feat(silo): client-side BOM diff/merge submission and Activity pane rendering #74

Closed
opened 2026-02-09 00:16:38 +00:00 by forbes · 1 comment
Owner

Phase 2 — Client-Side Diff Computation + Activity Pane BOM Merge Events

Ref: docs/BOM_MERGE.md Phases 2 & 6, issue #68
Depends on: #73 (link extraction)

Summary

After extract_bom_links() resolves assembly components to part numbers, diff the local BOM against the existing server BOM (_client.get_bom(part_number)), then POST the merge to the new POST /api/items/{partNumber}/bom/merge endpoint. Render the server's merge response and bom_merge SSE events in the Activity pane (SiloAuthDockWidget).

Requirements

Diff + Merge Submission (bom_sync.py)

  • diff_bom(local_entries, remote_entries) — compare assembly-derived BOM against _client.get_bom() response
    • Categorize into: added, removed, quantity_changed, unchanged
    • removed items are never auto-deleted — flagged as unreferenced warnings
  • submit_bom_merge(part_number, resolved_entries, client) — POST to /api/items/{partNumber}/bom/merge
    • Request body: {"source": "assembly", "entries": [{"child_part_number": "...", "quantity": N, "source": "assembly"}, ...]}
    • Handle response: log diff summary, surface resolve_url for web UI link

Activity Pane (silo_commands.py)

  • Add bom_merge to SiloEventListener event handling (currently handles server.state, item_updated, revision_created)
  • New signal: bom_merged(str, str) — part_number, summary
  • Render BOM merge events in _refresh_activity_panel():
    • Show added/changed/unreferenced counts
    • "View in Silo" link using resolve_url from server response
    • Warning badge for unresolved components (links to Phase 3 registration)

Merge Rules

Scenario Action
Added (in assembly, not on server) Auto-add
Quantity changed Auto-update to assembly quantity
Removed (on server, not in assembly) Do NOT delete — warn as unreferenced
Unchanged No action

API Dependency

Requires POST /api/items/{partNumber}/bom/merge endpoint and bom_merge SSE event type on the server (separate server-side issue).

Out of Scope

  • Link extraction (Phase 1, #73)
  • Part registration dialog (Phase 3)
  • Web UI merge resolution (Phase 4)
## Phase 2 — Client-Side Diff Computation + Activity Pane BOM Merge Events Ref: `docs/BOM_MERGE.md` Phases 2 & 6, issue #68 Depends on: #73 (link extraction) ### Summary After `extract_bom_links()` resolves assembly components to part numbers, diff the local BOM against the existing server BOM (`_client.get_bom(part_number)`), then POST the merge to the new `POST /api/items/{partNumber}/bom/merge` endpoint. Render the server's merge response and `bom_merge` SSE events in the Activity pane (`SiloAuthDockWidget`). ### Requirements #### Diff + Merge Submission (`bom_sync.py`) - `diff_bom(local_entries, remote_entries)` — compare assembly-derived BOM against `_client.get_bom()` response - Categorize into: `added`, `removed`, `quantity_changed`, `unchanged` - `removed` items are **never auto-deleted** — flagged as unreferenced warnings - `submit_bom_merge(part_number, resolved_entries, client)` — POST to `/api/items/{partNumber}/bom/merge` - Request body: `{"source": "assembly", "entries": [{"child_part_number": "...", "quantity": N, "source": "assembly"}, ...]}` - Handle response: log diff summary, surface `resolve_url` for web UI link #### Activity Pane (`silo_commands.py`) - Add `bom_merge` to `SiloEventListener` event handling (currently handles `server.state`, `item_updated`, `revision_created`) - New signal: `bom_merged(str, str)` — part_number, summary - Render BOM merge events in `_refresh_activity_panel()`: - Show added/changed/unreferenced counts - "View in Silo" link using `resolve_url` from server response - Warning badge for unresolved components (links to Phase 3 registration) #### Merge Rules | Scenario | Action | |----------|--------| | Added (in assembly, not on server) | Auto-add | | Quantity changed | Auto-update to assembly quantity | | Removed (on server, not in assembly) | Do NOT delete — warn as unreferenced | | Unchanged | No action | ### API Dependency Requires `POST /api/items/{partNumber}/bom/merge` endpoint and `bom_merge` SSE event type on the server (separate server-side issue). ### Out of Scope - Link extraction (Phase 1, #73) - Part registration dialog (Phase 3) - Web UI merge resolution (Phase 4)
forbes added the enhancement label 2026-02-09 00:16:38 +00:00
Author
Owner

Implemented in mods/silo/freecad/bom_sync.py as part of #276. diff_bom() and apply_bom_diff() handle client-side diff/merge.

Implemented in `mods/silo/freecad/bom_sync.py` as part of #276. `diff_bom()` and `apply_bom_diff()` handle client-side diff/merge.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kindred/create#74