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

@ -500,9 +500,17 @@ Full request example and calculation rules: `docs/cable-sizing-module.md`.
additions, source changes, unchanged and missing objects. Apply requires the
preview hash and source decisions and updates linked row quantities atomically.
- `GET|PUT .../external-model/objects` loads one compact project list and
applies revision-safe multi-object planning changes.
applies revision-safe multi-object planning changes. The list also carries
`maxSocketsPerCircuit` and the `socketDeviceTypeIds` of the configuration.
- `POST .../objects/assignment-plan` applies one plan of the Revit assignment
dialog: `{ expectedRevision, circuitListId, newCircuits: [{ key, sectionId }],
rows: [{ kind: "existing-row" | "new-row" | "new-row-in-new-circuit", … ,
objectIds }], confirmedConflictObjectIds, confirmedOverLimitCircuitKeys }`
(strict schema). New-circuit BMKs follow the request order; circuits above
the project socket limit are confirmed by circuit id or `new:<key>`.
- `POST .../objects/assign-row|assign-new-row|assign-new-circuit|detach-row`
changes external-object row assignments through persistent commands.
remain available; the editor uses only `detach-row` (single objects or all
objects of one row).
- `POST .../objects/delete-missing` requires `confirmed: true`, deletes only
objects marked missing and adjusts linked row quantities in the same command.
- `POST .../external-model/return-workbook` creates the structure-preserving

View file

@ -736,6 +736,36 @@ SQLite-Blöcken. Der synthetische Abnahmetest verarbeitet 5.000 Objekte; Details
und Messwerte stehen in
[R10-Abnahme](spec/revit-excel-r10-validation.md).
## Revit-Zuordnungsdialog und Steckdosen-Höchstwert (R11–R14)
Der Stromkreislisteneditor ordnet Revit-Objekte über den Dialog
`RevitAssignmentDialog` zu (Toolbar „Revit-Objekte zuordnen“ oder Kontextmenü
eines Stromkreises). Der frühere rechte Drawer und das Ziehen direkt ins Grid
sind entfernt. Links stehen die zuordenbaren Objekte des Verteilers als Raum →
Gruppe → Objekt mit Mehrfachauswahl und Filtern, rechts die Stromkreise mit
Steckdosenbelegung. Drag-and-drop, „Zuweisen an …“ und „Automatisch aufteilen
…“ ändern nur einen lokalen Plan.
Die Planungsregeln liegen importfrei in `src/shared/revit/assignment-plan.ts`
und werden von Dialog und API gemeinsam genutzt: Zeilenbildung je Raum,
Auswahlkenner, Geräteart, Kategorie, ProjectDevice und Planungswerten,
Konfliktliste, Belegung und die raumweise Aufteilung ohne Teilung eines
Objekts. `POST /api/projects/:projectId/external-model/objects/assignment-plan`
prüft den Plan erneut (strikte zod-Eingabe), verlangt die ausdrückliche
Bestätigung von Planungswert-Konflikten und Höchstwert-Überschreitungen und
schreibt ihn als `external-object.apply-assignment-plan`: neue Stromkreise mit
einmal geplanten BMKs und Standardschutz, neue Rows, Mengenänderungen und alle
Objektlinks in einer Revision. Die history-only Inverse
`external-object.revert-assignment-plan` entfernt nur unverändert gebliebene
erzeugte Struktur.
Der Höchstwert `projects.max_sockets_per_circuit` ist eine allgemeine
Projekteinstellung (Migration `0018`, `project.update-settings` Version 4,
Snapshot-Schema 11). Welche Revit-Gerätearten als Steckdose zählen, legt
`deviceTypes[].isSocket` der Revit-Konfiguration Version 2 fest; Version 1
leitet es aus `socketCount`-Familienregeln ab
(`src/shared/revit/socket-device-types.ts`).
## Historische CSV-Unterlagen
Der vor R3 vorhandene CSV-/IfcGUID-Laufzeitpfad ist entfernt. Seine damalige

View file

@ -19,10 +19,10 @@ Der alte CSV-Plan 14.0–14.6 ist abgelöst und wird nicht fortgeschrieben.
| R8 | abgeschlossen | Rückgabe-Excel für alle, abweichende oder ausgewählte Objekte und append-only Exportnachweis sind umgesetzt. |
| R9 | abgeschlossen | Vollständiger Folgeimport nach exakter Worksharing-ID mit Quellentscheidungen, fehlenden Objekten, bestätigtem Löschen und persistentem Undo/Redo. |
| R10 | abgeschlossen | Ende-zu-Ende-Kette, 5.000-Objekte-Lasttest, gebatchte Zustandspersistenz und Abschlussdokumentation. |
| R11 | geplant | Projekteinstellung `maxSocketsPerCircuit` und Geräteart-Merkmal `isSocket` samt Hochstufung und Einstellungs-UI. |
| R12 | geplant | Reines Planungsmodul für Row-Bildung, Belegung, Konflikte und raumweise Aufteilung. |
| R13 | geplant | Atomarer Command `external-object.apply-assignment-plan` mit Route und exakter Inverse. |
| R14 | geplant | Zuordnungsdialog mit Drag-and-drop und Plan, Row-Objektliste mit Einzel-Lösen, Entfernen des R7-Drawers. |
| R11 | abgeschlossen | Projekteinstellung `maxSocketsPerCircuit` und Geräteart-Merkmal `isSocket` samt Hochstufung und Einstellungs-UI. |
| R12 | abgeschlossen | Reines Planungsmodul für Row-Bildung, Belegung, Konflikte und raumweise Aufteilung. |
| R13 | abgeschlossen | Atomarer Command `external-object.apply-assignment-plan` mit Route und exakter Inverse. |
| R14 | abgeschlossen | Zuordnungsdialog mit Drag-and-drop und Plan, Row-Objektliste mit Einzel-Lösen, Entfernen des R7-Drawers. |
## R0 – Audit