A Lovelace dashboard strategy generates the panel views at render time: a party-board view and one quest-log view per child, with navigation wired between them, so quest_log_path and board_path are COMPUTED rather than configured. A test asserts the strategy output for a three-child household (the views, their paths, and the cards in each).
Changes
frontend/src/strategy.ts (new) — a Lovelace dashboard strategy registered on the bundle that reads the household child_roster at render time and generates the party-board view plus one quest-log view per child (ordered by sort_order) with computed paths and cross-wired navigation, so quest_log_path / board_path need not be configured. Explicit user configuration can still override.
frontend/src/nestquest-cards.ts — registers the strategy.
custom_components/nestquest/www/nestquest-cards.js — rebuilt and committed.
frontend/tests/render-strategy.mjs (new) + tests/test_panel_cards.py — assert the strategy output for a three-child household (views, paths, cards).
Verification
TZ=UTC uv run pytest -q → 1688 passed
cd frontend && npm run build → clean, committed bundle rebuilt
Opened by the controller on the developer's behalf after the developer's PR step was permission-denied; the branch and commit are the developer's (46f45aa4e5).
## Maestro task
`c859af23-3156-47c7-a6fd-c4ec1848609b` — Dashboard strategy generating the views (Feature 20 — Zero-Config Panel Dashboard)
## Done-condition (verbatim)
A Lovelace dashboard strategy generates the panel views at render time: a party-board view and one quest-log view per child, with navigation wired between them, so quest_log_path and board_path are COMPUTED rather than configured. A test asserts the strategy output for a three-child household (the views, their paths, and the cards in each).
## Changes
- **frontend/src/strategy.ts (new)** — a Lovelace dashboard strategy registered on the bundle that reads the household `child_roster` at render time and generates the party-board view plus one quest-log view per child (ordered by sort_order) with computed paths and cross-wired navigation, so `quest_log_path` / `board_path` need not be configured. Explicit user configuration can still override.
- **frontend/src/nestquest-cards.ts** — registers the strategy.
- **custom_components/nestquest/www/nestquest-cards.js** — rebuilt and committed.
- **frontend/tests/render-strategy.mjs (new)** + **tests/test_panel_cards.py** — assert the strategy output for a three-child household (views, paths, cards).
## Verification
- `TZ=UTC uv run pytest -q` → 1688 passed
- `cd frontend && npm run build` → clean, committed bundle rebuilt
Opened by the controller on the developer's behalf after the developer's PR step was permission-denied; the branch and commit are the developer's (46f45aa4e5ff567fa92ff47c3f0c79cb369e76f4).
The board and quest-log cards navigate by URL path, but the paths had
to be configured by hand per view. Add a custom dashboard strategy
(window.customStrategies['nestquest-party'], bundled with the cards) so
a dashboard with strategy { type: custom:nestquest-party } gets its
views GENERATED at render time: a party-board view at the dashboard
root and one quest-log view per child in the household roster's
sort_order. The card paths are computed — the board's quest_log_path is
the root, each log's path is the child slug (so childSlugFromPath
resolves it) and its board_path points back — making quest_log_path and
board_path derived rather than configured. Zero children still render
the board alone (its own not-set-up notice covers the empty roster),
and an explicit url_path in the strategy config pins the root.
- P1: every generated view now emits type: "panel" — HA defaults an
unspecified view to Masonry, which constrains the 1080px-tall card to
a narrow column (the exact failure the README warns about), and a
generated dashboard leaves no editor step to set Panel by hand. Added
a regression assertion that each view's type is "panel".
- P3: quest-log view titles use the roster's display name ("Ada's Quest
Log") instead of the raw slug; the slug stays the view path.
- P3: added a focused test that weather_entity from the strategy config
is passed through to every generated card config.
- P3: dropped the vestigial new (): unknown constructor from
StrategyClass — HA calls generate() statically.
- P2: README's TouchHub setup now documents the zero-config dashboard
strategy as the primary path, with the manual steps kept as the
alternative (full runbook rewrite is task fc69c940).
- Rebuilt the bundle.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Maestro task
c859af23-3156-47c7-a6fd-c4ec1848609b— Dashboard strategy generating the views (Feature 20 — Zero-Config Panel Dashboard)Done-condition (verbatim)
A Lovelace dashboard strategy generates the panel views at render time: a party-board view and one quest-log view per child, with navigation wired between them, so quest_log_path and board_path are COMPUTED rather than configured. A test asserts the strategy output for a three-child household (the views, their paths, and the cards in each).
Changes
child_rosterat render time and generates the party-board view plus one quest-log view per child (ordered by sort_order) with computed paths and cross-wired navigation, soquest_log_path/board_pathneed not be configured. Explicit user configuration can still override.Verification
TZ=UTC uv run pytest -q→ 1688 passedcd frontend && npm run build→ clean, committed bundle rebuiltOpened by the controller on the developer's behalf after the developer's PR step was permission-denied; the branch and commit are the developer's (
46f45aa4e5).The board and quest-log cards navigate by URL path, but the paths had to be configured by hand per view. Add a custom dashboard strategy (window.customStrategies['nestquest-party'], bundled with the cards) so a dashboard with strategy { type: custom:nestquest-party } gets its views GENERATED at render time: a party-board view at the dashboard root and one quest-log view per child in the household roster's sort_order. The card paths are computed — the board's quest_log_path is the root, each log's path is the child slug (so childSlugFromPath resolves it) and its board_path points back — making quest_log_path and board_path derived rather than configured. Zero children still render the board alone (its own not-set-up notice covers the empty roster), and an explicit url_path in the strategy config pins the root.- P1: every generated view now emits type: "panel" — HA defaults an unspecified view to Masonry, which constrains the 1080px-tall card to a narrow column (the exact failure the README warns about), and a generated dashboard leaves no editor step to set Panel by hand. Added a regression assertion that each view's type is "panel". - P3: quest-log view titles use the roster's display name ("Ada's Quest Log") instead of the raw slug; the slug stays the view path. - P3: added a focused test that weather_entity from the strategy config is passed through to every generated card config. - P3: dropped the vestigial new (): unknown constructor from StrategyClass — HA calls generate() statically. - P2: README's TouchHub setup now documents the zero-config dashboard strategy as the primary path, with the manual steps kept as the alternative (full runbook rewrite is task fc69c940). - Rebuilt the bundle.Independent Claude Sonnet 5 review completed for this exact commit.