commit 430dacd9cafd13bb66cc3fff2852f31573301d71
parent a2b1c2eb8ad11a752fea1fa75f5b233ec2043d61
Author: Silas Brack <silasbrack@gmail.com>
Date: Thu, 11 Jun 2026 12:32:06 +0200
fix: use proper SSE format and outer morph for search responses
Search handler now returns datastar-patch-elements SSE events.
Search results template includes wrapper div with ID for outer
morph matching.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Diffstat:
2 files changed, 4 insertions(+), 9 deletions(-)
diff --git a/src/handlers/search.rs b/src/handlers/search.rs
@@ -1,8 +1,6 @@
use askama::Template;
use axum::{
- body::Body,
extract::State,
- http::{StatusCode, header},
response::{Html, Response},
Form,
};
@@ -11,6 +9,7 @@ use serde::Deserialize;
use crate::error::AppError;
use crate::handlers::auth::get_tokens_from_cookies;
+use crate::sse;
use crate::state::AppState;
use crate::templates::{ApplicationTemplate, SearchResultsTemplate, SearchTemplate};
use crate::trailbase::{ClientError, SearchResult};
@@ -57,11 +56,5 @@ pub async fn search(
let template = SearchResultsTemplate { results };
let html = template.render()?;
- Ok(Response::builder()
- .status(StatusCode::OK)
- .header(header::CONTENT_TYPE, "text/html")
- .header("datastar-selector", "#search-results")
- .header("datastar-mode", "inner")
- .body(Body::from(html))
- .unwrap())
+ Ok(sse::patch_elements(&html))
}
diff --git a/templates/search_results.html b/templates/search_results.html
@@ -1,3 +1,4 @@
+<div id="search-results">
{% if results.is_empty() %}
<p class="empty-message">No results found.</p>
{% else %}
@@ -16,3 +17,4 @@
{% endfor %}
</ul>
{% endif %}
+</div>