use crate::model::utility::File; use wasm_bindgen::closure::Closure; use wasm_bindgen::JsCast; use web_sys::FileReader; use yew::prelude::*; use yew::services::ConsoleService; /// Type that represents the visiual appearance of an input field. pub enum VCardPropertyInputField { Text { label: String, id: Option, placeholder: Option, oninput: Callback, value: String, typ: String, }, File { label: String, name: String, callback: Callback>, value: Option, }, Select { label: String, id: Option, options: Vec<(String, String)>, onchange: Callback, value: String, }, CheckBox { label: String, id: Option, onclick: Callback, value: bool, }, } impl VCardPropertyInputField { /// Returns a `Html` representation of the `VCardPropertyInputField`. pub fn render(&self) -> Html { match self { Self::Text { label, id, placeholder, oninput, value: _, typ, } => Self::text_field_input(label, id, placeholder, oninput, typ), Self::File { label, name, callback, value, } => Self::file_field_input(label, name, callback, value), Self::Select { label, id, options, onchange, value, } => Self::select_field_input(label, id, options, onchange, value), Self::CheckBox { label, id, onclick, value, } => 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, placeholder: &Option, oninput: &Callback, typ: &str, ) -> Html { html! {
} } /// Returns an `Html` representation of a file input field with the given parameters. fn file_field_input( label: &str, name: &str, callback: &Callback>, file: &Option, ) -> Html { let callback = callback.clone(); let onchange = Callback::<()>::default(); let onchange = onchange.reform(move |c: ChangeData| { if let ChangeData::Files(files) = c { match files.item(0) { Some(file) => { let file_reader = FileReader::new().unwrap(); match file_reader.read_as_data_url(&file) { Ok(_) => (), Err(_) => ConsoleService::warn("Error: Couldn't get file as data url."), }; let callback = callback.clone(); let onload = Closure::wrap(Box::new(move |event: Event| { let file_reader: FileReader = event.target().unwrap().dyn_into().unwrap(); let data_url: Option = file_reader.result().unwrap().as_string(); match data_url { Some(content) => callback.emit(Some(File { name: file.name(), content, })), None => { ConsoleService::warn("Couldn't get data url as string."); callback.emit(None); } }; }) as Box); file_reader.set_onload(Some(onload.as_ref().unchecked_ref())); onload.forget(); } None => callback.emit(None), } } else { callback.emit(None); } }); html! {
} } fn select_field_input( label: &str, id: &Option, options: &Vec<(String, String)>, onchange: &Callback, value: &str, ) -> Html { html! {
} } /// Returns an `Html` representation of a checkbox input field with the given parameters. fn checkbox_field_input( label: &str, id: &Option, checked: &bool, onclick: &Callback, ) -> Html { html! {
} } }