feat: ability to edit a task #32

Merged
matous-volf merged 2 commits from feat/task-edit into main 2024-09-07 08:26:42 +00:00
5 changed files with 19 additions and 23 deletions
Showing only changes of commit 6dcf00efe9 - Show all commits

View File

@ -20,13 +20,11 @@ pub(crate) fn ProjectsPage() -> Element {
key: "{project.id()}", key: "{project.id()}",
class: format!( class: format!(
"px-8 py-4 select-none {}", "px-8 py-4 select-none {}",
if project_being_edited().map(|p| p.id()) == Some(project.id()) { if project_being_edited().is_some_and(|p| p.id() == project.id()) {
"bg-zinc-700" "bg-zinc-700"
} else { "" } } else { "" }
), ),
onclick: move |_| { onclick: move |_| project_being_edited.set(Some(project.clone())),
project_being_edited.set(Some(project.clone()));
},
{project.title()} {project.title()}
} }
} }

View File

@ -10,24 +10,20 @@ use crate::query::{QueryErrors, QueryKey, QueryValue};
pub(crate) fn ProjectForm(project: Option<Project>, on_successful_submit: EventHandler<()>) pub(crate) fn ProjectForm(project: Option<Project>, on_successful_submit: EventHandler<()>)
-> Element { -> Element {
let query_client = use_query_client::<QueryValue, QueryErrors, QueryKey>(); let query_client = use_query_client::<QueryValue, QueryErrors, QueryKey>();
let project_for_submit = project.clone(); let project_for_submit = project.clone();
rsx! { rsx! {
form { form {
onsubmit: move |event| { onsubmit: move |event| {
let project_clone = project_for_submit.clone(); let project = project_for_submit.clone();
async move { async move {
let new_project = NewProject::new( let new_project = NewProject::new(
event.values().get("title").unwrap().as_value() event.values().get("title").unwrap().as_value()
); );
match project_clone { if let Some(project) = project {
Some(project) => { let _ = edit_project(project.id(), new_project).await;
let _ = edit_project(project.id(), new_project).await; } else {
} let _ = create_project(new_project).await;
None => {
let _ = create_project(new_project).await;
}
} }
query_client.invalidate_queries(&[ query_client.invalidate_queries(&[
QueryKey::Projects QueryKey::Projects

View File

@ -1,4 +1,4 @@
pub(crate) mod error; pub(crate) mod error;
pub(crate) mod error_vec; pub(crate) mod error_vec;
pub(crate) mod project_create_error; pub(crate) mod project_error;
pub(crate) mod task_create_error; pub(crate) mod task_error;

View File

@ -34,6 +34,12 @@ impl From<ValidationErrors> for ErrorVec<ProjectError> {
} }
} }
impl From<diesel::result::Error> for ProjectError {
fn from(_: diesel::result::Error) -> Self {
ProjectError::Error(Error::ServerInternal)
}
}
// Has to be implemented for Dioxus server functions. // Has to be implemented for Dioxus server functions.
impl Display for ProjectError { impl Display for ProjectError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {

View File

@ -1,6 +1,6 @@
use crate::errors::error::Error; use crate::errors::error::Error;
use crate::errors::error_vec::ErrorVec; use crate::errors::error_vec::ErrorVec;
use crate::errors::project_create_error::ProjectError; use crate::errors::project_error::ProjectError;
use crate::models::project::{NewProject, Project}; use crate::models::project::{NewProject, Project};
use crate::server::database_connection::establish_database_connection; use crate::server::database_connection::establish_database_connection;
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper}; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper};
@ -24,9 +24,7 @@ pub(crate) async fn create_project(new_project: NewProject)
.values(&new_project) .values(&new_project)
.returning(Project::as_returning()) .returning(Project::as_returning())
.get_result(&mut connection) .get_result(&mut connection)
.map_err::<ErrorVec<ProjectError>, _>( .map_err::<ErrorVec<ProjectError>, _>(|error| vec![error.into()].into())?;
|_| vec![ProjectError::Error(Error::ServerInternal)].into()
)?;
Ok(new_project) Ok(new_project)
} }
@ -69,9 +67,7 @@ pub(crate) async fn edit_project(project_id: i32, new_project: NewProject)
.set(title.eq(new_project.title)) .set(title.eq(new_project.title))
.returning(Project::as_returning()) .returning(Project::as_returning())
.get_result(&mut connection) .get_result(&mut connection)
.map_err::<ErrorVec<ProjectError>, _>( .map_err::<ErrorVec<ProjectError>, _>(|error| vec![error.into()].into())?;
|_| vec![ProjectError::Error(Error::ServerInternal)].into()
)?;
Ok(updated_project) Ok(updated_project)
} }