From 823ae007e3a5c498493811fb22bfca80af8626c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matou=C5=A1=20Volf?= <66163112+matous-volf@users.noreply.github.com> Date: Sun, 8 Sep 2024 09:55:46 +0200 Subject: [PATCH 1/4] chore: remove an unused import --- src/components/category_input.rs | 1 - 1 file changed, 1 deletion(-) 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::*; From 7b635ea372852b1c1eab1d28bc95674749da8f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matou=C5=A1=20Volf?= <66163112+matous-volf@users.noreply.github.com> Date: Sun, 8 Sep 2024 09:56:11 +0200 Subject: [PATCH 2/4] style: formatting --- src/models/task.rs | 6 ++++-- src/server/projects.rs | 9 ++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) 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(()) } From 7b98527882d55522eb7c4410d80709e852c8bfb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matou=C5=A1=20Volf?= <66163112+matous-volf@users.noreply.github.com> Date: Sun, 8 Sep 2024 09:56:23 +0200 Subject: [PATCH 3/4] feat: create a server function for deleting a task permanently --- src/server/tasks.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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(()) +} From 7ac3c6e136959a00d7ea3f066e36aa5f655c596c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matou=C5=A1=20Volf?= <66163112+matous-volf@users.noreply.github.com> Date: Sun, 8 Sep 2024 09:56:37 +0200 Subject: [PATCH 4/4] feat: add the ability to delete a task --- src/components/task_form.rs | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) 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",