feat: ability to edit a task #32
@@ -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()}
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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 {
 | 
				
			||||||
@@ -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)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user