feat(web): shared UI wrappers, pipes, stores and store-slice pattern #60
No reviewers
Labels
No labels
in-progress
in-review
ready-for-agent
seam-request
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
patrick/Polaris!60
Loading…
Reference in a new issue
No description provided.
Delete branch "feature/web-shared-ui"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
PH1.5 (docs/12-implementation-plan.md) — establishes the layer every later frontend feature ticket builds on.
What's in here
shared/ui: thin, dumb (input()/output()-only) wrappers around Optimus UI — button, tag, input-text, textarea, select, checkbox, dialog, table, toast (+AppToastService), confirm-dialog (+AppConfirmService). Features never import@openng/optimus-uidirectly; onlyshared/uidoes.shared/pipes:localTime(Europe/Amsterdam, date always visible, DST-aware) andconfidence(%withn=), per CLAUDE.md / docs/06-ux.md.shared/models:ScheduleRow/ScheduleItemand map GeoJSON view-model types (FeatureCollectionfor sites/routes/stops) — types only, API-independent; the Gantt/map components land later in track T-F.shared/admin-crud: generic P15 admin CRUD (table + dynamic form) driven by a minimal, tolerant OpenAPI-schema-shaped config.backend/openapi.jsondoesn't exist yet (PH1.7), so it's built and tested against a representative fixture and degrades gracefully on an unrecognised propertytype/format. Fullyinput()/output()-driven — no HTTP, no store injection.core/stores:current-user,config,languageas simpleSignalStorewrappers over existingcore/services, andnotificationsas the worked example of thesignalStoreFeatureslice-composition pattern (store/with-feed.ts+store/with-read-state.ts, composed innotifications.store.ts) every later feature store follows.shared/architecture: two specs (no-optimus-outside-shared,dumb-components) statically enforce "no feature imports Optimus directly" and "shared/ components are dumb" viaimport.meta.globreading source as text — a test rather than an ESLint rule becauseeslint.config.js/tools/eslint-rules/**sit outside this ticket's owned paths.shared/i18n: thesharedTransloco scope'snl/enstrings.Known gap (seam request filed)
core/i18n/transloco-loader.ts(owned by PH0.5, not this row) resolves any non-shellscope tofeatures/<scope>/i18n/..., soprovideTranslocoScope('shared')would currently 404 instead of resolving toshared/i18n/.... Doesn't block this PR (nothing mountsshared/ui/shared/admin-crudin a routed page yet), but will block the first feature that does. Filed as #59 with the one-line fix.Acceptance criteria (issue #13)
localTimeshows Europe/Amsterdam with the date;confidencerenders%withn=shared/components use onlyinput()/output()— no store injection, no HTTP — verified by a testsharedi18n scope hasnl/enparityTesting
npm run build/npm run lint/npm run testall green — 63 tests across 18 files.npm run i18n:parityOK.Closes #13
🤖 Generated with Claude Code
https://claude.ai/code/session_01LoNrSy7Reyp7evkfcdHeLX