()
| 515 | collapseAdjacentDuplicateBinaryOps(window.searchBoolTokens); |
| 516 | clearSidebarFilterKinds(kindsFromAtoms(picked)); |
| 517 | setSearchQueryAwaiting(false); |
| 518 | return true; |
| 519 | } |
| 520 | |
| 521 | function queryBuilderTryConsumeAwaitingTagPick(rawTag) { |
| 522 | initSearchClauseState(); |
| 523 | if (!queryBuilderAwaitingSearchOperandSlot()) return false; |
| 524 | const v = String(rawTag || "").trim(); |
| 525 | if (!v) return false; |
| 526 | window.searchBoolTokens.push({ t: "filter", kind: "tag", value: v }); |
| 527 | collapseAdjacentDuplicateBinaryOps(window.searchBoolTokens); |
| 528 | clearSidebarFilterKinds(new Set(["tag"])); |
| 529 | setSearchQueryAwaiting(false); |
| 530 | return true; |
| 531 | } |
| 532 | |
| 533 | function appendSearchBoolOp(op) { |
| 534 | initSearchClauseState(); |
| 535 | const join = op === "OR" ? "OR" : "AND"; |
| 536 | const tok = window.searchBoolTokens; |
| 537 | let last = tok.length ? tok[tok.length - 1] : null; |
| 538 | if (!last) { |
| 539 | materializeActiveSidebarFiltersIntoSearchTokensIfNeeded(); |
| 540 | last = tok.length ? tok[tok.length - 1] : null; |
| 541 | } |
| 542 | if (!last) return; |
| 543 | if (last.t === "op") { |
| 544 | last.op = join; |
| 545 | setSearchQueryAwaiting(true); |
| 546 | return; |
nothing calls this directly
no test coverage detected