From e325de6352a6a9b64ecbb833558147fee5101c60 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Wed, 14 Feb 2024 16:44:48 +0100 Subject: [PATCH] Also allow resolving federated edit conflicts --- src/backend/database/conflict.rs | 2 +- src/common/mod.rs | 2 +- src/frontend/app.rs | 4 +++- src/frontend/components/nav.rs | 3 +++ src/frontend/pages/article/edit.rs | 33 ++++++++++++++++++++++-------- src/frontend/pages/conflicts.rs | 26 +++++++++++++++++++++++ src/frontend/pages/mod.rs | 1 + 7 files changed, 60 insertions(+), 11 deletions(-) create mode 100644 src/frontend/pages/conflicts.rs diff --git a/src/backend/database/conflict.rs b/src/backend/database/conflict.rs index 1aee954..8e5c816 100644 --- a/src/backend/database/conflict.rs +++ b/src/backend/database/conflict.rs @@ -99,7 +99,7 @@ impl DbConflict { hash: self.hash.clone(), three_way_merge, summary: self.summary.clone(), - article_id: original_article.id, + article: original_article.clone(), previous_version_id: original_article .latest_edit_version(&data.db_connection)?, })) diff --git a/src/common/mod.rs b/src/common/mod.rs index 27e6e80..d4e53f5 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -217,7 +217,7 @@ pub struct ApiConflict { pub hash: EditVersion, pub three_way_merge: String, pub summary: String, - pub article_id: i32, + pub article: DbArticle, pub previous_version_id: EditVersion, } diff --git a/src/frontend/app.rs b/src/frontend/app.rs index 9f4ec76..8736bfe 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -7,6 +7,7 @@ use crate::frontend::pages::article::edit::EditArticle; use crate::frontend::pages::article::history::ArticleHistory; use crate::frontend::pages::article::list::ListArticles; use crate::frontend::pages::article::read::ReadArticle; +use crate::frontend::pages::conflicts::Conflicts; use crate::frontend::pages::diff::EditDiff; use crate::frontend::pages::instance_details::InstanceDetails; use crate::frontend::pages::login::Login; @@ -94,7 +95,7 @@ pub fn App() -> impl IntoView { - + @@ -104,6 +105,7 @@ pub fn App() -> impl IntoView { + diff --git a/src/frontend/components/nav.rs b/src/frontend/components/nav.rs index 0e99b53..a32f6a0 100644 --- a/src/frontend/components/nav.rs +++ b/src/frontend/components/nav.rs @@ -35,6 +35,9 @@ pub fn Nav() -> impl IntoView {
  • "Create Article"
  • +
  • + "Edit Conflicts" +
  • impl IntoView { let article = article_resource(); + let (edit_response, set_edit_response) = create_signal(EditResponse::None); + let (edit_error, set_edit_error) = create_signal(None::); + + let conflict_id = move || use_params_map().get().get("conflict_id").cloned(); + if let Some(conflict_id) = conflict_id() { + create_action(move |conflict_id: &String| { + let conflict_id: i32 = conflict_id.parse().unwrap(); + async move { + let conflict = GlobalState::api_client() + .get_conflicts() + .await + .unwrap() + .into_iter() + .find(|c| c.id == conflict_id) + .unwrap(); + set_edit_response.set(EditResponse::Conflict(conflict)); + set_edit_error.set(Some(CONFLICT_MESSAGE.to_string())); + } + }) + .dispatch(conflict_id); + } let (text, set_text) = create_signal(String::new()); let (summary, set_summary) = create_signal(String::new()); - let (edit_response, set_edit_response) = create_signal(EditResponse::None); - let (edit_error, set_edit_error) = create_signal(None::); let (wait_for_response, set_wait_for_response) = create_signal(false); let button_is_disabled = Signal::derive(move || wait_for_response.get() || summary.get().is_empty()); @@ -58,12 +80,7 @@ pub fn EditArticle() -> impl IntoView { match res { Ok(Some(conflict)) => { set_edit_response.update(|v| *v = EditResponse::Conflict(conflict)); - set_edit_error.update(|e| { - *e = Some( - "There was an edit conflict. Resolve it manually and resubmit." - .to_string(), - ) - }); + set_edit_error.set(Some(CONFLICT_MESSAGE.to_string())); } Ok(None) => { set_edit_response.update(|v| *v = EditResponse::Success); diff --git a/src/frontend/pages/conflicts.rs b/src/frontend/pages/conflicts.rs new file mode 100644 index 0000000..b01bfb8 --- /dev/null +++ b/src/frontend/pages/conflicts.rs @@ -0,0 +1,26 @@ +use crate::frontend::app::GlobalState; +use crate::frontend::article_link; +use crate::frontend::article_title; +use leptos::*; + +#[component] +pub fn Conflicts() -> impl IntoView { + let conflicts = create_resource( + move || {}, + |_| async move { GlobalState::api_client().get_conflicts().await.unwrap() }, + ); + + view! { +

    Your unresolved edit conflicts

    + + + + } +} diff --git a/src/frontend/pages/mod.rs b/src/frontend/pages/mod.rs index 020a5e1..ebcda15 100644 --- a/src/frontend/pages/mod.rs +++ b/src/frontend/pages/mod.rs @@ -4,6 +4,7 @@ use leptos::{create_resource, Resource, SignalGet}; use leptos_router::use_params_map; pub(crate) mod article; +pub(crate) mod conflicts; pub(crate) mod diff; pub(crate) mod instance_details; pub(crate) mod login;