summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/view/address.rs19
-rw-r--r--src/view/mod.rs6
-rw-r--r--src/view/name.rs43
-rw-r--r--src/view/telephone.rs18
-rw-r--r--src/viewmodel/mod.rs15
-rw-r--r--src/viewmodel/name.rs17
-rw-r--r--src/viewmodel/vcard.rs9
7 files changed, 94 insertions, 33 deletions
diff --git a/src/view/address.rs b/src/view/address.rs
index a16d93a..01c949b 100644
--- a/src/view/address.rs
+++ b/src/view/address.rs
@@ -1,15 +1,28 @@
use yew::services::ConsoleService;
+use yew::prelude::*;
+use yewtil::NeqAssign;
use yewtil::ptr::Irc;
use yewtil::ptr::Mrc;
use super::WeakComponentLink;
-use yew::prelude::*;
-use yewtil::NeqAssign;
use crate::viewmodel::address::*;
use crate::viewmodel::VCardPropertyInputObject;
use super::VCardPropertyInputComponent;
use crate::viewmodel::Error;
-
+/// View Component for a `address` field
+///
+/// # Examples
+///
+/// ```compile_fail
+/// let html = html!{
+/// <AddressView weak_link=some_weak_component_link
+/// generated=self.link.callback(
+/// |n: Irc<Address>|
+/// Msg::GeneratedAddress(some_address)
+/// )
+/// />
+/// };
+/// ```
pub struct AddressView {
props: Props,
value: Mrc<Address>,
diff --git a/src/view/mod.rs b/src/view/mod.rs
index 7a64fed..d97c6e4 100644
--- a/src/view/mod.rs
+++ b/src/view/mod.rs
@@ -9,10 +9,15 @@ pub mod name;
pub mod address;
pub mod telephone;
+/// Trait for types that represent an input component for a vcard property.
pub trait VCardPropertyInputComponent<T: VCardPropertyInputObject<Self>>: Component {
+ /// Returns the object containing the input data.
fn get_input_object(&self) -> T;
+ /// Getter function for the title of the component
fn get_title(&self) -> String;
+ /// Getter function for an eventual error.
fn get_error(&self) -> Option<Error>;
+ /// Returns the error as `Html`
fn render_error(&self) -> Html {
html!{
<>
@@ -32,6 +37,7 @@ pub trait VCardPropertyInputComponent<T: VCardPropertyInputObject<Self>>: Compon
}
}
+/// Weak link; Useful for being able to have a list of subcomponents.
pub struct WeakComponentLink<COMP: Component>(Rc<RefCell<Option<ComponentLink<COMP>>>>);
impl<COMP: Component> Clone for WeakComponentLink<COMP> {
diff --git a/src/view/name.rs b/src/view/name.rs
index 5b64bae..d864e35 100644
--- a/src/view/name.rs
+++ b/src/view/name.rs
@@ -1,14 +1,28 @@
use yew::services::ConsoleService;
+use yew::prelude::*;
+use yewtil::NeqAssign;
use yewtil::ptr::Irc;
use yewtil::ptr::Mrc;
use crate::viewmodel::Error;
use crate::view::WeakComponentLink;
-use yew::prelude::*;
-use yewtil::NeqAssign;
use crate::viewmodel::name::*;
use crate::viewmodel::VCardPropertyInputObject;
use super::VCardPropertyInputComponent;
+/// View Component for a `name` field
+///
+/// # Examples
+///
+/// ```compile_fail
+/// let html = html!{
+/// <NameView weak_link=some_weak_component_link
+/// generated=self.link.callback(
+/// |n: Irc<Name>|
+/// Msg::GeneratedName(some_name)
+/// )
+/// />
+/// };
+/// ```
pub struct NameView {
props: Props,
value: Mrc<Name>,
@@ -62,26 +76,11 @@ impl Component for NameView {
}
fn update(&mut self, msg: <Self as yew::Component>::Message) -> bool {
match msg {
- Msg::UpdatePrefix(p) => match self.value.get_mut() {
- Some(value) => value.prefix = p,
- None => ConsoleService::info("Couldn't get mutable reference to name"),
- },
- Msg::UpdateFirstName(f) => match self.value.get_mut() {
- Some(value) => value.first_name = f,
- None => ConsoleService::info("Couldn't get mutable reference to name"),
- },
- Msg::UpdateMiddleName(m) => match self.value.get_mut() {
- Some(value) => value.middle_name = m,
- None => ConsoleService::info("Couldn't get mutable reference to name"),
- },
- Msg::UpdateLastName(l) => match self.value.get_mut() {
- Some(value) => value.last_name = l,
- None => ConsoleService::info("Couldn't get mutable reference to name"),
- },
- Msg::UpdateSuffix(s) => match self.value.get_mut() {
- Some(value) => value.suffix = s,
- None => ConsoleService::info("Couldn't get mutable reference to name"),
- },
+ Msg::UpdatePrefix(p) => self.value.prefix = p,
+ Msg::UpdateFirstName(f) => self.value.first_name = f,
+ Msg::UpdateMiddleName(m) => self.value.middle_name = m,
+ Msg::UpdateLastName(l) => self.value.last_name = l,
+ Msg::UpdateSuffix(s) => self.value.suffix = s,
Msg::Generate => {
self.props.generated.emit(self.value.irc());
},
diff --git a/src/view/telephone.rs b/src/view/telephone.rs
index ca58538..63fdee7 100644
--- a/src/view/telephone.rs
+++ b/src/view/telephone.rs
@@ -1,14 +1,28 @@
+use yew::prelude::*;
use yew::services::ConsoleService;
use yewtil::ptr::Irc;
use yewtil::ptr::Mrc;
+use yewtil::NeqAssign;
use crate::view::WeakComponentLink;
use crate::viewmodel::Error;
-use yew::prelude::*;
-use yewtil::NeqAssign;
use crate::viewmodel::telephone::*;
use crate::viewmodel::VCardPropertyInputObject;
use super::VCardPropertyInputComponent;
+/// View Component for a `telephone` field
+///
+/// # Examples
+///
+/// ```compile_fail
+/// let html = html!{
+/// <TelephoneView weak_link=some_weak_component_link
+/// generated=self.link.callback(
+/// |n: Irc<Telephone>|
+/// Msg::GeneratedTelephone(some_telephone)
+/// )
+/// />
+/// };
+/// ```
pub struct TelephoneView {
props: Props,
value: Mrc<Telephone>,
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