Prevent hidden action execution

Block execution of actions from an empty list
until user input specifies a selection, ensuring
actions not displayed don't trigger unexpectedly.
This commit is contained in:
Andrew
2026-07-13 19:20:15 +08:00
parent 87c9ab138c
commit c3ebf38a07
2 changed files with 22 additions and 2 deletions

View File

@@ -56,9 +56,13 @@ function shouldRenderActionList(query) {
// Resolve the selection cursor {zone,i} to the action id it points at: fav zone indexes the
// visible favourites, list zone the filtered actions. Pure so runSelected() shares one lookup.
function selectedActionId(sel, actions, favIds) {
function selectedActionId(sel, actions, favIds, query) {
if (sel.zone === "fav")
return favIds[sel.i];
// why: search-first keeps the list blank until the user types; an empty query still
// filters to ALL actions, so without this gate Enter fires an action never shown.
if (!shouldRenderActionList(query))
return null;
var a = actions[sel.i];
return a && a.id;
}
@@ -444,7 +448,7 @@ function run(a) {
}
function runSelected() {
var id = selectedActionId(sel, filterActions(ACTIONS, query), currentVisibleFavs());
var id = selectedActionId(sel, filterActions(ACTIONS, query), currentVisibleFavs(), query);
if (id) run(byId(id));
}

View File

@@ -26,4 +26,20 @@ assert.equal(ctx.shouldRenderActionList(""), false, "an empty search keeps the a
assert.equal(ctx.shouldRenderActionList(" "), false, "whitespace-only search keeps the action list hidden");
assert.equal(ctx.shouldRenderActionList("r"), true, "typing starts rendering matching actions");
assert.equal(
ctx.selectedActionId({ zone: "list", i: 0 }, duplicateActions, [], ""),
null,
"Enter with an empty query must not resolve to an action the blank list never showed"
);
assert.equal(
ctx.selectedActionId({ zone: "list", i: 0 }, duplicateActions, [], "rep"),
"0123456789abcdef",
"a typed query resolves the list selection"
);
assert.equal(
ctx.selectedActionId({ zone: "fav", i: 0 }, duplicateActions, ["fedcba9876543210"], ""),
"fedcba9876543210",
"favourites stay runnable with an empty query - the fav bar is always visible"
);
console.log("ok");