Room parsing from text
K1 -> -1 D1 -> 1001 1 -> 1
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
use chrono_tz::Europe::Berlin;
|
use chrono_tz::Europe::Berlin;
|
||||||
use gloo_net::http::Request;
|
use gloo_net::http::Request;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
@@ -7,6 +9,15 @@ use web_sys::HtmlSelectElement;
|
|||||||
use yew::prelude::*;
|
use yew::prelude::*;
|
||||||
use yew_router::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)]
|
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
|
||||||
pub struct TicketCreateScheme {
|
pub struct TicketCreateScheme {
|
||||||
pub category: String,
|
pub category: String,
|
||||||
@@ -56,22 +67,34 @@ pub fn submit_ticket_component() -> Html {
|
|||||||
let category = use_state(|| "".to_string());
|
let category = use_state(|| "".to_string());
|
||||||
let betreff = use_state(|| "".to_string());
|
let betreff = use_state(|| "".to_string());
|
||||||
let description = use_state(|| "".to_string());
|
let description = use_state(|| "".to_string());
|
||||||
let room = use_state(|| 0i16);
|
let room = use_state(|| None::<i16>);
|
||||||
|
let room_input = use_state(|| "".to_string());
|
||||||
let status = use_state(|| None::<String>);
|
let status = use_state(|| None::<String>);
|
||||||
|
|
||||||
|
let valid_rooms: HashSet<i16> = VALID_ROOMS.iter().copied().collect();
|
||||||
|
|
||||||
let onsubmit = {
|
let onsubmit = {
|
||||||
let category = category.clone();
|
let category = category.clone();
|
||||||
let betreff = betreff.clone();
|
let betreff = betreff.clone();
|
||||||
let description = description.clone();
|
let description = description.clone();
|
||||||
let room = room.clone();
|
let room = room.clone();
|
||||||
let status = status.clone();
|
let status = status.clone();
|
||||||
|
let valid_rooms = valid_rooms.clone();
|
||||||
|
|
||||||
Callback::from(move |e: SubmitEvent| {
|
Callback::from(move |e: SubmitEvent| {
|
||||||
e.prevent_default();
|
e.prevent_default();
|
||||||
|
if room.is_none() {
|
||||||
|
status.set(Some("Invalid room".into()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
let category = (*category).clone();
|
let category = (*category).clone();
|
||||||
let betreff = (*betreff).clone();
|
let betreff = (*betreff).clone();
|
||||||
let description = (*description).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();
|
let status = status.clone();
|
||||||
|
|
||||||
spawn_local(async move {
|
spawn_local(async move {
|
||||||
@@ -123,12 +146,50 @@ pub fn submit_ticket_component() -> Html {
|
|||||||
|
|
||||||
let room_change = {
|
let room_change = {
|
||||||
let room = room.clone();
|
let room = room.clone();
|
||||||
|
let room_input = room_input.clone();
|
||||||
Callback::from(move |e: InputEvent| {
|
Callback::from(move |e: InputEvent| {
|
||||||
let input: web_sys::HtmlInputElement = e.target_unchecked_into();
|
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<i16> = 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::<i16>() {
|
||||||
|
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::<i16>() {
|
||||||
|
Ok(n) => Some(1000 + n),
|
||||||
|
Err(_) => None,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
match raw_trim.parse::<i16>() {
|
||||||
|
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! {
|
html! {
|
||||||
<form {onsubmit}>
|
<form {onsubmit}>
|
||||||
<label>{ "Betreff:" }
|
<label>{ "Betreff:" }
|
||||||
@@ -151,8 +212,17 @@ pub fn submit_ticket_component() -> Html {
|
|||||||
</label>
|
</label>
|
||||||
<br/>
|
<br/>
|
||||||
<label>{ "Raum:" }
|
<label>{ "Raum:" }
|
||||||
<input type="number" value={room.to_string()} oninput={room_change}/>
|
<input type="text" value={(*room_input).clone()} oninput={room_change}/>
|
||||||
</label>
|
</label>
|
||||||
|
{
|
||||||
|
if !room_valid {
|
||||||
|
html! {
|
||||||
|
<p style="color: red;">{ "Ungültiger oder nicht erlaubter Raum (z. B. 101, K12, D5)" }</p>
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
html! {}
|
||||||
|
}
|
||||||
|
}
|
||||||
<br/>
|
<br/>
|
||||||
<button type="submit">{ "Send" }</button>
|
<button type="submit">{ "Send" }</button>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user