feat: ability to edit a task #32
@@ -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