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! {
+
+ }
+}