Files
kandev/docs/plans/org-units/task-04-unit-interface.md
T
João Salavisa 481359ddb2 feat(auth): organization units, tenancy, roles and scopes for team access (#2919)
Co-authored-by: Kandev Agent <agent@kandev.dev>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-05 13:40:43 +00:00

92 lines
3.0 KiB
Markdown

---
id: "04-unit-interface"
title: "Unit tree and placement interface"
status: done
wave: 3
depends_on: ["03-unit-management-api"]
plan: "plan.md"
spec: "../../specs/workspaces/requirements/org-units.md"
---
# Task 04: Unit Tree and Placement Interface
## Outcome
An organization administrator can build the tree, manage a unit's members, and
move a workspace between units, on desktop and on a phone.
## In scope
- A unit tree in settings under Access Control, with create, rename, move and
delete.
- A unit members view reusing the existing member picker and role control.
- Workspace placement shown on the workspace, with a move control gated on the
caller's scopes.
- Copy in all five locales.
## Out of scope
- Removing the visibility control, order 05.
- Screenshots and public documentation, order 06.
## Requirements
`REQ-WORKSPACES-ORG-UNITS-001`, `REQ-WORKSPACES-ORG-UNITS-002`,
`REQ-WORKSPACES-ORG-UNITS-005`.
Acceptance criteria: `AC-WORKSPACES-ORG-UNITS-001.8`,
`AC-WORKSPACES-ORG-UNITS-002.1`, `AC-WORKSPACES-ORG-UNITS-005.2`.
## System design
[Organization units](../../specs/workspaces/system-design/org-units.md), section
Components and responsibilities.
## Implementation acceptance
1. The tree renders an organization's units in hierarchy order and hides
controls the caller's scopes do not permit.
2. Moving a workspace updates its displayed placement without a reload.
3. The interface works at a phone viewport, per `/mobile-parity`.
## Verification
```bash
cd apps/web
pnpm run typecheck && pnpm run lint
pnpm test -- components/settings/units lib/api/domains/org-units-api.test.ts
pnpm run i18n:check && pnpm run i18n:ratchet
```
## Likely files
- `apps/web/components/settings/units/` (new)
- `apps/web/lib/api/domains/org-units-api.ts` (new)
- `apps/web/components/app-sidebar/sections/settings/settings-menu-sections.ts`
- `apps/web/src/locales/*/settings.json`
## Results
Done. `Settings > Access Control > Organization units` renders the tree with a
row per unit, indented by depth derived from the materialized path, and offers
create, delete and member management. A personal unit and the root show no
control that would only ever be refused: a personal unit takes no members and
cannot be deleted, and deleting the root would leave every workspace beneath it
homeless.
Copy ships in all five locales.
A gap found later while auditing screenshots: this order claimed workspace
placement was shown on the workspace, and it was not. The API and the e2e
coverage existed, but nothing in the interface could move a workspace, which is
the only way to narrow access in this design. `WorkspacePlacementCard` closes
it, gated on `workspace.manage` and restoring the previous unit when a move is
refused.
RED/GREEN:
- RED: treating a personal unit as an ordinary one fails
"offers no member or delete control on a personal unit".
- GREEN: `pnpm test -- components/settings/units lib/api/domains/org-units-api.test.ts`
- GREEN: typecheck, eslint, i18n:check, i18n:ratchet.