diff --git a/src/components/mod.rs b/src/components/mod.rs index 4c2ed38..87f4189 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -14,4 +14,5 @@ pub mod nav_bar; pub mod new_widget; pub mod project_card; pub mod textfield; -pub mod single_media_picker; \ No newline at end of file +pub mod single_media_picker; +pub mod number_textfield; \ No newline at end of file diff --git a/src/components/number_textfield.rs b/src/components/number_textfield.rs new file mode 100644 index 0000000..70063ff --- /dev/null +++ b/src/components/number_textfield.rs @@ -0,0 +1,49 @@ + +use wasm_bindgen::{JsCast, UnwrapThrowExt}; +use web_sys::{HtmlInputElement}; +use yew::prelude::*; +use std::{str::FromStr, num::ParseFloatError}; + +#[derive(Properties, PartialEq, Clone)] +pub struct NumberTextFieldProps { + pub label: String, + pub value: UseStateHandle, + #[prop_or_default] + pub required: bool, + pub onchange: Option>, +} + + +#[function_component(NumberTextField)] +pub fn number_textfield(props: &NumberTextFieldProps) -> Html { + let on_input_changed = { + let handle = props.value.clone(); + let onchange = props.onchange.clone(); + Callback::from(move |e: InputEvent| { + let value = match get_number_value_from_input_event(e) { + Ok(float) => float, + Err(error) => { + log::error!("Error ocurred attempting to parse float on input type number. This only happens in firefox browsers. {error}"); + 0.0 + }}; + match onchange.clone() { + Some(onchange) => onchange.emit(value), + None => {} + }; + handle.set(value); + }) + }; + html! { +
+
{props.label.clone()}
+ +
+ } +} + +pub fn get_number_value_from_input_event(e: InputEvent) -> Result { + let event: Event = e.dyn_into().unwrap_throw(); + let event_target = event.target().unwrap_throw(); + let target: HtmlInputElement = event_target.dyn_into().unwrap_throw(); + f64::from_str(&target.value()) +} \ No newline at end of file diff --git a/src/pages/admin/fields/unit.rs b/src/pages/admin/fields/unit.rs index f4245a8..aae5119 100644 --- a/src/pages/admin/fields/unit.rs +++ b/src/pages/admin/fields/unit.rs @@ -3,7 +3,7 @@ use uuid::Uuid; use yew::prelude::*; use yew_router::prelude::use_navigator; -use crate::pages::admin::edit::EditType; +use crate::{pages::admin::edit::EditType, components::number_textfield::NumberTextField}; #[derive(Properties, PartialEq, Clone)] pub struct UnitFieldsProps { @@ -17,7 +17,9 @@ pub fn unit_fields(props: &UnitFieldsProps) -> Html { let navigator = use_navigator().unwrap(); let user_typed = use_state(|| false); + // Fields + let price_usd = use_state(|| 0.0); html! { - + } } \ No newline at end of file