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)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user