PH1.5 — Web shared UI: Optimus wrappers, pipes, view-model types, generic admin CRUD, store slice pattern #13

Closed
opened 2026-09-11 09:02:10 +00:00 by bart · 1 comment
Collaborator

Parent

Row PH1.5 in docs/12-implementation-plan.md (branch, owned paths and doc section are defined there).

What to build

Features can build on a shared/ui layer wrapping Optimus UI, localTime (Europe/Amsterdam, date visible) and confidence (% with n=) pipes, API-independent ScheduleRow/ScheduleItem and map GeoJSON view models, core stores (user, config, notifications, language), and a signalStoreFeature slice example. A generic admin CRUD table+form driven by the OpenAPI schema lists, creates, edits and soft-deletes any master-data table (P15).

Acceptance criteria

  • Admin CRUD page (P15) lists/creates/edits/soft-deletes a table given only its OpenAPI schema
  • localTime shows Europe/Amsterdam with the date; confidence renders % with n=
  • shared/ components use only input()/output() — no store injection, no HTTP — verified by a lint rule or test
  • Example feature store composes two slice files; shared i18n scope has nl/en parity
  • No feature imports Optimus UI directly (lint rule)

Blocked by

  • #5 — Web skeleton: Angular workspace, PKCE login, shell, complete routes and nav, Transloco
## Parent Row **PH1.5** in `docs/12-implementation-plan.md` (branch, owned paths and doc section are defined there). ## What to build Features can build on a `shared/ui` layer wrapping Optimus UI, `localTime` (Europe/Amsterdam, date visible) and `confidence` (% with `n=`) pipes, API-independent `ScheduleRow`/`ScheduleItem` and map GeoJSON view models, core stores (user, config, notifications, language), and a `signalStoreFeature` slice example. A generic admin CRUD table+form driven by the OpenAPI schema lists, creates, edits and soft-deletes any master-data table (P15). ## Acceptance criteria - [x] Admin CRUD page (P15) lists/creates/edits/soft-deletes a table given only its OpenAPI schema - [x] `localTime` shows Europe/Amsterdam with the date; `confidence` renders `%` with `n=` - [x] `shared/` components use only `input()`/`output()` — no store injection, no HTTP — verified by a lint rule or test - [x] Example feature store composes two slice files; `shared` i18n scope has `nl`/`en` parity - [x] No feature imports Optimus UI directly (lint rule) ## Blocked by - #5 — Web skeleton: Angular workspace, PKCE login, shell, complete routes and nav, Transloco
patrick self-assigned this 2026-09-11 11:03:45 +00:00
Owner

Starting on this. Branch feature/web-shared-ui, branched from main (main already has frontend/ from #5/#50 web-skeleton). Owning frontend/src/app/shared/** and frontend/src/app/core/stores/** only, per CLAUDE.md — leaving features/admin-crud/** (route wiring) alone since that's outside this row.

Plan: shared/ui Optimus wrappers (button, tag, input-text, textarea, select, checkbox, dialog, table, toast, confirm-dialog), localTime/confidence pipes, ScheduleRow/ScheduleItem + map GeoJSON view-model types, a generic shared/admin-crud table+form (P15) driven by a representative fixture schema (backend/openapi.json isn't there yet — PH1.7), and core/stores (current-user, config, language, notifications) with notifications as the two-slice signalStoreFeature worked example.

Will file a seam-request issue for one thing I can't fix myself: core/i18n/transloco-loader.ts (owned by PH0.5, not this row) resolves any non-shell scope to features/<scope>/i18n/..., so shared/i18n/** won't actually load at runtime under a shared scope until that gets a special case. Ticking acceptance criteria as I go.

Starting on this. Branch `feature/web-shared-ui`, branched from `main` (main already has `frontend/` from #5/#50 web-skeleton). Owning `frontend/src/app/shared/**` and `frontend/src/app/core/stores/**` only, per CLAUDE.md — leaving `features/admin-crud/**` (route wiring) alone since that's outside this row. Plan: `shared/ui` Optimus wrappers (button, tag, input-text, textarea, select, checkbox, dialog, table, toast, confirm-dialog), `localTime`/`confidence` pipes, `ScheduleRow`/`ScheduleItem` + map GeoJSON view-model types, a generic `shared/admin-crud` table+form (P15) driven by a representative fixture schema (`backend/openapi.json` isn't there yet — PH1.7), and `core/stores` (current-user, config, language, notifications) with `notifications` as the two-slice `signalStoreFeature` worked example. Will file a seam-request issue for one thing I can't fix myself: `core/i18n/transloco-loader.ts` (owned by PH0.5, not this row) resolves any non-`shell` scope to `features/<scope>/i18n/...`, so `shared/i18n/**` won't actually load at runtime under a `shared` scope until that gets a special case. Ticking acceptance criteria as I go.
Sign in to join this conversation.
No labels
ready-for-agent
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
patrick/Polaris#13
No description provided.