diff --git a/frontend/Cargo.toml b/frontend/Cargo.toml index 882c457..cef7f39 100644 --- a/frontend/Cargo.toml +++ b/frontend/Cargo.toml @@ -16,8 +16,8 @@ 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", "HtmlSelectElement", - "SubmitEvent","InputEvent","HtmlInputElement","Event", "HtmlFormElement" + "Window","Document","Request","Response","Headers", "HtmlSelectElement", "RequestCredentials", + "SubmitEvent","InputEvent","HtmlInputElement","Event", "HtmlFormElement", "MouseEvent" ] } gloo-net = "0.7.0" yew-router = "0.20.0" diff --git a/frontend/src/pages/ticket.rs b/frontend/src/pages/ticket.rs index 401670a..4d50c99 100644 --- a/frontend/src/pages/ticket.rs +++ b/frontend/src/pages/ticket.rs @@ -242,6 +242,52 @@ pub fn ticket_by_id_component(props: &TicketProps) -> Html { }) }; + let deleting = use_state(|| false); + let delete_error = use_state(|| None::); + + let ondelete = { + let deleting = deleting.clone(); + let delete_error = delete_error.clone(); + let ticket_state = ticket.clone(); + let id = id; + + Callback::from(move |e: MouseEvent| { + e.prevent_default(); + if !web_sys::window() + .and_then(|w| w.confirm_with_message("Sicher löschen?").ok()) + .unwrap_or(false) + { + return; + } + + deleting.set(true); + delete_error.set(None); + + let deleting = deleting.clone(); + let delete_error = delete_error.clone(); + let ticket_state = ticket_state.clone(); + + spawn_local(async move { + let url = format!("/api/tickets/{}", id); + let request = + Request::delete(&url).credentials(web_sys::RequestCredentials::Include); + + match request.send().await { + Ok(resp) if resp.status() == 200 || resp.status() == 204 => { + // remove local state or navigate away + ticket_state.set(None); // clears the shown item + } + Ok(resp) => { + let txt = resp.text().await.unwrap_or_else(|_| "Unknown".into()); + delete_error.set(Some(format!("HTTP {}: {}", resp.status(), txt))); + } + Err(err) => delete_error.set(Some(format!("Network error: {}", err))), + } + deleting.set(false); + }); + }) + }; + if *loading { html! {

{ "Loading" }

} } else if let Some(e) = &*error { @@ -274,6 +320,13 @@ pub fn ticket_by_id_component(props: &TicketProps) -> Html { + + + if let Some(err) = &*delete_error { +

{ err.clone() }

+ } } } else {