summaryrefslogtreecommitdiff
path: root/src/viewmodel
diff options
context:
space:
mode:
Diffstat (limited to 'src/viewmodel')
-rw-r--r--src/viewmodel/mod.rs15
-rw-r--r--src/viewmodel/name.rs17
-rw-r--r--src/viewmodel/vcard.rs9
3 files changed, 35 insertions, 6 deletions
diff --git a/src/viewmodel/mod.rs b/src/viewmodel/mod.rs
index de433de..d5d0de3 100644
--- a/src/viewmodel/mod.rs
+++ b/src/viewmodel/mod.rs
@@ -7,11 +7,16 @@ pub mod name;
pub mod telephone;
pub mod utility;
+
+/// Trait for types that represent the data of a vcard property used inside of a `VCardPropertyInputComponent`.
pub trait VCardPropertyInputObject<C: VCardPropertyInputComponent<Self>>
- where Self: Sized
+ where Self: Sized
{
+ /// Function for creating a new (and empty) `VCardPropertyInputObject`.
fn new() -> Self;
+ /// Converts each field of the `VCardPropertyInputObject` to a VCardPropertyInputField and returns them as a vector.
fn get_input_fields(&self, link: &ComponentLink<C>) -> Vec<VCardPropertyInputField>;
+ /// Returns a `Html` representation of the `VCardPropertyInputObject`.
fn render(&self, link: &ComponentLink<C>) -> Html {
html!{
<div class="columns is-mobile is-multiline">
@@ -23,14 +28,19 @@ pub trait VCardPropertyInputObject<C: VCardPropertyInputComponent<Self>>
</div>
}
}
+ /// Convenience function for checking if the `VCardPropertyInputObject` is empty.
fn is_empty(&self) -> bool;
}
+/// Type for saving error messages.
+///
+/// More of a placeholder for something better later on.
#[derive(Debug,Clone,PartialEq)]
pub struct Error {
pub msg: String,
}
+/// Type that represents the visiual appearance of an input field.
pub enum VCardPropertyInputField {
Text {
label: String,
@@ -48,6 +58,7 @@ pub enum VCardPropertyInputField {
}
impl VCardPropertyInputField {
+ /// Returns a `Html` representation of the `VCardPropertyInputField`.
pub fn render(&self) -> Html {
match self {
Self::Text {
@@ -65,6 +76,7 @@ impl VCardPropertyInputField {
} => Self::checkbox_field_input(label, id, value, onclick),
}
}
+ /// Returns an `Html` representation of a text input field with the given parameters.
fn text_field_input(label: &str, id: &Option<String>, placeholder: &Option<String>, oninput: &Callback<InputData>) -> Html {
html!{
<div class="field column
@@ -83,6 +95,7 @@ impl VCardPropertyInputField {
</div>
}
}
+ /// Returns an `Html` representation of a checkbox input field with the given parameters.
fn checkbox_field_input(label: &str, id: &Option<String>, checked: &bool, onclick: &Callback<MouseEvent>) -> Html {
html!{
<div class="field column
diff --git a/src/viewmodel/name.rs b/src/viewmodel/name.rs
index a88e07f..b6ded60 100644
--- a/src/viewmodel/name.rs
+++ b/src/viewmodel/name.rs
@@ -1,6 +1,21 @@
use super::*;
use crate::view::name::*;
+/// Type that represents a vcard `name` property
+///
+/// # Examples
+/// ```
+/// # use bcard_wasm_webapp::viewmodel::name::Name;
+/// # use crate::bcard_wasm_webapp::viewmodel::VCardPropertyInputObject;
+/// let mut name = Name::new();
+/// name.prefix = String::from("Sir");
+/// name.first_name = String::from("Arthur");
+/// name.middle_name = String::from("Charles");
+/// name.last_name = String::from("Clarke");
+/// name.suffix = String::from("CBE FRAS");
+///
+/// assert_eq!(name.generate_fn(), String::from("Sir Arthur Charles Clarke, CBE FRAS"));
+/// ```
#[derive(Clone, Debug)]
pub struct Name {
pub prefix: String,
@@ -86,7 +101,7 @@ impl Name {
full_name.push_str(&self.last_name);
}
if !self.suffix.is_empty() {
- full_name.push_str(" ");
+ full_name.push_str(", ");
full_name.push_str(&self.suffix);
}
diff --git a/src/viewmodel/vcard.rs b/src/viewmodel/vcard.rs
index 2d415b7..0225590 100644
--- a/src/viewmodel/vcard.rs
+++ b/src/viewmodel/vcard.rs
@@ -3,6 +3,7 @@ use crate::viewmodel::telephone::Telephone;
use crate::viewmodel::address::Address;
use crate::viewmodel::name::Name;
+/// Type that represents the data structure of a vcard.
#[derive(Clone, Debug)]
pub struct VCardData {
pub names: Vec<Irc<Name>>,
@@ -11,7 +12,7 @@ pub struct VCardData {
}
macro_rules! make_vec_adder_fn {
- ( $fnname:ident $property:ident $($arg_name:ident : $arg_type:ty),* ) => {
+ ( fn $fnname:ident $property:ident => $($arg_name:ident : $arg_type:ty),* ) => {
pub fn $fnname(&mut self, $( $arg_name : $arg_type ),*) {
$(self.$property.push($arg_name);)*
}
@@ -26,7 +27,7 @@ impl VCardData {
telephones: Vec::new(),
}
}
- make_vec_adder_fn!( add_name names name: Irc<Name> );
- make_vec_adder_fn!( add_address addresses address: Irc<Address> );
- make_vec_adder_fn!( add_telephone telephones telephone: Irc<Telephone> );
+ make_vec_adder_fn!( fn add_name names => name: Irc<Name> );
+ make_vec_adder_fn!( fn add_address addresses => address: Irc<Address> );
+ make_vec_adder_fn!( fn add_telephone telephones => telephone: Irc<Telephone> );
} \ No newline at end of file