From 38603dc84b1ccb2b5d15b8b1389919babdc6d784 Mon Sep 17 00:00:00 2001 From: schn33fuchs Date: Sat, 2 May 2026 15:01:26 +0200 Subject: [PATCH] Room parsing from text K1 -> -1 D1 -> 1001 1 -> 1 --- frontend/src/pages/ticket.rs | 78 ++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 4 deletions(-) diff --git a/frontend/src/pages/ticket.rs b/frontend/src/pages/ticket.rs index 2b58af7..c17f226 100644 --- a/frontend/src/pages/ticket.rs +++ b/frontend/src/pages/ticket.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use chrono_tz::Europe::Berlin; use gloo_net::http::Request; use serde::{Deserialize, Serialize}; @@ -7,6 +9,15 @@ use web_sys::HtmlSelectElement; use yew::prelude::*; use yew_router::prelude::*; +const VALID_ROOMS: &[i16] = &[ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 32, 34, 36, 37, 39, 41, 49, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, + 118, 120, 121, 122, 123, 124, 126, 127, 128, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 145, 146, 147, 148, 150, 152, 153, 154, 155, 156, 157, 158, 159, 160, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 214, 1001, 1002, 1003, -1, -2, -3, -4, -5, -6, -7, + -8, +]; + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] pub struct TicketCreateScheme { pub category: String, @@ -56,22 +67,34 @@ pub fn submit_ticket_component() -> Html { let category = use_state(|| "".to_string()); let betreff = use_state(|| "".to_string()); let description = use_state(|| "".to_string()); - let room = use_state(|| 0i16); + let room = use_state(|| None::); + let room_input = use_state(|| "".to_string()); let status = use_state(|| None::); + let valid_rooms: HashSet = VALID_ROOMS.iter().copied().collect(); + let onsubmit = { let category = category.clone(); let betreff = betreff.clone(); let description = description.clone(); let room = room.clone(); let status = status.clone(); + let valid_rooms = valid_rooms.clone(); Callback::from(move |e: SubmitEvent| { e.prevent_default(); + if room.is_none() { + status.set(Some("Invalid room".into())); + return; + } let category = (*category).clone(); let betreff = (*betreff).clone(); let description = (*description).clone(); - let room = *room; + let room = room.unwrap(); + if !valid_rooms.contains(&room) { + status.set(Some("Room not allowed".into())); + return; + } let status = status.clone(); spawn_local(async move { @@ -123,12 +146,50 @@ pub fn submit_ticket_component() -> Html { let room_change = { let room = room.clone(); + let room_input = room_input.clone(); Callback::from(move |e: InputEvent| { let input: web_sys::HtmlInputElement = e.target_unchecked_into(); - room.set(input.value().parse().unwrap_or(0)); + let raw = input.value(); + room_input.set(raw.clone()); + + let parsed_value: Option = if raw.trim().is_empty() { + None + } else { + let raw_trim = raw.trim(); + if raw_trim.len() > 1 && (raw_trim.starts_with('K') || raw_trim.starts_with('k')) { + match raw_trim[1..].parse::() { + Ok(n) => Some(-n), + Err(_) => None, + } + } else if raw_trim.len() > 1 + && (raw_trim.starts_with('D') || raw_trim.starts_with('d')) + { + match raw_trim[1..].parse::() { + Ok(n) => Some(1000 + n), + Err(_) => None, + } + } else { + match raw_trim.parse::() { + Ok(n) => Some(n), + Err(_) => None, + } + } + }; + + if let Some(v) = parsed_value { + if !valid_rooms.contains(&v) { + room.set(None); + } else { + room.set(Some(v)); + } + } else { + room.set(None); + } }) }; + let room_valid = (*room).is_some(); + html! {

+ { + if !room_valid { + html! { +

{ "Ungültiger oder nicht erlaubter Raum (z. B. 101, K12, D5)" }

+ } + } else { + html! {} + } + }