dashboard: selection-bar M0V3 affordances for re-parenting agents (#486)
Backend POST /api/topology/set-parent already shipped; the dashboard was missing the operator surface to drive it. Adds two affordances to the SW4RM tab's selection bar (alongside the existing R3ST4RT / ST0P / ST4RT / R3BU1LD / DESTR0Y / PURG3 actions): - '⇡ M0V3 → ROOT' (bulk): promote selected agents to top-level (parent=null). Disabled when all selected are already at root or the selection includes the manager (backend refuses anyway). - '⇢ M0V3 → [pick]' (single-agent only): inline <select> dropdown + button pair. Dropdown lists every container that isn't the target nor a descendant of it (client-side BFS via the existing c.parent map). On submit POSTs form-encoded 'child=<name>&new_parent=<target>' to /api/topology/set-parent; the backend re-checks the cycle invariant and re-emits a container snapshot so the tree repaints without a reload. Both POSTs hit a single URL, so addBulkButton grew an optional 'perAgentBodyFor(name)' hook to handle the body-driven endpoint shape (vs the URL-suffix /start/<name> shape every other action uses). Lifecycle endpoints unchanged. Mauve chrome (var(--mauve)) reads as 'structural change' rather than the destructive red / amber of destroy / rebuild. closes #486
This commit is contained in:
parent
b714ba15c2
commit
2950a7f9ee
3 changed files with 189 additions and 2 deletions
|
|
@ -915,6 +915,11 @@ ul form.inline { display: inline-block; }
|
|||
.btn-restart { color: var(--cyan); border-color: var(--cyan); font-size: 0.75em; padding: 0.15em 0.5em; margin-left: 0.6em; }
|
||||
.btn-stop { color: var(--pink); border-color: var(--pink); font-size: 0.75em; padding: 0.15em 0.5em; margin-left: 0.6em; }
|
||||
.btn-start { color: var(--green); border-color: var(--green); font-size: 0.75em; padding: 0.15em 0.5em; margin-left: 0.6em; }
|
||||
/* #486 — M0V3 affordance (selection bar). Mauve picks up the same
|
||||
accent the question-override / mid-status surfaces use; reads as
|
||||
"structural change" rather than the destructive red / amber chrome
|
||||
of destroy / rebuild. */
|
||||
.btn-move { color: var(--mauve); border-color: var(--mauve); font-size: 0.75em; padding: 0.15em 0.5em; margin-left: 0.6em; }
|
||||
.btn-talk { color: var(--cyan); border-color: var(--cyan); }
|
||||
.btn-spawn { color: var(--amber); border-color: var(--amber); }
|
||||
.btn-fire-now { color: var(--mauve, #cba6f7); border-color: var(--mauve, #cba6f7); }
|
||||
|
|
@ -2085,3 +2090,32 @@ body.flow-shell .tabbar .tab.active.tab-link {
|
|||
visible (`body.has-selection`, toggled by tabs.js when the
|
||||
selection set is non-empty). */
|
||||
body.dashboard-shell.has-selection { padding-bottom: 4.5em; }
|
||||
|
||||
/* #486 — M0V3 → <pick> picker. Inline `<select>` + button pair
|
||||
sitting alongside the bulk action buttons in the selection bar.
|
||||
The select inherits the terminal-y monospace look so it doesn't
|
||||
read as system-chrome popping out of the swarm aesthetic. Only
|
||||
surfaces when exactly one agent is selected. */
|
||||
.move-picker {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.3em;
|
||||
margin-left: 0.6em;
|
||||
}
|
||||
.move-picker-select {
|
||||
font-family: inherit;
|
||||
font-size: 0.75em;
|
||||
background: var(--bg);
|
||||
color: var(--fg);
|
||||
border: 1px solid var(--mauve);
|
||||
border-radius: 2px;
|
||||
padding: 0.1em 0.3em;
|
||||
max-width: 16em;
|
||||
}
|
||||
.move-picker-select:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: default;
|
||||
}
|
||||
.move-picker .btn-move {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue