feat(examples): make v0 todo rename form editable

Turn the v0 todo row rename action into an editable generated form instead of a fixed submit value, and preserve validation/recovery behavior for blank titles. This keeps the beginner exemplar on generated form handles and user-visible recovery instead of hidden demo shortcuts.

req: examples/001

req: canonical_authoring/003
This commit is contained in:
slhx agent
2026-06-22 22:12:27 +02:00
parent 797132647f
commit 430603ec00
2 changed files with 27 additions and 2 deletions
+21
View File
@@ -402,6 +402,13 @@ mod auth_handlers {
fn rename_todo_effect(state: Arc<ExampleState>, form: RenameTodo) -> impl IntoEffect {
// req: examples/001 req: canonical_authoring/003
if form.title.as_str().is_empty() {
return Some((
todo_row::rename_todo_form.focus("title"),
todos::notice.set("Add a title before renaming"),
));
}
let mut todos = state.todos.lock().unwrap();
todos
.iter_mut()
@@ -710,6 +717,20 @@ mod tests {
assert!(add.payload_contains("Added Ship v0"));
assert!(add.resets_form(todos::new_todo));
let rename_validation = inspect_batch(
InteractionRequest::from(form(
todo_row::rename_todo,
&[("id", "1"), ("title", " ")],
))
.dispatch_async(handlers(state.clone()))
.await
.unwrap()
.batch,
);
assert_eq!(state.todos.lock().unwrap()[0].title, "Ship v0");
assert!(rename_validation.payload_contains("Add a title before renaming"));
assert!(rename_validation.updates_text(todos::notice));
let rename = inspect_batch(
InteractionRequest::from(form(
todo_row::rename_todo,
+6 -2
View File
@@ -1,8 +1,12 @@
<li +data-key="self.id">
<span>{+ self.title +}</span>
<form data-hemx-handle="rename_todo">
<form data-hemx-handle="rename_todo" data-hemx-form="rename_todo">
<input type="hidden" name="id" +value="self.id">
<button type="submit" name="title" value="Renamed todo">Rename</button>
<label>
Rename
<input name="title" +value="self.title" required="required">
</label>
<button type="submit">Save</button>
</form>
<form data-hemx-handle="delete_todo">
<button type="submit" name="id" +value="self.id">Delete</button>