Replace the Revit drawer with the assignment dialog

- RevitAssignmentDialog: objects as room/group/object with multi-select,
  filters and drag-and-drop or keyboard assignment onto rows, circuits or
  new circuits; room-wise automatic split under the socket limit; local
  plan with review of conflicts and limit overruns, one command on apply
  and re-check after a revision conflict.
- Row badge and context menu list linked objects and detach single
  objects or all; the context menu opens the dialog for a circuit.
- Remove the R7 drawer and direct grid drops; update AGENTS.md, API and
  architecture docs and mark R11-R14 complete.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Julian Appel 2026-10-30 21:39:27 +01:00
parent fd45a1caeb
commit 191455c745
12 changed files with 1885 additions and 157 deletions

View file

@ -323,7 +323,9 @@ not change the project revision or undo/redo stacks. Restoring a server-stored
snapshot verifies its checksum and the current-state hash, replaces supported
project data atomically and records a new `restore` revision with a complete
inverse command. Restore can therefore be undone and redone after a restart.
Current snapshot schema version 10 stores the Linear-XLSX configuration and
Current snapshot schema version 11 adds the project setting
`maxSocketsPerCircuit`; version 10 is upgraded with `null`. Version 10 stores
the Linear-XLSX configuration and
external state with Worksharing-ID identity. Empty versions 1 to 9 are upgraded;
versions containing legacy CSV configuration or external CSV state are rejected
with a German migration error. Version 9 additionally stores
@ -408,8 +410,22 @@ to preserve the row.
with stable BMK/UUIDs, derived voltage, one external-only row, required default
protection and its external object links. Its history-only inverse requires the
complete unchanged circuit snapshot and exact link set. Redo never recalculates
the BMK. All three external assignment stores share
the BMK. All external assignment stores share
`external-object-assignment.persistence.ts` for compatibility and link safety.
The editor no longer uses these three commands (they stay executable for
stored history): it assigns through the Revit assignment dialog
(`revit-assignment-dialog.tsx`, requirements §11). The dialog builds a local
plan with drag-and-drop, keyboard assignment and a room-wise automatic split
(`src/shared/revit/assignment-plan.ts`, shared with the API); a Revit object is
indivisible and always lands on exactly one row and circuit.
`external-object.apply-assignment-plan` writes the whole plan (new circuits
with BMKs planned once, new rows, row quantities, links) as one revision; its
history-only inverse `external-object.revert-assignment-plan` removes only
unchanged created structure. Planning-value conflicts and circuits above the
project socket limit need explicit confirmation. Only Revit device types with
`isSocket` (configuration schema 2; version 1 derives it from `socketCount`
rules) count towards `maxSocketsPerCircuit`. The row badge lists linked objects
and detaches single objects or all of them.
The current read-only
`GET /api/projects/:projectId/circuit-lists/:circuitListId/external-objects`
projection resolves the board through the owned CircuitList and returns compact
@ -452,6 +468,9 @@ Schema version 3 additionally carries the print cover fields `siteAddress`,
`workStage`, `projectLead` and `projectEditor` (migration `0008`); version 2
(without them) and baseline version 1 stay executable and keep the current
cover values. The PUT route accepts the cover fields optionally.
Schema version 4 adds the client-specific `maxSocketsPerCircuit` (migration
`0018`, positive integer or `null` = no limit); versions 1 to 3 keep the
current value. The PUT route accepts it optionally.
The public-building flag is the future sizing input for requiring halogen-free
cables and lines. The system catalog is `AV`, `SV`, `EV`,
`USV`, `MSR`, `SiBe`; at least one must be enabled and a type used by a board