@returns {SearchBoolToken[]}
()
| 182 | const section = document.querySelector(".filter-section"); |
| 183 | if (hint) hint.hidden = !want; |
| 184 | if (section) section.classList.toggle("filter-section-awaiting-search", want); |
| 185 | } |
| 186 | |
| 187 | function dismissSearchAwaiting() { |
| 188 | setSearchQueryAwaiting(false); |
| 189 | } |
| 190 | |
| 191 | /** @returns {SearchBoolToken[]} */ |
| 192 | function readSearchBoolTokens() { |
| 193 | initSearchClauseState(); |
| 194 | return window.searchBoolTokens.map((x) => { |
| 195 | if (x.t === "clause") { |
| 196 | return { |
| 197 | t: "clause", |
| 198 | field: (x.field || "all").toString(), |
| 199 | value: String(x.value || "").trim(), |
| 200 | }; |
| 201 | } |
| 202 | if (x.t === "op") return { t: "op", op: x.op === "OR" ? "OR" : "AND" }; |
| 203 | if (x.t === "not") return { t: "not" }; |
| 204 | if (x.t === "filter") { |
| 205 | return { |
| 206 | t: "filter", |
| 207 | kind: String(x.kind || "").trim(), |
| 208 | value: String(x.value != null ? x.value : "").trim(), |
| 209 | }; |
| 210 | } |
| 211 | if (x.t === "filterMulti") { |
| 212 | const vals = Array.isArray(x.values) ? x.values.map((v) => String(v).trim()).filter(Boolean) : []; |
| 213 | const combine = String(x.combine || "OR").toUpperCase() === "AND" ? "AND" : "OR"; |
no test coverage detected