mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-08-18 14:33:19 +00:00
feat: add confirmed Take down stack action with optional volume removal (#1599)
* feat: add confirmed Take down stack action with optional volume removal Expose Take down in the stack header and sidebar with a confirmation dialog that runs compose down while keeping the stack definition on disk. Optional volume removal is gated by node capability and stack:deploy permission, with remote gateway preflight before proxying removeVolumes requests. Closes #1582 * fix: reset take-down volume checkbox when dialog closes * test: align getStackMenuVisibility assertions with showTakeDown key getStackMenuVisibility now returns a fifth lifecycle flag, showTakeDown, but three exhaustive toEqual assertions still listed only the prior four keys and failed. Add the expected showTakeDown value to each: true for the partial and exited running-stack cases, false for the self stack. * test: cover Take down visibility for running non-self stacks The getStackMenuVisibility assertions exercised the partial and exited branches and the self-stack guard, but not the raw === 'running' literal that drives showTakeDown for a normal running stack. Add a case so a regression dropping 'running' from that check is caught. * fix: drop Take down from header overflow and wire activity shortcut Remove duplicate Take down from More actions. Keep inline button when running, sidebar menu, and Cmd+ArrowDown. Record stack_taken_down in activity on successful POST /down.
This commit is contained in:
@@ -22,26 +22,30 @@ export function useStackKeyboardShortcuts(
|
||||
const cmdOrCtrl = e.metaKey || e.ctrlKey;
|
||||
const key = e.key.toLowerCase();
|
||||
|
||||
const isCmdKey = cmdOrCtrl && ['enter', '.', 'r', 'arrowup', 'backspace'].includes(key);
|
||||
const isCmdKey = cmdOrCtrl && ['enter', '.', 'r', 'arrowup', 'arrowdown', 'backspace'].includes(key);
|
||||
const isSingleKey = !cmdOrCtrl && ['a', 'h', 'u', 'p'].includes(key);
|
||||
if (!isCmdKey && !isSingleKey) return;
|
||||
|
||||
const ctx = buildMenuCtxRef.current(file);
|
||||
const { showDeploy, showStop, showRestart, showUpdate } = ctx.menuVisibility;
|
||||
const { showDeploy, showStop, showRestart, showUpdate, showTakeDown } = ctx.menuVisibility;
|
||||
const canDeploy = (show: boolean) => ctx.canDeploy && show && !ctx.isBusy;
|
||||
|
||||
if (cmdOrCtrl) {
|
||||
if (key === 'enter' && showDeploy && !ctx.isBusy) {
|
||||
if (key === 'enter' && canDeploy(showDeploy)) {
|
||||
e.preventDefault();
|
||||
ctx.deploy();
|
||||
} else if (key === '.' && showStop && !ctx.isBusy) {
|
||||
} else if (key === '.' && canDeploy(showStop)) {
|
||||
e.preventDefault();
|
||||
ctx.stop();
|
||||
} else if (key === 'r' && showRestart && !ctx.isBusy) {
|
||||
} else if (key === 'r' && canDeploy(showRestart)) {
|
||||
e.preventDefault();
|
||||
ctx.restart();
|
||||
} else if (key === 'arrowup' && showUpdate && !ctx.isBusy) {
|
||||
} else if (key === 'arrowup' && canDeploy(showUpdate)) {
|
||||
e.preventDefault();
|
||||
ctx.update();
|
||||
} else if (key === 'arrowdown' && canDeploy(showTakeDown)) {
|
||||
e.preventDefault();
|
||||
ctx.takeDown();
|
||||
} else if (key === 'backspace' && ctx.canDelete && !ctx.isBusy) {
|
||||
e.preventDefault();
|
||||
ctx.remove();
|
||||
|
||||
Reference in New Issue
Block a user