From 3a0e91bda1e93afa33dd182c2e820c94b3e94593 Mon Sep 17 00:00:00 2001 From: Benedikt Peetz Date: Sat, 25 Oct 2025 02:15:31 +0200 Subject: feat(treewide): Add further buttons The register product > associate barcode > buy barcode workflow is now usable. The only missing features for an MVP are unit and unit property creation. --- src/pages/create_product.rs | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/pages/create_product.rs (limited to 'src/pages/create_product.rs') diff --git a/src/pages/create_product.rs b/src/pages/create_product.rs new file mode 100644 index 0000000..fcd3b0b --- /dev/null +++ b/src/pages/create_product.rs @@ -0,0 +1,96 @@ +use std::{convert::Infallible, str::FromStr}; + +use leptos::{ + IntoView, component, + prelude::{Get, Show, signal}, + task::spawn_local, + view, +}; +use rocie_client::models::{ProductStub, UnitPropertyId}; +use rocie_macros::Form; +use uuid::Uuid; + +use crate::{ + api::{get_config, register_product_external_wrapped, unit_properties_wrapped}, + components::{async_fetch::AsyncResource, banner::Banner, site_header::SiteHeader}, +}; + +struct OptionalString(Option); + +impl FromStr for OptionalString { + type Err = Infallible; + + fn from_str(s: &str) -> Result { + if s.is_empty() { + Ok(Self(None)) + } else { + Ok(Self(Some(s.to_owned()))) + } + } +} + +#[component] +pub fn CreateProduct() -> impl IntoView { + let (error_message, error_message_set) = signal(None); + + view! { + + + + + + + { + Form! { + on_submit = |product_name, product_description, unit_property_id| { + let config = get_config!(); + + spawn_local(async move { + match register_product_external_wrapped(&config, ProductStub { + description: Some(product_description.0), + name: product_name, + parent: None, // TODO: Add this <2025-10-25> + unit_property: UnitPropertyId { value: unit_property_id }, + } + ).await { + Ok(_id) => {} + Err(err) => error_message_set.set(Some(format!("Failed to create product: {err}"))), + } + }); + }; + + + + + +