diff options
Diffstat (limited to 'src/model/telephone.rs')
-rw-r--r-- | src/model/telephone.rs | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/src/model/telephone.rs b/src/model/telephone.rs new file mode 100644 index 0000000..946da33 --- /dev/null +++ b/src/model/telephone.rs @@ -0,0 +1,146 @@ +use super::*; + +#[derive(Clone, Debug, PartialEq)] +pub struct Telephone { + pub number: String, + pub work: bool, + pub home: bool, + pub text: bool, + pub voice: bool, + pub fax: bool, + pub cell: bool, + pub video: bool, + pub pager: bool, + pub text_phone: bool, +} + +#[derive(Clone, PartialEq)] +pub enum TelephoneMsg { + UpdateNumber(String), + ToggleWork, + ToggleHome, + ToggleText, + ToggleVoice, + ToggleFax, + ToggleCell, + ToggleVideo, + TogglePager, + ToggleTextPhone, + + Generate, +} + +impl VCardPropertyInputObject<TelephoneMsg> for Telephone { + fn new() -> Self { + Self { + number: String::new(), + work: false, + home: false, + text: false, + voice: false, + fax: false, + cell: false, + video: false, + pager: false, + text_phone: false, + } + } + fn get_title(&self) -> String { + "Telephone".to_string() + } + fn get_input_fields( + &self, + link: &ComponentLink<PropertyGroupInputComponent<Self, TelephoneMsg>>, + ) -> Vec<VCardPropertyInputField> { + let typ = String::from("tel"); + vec![ + VCardPropertyInputField::Text { + label: "Number".to_string(), + id: Some("number".to_string()), + placeholder: None, + oninput: link.callback(|e: InputData| TelephoneMsg::UpdateNumber(e.value)), + value: self.number.clone(), + typ, + }, + VCardPropertyInputField::CheckBox { + label: "Work".to_string(), + id: Some("work".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::ToggleWork), + value: self.work, + }, + VCardPropertyInputField::CheckBox { + label: "Home".to_string(), + id: Some("home".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::ToggleHome), + value: self.home, + }, + VCardPropertyInputField::CheckBox { + label: "Text".to_string(), + id: Some("text".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::ToggleText), + value: self.text, + }, + VCardPropertyInputField::CheckBox { + label: "Voice".to_string(), + id: Some("voice".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::ToggleVoice), + value: self.voice, + }, + VCardPropertyInputField::CheckBox { + label: "Fax".to_string(), + id: Some("fax".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::ToggleFax), + value: self.fax, + }, + VCardPropertyInputField::CheckBox { + label: "Cell".to_string(), + id: Some("cell".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::ToggleCell), + value: self.cell, + }, + VCardPropertyInputField::CheckBox { + label: "Video".to_string(), + id: Some("video".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::ToggleVideo), + value: self.video, + }, + VCardPropertyInputField::CheckBox { + label: "Pager".to_string(), + id: Some("pager".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::TogglePager), + value: self.pager, + }, + VCardPropertyInputField::CheckBox { + label: "Text Phone".to_string(), + id: Some("text_phone".to_string()), + onclick: link.callback(|_: MouseEvent| TelephoneMsg::ToggleTextPhone), + value: self.text_phone, + }, + ] + } + fn update( + &mut self, + props: InputProps<Self, TelephoneMsg>, + msg: <PropertyGroupInputComponent<Self, TelephoneMsg> as yew::Component>::Message, + ) -> bool { + match msg { + TelephoneMsg::UpdateNumber(n) => self.number = n, + TelephoneMsg::ToggleWork => self.work = !self.work, + TelephoneMsg::ToggleHome => self.home = !self.home, + TelephoneMsg::ToggleText => self.text = !self.text, + TelephoneMsg::ToggleVoice => self.voice = !self.voice, + TelephoneMsg::ToggleFax => self.fax = !self.fax, + TelephoneMsg::ToggleCell => self.cell = !self.cell, + TelephoneMsg::ToggleVideo => self.video = !self.video, + TelephoneMsg::TogglePager => self.pager = !self.pager, + TelephoneMsg::ToggleTextPhone => self.text_phone = !self.text_phone, + TelephoneMsg::Generate => { + props.generated.emit(self.clone()); + } + }; + true + } + fn is_empty(&self) -> bool { + self.number.is_empty() + } +} |