refactor(kanban): shorten generated resource paths

Import scoped generated board modules at the kanban boundary so tests and page helpers read as local board resources without fully qualified generated-resource ceremony.

req: component/003

req: dx/006
This commit is contained in:
slhx agent
2026-06-01 22:59:00 +02:00
parent edd804a505
commit ef3323831f
2 changed files with 11 additions and 11 deletions
+8 -8
View File
@@ -3,7 +3,7 @@ pub mod ui {}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::ui; use super::ui::{board, board_card};
use hemplate::Hemplate; use hemplate::Hemplate;
use scraper::{Html, Selector}; use scraper::{Html, Selector};
use slhx::{Effect, IntoEffect, Payload, RenderSlotExt}; use slhx::{Effect, IntoEffect, Payload, RenderSlotExt};
@@ -27,18 +27,18 @@ mod tests {
#[test] #[test]
fn kanban_board_updates_generated_slot() { fn kanban_board_updates_generated_slot() {
fn render_board() -> impl IntoEffect { fn render_board() -> impl IntoEffect {
ui::board::slots::board.render(&empty_board()) board::slots::board.render(&empty_board())
} }
let effect = inspect(render_board()); let effect = inspect(render_board());
assert!(effect.has_slot(ui::board::slots::board)); assert!(effect.has_slot(board::slots::board));
assert!(matches!(effect.ops(), [Effect::Put { payload: Payload::Html(_), .. }])); assert!(matches!(effect.ops(), [Effect::Put { payload: Payload::Html(_), .. }]));
} }
// req: html_safety/002 req: view/001 req: test/005 // req: html_safety/002 req: view/001 req: test/005
#[test] #[test]
fn kanban_board_test_payload_is_rendered_by_a_hemplate_view() { fn kanban_board_test_payload_is_rendered_by_a_hemplate_view() {
let html = slhx::render_html(&empty_board()); let html = super::ui::render_html(&empty_board());
let document = Html::parse_fragment(html.as_str()); let document = Html::parse_fragment(html.as_str());
assert_eq!(document.select(&selector(".columns")).count(), 1); assert_eq!(document.select(&selector(".columns")).count(), 1);
} }
@@ -57,19 +57,19 @@ mod tests {
fn kanban_form_handler_is_checked_against_hemplate_form() { fn kanban_form_handler_is_checked_against_hemplate_form() {
#[slhx::handler] #[slhx::handler]
fn create_card(_form: slhx::Form<CreateCard>) -> impl IntoEffect { fn create_card(_form: slhx::Form<CreateCard>) -> impl IntoEffect {
ui::board::slots::notice.text("queued") board::slots::notice.text("queued")
} }
let effect = inspect(create_card(CreateCard::FORM)); let effect = inspect(create_card(CreateCard::FORM));
assert!(effect.has_slot(ui::board::slots::notice)); assert!(effect.has_slot(board::slots::notice));
assert!(matches!(effect.ops(), [Effect::Put { payload: Payload::Text(_), .. }])); assert!(matches!(effect.ops(), [Effect::Put { payload: Payload::Text(_), .. }]));
} }
// req: examples/001 req: form/002 req: codegen/003 // req: examples/001 req: form/002 req: codegen/003
#[test] #[test]
fn kanban_template_exports_form_and_card_handles() { fn kanban_template_exports_form_and_card_handles() {
assert_ne!(ui::board::handles::create_card.id(), ui::board_card::handles::move_right.id()); assert_ne!(board::handles::create_card.id(), board_card::handles::move_right.id());
assert_eq!(ui::board::forms::create_card.field("title").resource, ui::board::forms::create_card.id()); assert_eq!(board::forms::create_card.field("title").resource, board::forms::create_card.id());
} }
} }
+3 -3
View File
@@ -6,7 +6,7 @@ use futures_util::{stream, StreamExt};
use hemplate::Hemplate; use hemplate::Hemplate;
use slhx::{IntoEffect, RenderSlotExt, SafeHtml}; use slhx::{IntoEffect, RenderSlotExt, SafeHtml};
use slhx_axum::{runtime_js, sse, DispatchRejection, EffectResponse, HandlerRegistry, InteractionForm, PageRequest}; use slhx_axum::{runtime_js, sse, DispatchRejection, EffectResponse, HandlerRegistry, InteractionForm, PageRequest};
use slhx_kanban_example::ui; use slhx_kanban_example::ui::{self, board as board_ui};
use slhx_kanban_example::ui::board::{forms, handles, slots}; use slhx_kanban_example::ui::board::{forms, handles, slots};
use slhx_kanban_example::ui::board_card::handles as card_handles; use slhx_kanban_example::ui::board_card::handles as card_handles;
use std::collections::BTreeMap; use std::collections::BTreeMap;
@@ -226,7 +226,7 @@ fn parse_column(value: Option<&str>) -> usize {
fn page_html(board: &BoardState) -> String { fn page_html(board: &BoardState) -> String {
// Explicit full-page composition boundary for already-rendered hemplate fragments. // Explicit full-page composition boundary for already-rendered hemplate fragments.
// req: html_safety/002 req: view/001 // req: html_safety/002 req: view/001
ui::board::render_html(&Board { board_ui::render_html(&Board {
options: render_options(), options: render_options(),
board: render_board(board), board: render_board(board),
}) })
@@ -354,7 +354,7 @@ mod tests {
// req: html_safety/002 req: view/001 req: test/005 // req: html_safety/002 req: view/001 req: test/005
#[test] #[test]
fn presence_payload_is_rendered_by_a_hemplate_view() { fn presence_payload_is_rendered_by_a_hemplate_view() {
let html = slhx::render_html(&Presence { count: 7 }); let html = ui::render_html(&Presence { count: 7 });
let document = Html::parse_fragment(html.as_str()); let document = Html::parse_fragment(html.as_str());
assert_eq!(document.select(&selector("span.presence")).count(), 2); assert_eq!(document.select(&selector("span.presence")).count(), 2);
assert_eq!( assert_eq!(