## Endpoints | Method | Path | Purpose | |---|---|---| | `GET` | `/api/lists/{id}/views` | every **shared** view on the list, plus this user's own **personal** views | | `POST` | `/api/lists/{id}/views` | create a view — `{name, scope, config, isDefault}` | | `POST` | `/api/lists/{id}/views/{viewId}` | **fork** a shared view into a personal copy owned by the caller — the escape hatch when someone else's shared view does not suit you | | `PUT` | `/api/lists/{id}/views/{viewId}` | update name, config or default flag | | `DELETE` | `/api/lists/{id}/views/{viewId}` | delete | Live-verified: `GET` → `200 {"views":[]}`. ## Acceptance criteria - [ ] Service methods + models; the `config` payload shape confirmed live by creating a view from the web (or via a test write) before typing it strictly. - [ ] A view picker on the list detail, separating shared from personal views and marking the default. - [ ] Create / rename / set-default / delete, and **Fork** on a shared view. - [ ] Applying a view drives the grid's columns/filter/sort. - [ ] `scope` (shared vs personal) is explicit in the create UI.
Activity