28 lines
1.8 KiB
Markdown
28 lines
1.8 KiB
Markdown
# Projects Interface Pattern Migration
|
|
|
|
Projects uses a full-height list-detail workspace. It owns native portfolio,
|
|
project, and milestone context; Tasks and Tickets own actionable work,
|
|
Connectors owns OpenProject transport, and optional integrations remain
|
|
capability-based.
|
|
|
|
| Surface | Task and archetype | Consequence and state contract |
|
|
| --- | --- | --- |
|
|
| `/projects` catalogue | Search/filter and select a planning object | Loading, empty, failed, filtered, and selected states retain the list context. Restricted records are removed by backend authorization rather than cosmetically hidden. |
|
|
| Object detail | Inspect status, dates, ownership/membership evidence, outcomes, benefits, dependencies, and links | The selected identity, key, state, and revision remain visible while detail changes. |
|
|
| Create/edit dialog | Adaptive create/edit | Core Dialog supplies focus containment and return. Stable key, state, visibility, parent, dates, and change reason have labelled controls; save errors remain attached to the dialog. |
|
|
| Revisioned save | Consequential corrective action | Every successful save creates immutable revision and lifecycle evidence under optimistic concurrency. The required change reason explains the new record. |
|
|
|
|
Creating and editing require the Projects write permission. Restricted
|
|
visibility changes who may read an object, so its consequence is explained at
|
|
the field and enforced by the backend ACL. The workspace reflows to list then
|
|
detail at narrow widths, preserves semantic button/list behavior, and uses Core
|
|
buttons, icon buttons, dialog, alerts, loading, status, field labels, scrolling,
|
|
and documentation help.
|
|
|
|
Verification:
|
|
|
|
- `npm run test:interface-pattern`
|
|
- Projects service, migration, and manifest tests
|
|
- the Core TypeScript graph, structural localization audit, theme check, module
|
|
permutations, and full-product bundle budget
|