feat(web): route editor actions through mutation queue on active topologies
useTopologyEditor now branches on topoStatus: pending keeps direct CRUD, active/degraded routes through enqueueMutation with expected_version. Every primitive returns a tagged PrimitiveResult; callers skip local state updates on enqueued and wait for the SSE mutation.applied refetch to reflect DB truth. - remove_lan/remove_decky/detach_decky: direct name-keyed enqueues. - update_decky/update_lan: services/x/y lifted to top-level payload keys, remainder placed under patch (matches apply_update_* contract). - attach_decky: enqueued with decky+lan names; requires the decky to already exist (Phase B step 3 adds the create+attach composite). - createDecky stays direct-CRUD this pass — no add_decky op yet, so new-decky drag will 409 on active until a follow-up commit. - MazeNET surfaces mutation.failed payload.reason/error into actionErr so the status bar tells the user WHY a queue op was rejected.
This commit is contained in:
@@ -469,6 +469,14 @@ const MazeNET: React.FC = () => {
|
||||
|| event.name === 'status') {
|
||||
setStreamLive(true);
|
||||
}
|
||||
if (event.name === 'mutation.failed') {
|
||||
const p = event.payload ?? {};
|
||||
const reason = typeof p.reason === 'string' ? p.reason
|
||||
: typeof p.error === 'string' ? p.error
|
||||
: 'mutation failed — check mutator logs';
|
||||
setActionErr(`mutation failed: ${reason}`);
|
||||
setTimeout(() => setActionErr(null), 6000);
|
||||
}
|
||||
if (event.name === 'mutation.applied'
|
||||
|| event.name === 'mutation.failed'
|
||||
|| event.name === 'status') {
|
||||
|
||||
Reference in New Issue
Block a user