diff --git a/html-router/assets/knowledge-graph.js b/html-router/assets/knowledge-graph.js
index 4d0cbd3..dbbc63e 100644
--- a/html-router/assets/knowledge-graph.js
+++ b/html-router/assets/knowledge-graph.js
@@ -419,6 +419,10 @@
document.addEventListener('DOMContentLoaded', () => tryRender(document));
// HTMX partial swaps
+ document.body.addEventListener('knowledge-graph-refresh', () => {
+ tryRender(document);
+ });
+
document.body.addEventListener('htmx:afterSettle', (evt) => {
tryRender(evt && evt.target ? evt.target : document);
});
diff --git a/html-router/src/routes/knowledge/handlers.rs b/html-router/src/routes/knowledge/handlers.rs
index a5a3c52..02dadaa 100644
--- a/html-router/src/routes/knowledge/handlers.rs
+++ b/html-router/src/routes/knowledge/handlers.rs
@@ -4,10 +4,11 @@ use std::fmt;
use axum::{
extract::{Path, Query, State},
- response::IntoResponse,
+ http::HeaderValue,
+ response::{IntoResponse, Response},
Form, Json,
};
-use axum_htmx::{HxBoosted, HxRequest};
+use axum_htmx::{HxBoosted, HxRequest, HX_TRIGGER};
use serde::{
de::{self, Deserializer, MapAccess, Visitor},
Deserialize, Serialize,
@@ -42,6 +43,16 @@ const DEFAULT_RELATIONSHIP_TYPE: &str = "relates_to";
const MAX_RELATIONSHIP_SUGGESTIONS: usize = 10;
const SUGGESTION_MIN_SCORE: f32 = 0.5;
+const GRAPH_REFRESH_TRIGGER: &str = r#"{"knowledge-graph-refresh":true}"#;
+
+fn respond_with_graph_refresh(response: TemplateResponse) -> Response {
+ let mut response = response.into_response();
+ if let Ok(value) = HeaderValue::from_str(GRAPH_REFRESH_TRIGGER) {
+ response.headers_mut().insert(HX_TRIGGER, value);
+ }
+ response
+}
+
#[derive(Deserialize, Default)]
pub struct FilterParams {
entity_type: Option,
@@ -148,11 +159,11 @@ pub async fn create_knowledge_entity(
let default_params = FilterParams::default();
let kb_data = build_knowledge_base_data(&state, &user, &default_params).await?;
- Ok(TemplateResponse::new_partial(
+ Ok(respond_with_graph_refresh(TemplateResponse::new_partial(
"knowledge/base.html",
"main",
kb_data,
- ))
+ )))
}
pub async fn suggest_knowledge_relationships(
@@ -806,7 +817,7 @@ pub async fn patch_knowledge_entity(
let content_categories = User::get_user_categories(&user.id, &state.db).await?;
// Render updated list
- Ok(TemplateResponse::new_template(
+ Ok(respond_with_graph_refresh(TemplateResponse::new_template(
"knowledge/entity_list.html",
EntityListData {
visible_entities,
@@ -818,7 +829,7 @@ pub async fn patch_knowledge_entity(
selected_content_category: None,
page_query: String::new(),
},
- ))
+ )))
}
pub async fn delete_knowledge_entity(
@@ -845,7 +856,7 @@ pub async fn delete_knowledge_entity(
// Get content categories
let content_categories = User::get_user_categories(&user.id, &state.db).await?;
- Ok(TemplateResponse::new_template(
+ Ok(respond_with_graph_refresh(TemplateResponse::new_template(
"knowledge/entity_list.html",
EntityListData {
visible_entities,
@@ -857,7 +868,7 @@ pub async fn delete_knowledge_entity(
selected_content_category: None,
page_query: String::new(),
},
- ))
+ )))
}
#[derive(Serialize)]
@@ -878,13 +889,13 @@ pub async fn delete_knowledge_relationship(
let relationships = User::get_knowledge_relationships(&user.id, &state.db).await?;
// Render updated list
- Ok(TemplateResponse::new_template(
+ Ok(respond_with_graph_refresh(TemplateResponse::new_template(
"knowledge/relationship_table.html",
RelationshipTableData {
entities,
relationships,
},
- ))
+ )))
}
#[derive(Deserialize)]
@@ -915,11 +926,11 @@ pub async fn save_knowledge_relationship(
let relationships = User::get_knowledge_relationships(&user.id, &state.db).await?;
// Render updated list
- Ok(TemplateResponse::new_template(
+ Ok(respond_with_graph_refresh(TemplateResponse::new_template(
"knowledge/relationship_table.html",
RelationshipTableData {
entities,
relationships,
},
- ))
+ )))
}