feat: polish project editing
This commit is contained in:
		| @@ -20,13 +20,11 @@ pub(crate) fn ProjectsPage() -> Element { | ||||
|                             key: "{project.id()}", | ||||
|                             class: format!( | ||||
|                                 "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" | ||||
|                                 } else { "" } | ||||
|                             ), | ||||
|                             onclick: move |_| { | ||||
|                                 project_being_edited.set(Some(project.clone())); | ||||
|                             }, | ||||
|                             onclick: move |_| project_being_edited.set(Some(project.clone())), | ||||
|                             {project.title()} | ||||
|                         } | ||||
|                     } | ||||
|   | ||||
| @@ -10,24 +10,20 @@ use crate::query::{QueryErrors, QueryKey, QueryValue}; | ||||
| pub(crate) fn ProjectForm(project: Option<Project>, on_successful_submit: EventHandler<()>) | ||||
|                           -> Element { | ||||
|     let query_client = use_query_client::<QueryValue, QueryErrors, QueryKey>(); | ||||
|      | ||||
|     let project_for_submit = project.clone(); | ||||
|      | ||||
|  | ||||
|     rsx! { | ||||
|         form { | ||||
|             onsubmit: move |event| { | ||||
|                 let project_clone = project_for_submit.clone(); | ||||
|                 let project = project_for_submit.clone(); | ||||
|                 async move { | ||||
|                     let new_project = NewProject::new( | ||||
|                         event.values().get("title").unwrap().as_value() | ||||
|                     ); | ||||
|                     match project_clone { | ||||
|                         Some(project) => { | ||||
|                             let _ = edit_project(project.id(), new_project).await; | ||||
|                         } | ||||
|                         None => { | ||||
|                             let _ = create_project(new_project).await; | ||||
|                         } | ||||
|                     if let Some(project) = project { | ||||
|                         let _ = edit_project(project.id(), new_project).await; | ||||
|                     } else { | ||||
|                         let _ = create_project(new_project).await; | ||||
|                     } | ||||
|                     query_client.invalidate_queries(&[ | ||||
|                         QueryKey::Projects | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| pub(crate) mod error; | ||||
| pub(crate) mod error_vec; | ||||
| pub(crate) mod project_create_error; | ||||
| pub(crate) mod task_create_error; | ||||
| pub(crate) mod project_error; | ||||
| pub(crate) mod task_error; | ||||
|   | ||||
| @@ -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.
 | ||||
| impl Display for ProjectError { | ||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||
| @@ -1,6 +1,6 @@ | ||||
| use crate::errors::error::Error; | ||||
| 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::server::database_connection::establish_database_connection; | ||||
| use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper}; | ||||
| @@ -24,9 +24,7 @@ pub(crate) async fn create_project(new_project: NewProject) | ||||
|         .values(&new_project) | ||||
|         .returning(Project::as_returning()) | ||||
|         .get_result(&mut connection) | ||||
|         .map_err::<ErrorVec<ProjectError>, _>( | ||||
|             |_| vec![ProjectError::Error(Error::ServerInternal)].into() | ||||
|         )?; | ||||
|         .map_err::<ErrorVec<ProjectError>, _>(|error| vec![error.into()].into())?; | ||||
|  | ||||
|     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)) | ||||
|         .returning(Project::as_returning()) | ||||
|         .get_result(&mut connection) | ||||
|         .map_err::<ErrorVec<ProjectError>, _>( | ||||
|             |_| vec![ProjectError::Error(Error::ServerInternal)].into() | ||||
|         )?; | ||||
|         .map_err::<ErrorVec<ProjectError>, _>(|error| vec![error.into()].into())?; | ||||
|  | ||||
|     Ok(updated_project) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user