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