diff --git a/frontend/Cargo.lock b/frontend/Cargo.lock index 0810194..018471f 100644 --- a/frontend/Cargo.lock +++ b/frontend/Cargo.lock @@ -64,8 +64,10 @@ dependencies = [ name = "frontend" version = "0.1.0" dependencies = [ + "gloo 0.12.0", "gloo-net 0.7.0", "serde", + "serde_json", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -168,17 +170,36 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d15282ece24eaf4bd338d73ef580c6714c8615155c4190c781290ee3fa0fd372" dependencies = [ - "gloo-console", - "gloo-dialogs", - "gloo-events", - "gloo-file", - "gloo-history", + "gloo-console 0.3.0", + "gloo-dialogs 0.2.0", + "gloo-events 0.2.0", + "gloo-file 0.3.0", + "gloo-history 0.2.2", "gloo-net 0.5.0", - "gloo-render", - "gloo-storage", - "gloo-timers", + "gloo-render 0.2.0", + "gloo-storage 0.3.0", + "gloo-timers 0.3.0", "gloo-utils 0.2.0", - "gloo-worker", + "gloo-worker 0.5.0", +] + +[[package]] +name = "gloo" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc13cc21c3835347855fd83900414d94716adc1e332f09f7fba56f21be127214" +dependencies = [ + "gloo-console 0.4.0", + "gloo-dialogs 0.3.0", + "gloo-events 0.3.0", + "gloo-file 0.4.0", + "gloo-history 0.3.0", + "gloo-net 0.7.0", + "gloo-render 0.3.0", + "gloo-storage 0.4.0", + "gloo-timers 0.4.0", + "gloo-utils 0.3.0", + "gloo-worker 0.6.0", ] [[package]] @@ -194,6 +215,19 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gloo-console" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f1d5cec0b97edb53f21221f799c659cef3764ad5a00eca52950eb9b902028ba" +dependencies = [ + "gloo-utils 0.3.0", + "js-sys", + "serde", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gloo-dialogs" version = "0.2.0" @@ -204,6 +238,16 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gloo-dialogs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45618929b7022bb49903b958b5b7af1d4fb58fbd99712926d91641fe582f3d55" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gloo-events" version = "0.2.0" @@ -214,6 +258,16 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gloo-events" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6a94fa8cd88bea0babf8a27fe9abbcdece831fd1c3c84dd5c231fab4685ec7" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gloo-file" version = "0.3.0" @@ -221,7 +275,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97563d71863fb2824b2e974e754a81d19c4a7ec47b09ced8a0e6656b6d54bd1f" dependencies = [ "futures-channel", - "gloo-events", + "gloo-events 0.2.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-file" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "544a15ff6a3d5976bebc97380c8471ae14283bc71f4bb198d6c8cae64f411ab7" +dependencies = [ + "gloo-events 0.3.0", "js-sys", "wasm-bindgen", "web-sys", @@ -234,7 +300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "903f432be5ba34427eac5e16048ef65604a82061fe93789f2212afc73d8617d6" dependencies = [ "getrandom", - "gloo-events", + "gloo-events 0.2.0", "gloo-utils 0.2.0", "serde", "serde-wasm-bindgen", @@ -244,6 +310,23 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gloo-history" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f07f3d446931414cc92f4a1b6e631dfa233db2f96c887d5f72beeecd1b5db39c" +dependencies = [ + "getrandom", + "gloo-events 0.3.0", + "gloo-utils 0.3.0", + "serde", + "serde-wasm-bindgen", + "serde_urlencoded", + "thiserror 2.0.18", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gloo-net" version = "0.5.0" @@ -296,6 +379,16 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gloo-render" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f609333b9e38e43e74224410d6616e3ad773ed6fe14f53cd8a006d1bb25e108" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gloo-storage" version = "0.3.0" @@ -311,6 +404,21 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gloo-storage" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e82ce7d41c6d821640a43726f6ff33c924795cc151b62e5a84d0c988c151c980" +dependencies = [ + "gloo-utils 0.3.0", + "js-sys", + "serde", + "serde_json", + "thiserror 2.0.18", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "gloo-timers" version = "0.3.0" @@ -323,6 +431,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gloo-timers" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "482ce8a491a501da4cd806bd190275363d674f2845005c6ddbd5d3e1dd54495d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "gloo-utils" version = "0.2.0" @@ -358,7 +476,7 @@ dependencies = [ "bincode", "futures", "gloo-utils 0.2.0", - "gloo-worker-macros", + "gloo-worker-macros 0.1.0", "js-sys", "pinned", "serde", @@ -368,13 +486,44 @@ dependencies = [ "web-sys", ] +[[package]] +name = "gloo-worker" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142478655c5d764e5168d3019510ea0c0885687a72ba74e90548bd74ae160a41" +dependencies = [ + "bincode", + "futures", + "gloo-utils 0.2.0", + "gloo-worker-macros 0.2.0", + "js-sys", + "pinned", + "serde", + "thiserror 2.0.18", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "gloo-worker-macros" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "956caa58d4857bc9941749d55e4bd3000032d8212762586fa5705632967140e7" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "gloo-worker-macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3bf5ede96b06406bd74351a026f708ae196b7dc262077aee56e6ad7223e7466" +dependencies = [ + "proc-macro-crate 3.3.0", "proc-macro2", "quote", "syn 2.0.117", @@ -549,7 +698,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit 0.22.27", ] [[package]] @@ -784,7 +942,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba44a1b36f42a95bd21b5e4acc1468547f75a73e7cf619312408d1f74c7fb687" dependencies = [ "futures", - "gloo", + "gloo 0.11.0", "num_cpus", "once_cell", "pin-project", @@ -808,7 +966,18 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.7.15", ] [[package]] @@ -940,6 +1109,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + [[package]] name = "yew" version = "0.23.0" @@ -948,7 +1126,7 @@ checksum = "2c154fadfa97eabdd3f3b79345ceeb9c05ee8f13f76d3d881d17fba618bf558d" dependencies = [ "console_error_panic_hook", "futures", - "gloo", + "gloo 0.11.0", "implicit-clone", "indexmap", "js-sys", @@ -985,7 +1163,7 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "870bd2a1aa6d608c0c789c122654e25f4927bb6bfe344cc0da3b630ac3c73260" dependencies = [ - "gloo", + "gloo 0.11.0", "js-sys", "route-recognizer", "serde", diff --git a/frontend/Cargo.toml b/frontend/Cargo.toml index 23cba91..1684f68 100644 --- a/frontend/Cargo.toml +++ b/frontend/Cargo.toml @@ -15,6 +15,12 @@ yew = { version = "0.23", features = ["csr"] } serde = { version = "1.0.228", features = ["derive"] } wasm-bindgen = "0.2.118" wasm-bindgen-futures = "0.4.68" -web-sys = { version = "0.3.95", features = ["Window", "Document", "Request", "Response", "Headers"] } +web-sys = { version = "0.3.95", features = [ + "Window","Document","Request","Response","Headers", + "SubmitEvent","InputEvent","HtmlInputElement","Event" +] } gloo-net = "0.7.0" yew-router = "0.20.0" +serde_json = "1.0.149" +gloo = "0.12.0" + diff --git a/frontend/src/lib.rs b/frontend/src/lib.rs index 31d4860..f6c81f1 100644 --- a/frontend/src/lib.rs +++ b/frontend/src/lib.rs @@ -7,6 +7,8 @@ use yew_router::prelude::*; enum Route { #[at("/")] Home, + #[at("/ticket")] + Ticket, #[not_found] #[at("/404")] NotFound, @@ -15,7 +17,8 @@ enum Route { fn switch(route: Route) -> Html { match route { Route::Home => html! { }, - Route::NotFound => html! { }, + Route::NotFound => html! { }, + Route::Ticket => html! { }, } } diff --git a/frontend/src/pages/mod.rs b/frontend/src/pages/mod.rs index 11980c3..01340f0 100644 --- a/frontend/src/pages/mod.rs +++ b/frontend/src/pages/mod.rs @@ -1 +1,2 @@ pub mod basic_pages; +pub mod ticket; diff --git a/frontend/src/pages/ticket.rs b/frontend/src/pages/ticket.rs new file mode 100644 index 0000000..642bfb4 --- /dev/null +++ b/frontend/src/pages/ticket.rs @@ -0,0 +1,120 @@ +use gloo_net::http::Request; +use serde::{Deserialize, Serialize}; +use wasm_bindgen_futures::spawn_local; +use yew::prelude::*; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct TicketCreateScheme { + pub category: String, + pub betreff: String, + pub description: String, + pub room: i16, +} + +#[component(Ticket)] +pub fn 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 status = use_state(|| None::); + + let onsubmit = { + let category = category.clone(); + let betreff = betreff.clone(); + let description = description.clone(); + let room = room.clone(); + let status = status.clone(); + + Callback::from(move |e: SubmitEvent| { + e.prevent_default(); + let category = (*category).clone(); + let betreff = (*betreff).clone(); + let description = (*description).clone(); + let room = *room; + let status = status.clone(); + + spawn_local(async move { + let payload = TicketCreateScheme { + category, + betreff, + description, + room, + }; + + let request = Request::post("http://localhost:8001/api/tickets/create") + .json(&payload) + .expect("Failed to build request"); + + match request.send().await { + Ok(response) if response.status() == 200 => status.set(Some("Success".into())), + Ok(response) => status.set(Some(format!("Error: {}", response.status()))), + Err(err) => status.set(Some(format!("Network error: {}", err))), + } + }); + }) + }; + + let category_change = { + let category = category.clone(); + Callback::from(move |e: InputEvent| { + let input: web_sys::HtmlInputElement = e.target_unchecked_into(); + category.set(input.value()); + }) + }; + + let betreff_change = { + let betreff = betreff.clone(); + Callback::from(move |e: InputEvent| { + let input: web_sys::HtmlInputElement = e.target_unchecked_into(); + betreff.set(input.value()); + }) + }; + + let description_change = { + let description = description.clone(); + Callback::from(move |e: InputEvent| { + let input: web_sys::HtmlInputElement = e.target_unchecked_into(); + description.set(input.value()); + }) + }; + + let room_change = { + let room = room.clone(); + Callback::from(move |e: InputEvent| { + let input: web_sys::HtmlInputElement = e.target_unchecked_into(); + room.set(input.value().parse().unwrap_or(0)); + }) + }; + + html! { +
+ +
+ +
+ +
+ +
+ + + { + if let Some(s) = &*status { + html!{

{ s }

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