diff --git a/src/components/category_input.rs b/src/components/category_input.rs index 615ebe8..a8b8a7c 100644 --- a/src/components/category_input.rs +++ b/src/components/category_input.rs @@ -1,5 +1,4 @@ use crate::models::category::Category; -use chrono::NaiveDate; use dioxus::core_macro::rsx; use dioxus::dioxus_core::Element; use dioxus::prelude::*; diff --git a/src/components/task_form.rs b/src/components/task_form.rs index d0bc46b..8618c48 100644 --- a/src/components/task_form.rs +++ b/src/components/task_form.rs @@ -6,7 +6,7 @@ use crate::models::task::Task; use crate::query::{QueryErrors, QueryKey, QueryValue}; use crate::route::Route; use crate::server::projects::get_projects; -use crate::server::tasks::{create_task, edit_task}; +use crate::server::tasks::{create_task, delete_task, edit_task}; use chrono::{Duration}; use dioxus::core_macro::{component, rsx}; use dioxus::dioxus_core::Element; @@ -336,7 +336,39 @@ pub(crate) fn TaskForm(task: Option, on_successful_submit: EventHandler<() _ => None }, div { - class: "flex flex-row justify-end mt-auto", + class: "flex flex-row justify-between mt-auto", + button { + r#type: "button", + class: "py-2 px-4 bg-zinc-300/50 rounded-lg", + onclick: move |_| { + let task = task.clone(); + async move { + if let Some(task) = task { + if *(task.category()) == Category::Trash { + let _ = delete_task(task.id()).await; + } else { + let new_task = NewTask::new( + task.title().to_owned(), + task.deadline(), + Category::Trash, + task.project_id() + ); + + let _ = edit_task(task.id(), new_task).await; + } + + query_client.invalidate_queries(&[ + QueryKey::TasksInCategory(task.category().clone()), + QueryKey::Tasks, + ]); + } + on_successful_submit.call(()); + } + }, + i { + class: "fa-solid fa-trash-can" + } + } button { r#type: "submit", class: "py-2 px-4 bg-zinc-300/50 rounded-lg", diff --git a/src/models/task.rs b/src/models/task.rs index caa1d7f..1e2a52d 100644 --- a/src/models/task.rs +++ b/src/models/task.rs @@ -63,8 +63,10 @@ pub struct NewTask { impl NewTask { pub fn new( - title: String, deadline: Option, - category: Category, project_id: Option, + title: String, + deadline: Option, + category: Category, + project_id: Option, ) -> Self { Self { title, deadline, category, project_id } } diff --git a/src/server/projects.rs b/src/server/projects.rs index 0519dcd..8ae58b2 100644 --- a/src/server/projects.rs +++ b/src/server/projects.rs @@ -51,7 +51,7 @@ pub(crate) async fn get_projects() #[server] pub(crate) async fn edit_project(project_id: i32, new_project: NewProject) - -> Result>> { + -> Result>> { use crate::schema::projects::dsl::*; new_project.validate() @@ -72,16 +72,19 @@ pub(crate) async fn edit_project(project_id: i32, new_project: NewProject) Ok(updated_project) } +// TODO: Get rid of this suppression. +//noinspection DuplicatedCode #[server] pub(crate) async fn delete_project(project_id: i32) - -> Result<(), ServerFnError>> { + -> Result<(), ServerFnError>> { use crate::schema::projects::dsl::*; let mut connection = establish_database_connection() .map_err::, _>(|_| vec![Error::ServerInternal].into())?; + diesel::delete(projects.filter(id.eq(project_id))).execute(&mut connection) .map_err::, _>(|error| vec![error.into()].into())?; - + Ok(()) } diff --git a/src/server/tasks.rs b/src/server/tasks.rs index 91c4083..b20d3b6 100644 --- a/src/server/tasks.rs +++ b/src/server/tasks.rs @@ -136,3 +136,19 @@ pub(crate) async fn complete_task(task_id: i32) -> Result Result<(), ServerFnError>> { + use crate::schema::tasks::dsl::*; + + let mut connection = establish_database_connection() + .map_err::, _>(|_| vec![Error::ServerInternal].into())?; + + diesel::delete(tasks.filter(id.eq(task_id))).execute(&mut connection) + .map_err::, _>(|error| vec![error.into()].into())?; + + Ok(()) +}