@loadbare/app 0.25.0 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/assemble.d.ts +1 -2
- package/dist/build/assemble.d.ts.map +1 -1
- package/dist/build/assemble.js +11 -53
- package/dist/build/assemble.js.map +1 -1
- package/dist/build/cli.d.ts +4 -10
- package/dist/build/cli.d.ts.map +1 -1
- package/dist/build/cli.js +11 -33
- package/dist/build/cli.js.map +1 -1
- package/dist/build/declared.js +1 -1
- package/dist/build/declared.js.map +1 -1
- package/dist/core/lb-constants.d.ts +8 -18
- package/dist/core/lb-constants.d.ts.map +1 -1
- package/dist/core/lb-constants.js +32 -72
- package/dist/core/lb-constants.js.map +1 -1
- package/dist/core/lb-types.d.ts +12 -11
- package/dist/core/lb-types.d.ts.map +1 -1
- package/dist/core/lb-types.js +7 -0
- package/dist/core/lb-types.js.map +1 -1
- package/dist/hub/lb-apply.d.ts +10 -37
- package/dist/hub/lb-apply.d.ts.map +1 -1
- package/dist/hub/lb-apply.js +139 -522
- package/dist/hub/lb-apply.js.map +1 -1
- package/dist/hub/lb-hub.browser.d.ts.map +1 -1
- package/dist/hub/lb-hub.browser.js +115 -126
- package/dist/hub/lb-hub.browser.js.map +1 -1
- package/dist/hub/lb-lifecycle.d.ts +2 -2
- package/dist/hub/lb-lifecycle.d.ts.map +1 -1
- package/dist/hub/lb-lifecycle.js +9 -17
- package/dist/hub/lb-lifecycle.js.map +1 -1
- package/dist/server/lb-express.d.ts.map +1 -1
- package/dist/server/lb-express.js +3 -3
- package/dist/server/lb-express.js.map +1 -1
- package/dist/server/lb-server.d.ts +35 -19
- package/dist/server/lb-server.d.ts.map +1 -1
- package/dist/server/lb-server.js +141 -88
- package/dist/server/lb-server.js.map +1 -1
- package/docs/binding-cases.md +150 -0
- package/docs/comparison.md +18 -29
- package/docs/miswarts.md +2 -2
- package/docs/reference/css.md +2 -15
- package/docs/reference/custom-elements.md +6 -8
- package/docs/reference/data-binding.md +37 -180
- package/docs/reference/names.md +10 -26
- package/docs/reference/page-files.md +1 -12
- package/docs/reference/server.md +0 -1
- package/docs/testing.md +2 -5
- package/package.json +1 -1
- package/skills/loadbare-app/SKILL.md +52 -54
- package/skills/loadbare-app/references/css.md +2 -15
- package/skills/loadbare-app/references/custom-elements.md +6 -8
- package/skills/loadbare-app/references/data-binding.md +37 -180
- package/skills/loadbare-app/references/miswarts.md +2 -2
- package/skills/loadbare-app/references/names.md +10 -26
- package/skills/loadbare-app/references/page-files.md +1 -12
- package/skills/loadbare-app/references/server.md +0 -1
package/dist/hub/lb-apply.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lb-apply.js","sourceRoot":"","sources":["../../hub/lb-apply.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference lib=\"dom\" />\n\n/**\n * Landing — see docs/reference/data-binding.md.\n *\n * The hub lands a response item's rows on every element whose `lb-query`\n * names its query. The item says the query's kind and key, so the markup\n * says neither:\n *\n * kind row template the hub\n * row no lands the row on the element itself\n * row yes lands one live row\n * rows yes lands one live row per row\n * rows no lands nothing\n *\n * Filling a live row and filling an element a `row` lands on are the same\n * operation, and the only difference is how much of the page the root\n * covers.\n *\n * An answer is kept after it lands. An element that names a query and\n * arrives after that query's answer — a picker in a new live row, a ghost\n * row a custom element built — is filled from the kept answer at the end of\n * the next landing, so a query need not land again, and need not land after\n * the one whose rows hold it, just to fill what is new.\n *\n * Every custom element landing places is told so once the landing is done,\n * and every one it removes is told so once it is gone — see lb-lifecycle.\n *\n * A `rows` query is placed by its order: the user's, from the choice its\n * element's `lb-order` names, or the one the server declared, or, with\n * neither, the order its rows arrived in. Groups are built from the markup's\n * group templates as the order breaks, and every change to a list — a row\n * created, changed, moved or leaving, a group appearing or leaving — is one\n * a stylesheet can see. A row a filter the user chose does not pass is\n * hidden.\n *\n * A condition is the one other thing landing moves. An element whose\n * `lb-show` column is off stands in the document inside a template, and\n * landing reaches in there as it reaches everywhere else, so a branch that\n * returns is already current. Nothing but landing reaches in.\n */\n\nimport {\n AGGREGATES,\n ATTR_COLUMN,\n ATTR_FILTER,\n ATTR_ORDER,\n CHOICES_QUERY,\n LB_RESERVED_PREFIX,\n ATTR_COLUMN_VALUE,\n ATTR_COUNT,\n ATTR_GROUP,\n ATTR_GROUP_COLUMN,\n ATTR_GROUP_LEAVING,\n ATTR_GROUP_LIVE,\n ATTR_GROUP_VALUE,\n ATTR_KEY_VALUE,\n ATTR_MAX,\n ATTR_MIN,\n ATTR_QUERY,\n ATTR_QUERY_ORDER,\n ATTR_QUERY_ROW_COUNT,\n ATTR_MANUAL,\n MANUAL_FILTER,\n MANUAL_ORDER,\n ATTR_QUERY_UNPLACED_COUNT,\n ATTR_ROW_CHANGED,\n ATTR_ROW_CREATED,\n ATTR_ROW_LEAVING,\n ATTR_ROW_LIVE,\n ATTR_ROW_MOVED,\n ATTR_ROW_REQUESTED,\n ATTR_ROW_UNPLACED,\n ATTR_SHOW,\n ATTR_SUM,\n ATTR_URL_PARM,\n KIND_ROW,\n LIVE_GROUP,\n LIVE_ROW,\n ORDER_DESCENDING,\n REQUESTED_CHANGED,\n REQUESTED_CREATED,\n REQUESTED_MOVED,\n SHOW_NOT,\n ATTR_SELECT,\n ATTR_ROW_SELECTED,\n} from \"../core/lb-constants.js\";\nimport {\n compareRows,\n compareValues,\n isPatch,\n parseFilter,\n parseOrder,\n passes,\n readAs,\n type ColumnType,\n type ColumnTypes,\n type FilterTerm,\n type OrderTerm,\n type ParmValue,\n type Patch,\n type HubLifecycle,\n type ResponseItem,\n type Row,\n type RowsResult,\n} from \"../core/lb-types.js\";\nimport {\n attachPlaced,\n detachRemoved,\n LEAVING,\n PARKED,\n placed,\n upgradeAbsent,\n} from \"./lb-lifecycle.js\";\n\n/** A DocumentFragment's nodeType. Tier 3 has no `Node` global to read it from. */\nconst FRAGMENT_NODE = 11;\n\n/** An Element's nodeType, for the same reason. */\nconst ELEMENT_NODE = 1;\n\n/** A Text node's nodeType, for the same reason. */\nconst TEXT_NODE = 3;\n\n/**\n * The input types whose state is not their `value`, or cannot be set. A\n * checkbox's and a radio button's state is `checked`, and each is a control\n * by its own rule.\n */\nconst UNLANDED_INPUTS = [\"checkbox\", \"radio\", \"file\"];\n\n/** A control's value, whether it is native or a custom element. */\nexport interface Control extends Element {\n value: string;\n}\n\n/**\n * A native control whose state is its `value`: a `<select>`, a\n * `<textarea>`, or an `<input>` of any type but checkbox, radio and file.\n *\n * Told apart by tag name and type rather than by class, so it holds for an\n * element from any document.\n */\nfunction isNativeControl(el: Element): boolean {\n if (el.localName === \"select\" || el.localName === \"textarea\") return true;\n return (\n el.localName === \"input\" &&\n !UNLANDED_INPUTS.includes((el as HTMLInputElement).type)\n );\n}\n\n/**\n * A checkbox, whose state is `checked` rather than `value`. HTML's quirk,\n * and so the hub's: it lands and gathers by its checked state, so every other\n * part of the vocabulary treats it as any control.\n */\nfunction isCheckbox(el: Element): boolean {\n return (\n el.localName === \"input\" && (el as HTMLInputElement).type === \"checkbox\"\n );\n}\n\n/**\n * A radio button, whose state is `checked` as well. It is checked when its\n * own `value` is the value that landed, so a group of them naming one column\n * shows that value, and gathers the one checked.\n */\nexport function isRadio(el: Element): boolean {\n return el.localName === \"input\" && (el as HTMLInputElement).type === \"radio\";\n}\n\n/**\n * A form-associated custom element with a `value` property. HTML marks one\n * with `static formAssociated = true` on its class, and a control has a value.\n */\nexport function isFormAssociated(el: Element): boolean {\n const ctor = el.constructor as { formAssociated?: unknown };\n return ctor.formAssociated === true && \"value\" in el;\n}\n\n/**\n * A control: an `<input>`, `<select>` or `<textarea>`, a checkbox, a radio\n * button, or a\n * form-associated custom element with a `value` property. Landing and\n * gathering draw the same line, so a value read back is the one that landed\n * there.\n */\nexport function isControl(el: Element): el is Control {\n return (\n isNativeControl(el) || isCheckbox(el) || isRadio(el) || isFormAssociated(el)\n );\n}\n\n/**\n * A control that holds several values: a `<select multiple>`, or a checkbox\n * carrying a `value`, one of a set naming one column. A checkbox with no\n * `value` is a flag.\n */\nfunction holdsSeveral(el: Element): boolean {\n if (el.localName === \"select\") return (el as HTMLSelectElement).multiple;\n return isCheckbox(el) && el.hasAttribute(\"value\");\n}\n\n/** A landed value as the list of strings a control holding several shows. */\nfunction listOf(value: unknown): string[] {\n if (Array.isArray(value)) return value.map((v) => String(v));\n if (value === null || value === undefined || value === \"\") return [];\n return [String(value)];\n}\n\n/**\n * What a control gathers: a checkbox `\"true\"` or `\"false\"`, so unchecked\n * still says so, a `<select multiple>` the values of its selected options,\n * and any other control its `value`, which a custom element may give as\n * several.\n */\nfunction controlValue(el: Control): ParmValue {\n if (isCheckbox(el)) return String((el as HTMLInputElement).checked);\n if (el.localName === \"select\" && (el as HTMLSelectElement).multiple) {\n return [...(el as HTMLSelectElement).selectedOptions].map((o) => o.value);\n }\n const value: unknown = el.value;\n return Array.isArray(value) ? value.map((v) => String(v)) : el.value;\n}\n\n/**\n * Gather a control into `values` under its column. Of the radio buttons\n * naming one column, the one checked gives the value, and `\"\"` stands when\n * none is. Of the checkboxes in a set naming one column, the checked ones\n * give their values, and none checked gives none.\n */\nexport function gatherInto(\n values: Record<string, ParmValue>,\n column: string,\n el: Control,\n): void {\n if (isRadio(el) && !(el as HTMLInputElement).checked) {\n values[column] ??= \"\";\n return;\n }\n if (isCheckbox(el) && holdsSeveral(el)) {\n const had = values[column];\n const set = Array.isArray(had) ? had : [];\n values[column] = set;\n if ((el as HTMLInputElement).checked) set.push(el.value);\n return;\n }\n values[column] = controlValue(el);\n}\n\n/**\n * Set an element from a column. A control's `value` is set. A custom element\n * that is not a control keeps its content, which the builder placed there\n * from its element file, and renders the stamp instead. Any other element's\n * text content is set. Every one carries the value as `lb-column-value`.\n */\nfunction land(el: Element, value: unknown): void {\n if (holdsSeveral(el)) return landSeveral(el, value);\n // A custom element control takes several values as they are. Anything\n // else holds one, and shows the first, as a URL's parm reads.\n if (Array.isArray(value) && !isFormAssociated(el)) value = value[0];\n // Untouched, whatever the server sent: the browser decides what a\n // non-string looks like. See Row in core/lb-types.ts.\n if (value === null || value === undefined) {\n if (isCheckbox(el) || isRadio(el)) {\n (el as HTMLInputElement).checked = false;\n } else if (isControl(el)) el.value = \"\";\n else if (!el.localName.includes(\"-\") && el.localName !== \"input\") {\n el.textContent = \"\";\n }\n el.removeAttribute(ATTR_COLUMN_VALUE);\n return;\n }\n if (isCheckbox(el)) {\n // Off for false, and for what an unchecked checkbox gathers or an absent\n // query parm lands as, so a checkbox lands what it gathered even from a\n // query whose values are strings, such as lb-url.\n (el as HTMLInputElement).checked =\n value !== false && value !== \"false\" && value !== \"\";\n } else if (isRadio(el)) {\n (el as HTMLInputElement).checked =\n (el as HTMLInputElement).value === String(value);\n } else if (isControl(el)) {\n el.value = value as string;\n } else if (el.localName === \"input\") {\n console.warn(\n `lb-hub: a value does not land on <input type=\"${(el as HTMLInputElement).type}\">, ignoring`,\n el,\n );\n return;\n } else if (!el.localName.includes(\"-\")) {\n setText(el, String(value));\n }\n setStamp(el, ATTR_COLUMN_VALUE, String(value));\n}\n\n/**\n * Set a control that holds several values: a checkbox in a set is checked\n * when its `value` is among them, and a `<select multiple>` selects each\n * option whose `value` is.\n */\nfunction landSeveral(el: Element, value: unknown): void {\n const list = listOf(value);\n if (isCheckbox(el)) {\n (el as HTMLInputElement).checked = list.includes((el as HTMLInputElement).value);\n } else {\n for (const option of (el as HTMLSelectElement).options) {\n option.selected = list.includes(option.value);\n }\n }\n if (list.length === 0) el.removeAttribute(ATTR_COLUMN_VALUE);\n else setStamp(el, ATTR_COLUMN_VALUE, JSON.stringify(list));\n}\n\n/**\n * Set an element's text, unless it already holds exactly that text. Writing\n * the same text again replaces the text node, which is two mutations and a\n * style check for nothing.\n */\nfunction setText(el: Element, text: string): void {\n const only = el.firstChild;\n const same = only\n ? only === el.lastChild &&\n only.nodeType === TEXT_NODE &&\n (only as Text).data === text\n : text === \"\";\n if (!same) el.textContent = text;\n}\n\n/** Set an attribute, unless it already has that value. */\nfunction setStamp(el: Element, name: string, value: string): void {\n if (el.getAttribute(name) !== value) el.setAttribute(name, value);\n}\n\n/**\n * Whether an element under `root` belongs to root's query, rather than to a\n * query nested inside it.\n *\n * A descendant is root's unless something between it and root carries\n * `lb-query`. The element's own `lb-query` does not count: it names what the\n * element holds, and the row it reads from is its ancestors'. So a picker\n * carrying `lb-query` and `lb-column` is set from the row around it. Root's\n * own attribute does not count either: root is what is being filled.\n *\n * Root may be the content of a template holding an absent branch. The walk\n * up from an element inside it stops at the top of that content, which has\n * no parent, and the template it stands for was in scope already.\n */\nfunction inScope(\n root: Element | DocumentFragment,\n el: Element,\n stop?: string,\n): boolean {\n if (stop && el !== root && el.matches(stop)) return false;\n for (let node = el.parentElement; node && node !== root;) {\n if (node.hasAttribute(ATTR_QUERY)) return false;\n if (stop && node.matches(stop)) return false;\n node = node.parentElement;\n }\n return true;\n}\n\n/**\n * Root if it matches, then every descendant in root's query that does.\n * Gathering finds columns through here. It does not reach into an absent\n * branch, so a live row is read back from the places a row lands that are\n * showing.\n */\nexport function within(root: Element, selector: string): Element[] {\n const found: Element[] = root.matches(selector) ? [root] : [];\n for (const el of root.querySelectorAll(selector)) {\n if (inScope(root, el)) found.push(el);\n }\n return found;\n}\n\n/**\n * Every descendant in root's query that matches, absent branches included.\n *\n * `querySelectorAll` does not enter template content, so an element that is\n * off would otherwise miss everything landed while it was away, and return\n * stale or with its rows empty. A template holding one is in root's query by\n * the ordinary rule, and its content is searched as if it stood there.\n */\nfunction below(\n root: Element | DocumentFragment,\n selector: string,\n stop?: string,\n): Element[] {\n const found: Element[] = [];\n for (const el of root.querySelectorAll(selector)) {\n if (inScope(root, el, stop)) found.push(el);\n }\n for (const parked of root.querySelectorAll(PARKED)) {\n if (inScope(root, parked, stop)) {\n found.push(\n ...below((parked as HTMLTemplateElement).content, selector, stop),\n );\n }\n }\n return found;\n}\n\n/**\n * Every element in root that matches, absent branches included. A query is\n * looked up this way before any row is known, so nothing is filtered out.\n */\nfunction everywhere(root: ParentNode, selector: string): Element[] {\n const found = [...root.querySelectorAll(selector)];\n for (const parked of root.querySelectorAll(PARKED)) {\n const content = (parked as HTMLTemplateElement).content;\n found.push(...everywhere(content, selector));\n }\n return found;\n}\n\n/**\n * Tick or clear an `lb-select` checkbox, and stamp the live row it selects\n * to match.\n */\nexport function select(box: Element, on: boolean): void {\n (box as HTMLInputElement).checked = on;\n box.closest(LIVE_ROW)?.toggleAttribute(ATTR_ROW_SELECTED, on);\n}\n\n/**\n * Put an element in the document or take it out, as its `lb-show` column\n * says.\n *\n * Off is inside a template that stands where the element stood, carrying the\n * same `lb-show`. The element is moved rather than rebuilt, so a custom\n * element keeps its instance and a control keeps what was typed into it. On\n * moves it back and the template goes.\n *\n * Landing reaches into that template, so both it and the element it holds\n * arrive here. The template decides; the element it holds, whose parent is\n * the template's content, is left to it.\n */\nfunction present(el: Element, on: boolean): void {\n if (el.localName === \"template\") {\n const branch = (el as HTMLTemplateElement).content.firstElementChild;\n if (on && branch) el.replaceWith(branch);\n return;\n }\n if (on || el.parentNode?.nodeType === FRAGMENT_NODE) return;\n // A selection hidden is a selection abandoned: a tick kept out of sight\n // would come back stale, and nothing else could clear it.\n for (const box of [el, ...el.querySelectorAll(`[${ATTR_SELECT}]`)]) {\n if (box.hasAttribute(ATTR_SELECT)) select(box, false);\n }\n const parked = el.ownerDocument.createElement(\"template\");\n parked.setAttribute(ATTR_SHOW, el.getAttribute(ATTR_SHOW)!);\n el.replaceWith(parked);\n parked.content.append(el);\n parkedIn.set(el, parked);\n}\n\n/** The template each absent element was last put in. */\nconst parkedIn = new WeakMap<Element, HTMLTemplateElement>();\n\n/**\n * Put a live row's element in the document or take it out, the element\n * itself being known. Its template, while it is in one, decides first, as it\n * does when landing finds both.\n */\nfunction presentPlaced(el: Element, on: boolean): void {\n const parked = parkedIn.get(el);\n if (parked && el.parentNode === parked.content) present(parked, on);\n present(el, on);\n}\n\n/**\n * Where one row's columns land and its conditions show, each list by the\n * attribute's value: `lb-column`'s, and `lb-show`'s with its `!`.\n */\ninterface Places {\n columns: Map<string, Element[]>;\n shows: Map<string, Element[]>;\n /** Every link whose `href` takes parms from the row. */\n links: Element[];\n}\n\nfunction addPlace(map: Map<string, Element[]>, name: string, el: Element): void {\n const list = map.get(name);\n if (list) list.push(el);\n else map.set(name, [el]);\n}\n\n/**\n * Note an element among the places: where its `lb-column` lands, and what\n * its `lb-show` decides. A template holding an absent branch decides for the\n * branch it holds, and is noted as that branch's.\n */\nfunction note(places: Places, el: Element): void {\n const column = el.getAttribute(ATTR_COLUMN);\n if (column !== null) addPlace(places.columns, column, el);\n if (el.hasAttribute(ATTR_URL_PARM)) places.links.push(el);\n const show = el.getAttribute(ATTR_SHOW);\n if (show === null) return;\n if (el.localName === \"template\") {\n const branch = (el as HTMLTemplateElement).content.firstElementChild;\n if (branch) parkedIn.set(branch, el as HTMLTemplateElement);\n return;\n }\n addPlace(places.shows, show, el);\n}\n\nfunction noPlaces(): Places {\n return { columns: new Map(), shows: new Map(), links: [] };\n}\n\n/** An element a row lands on, in any way. */\nconst PLACE = `[${ATTR_COLUMN}], [${ATTR_SHOW}], [${ATTR_URL_PARM}]`;\n\n/**\n * Note a row's root among its places: its own `lb-column` and `lb-url-parm`\n * count, as the row is its own. Its own `lb-show` never does.\n */\nfunction noteRoot(places: Places, root: Element): void {\n if (root.hasAttribute(ATTR_COLUMN)) {\n addPlace(places.columns, root.getAttribute(ATTR_COLUMN)!, root);\n }\n if (root.hasAttribute(ATTR_URL_PARM)) places.links.push(root);\n}\n\n/**\n * The places in root's query, found by searching: root's own `lb-column`\n * when `self`, and every one below it short of `stop`, absent branches\n * included.\n */\nfunction search(root: Element, self: boolean, stop?: string): Places {\n const places = noPlaces();\n if (self) noteRoot(places, root);\n for (const el of below(root, PLACE, stop)) note(places, el);\n return places;\n}\n\n/**\n * A place's position in a row: child indices from the row's root, where a\n * template holding an absent branch counts its content as its children.\n */\ntype Path = number[];\n\nfunction kids(el: Element): HTMLCollection {\n return el.localName === \"template\"\n ? (el as HTMLTemplateElement).content.children\n : el.children;\n}\n\n/**\n * Where every place below a row template's root lies, worked out once for\n * the template and followed in each copy of it. The rule is search()'s: a\n * nested query's own attributes are this row's and what is inside it is not,\n * and template content is entered only for an absent branch.\n */\nfunction compile(row: Element): Path[] {\n const paths: Path[] = [];\n const walk = (el: Element, path: Path): void => {\n const children = kids(el);\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!;\n const at = [...path, i];\n if (child.matches(PLACE)) paths.push(at);\n if (child.hasAttribute(ATTR_QUERY)) continue;\n if (child.localName === \"template\" && !child.hasAttribute(ATTR_SHOW)) {\n continue;\n }\n walk(child, at);\n }\n };\n walk(row, []);\n return paths;\n}\n\n/**\n * A live row's places, by its template's paths: its root's own `lb-column`,\n * and the element at the end of each path. Followed before anything lands,\n * while the copy is as the template made it.\n */\nfunction placesBy(row: Element, paths: Path[]): Places {\n const places = noPlaces();\n noteRoot(places, row);\n for (const path of paths) {\n let el = row;\n for (const i of path) el = kids(el)[i]!;\n note(places, el);\n }\n return places;\n}\n\n/** Whether two column values are the same value. */\nfunction same(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n // Loadbare does not read a non-atomic value, but one may still arrive.\n return (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n JSON.stringify(a) === JSON.stringify(b)\n );\n}\n\n/**\n * Land a row on its places: each column's value where it lands, and the\n * conditions it decides.\n *\n * Only null and false are off. A string is never read, so \"false\" is on, and\n * the query spells a condition as a boolean or a null.\n */\nfunction fill(places: Places, row: Row): void {\n for (const [column, value] of Object.entries(row)) {\n for (const el of places.columns.get(column) ?? []) land(el, value);\n const on = value !== null && value !== false;\n for (const el of places.shows.get(column) ?? []) presentPlaced(el, on);\n for (const el of places.shows.get(`${SHOW_NOT}${column}`) ?? []) {\n presentPlaced(el, !on);\n }\n }\n}\n\n/**\n * Fill from one row: every `lb-column` and `lb-show` in root's query.\n *\n * With `self`, root's own `lb-column` counts, as a live row's does:\n * `<option>`'s content model is text, so an option row has to be the column\n * it displays. An element a `row` lands on is not its own ancestor, so its\n * own `lb-column` reads from the row around it and is left alone here. Root's\n * own `lb-show` never counts.\n *\n * `stop` passes over everything matching it and inside it.\n */\nexport function applyRow(\n root: Element,\n row: Row,\n self = false,\n stop?: string,\n): void {\n const places = search(root, self, stop);\n fill(places, row);\n link(places, row);\n}\n\n/** The `href` each link was written with, which every landing starts from. */\nconst bases = new WeakMap<Element, string>();\n\n/** Columns already reported as missing from a row, or as no parm's value. */\nconst unlinked = new Set<string>();\n\n/** The columns an element's `lb-url-parm` names. */\nfunction parmsOf(el: Element): string[] {\n return (el.getAttribute(ATTR_URL_PARM) ?? \"\")\n .split(\",\")\n .map((column) => column.trim())\n .filter((column) => column !== \"\");\n}\n\n/**\n * Write each link's `href` from the whole row: the `href` as written, with\n * each column its `lb-url-parm` names as the parm of the same name. A null,\n * empty or missing column leaves its parm off, as an empty value takes a\n * parm out of the URL.\n */\nfunction link(places: Places, row: Row): void {\n if (places.links.length === 0) return;\n // A row with no values is a blank, not a row missing its columns.\n const real = Object.values(row).some((v) => v !== null && v !== undefined);\n for (const el of places.links) {\n let base = bases.get(el);\n if (base === undefined) {\n base = el.getAttribute(\"href\") ?? \"\";\n bases.set(el, base);\n }\n const hashAt = base.indexOf(\"#\");\n const hash = hashAt < 0 ? \"\" : base.slice(hashAt);\n const rest = hashAt < 0 ? base : base.slice(0, hashAt);\n const queryAt = rest.indexOf(\"?\");\n const path = queryAt < 0 ? rest : rest.slice(0, queryAt);\n const parms = new URLSearchParams(queryAt < 0 ? \"\" : rest.slice(queryAt));\n for (const column of parmsOf(el)) {\n const value = row[column];\n if (value === undefined && real && !unlinked.has(column)) {\n unlinked.add(column);\n console.warn(\n `lb-hub: <a ${ATTR_URL_PARM}> names '${column}', which the row ` +\n `around it does not have`,\n );\n }\n const atomic =\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\";\n if (!atomic && value !== null && value !== undefined) {\n if (!unlinked.has(column)) {\n unlinked.add(column);\n console.warn(\n `lb-hub: '${column}' is no value a query parm can hold, and is ` +\n `left off the link`,\n );\n }\n }\n if (!atomic || value === \"\") parms.delete(column);\n else parms.set(column, String(value));\n }\n const query = parms.toString();\n const href = `${path}${query ? `?${query}` : \"\"}${hash}`;\n if (el.getAttribute(\"href\") !== href) el.setAttribute(\"href\", href);\n }\n}\n\n/**\n * A row naming every column root's query shows, each null: what landing it\n * leaves is root as it stands with no row. Absent branches are counted, so a\n * column only an absent element names is cleared too.\n */\nexport function blankRow(root: Element): Row {\n const row: Row = {};\n for (const el of below(root, `[${ATTR_COLUMN}]`)) {\n row[el.getAttribute(ATTR_COLUMN)!] = null;\n }\n for (const el of below(root, `[${ATTR_SHOW}]`)) {\n const show = el.getAttribute(ATTR_SHOW)!;\n row[show.startsWith(SHOW_NOT) ? show.slice(SHOW_NOT.length) : show] = null;\n }\n return row;\n}\n\n/**\n * The row template: the first `<template>` among the element's descendants,\n * outside any nested `lb-query`. A template holding an absent branch is not a\n * row template: rows land before the row template, so one inside the first\n * live row comes first in document order.\n */\nexport function templateIn(el: Element): HTMLTemplateElement | null {\n const template = within(el, `template:not([${ATTR_SHOW}])`).find(\n (t) => t !== el,\n );\n return (template as HTMLTemplateElement | undefined) ?? null;\n}\n\n/** What can take focus, before asking whether it can be operated. */\nconst FOCUSABLE =\n `a[href], button, input:not([type=\"hidden\"]), select, textarea, ` +\n `summary, [tabindex]:not([tabindex=\"-1\"]), ` +\n `[contenteditable]:not([contenteditable=\"false\"])`;\n\n/**\n * Focus the first element in `root` the user can operate: not disabled, not\n * in a closed dialog, not inert, not hidden, and one that took the focus\n * when asked. Nothing in a `<template>` is a candidate, so an absent\n * `lb-show` branch is passed over.\n */\nexport function focusIn(root: Element): void {\n const doc = root.ownerDocument;\n for (const el of root.querySelectorAll<HTMLElement>(FOCUSABLE)) {\n if (el.matches(\":disabled\")) continue;\n if (el.closest(`dialog:not([open]), [inert], [hidden]`)) continue;\n if (el.checkVisibility?.() === false) continue;\n el.focus();\n if (doc.activeElement === el) return;\n }\n}\n\n/** One live row: its key, its element, where it lands, and what it holds. */\ninterface Entry {\n key: string;\n el: Element;\n places: Places;\n /** Its columns, as landed so far. */\n data: Row;\n /**\n * Its columns as they were when it was last placed by the order, which\n * decide the group it stands in.\n */\n placed: Row;\n /** Whether a filter the user chose hides it. */\n hidden: boolean;\n /** Whether it stands where the order would not put it. */\n unplaced: boolean;\n}\n\n/**\n * One group the hub built from a group template: the nodes its clone put in\n * the document, and the clone of the nested template, which is where its\n * contents go. The root of a list is a group with no nodes, whose slot is the\n * markup's own first template, and whose aggregates are the list's.\n */\ninterface Group {\n /** The column the group breaks on and its value there, as one string. */\n id: string;\n /** Every node the clone put in the document, the slot among them or not. */\n nodes: ChildNode[];\n /** The nested template's clone: contents land immediately before it. */\n slot: HTMLTemplateElement;\n /** The next level's groups, in order, when this is not the innermost. */\n children: Group[];\n /** The live rows, in order, when this is the innermost level. */\n rows: Entry[];\n /** Where each heading element's columns land, found once. */\n heads: Places[];\n /** Every aggregate the group sets, found once. */\n aggregates: Element[];\n /** Whether a filter the user chose hides every row in it. */\n hidden: boolean;\n}\n\n/**\n * What the hub keeps about one element's rows between landings: the\n * templates the markup wrote, each live row by key, and the groups built\n * from them.\n */\ninterface List {\n /** The markup's first template: a group template, or the row template. */\n top: HTMLTemplateElement;\n /** The group templates, outermost first. Empty when the list has none. */\n levels: HTMLTemplateElement[];\n /** The innermost template, which every live row is copied from. */\n rowTemplate: HTMLTemplateElement;\n /** Where the row template's places lie, once a row has been made. */\n paths?: Path[];\n /** Every live row, by key. */\n byKey: Map<string, Entry>;\n root: Group;\n /**\n * The rows not yet entered that `--lb-new` put in the list, in the order\n * they were added. They hold no data, so they are not placed, filtered or\n * aggregated, and stand after every row, until the submit that carries\n * them succeeds.\n */\n unentered: Element[];\n}\n\nconst lists = new WeakMap<Element, List>();\n\n/** Elements already told their group templates outrun their order. */\nconst warned = new WeakSet<Element>();\n\n/**\n * What a group's heading and aggregates stop at: the rows and groups inside\n * it, live or leaving, which are filled from rows of their own.\n */\nconst SCAFFOLD_STOP = `${LIVE_ROW}, ${LIVE_GROUP}, ${LEAVING}`;\n\n/** An element carrying any aggregate. */\nconst AGGREGATE = AGGREGATES.map((name) => `[${name}]`).join(\", \");\n\n/**\n * The template a group's contents go in front of: the first `<template>` in\n * the content outside any nested `lb-query`, and not one holding an absent\n * branch.\n */\nfunction slotIn(root: Element | DocumentFragment): HTMLTemplateElement | null {\n for (const t of root.querySelectorAll(`template:not([${ATTR_SHOW}])`)) {\n if (inScope(root, t)) return t as HTMLTemplateElement;\n }\n return null;\n}\n\n/**\n * The aggregates in root's scaffolding: root itself when `self`, and every\n * one below it that is not inside a row or a group of its own.\n */\nfunction aggregatesIn(root: Element, self: boolean): Element[] {\n const found = below(root, AGGREGATE, SCAFFOLD_STOP);\n if (self && root.matches(AGGREGATE)) found.unshift(root);\n return found;\n}\n\n/**\n * The list an element holds, found from its first template the first time\n * rows land on it, and kept after that: once groups exist, their slots are\n * templates too, and they come first in the document.\n */\nfunction listFor(el: Element, template: HTMLTemplateElement): List | null {\n const found = lists.get(el);\n if (found) return found;\n const levels: HTMLTemplateElement[] = [];\n let at = template;\n while (at.hasAttribute(ATTR_GROUP)) {\n levels.push(at);\n const next = slotIn(at.content);\n if (!next) {\n console.error(\n `lb-hub: a group template in <${el.localName}> holds no nested ` +\n `template for its contents`,\n );\n return null;\n }\n at = next;\n }\n const list: List = {\n top: template,\n levels,\n rowTemplate: at,\n byKey: new Map(),\n unentered: [],\n root: {\n id: \"\",\n nodes: [],\n slot: template,\n children: [],\n rows: [],\n heads: [],\n aggregates: aggregatesIn(el, false),\n hidden: false,\n },\n };\n // Live rows already in the markup, as a page rendered ahead of its data\n // ships them, are the list's from the start, in the order they stand.\n if (levels.length === 0) {\n for (const row of el.querySelectorAll(LIVE_ROW)) {\n if (!inScope(el, row)) continue;\n const key = row.getAttribute(ATTR_KEY_VALUE)!;\n if (list.byKey.has(key)) {\n console.error(\n `lb-hub: <${el.localName}> shows two rows with the key '${key}'`,\n );\n }\n const entry: Entry = {\n key,\n el: row,\n places: search(row, true),\n data: {},\n placed: {},\n hidden: false,\n unplaced: false,\n };\n list.byKey.set(key, entry);\n list.root.rows.push(entry);\n }\n }\n lists.set(el, list);\n return list;\n}\n\n/** The live rows of a group and everything under it, in order. */\nfunction rowsUnder(group: Group): Entry[] {\n return group.children.length > 0\n ? group.children.flatMap(rowsUnder)\n : group.rows;\n}\n\n/**\n * A new live row for a key, copied from the row template: upgraded, stamped\n * with its key, its places found by the template's paths, and no values yet.\n * It is in no document until it is placed.\n */\nfunction create(list: List, doc: Document, key: string): Entry {\n const template = list.rowTemplate.content.firstElementChild!;\n list.paths ??= compile(template);\n // Imported rather than cloned: template content belongs to a document with\n // no custom element definitions, so a clone would not upgrade until\n // inserted, and a form-associated control would be filled as if it were\n // not one.\n const el = doc.importNode(template, true);\n upgradeAbsent(el, doc);\n placed(el);\n el.setAttribute(ATTR_ROW_LIVE, \"\");\n el.setAttribute(ATTR_KEY_VALUE, key);\n nameRadios(el, key);\n const entry: Entry = {\n key,\n el,\n places: placesBy(el, list.paths),\n data: {},\n placed: {},\n hidden: false,\n unplaced: false,\n };\n list.byKey.set(key, entry);\n return entry;\n}\n\n/**\n * Put the rows not yet entered after every row: immediately after the list's\n * first template, which the rows and groups land in front of, so placing\n * them never moves these.\n */\nfunction standLast(list: List): void {\n let at: Element = list.root.slot;\n for (const row of list.unentered) {\n if (at.nextElementSibling !== row) at.after(row);\n at = row;\n }\n}\n\n/** Stamp a list's count: the rows it shows, and its rows not yet entered. */\nfunction recount(el: Element, list: List): void {\n const showing = rowsUnder(list.root).filter((entry) => !entry.hidden);\n setStamp(\n el,\n ATTR_QUERY_ROW_COUNT,\n String(showing.length + list.unentered.length),\n );\n}\n\n/**\n * Put a row not yet entered into a list: a live row copied from its row\n * template, keyed by the empty key, its controls at their HTML defaults and\n * its `lb-show` branches as for a row whose columns are all null. It sends\n * nothing; the submit of the form around the list carries it. False when the\n * element holds no row template.\n */\nexport function addUnentered(el: Element): boolean {\n const template = lists.get(el)?.top ?? templateIn(el);\n if (!template) return false;\n const list = listFor(el, template);\n if (!list) return false;\n const doc = el.ownerDocument;\n const source = list.rowTemplate.content.firstElementChild!;\n list.paths ??= compile(source);\n // Imported rather than cloned, for the reason a live row is.\n const row = doc.importNode(source, true);\n upgradeAbsent(row, doc);\n placed(row);\n row.setAttribute(ATTR_ROW_LIVE, \"\");\n row.setAttribute(ATTR_KEY_VALUE, \"\");\n nameRadios(row, \"\");\n for (const [show, els] of placesBy(row, list.paths).shows) {\n for (const shown of els) presentPlaced(shown, show.startsWith(SHOW_NOT));\n }\n list.unentered.push(row);\n standLast(list);\n recount(el, list);\n attachPlaced();\n return true;\n}\n\n/**\n * Take a row not yet entered out of its list, as a row leaves. False when\n * the row is not one `--lb-new` put in a list.\n */\nexport function discardUnentered(row: Element): boolean {\n const el = row.parentElement?.closest(`[${ATTR_QUERY}]`);\n const list = el ? lists.get(el) : undefined;\n const at = list?.unentered.indexOf(row) ?? -1;\n if (!el || !list || at < 0) return false;\n list.unentered.splice(at, 1);\n leaving(row, ATTR_ROW_LIVE, ATTR_ROW_LEAVING);\n depart([row]);\n recount(el, list);\n return true;\n}\n\n/**\n * Give each radio button of a new live row a group of its own. The browser\n * groups radio buttons by `name`, and a row template repeats one `name` in\n * every live row, so the hub follows the `name` written, or the column when\n * none is, with the row's key.\n */\nfunction nameRadios(row: Element, key: string): void {\n for (const el of below(row, `input[type=radio][${ATTR_COLUMN}]`)) {\n const name = el.getAttribute(\"name\") || el.getAttribute(ATTR_COLUMN)!;\n el.setAttribute(\"name\", `${name}-${key}`);\n }\n}\n\n/** A group's identity among its siblings: its column and its value there. */\nfunction groupId(column: string, value: unknown): string {\n return `${column}\\u0000${JSON.stringify(value ?? null)}`;\n}\n\n/** A new group, cloned from the group template for its level and stamped. */\nfunction makeGroup(\n doc: Document,\n template: HTMLTemplateElement,\n id: string,\n term: OrderTerm | undefined,\n value: unknown,\n): Group {\n // Imported rather than cloned, for the reason a live row is.\n const fragment = doc.importNode(template.content, true);\n upgradeAbsent(fragment, doc);\n const slot = slotIn(fragment)!;\n const nodes = [...fragment.childNodes];\n const heads: Places[] = [];\n const aggregates: Element[] = [];\n for (const node of nodes) {\n if (node.nodeType !== ELEMENT_NODE || node === slot) continue;\n const el = node as Element;\n placed(el);\n el.setAttribute(ATTR_GROUP_LIVE, \"\");\n if (term) el.setAttribute(ATTR_GROUP_COLUMN, term.column);\n if (value === null || value === undefined) {\n el.removeAttribute(ATTR_GROUP_VALUE);\n } else {\n el.setAttribute(ATTR_GROUP_VALUE, String(value));\n }\n // A heading's own column is filled, as a live row's is, unless it holds\n // the group's contents, which filling it would replace.\n heads.push(search(el, !el.contains(slot), SCAFFOLD_STOP));\n aggregates.push(...aggregatesIn(el, true));\n }\n return {\n id,\n nodes,\n slot,\n children: [],\n rows: [],\n heads,\n aggregates,\n hidden: false,\n };\n}\n\n/**\n * Put a sequence of items in the document in the order given, in front of\n * `end`, where `old` is the order they stood in. The run they share at the\n * start and the run they share at the end stay where they are, and what lies\n * between goes in as one fragment. An item not in `old` is new, and one in\n * `old` that is not given has gone somewhere else, or is leaving.\n */\nfunction placeRun<T>(\n old: T[],\n next: T[],\n end: ChildNode,\n nodesOf: (item: T) => ChildNode[],\n): void {\n const most = Math.min(old.length, next.length);\n let start = 0;\n while (start < most && old[start] === next[start]) start++;\n let tail = 0;\n while (\n tail < most - start &&\n old[old.length - 1 - tail] === next[next.length - 1 - tail]\n ) {\n tail++;\n }\n const middle = next.slice(start, next.length - tail);\n if (middle.length === 0) return;\n const ref = tail > 0 ? nodesOf(next[next.length - tail]!)[0]! : end;\n const fragment = ref.ownerDocument!.createDocumentFragment();\n for (const item of middle) fragment.append(...nodesOf(item));\n ref.parentNode!.insertBefore(fragment, ref);\n}\n\n/**\n * Place a list's live rows in the order given, with groups made where the\n * order breaks, kept while their run goes on, and gone where it no longer\n * does. What leaves is returned, to leave once everything is placed.\n */\nfunction arrange(\n list: List,\n doc: Document,\n order: Entry[],\n terms: OrderTerm[],\n): Group[] {\n const retired: Group[] = [];\n const visit = (parent: Group, level: number, entries: Entry[]): void => {\n if (level === list.levels.length) {\n placeRun(parent.rows, entries, parent.slot, (entry) => [entry.el]);\n parent.rows = entries;\n return;\n }\n const term = terms[level];\n const runs: { id: string; value: unknown; entries: Entry[] }[] = [];\n for (const entry of entries) {\n const value = term ? entry.placed[term.column] : null;\n const id = groupId(term?.column ?? \"\", value);\n const last = runs.at(-1);\n if (last?.id === id) last.entries.push(entry);\n else runs.push({ id, value, entries: [entry] });\n }\n // Each group already here goes on with the first run that has its id.\n const pool = new Map<string, Group[]>();\n for (const child of parent.children) {\n pool.set(child.id, [...(pool.get(child.id) ?? []), child]);\n }\n const next = runs.map(\n (run) =>\n pool.get(run.id)?.shift() ??\n makeGroup(doc, list.levels[level]!, run.id, term, run.value),\n );\n for (const left of pool.values()) retired.push(...left);\n placeRun(parent.children, next, parent.slot, (group) => group.nodes);\n parent.children = next;\n runs.forEach((run, i) => visit(next[i]!, level + 1, run.entries));\n };\n visit(list.root, 0, order);\n return retired;\n}\n\n/**\n * The rows that moved: rows whose values changed, and which now stand\n * somewhere else among the rows whose values did not. A neighbour a moved\n * row passed did not move, and neither did a row whose new values left it\n * where it was.\n */\nfunction movedRows(\n before: Entry[],\n after: Entry[],\n changed: ReadonlySet<Entry>,\n): Set<Entry> {\n const moved = new Set<Entry>();\n if (changed.size === 0) return moved;\n const stayed = new Set(before);\n // For each changed row, the nearest unchanged row on either side of it.\n const anchors = (rows: Entry[]): Map<Entry, (Entry | null)[]> => {\n const around = new Map<Entry, (Entry | null)[]>();\n const kept = rows.filter((row) => stayed.has(row));\n let last: Entry | null = null;\n for (const row of kept) {\n if (changed.has(row)) around.set(row, [last, null]);\n else last = row;\n }\n last = null;\n for (const row of kept.reverse()) {\n if (changed.has(row)) around.get(row)![1] = last;\n else last = row;\n }\n return around;\n };\n const was = anchors(before);\n for (const [row, [prior, following]] of anchors(after)) {\n const [p, f] = was.get(row)!;\n if (p !== prior || f !== following) moved.add(row);\n }\n return moved;\n}\n\n/** Mark an element as leaving: no longer live, and taking no input. */\nfunction leaving(el: Element, live: string, stamp: string): void {\n el.removeAttribute(live);\n el.removeAttribute(ATTR_ROW_REQUESTED);\n el.setAttribute(stamp, \"\");\n el.setAttribute(\"inert\", \"\");\n}\n\n/** A group whose rows are all gone, and every group inside it, leave. */\nfunction leaveGroup(group: Group, nodes: ChildNode[]): void {\n for (const child of group.children) leaveGroup(child, nodes);\n for (const node of group.nodes) {\n if (node.nodeType === ELEMENT_NODE) {\n leaving(node as Element, ATTR_GROUP_LIVE, ATTR_GROUP_LEAVING);\n }\n }\n nodes.push(...group.nodes);\n}\n\n/**\n * Take nodes out of the document once whatever their stylesheet started on\n * them has finished: at once when nothing is running. Asking for the running\n * animations computes the style, so it is asked once, after everything a\n * landing writes, and an animation keyed to the leaving stamp is among them.\n */\nfunction depart(nodes: ChildNode[]): void {\n const running: Animation[] = [];\n for (const node of nodes) {\n if (node.nodeType !== ELEMENT_NODE) continue;\n const el = node as Element & { getAnimations?: Element[\"getAnimations\"] };\n running.push(...(el.getAnimations?.({ subtree: true }) ?? []));\n }\n const go = (): void => {\n for (const node of nodes) node.remove();\n detachRemoved(nodes);\n };\n if (running.length === 0) go();\n else void Promise.allSettled(running.map((a) => a.finished)).then(go);\n}\n\n/**\n * The stamps of what happened to rows, set together: a stamp a row already\n * carries is taken off first and put back after the style has been computed\n * once for all of them, so an animation keyed to it plays again.\n */\nclass Stamps {\n private again: [Element, string][] = [];\n\n set(el: Element, name: string, on: boolean): void {\n const had = el.hasAttribute(name);\n if (had) el.removeAttribute(name);\n if (!on) return;\n if (had) this.again.push([el, name]);\n else el.setAttribute(name, \"\");\n }\n\n done(doc: Document): void {\n if (this.again.length === 0) return;\n void doc.defaultView?.getComputedStyle(this.again[0]![0]).animationName;\n for (const [el, name] of this.again) el.setAttribute(name, \"\");\n }\n}\n\n/** A decimal: the digits as one integer, and how many of them are decimals. */\ninterface Decimal {\n digits: bigint;\n scale: number;\n}\n\n/** A plain decimal number, as JSON or Postgres writes one. */\nconst DECIMAL = /^[+-]?\\d+(\\.\\d+)?$/;\n\nfunction decimalOf(value: unknown): Decimal | null {\n const text = typeof value === \"number\" ? String(value) : value;\n if (typeof text !== \"string\" || !DECIMAL.test(text.trim())) return null;\n const [whole, fraction = \"\"] = text.trim().split(\".\");\n return { digits: BigInt(whole! + fraction), scale: fraction.length };\n}\n\nfunction rescale(d: Decimal, scale: number): bigint {\n return d.digits * 10n ** BigInt(scale - d.scale);\n}\n\nfunction decimalText(digits: bigint, scale: number): string {\n const negative = digits < 0n;\n const text = (negative ? -digits : digits)\n .toString()\n .padStart(scale + 1, \"0\");\n const whole = text.slice(0, text.length - scale);\n const fraction = scale > 0 ? `.${text.slice(text.length - scale)}` : \"\";\n return `${negative ? \"-\" : \"\"}${whole}${fraction}`;\n}\n\n/** Aggregates already warned about, so a bad value is reported once. */\nconst reported = new Set<string>();\n\n/**\n * One aggregate over rows. A sum and an average are exact, carried as\n * decimals with as many places as the most precise value, and an average\n * keeps up to two places more. Null and empty values are left out, as SQL\n * leaves them out; a value that is not a number is left out and reported.\n */\nfunction aggregateOf(\n name: string,\n column: string,\n rows: Row[],\n type?: ColumnType,\n): unknown {\n if (name === ATTR_COUNT) return rows.length;\n const values = rows\n .map((row) => row[column])\n .filter((v) => v !== null && v !== undefined && v !== \"\");\n if (values.length === 0) return null;\n if (name === ATTR_MIN || name === ATTR_MAX) {\n const sign = name === ATTR_MIN ? 1 : -1;\n return values.reduce((a, b) =>\n sign * compareValues(readAs(b, type), readAs(a, type)) < 0 ? b : a,\n );\n }\n const decimals: Decimal[] = [];\n for (const value of values) {\n const d = decimalOf(value);\n if (d) decimals.push(d);\n else if (!reported.has(`${name}:${column}`)) {\n reported.add(`${name}:${column}`);\n console.warn(\n `lb-hub: ${name}=\"${column}\" left out ${JSON.stringify(value)}, ` +\n `which is not a number`,\n );\n }\n }\n if (decimals.length === 0) return null;\n const scale = Math.max(...decimals.map((d) => d.scale));\n const sum = decimals.reduce((total, d) => total + rescale(d, scale), 0n);\n if (name === ATTR_SUM) return decimalText(sum, scale);\n // An average, rounded half away from zero at two places past the values',\n // which are then dropped while they are zeros.\n const scaled = sum * 100n;\n const n = BigInt(decimals.length);\n const sign = scaled < 0n ? -1n : 1n;\n let text = decimalText((2n * scaled + sign * n) / (2n * n), scale + 2);\n for (let i = 0; i < 2 && text.endsWith(\"0\"); i++) text = text.slice(0, -1);\n return text.endsWith(\".\") ? text.slice(0, -1) : text;\n}\n\n/** Set each aggregate element from rows, each column read as its type. */\nfunction aggregate(elements: Element[], rows: Row[], types: ColumnTypes): void {\n for (const el of elements) {\n const name = AGGREGATES.find((a) => el.hasAttribute(a))!;\n const column = el.getAttribute(name) ?? \"\";\n land(el, aggregateOf(name, column, rows, types[column]));\n }\n}\n\n/** Show or hide an element for a filter, saying so only when it changes. */\nfunction hide(el: Element, hidden: boolean): void {\n if (el.hasAttribute(\"hidden\") !== hidden) el.toggleAttribute(\"hidden\", hidden);\n}\n\n/**\n * Finish a group and everything under it, from the rows it shows: each\n * heading filled and linked from the first, as it was when last placed by\n * the order,\n * each aggregate set from all of them, and a group hidden when a filter hides\n * every row in it. The rows it shows are returned.\n */\nfunction finish(group: Group, types: ColumnTypes): Entry[] {\n const shown =\n group.children.length > 0\n ? group.children.flatMap((child) => finish(child, types))\n : group.rows.filter((entry) => !entry.hidden);\n const rows = shown.map((entry) => entry.data);\n const hidden = rows.length === 0 && rowsUnder(group).length > 0;\n if (hidden !== group.hidden) {\n group.hidden = hidden;\n for (const node of group.nodes) {\n if (node.nodeType === ELEMENT_NODE && node !== group.slot) {\n hide(node as Element, hidden);\n }\n }\n }\n if (shown[0]) {\n for (const head of group.heads) {\n fill(head, shown[0].placed);\n link(head, shown[0].placed);\n }\n }\n aggregate(group.aggregates, rows, types);\n return shown;\n}\n\n/** The order to place rows by, or none when it cannot be read. */\nfunction termsOf(el: Element, order: string | undefined): OrderTerm[] {\n try {\n return parseOrder(order ?? \"\");\n } catch (err) {\n console.error(`lb-hub: <${el.localName}> ${(err as Error).message}`);\n return [];\n }\n}\n\n/** An order's terms written back as its text. */\nfunction orderText(terms: OrderTerm[]): string {\n return terms\n .map((term) => (term.descending ? ORDER_DESCENDING : \"\") + term.column)\n .join(\",\");\n}\n\n/** The user's choice in a column of `lb-choices`, when one is made. */\nfunction choiceIn(choices: Row | undefined, column: string): string | undefined {\n const value = choices?.[column];\n return value === null || value === undefined || value === \"\"\n ? undefined\n : String(value);\n}\n\n/** The columns an element's `lb-filter` names. */\nfunction filtered(el: Element): string[] {\n return (el.getAttribute(ATTR_FILTER) ?? \"\")\n .split(\",\")\n .map((column) => column.trim())\n .filter((column) => column !== \"\");\n}\n\n/**\n * The order an element's rows are placed by: the user's, from the column of\n * `lb-choices` its `lb-order` names, else the one the server declared.\n */\nfunction orderFor(el: Element, options: RowsOptions): string | undefined {\n const column = el.getAttribute(ATTR_ORDER);\n const chosen = column ? choiceIn(options.choices, column) : undefined;\n return chosen ?? options.order;\n}\n\n/**\n * Whether a row passes every filter the user chose for the element: for each\n * column its `lb-filter` names, the filter in the column of `lb-choices` of\n * the same name.\n */\nfunction filterFor(\n el: Element,\n choices: Row | undefined,\n types: ColumnTypes,\n): (row: Row) => boolean {\n const filters: [string, FilterTerm[]][] = [];\n for (const column of filtered(el)) {\n const text = choiceIn(choices, column);\n const terms = text === undefined ? [] : parseFilter(text);\n if (terms.length > 0) filters.push([column, terms]);\n }\n return (row) =>\n filters.every(([column, terms]) => passes(row[column], terms, types[column]));\n}\n\n/**\n * Hide or show a row for a filter. A selection hidden is a selection\n * abandoned, as it is for `lb-show`.\n */\nfunction filterRow(entry: Entry, hidden: boolean): void {\n if (entry.hidden === hidden) return;\n entry.hidden = hidden;\n hide(entry.el, hidden);\n if (!hidden) return;\n for (const box of [entry.el, ...entry.el.querySelectorAll(`[${ATTR_SELECT}]`)]) {\n if (box.hasAttribute(ATTR_SELECT)) select(box, false);\n }\n}\n\n/** Whether a row's columns as landed differ from what they were. */\nfunction differs(before: Row, after: Row): boolean {\n return Object.entries(after).some(\n ([column, value]) => !same(before[column], value),\n );\n}\n\n/** How a list of rows lands: in what order, and whether a request asked. */\nexport interface RowsOptions {\n /** The order the server declared, as an order's text. */\n order?: string;\n /** The column types the server declared. */\n types?: ColumnTypes;\n /** The user's choices: the row of `lb-choices`. */\n choices?: Row;\n /**\n * The landing answers a request from this page, so a side the list\n * places by hand leaves its rows where they stand.\n */\n requested?: boolean;\n /**\n * Fill every row, changed or not: the element has not been filled for\n * real before, so what its rows show cannot be trusted.\n */\n refill?: boolean;\n /**\n * The document the page is in, where new rows are built. An element\n * `lb-show` holds absent is in its template's document, where nothing\n * upgrades, so its own would build rows whose controls are filled as if\n * they were not ones.\n */\n doc?: Document;\n}\n\n/**\n * Land rows through a row template.\n *\n * Two loops do the work, on rows in no document. The creation loop makes a\n * live row for each key not yet shown, with its key and no values. The\n * landing loop lands each arriving row's values on its live row, as a `row`\n * lands, passing over a column that already shows its value. Then every live\n * row is placed by the order in one fragment, and the browser styles once.\n *\n * All rows decide membership: a row whose key did not arrive leaves. A patch\n * disturbs only what it names — a row it did not mention keeps its contents,\n * and keeps its place unless a row the patch named now sorts around it.\n *\n * With no order, all rows show in the order they arrived, and a patch's new\n * rows go last. A row that stands where it stood is not touched, so landing\n * the same rows again moves nothing. A row a filter the user chose does not\n * pass is `hidden`.\n *\n * A landing that answers a request leaves alone each side `lb-manual` names\n * on the element, whole or a patch. Under `order`, nothing already showing\n * moves, and a new row goes last in its group. Under `filter`, a row the\n * answer changed or created stays showing. A row left where the order or\n * the filter would not leave it is stamped unplaced until the rows are next\n * placed.\n */\nexport function applyRows(\n el: Element,\n template: HTMLTemplateElement,\n keyColumn: string,\n result: RowsResult,\n options: RowsOptions = {},\n): void {\n const list = listFor(el, template);\n if (!list) return;\n const doc = options.doc ?? el.ownerDocument;\n const host = el as Element & HubLifecycle;\n const whole = !isPatch(result);\n const shown = rowsUnder(list.root);\n const focused = focusedRow(list, doc);\n\n // What a request did is said by this landing alone.\n for (const entry of shown) entry.el.removeAttribute(ATTR_ROW_REQUESTED);\n\n // The rows arriving, by key.\n const arriving = new Map<string, Row>();\n for (const data of whole ? result : (result.rows ?? [])) {\n if (data[keyColumn] === undefined) {\n console.error(\n `lb-hub: a row for <${el.localName}> has no '${keyColumn}' column`,\n );\n continue;\n }\n // The key is stored on the row as an attribute and read back from\n // there, so it is compared as the string the attribute holds.\n const key = String(data[keyColumn]);\n if (arriving.has(key)) {\n console.error(\n `lb-hub: two rows for <${el.localName}> have the key '${key}'; ` +\n `the last one shows`,\n );\n arriving.delete(key);\n }\n arriving.set(key, data);\n }\n const dropped = whole\n ? []\n : (result.drop ?? []).map((key) => String(key));\n for (const key of dropped) arriving.delete(key);\n const gone = whole\n ? shown.filter((entry) => !arriving.has(entry.key))\n : dropped.flatMap((key) => list.byKey.get(key) ?? []);\n\n // The creation loop.\n const created = new Set<Entry>();\n for (const key of arriving.keys()) {\n if (!list.byKey.has(key)) created.add(create(list, doc, key));\n }\n\n // The landing loop. A row whose values arrive as it already shows them is\n // left as it is, so a control the user has typed into and not committed\n // keeps what was typed. A row whose values changed is filled whole.\n const changed = new Set<Entry>();\n for (const [key, data] of arriving) {\n const entry = list.byKey.get(key)!;\n const fresh = created.has(entry);\n if (!fresh && differs(entry.data, data)) changed.add(entry);\n if (fresh || options.refill || changed.has(entry)) fill(entry.places, data);\n entry.data = { ...entry.data, ...data };\n // A link reads the whole row, which a patch may send only part of.\n if (fresh || options.refill || changed.has(entry)) {\n link(entry.places, entry.data);\n }\n }\n\n for (const entry of gone) {\n list.byKey.delete(entry.key);\n leaving(entry.el, ATTR_ROW_LIVE, ATTR_ROW_LEAVING);\n }\n\n // The order the rows arrived in for all rows, and for a patch the order\n // already showing with what is new after it. A sort keeps rows that\n // compare equal in this order.\n const stayed = shown.filter((entry) => list.byKey.get(entry.key) === entry);\n const terms = termsOf(el, orderFor(el, options));\n if (list.levels.length > terms.length && !warned.has(el)) {\n warned.add(el);\n console.warn(\n `lb-hub: <${el.localName}> has ${list.levels.length} group ` +\n `template(s) and an order of ${terms.length} term(s); a level with ` +\n `no term shows its rows as one group`,\n );\n }\n const sort = (entries: Entry[]): Entry[] =>\n terms.length === 0\n ? entries\n : entries\n .map((entry, i) => ({ entry, i }))\n .sort(\n (a, b) =>\n compareRows(a.entry.data, b.entry.data, terms, options.types) ||\n a.i - b.i,\n )\n .map(({ entry }) => entry);\n const passing = filterFor(el, options.choices, options.types ?? {});\n\n const manual = options.requested ? manualOf(el) : NO_MANUAL;\n const touched = new Set([...changed, ...created]);\n // A row left out of place stays touched until the rows are placed again.\n for (const entry of shown) if (entry.unplaced) touched.add(entry);\n\n let order: Entry[];\n let out = new Set<Entry>();\n if (manual.order) {\n // What already shows stays where it stands, and what is new goes last\n // in the group it belongs to.\n for (const entry of created) entry.placed = entry.data;\n order = heldOrder(stayed, created, groupTerms(list, terms));\n out = movedRows(order, sort(order), touched);\n } else {\n order = sort(\n whole\n ? [...arriving.keys()].map((key) => list.byKey.get(key)!)\n : [...stayed, ...created],\n );\n }\n for (const entry of order) {\n const fails = !passing(entry.data);\n // A row the answer touched does not vanish from under the user.\n const kept = manual.filter && touched.has(entry) && !entry.hidden && fails;\n const hides = fails && !kept;\n filterRow(entry, hides);\n // A row stands in the group it was placed in until it is placed again.\n const moves = manual.order && regrouped(entry, list, terms);\n if (!moves) entry.placed = entry.data;\n // A row nobody sees stands nowhere the user would notice.\n entry.unplaced = !hides && (out.has(entry) || kept || moves);\n }\n\n const moved = movedRows(stayed, order, changed);\n const retired = arrange(list, doc, order, terms);\n refocus(list, focused);\n\n const stamps = new Stamps();\n for (const key of arriving.keys()) {\n const entry = list.byKey.get(key)!;\n const fresh = created.has(entry);\n const went = moved.has(entry);\n stamps.set(entry.el, ATTR_ROW_CREATED, fresh);\n stamps.set(entry.el, ATTR_ROW_CHANGED, changed.has(entry));\n stamps.set(entry.el, ATTR_ROW_MOVED, went);\n const requested = went\n ? REQUESTED_MOVED\n : fresh\n ? REQUESTED_CREATED\n : changed.has(entry)\n ? REQUESTED_CHANGED\n : null;\n if (options.requested && requested) {\n entry.el.setAttribute(ATTR_ROW_REQUESTED, requested);\n }\n }\n stamps.done(doc);\n let unplaced = 0;\n for (const entry of order) {\n if (entry.el.hasAttribute(ATTR_ROW_UNPLACED) !== entry.unplaced) {\n entry.el.toggleAttribute(ATTR_ROW_UNPLACED, entry.unplaced);\n }\n if (entry.unplaced) unplaced++;\n }\n\n const rows = finish(list.root, options.types ?? {});\n // Counted from what the hub holds, which is what the rows show.\n setStamp(el, ATTR_QUERY_ROW_COUNT, String(rows.length + list.unentered.length));\n standLast(list);\n setStamp(el, ATTR_QUERY_UNPLACED_COUNT, String(unplaced));\n if (terms.length === 0) el.removeAttribute(ATTR_QUERY_ORDER);\n else setStamp(el, ATTR_QUERY_ORDER, orderText(terms));\n\n const departing: ChildNode[] = gone.map((entry) => entry.el);\n for (const group of retired) leaveGroup(group, departing);\n if (departing.length > 0) depart(departing);\n\n host.lbRowsLanded?.();\n}\n\n/** Which placements a list leaves to the user, as `lb-manual` names them. */\ninterface Manual {\n order: boolean;\n filter: boolean;\n}\n\nconst NO_MANUAL: Manual = { order: false, filter: false };\n\nfunction manualOf(el: Element): Manual {\n const sides = (el.getAttribute(ATTR_MANUAL) ?? \"\").split(/\\s+/);\n return {\n order: sides.includes(MANUAL_ORDER),\n filter: sides.includes(MANUAL_FILTER),\n };\n}\n\n/** The order's terms a list's groups break on, outermost first. */\nfunction groupTerms(list: List, terms: OrderTerm[]): OrderTerm[] {\n return terms.slice(0, list.levels.length);\n}\n\n/** The group a row's columns put it in, as one string. */\nfunction groupOf(row: Row, terms: OrderTerm[]): string {\n return terms.map((term) => groupId(term.column, row[term.column])).join(\"\\u0001\");\n}\n\n/** Whether a row's columns now put it in another group than it stands in. */\nfunction regrouped(entry: Entry, list: List, terms: OrderTerm[]): boolean {\n const by = groupTerms(list, terms);\n return groupOf(entry.data, by) !== groupOf(entry.placed, by);\n}\n\n/**\n * The rows of a list the user is working in: those showing where they\n * stand, and each new one after the last row of its group, or last of all\n * when its group shows no row.\n */\nfunction heldOrder(\n stayed: Entry[],\n created: Iterable<Entry>,\n by: OrderTerm[],\n): Entry[] {\n const order = [...stayed];\n for (const entry of created) {\n const group = groupOf(entry.placed, by);\n let at = order.length;\n if (by.length > 0) {\n while (at > 0 && groupOf(order[at - 1]!.placed, by) !== group) at--;\n if (at === 0) at = order.length;\n }\n order.splice(at, 0, entry);\n }\n return order;\n}\n\n/** The live row of a list holding the focus, and the element that has it. */\ninterface Focused {\n entry: Entry;\n active: HTMLElement;\n}\n\nfunction focusedRow(list: List, doc: Document): Focused | null {\n const active = doc.activeElement as HTMLElement | null;\n const row = active?.closest(LIVE_ROW);\n if (!active || !row) return null;\n const entry = list.byKey.get(row.getAttribute(ATTR_KEY_VALUE)!);\n return entry?.el === row ? { entry, active } : null;\n}\n\n/**\n * Keep the focus where the user had it once rows are placed: on the same\n * element, scrolled into view, when its row still shows; otherwise on the\n * first element the user can operate in the first row showing.\n */\nfunction refocus(list: List, focused: Focused | null): void {\n if (!focused) return;\n const { entry, active } = focused;\n const doc = active.ownerDocument;\n if (list.byKey.get(entry.key) === entry && !entry.hidden) {\n if (doc.activeElement === active || !active.isConnected) return;\n active.focus({ preventScroll: true });\n active.scrollIntoView?.({ block: \"nearest\" });\n return;\n }\n const first = rowsUnder(list.root).find((row) => !row.hidden);\n if (first) focusIn(first.el);\n}\n\n/** Land one response item on one element that names its query. */\nfunction landItem(\n el: Element,\n item: ResponseItem,\n options: RowsOptions = {},\n): void {\n const template = lists.get(el)?.top ?? templateIn(el);\n if (item.kind === KIND_ROW) {\n const row = item.row;\n if (template) {\n applyRows(el, template, item.key, row ? [row] : [], options);\n return;\n }\n // No row: every column the element shows lands null, and the element\n // names no row.\n if (!row) {\n applyRow(el, blankRow(el));\n el.removeAttribute(ATTR_KEY_VALUE);\n return;\n }\n applyRow(el, row);\n const key = row[item.key];\n if (key !== undefined && key !== null) {\n setStamp(el, ATTR_KEY_VALUE, String(key));\n }\n return;\n }\n // A `rows` query with no row template lands nothing: an insert form names\n // the query it adds to, and shows none of its rows.\n if (!template) return;\n const result = item.patch ?? item.rows ?? [];\n applyRows(el, template, item.key, result, options);\n}\n\n/**\n * What landing keeps for one root: the last whole answer to each query, and\n * every element an answer has landed on. The user's choices are among the\n * answers, as the answer to `lb-choices`.\n */\ninterface Kept {\n answers: Map<string, ResponseItem>;\n landed: WeakSet<Element>;\n /** The document the root is in. */\n doc: Document;\n}\n\nconst kept = new WeakMap<ParentNode, Kept>();\n\nfunction keptFor(root: ParentNode): Kept {\n let found = kept.get(root);\n if (!found) {\n const node = root as Node;\n found = {\n answers: new Map(),\n landed: new WeakSet(),\n doc: node.ownerDocument ?? (node as Document),\n };\n kept.set(root, found);\n }\n return found;\n}\n\n/** The answer kept for a query, as all of its rows. */\nexport function keptAnswer(\n root: ParentNode,\n query: string,\n): ResponseItem | undefined {\n return kept.get(root)?.answers.get(query);\n}\n\n/**\n * How a query's rows land: by its order, its column types, and the user's\n * choices. The order and types are the kept answer's, since only the answer\n * that loads the page carries them.\n */\nfunction rowsOptions(state: Kept, item: ResponseItem): RowsOptions {\n const declared = state.answers.get(item.query) ?? item;\n return {\n order: declared.order,\n types: declared.types,\n choices: state.answers.get(CHOICES_QUERY)?.row ?? undefined,\n doc: state.doc,\n };\n}\n\n/**\n * Drop what landing kept for a root. The hub calls it when it replaces the\n * page, since another page's query of the same name is another query, and\n * the user's choices were for the page they were made on.\n */\nexport function forget(root: ParentNode): void {\n kept.delete(root);\n}\n\n/**\n * All rows after a patch, as the elements it landed on now show them: a row\n * it names takes the columns it sends and keeps its place, a new one goes\n * last, and a dropped one goes.\n */\nfunction patched(rows: Row[], key: string, patch: Patch): Row[] {\n const byKey = new Map(rows.map((row) => [String(row[key]), row]));\n for (const row of patch.rows ?? []) {\n const k = String(row[key]);\n byKey.set(k, { ...byKey.get(k), ...row });\n }\n for (const k of patch.drop ?? []) byKey.delete(String(k));\n return [...byKey.values()];\n}\n\n/**\n * Keep an answer as all of the query's rows. A patch is applied to the\n * answer already kept; with none, it is not the whole of anything, and\n * nothing is kept.\n *\n * A query's order and column types arrive with the answer that loads the\n * page, and every answer after it, all rows or a patch, keeps them.\n */\nfunction keep(answers: Map<string, ResponseItem>, item: ResponseItem): void {\n const before = answers.get(item.query);\n const declared = {\n ...(before?.order !== undefined && { order: before.order }),\n ...(before?.types !== undefined && { types: before.types }),\n };\n if (!item.patch) {\n answers.set(item.query, { ...declared, ...item });\n return;\n }\n if (!before) return;\n const { patch: _, ...whole } = item;\n answers.set(item.query, {\n ...declared,\n ...whole,\n rows: patched(before.rows ?? [], item.key, item.patch),\n });\n}\n\n/** The columns of `lb-choices` an answer to it changes. */\nfunction chosen(state: Kept, item: ResponseItem): Set<string> {\n const before = state.answers.get(CHOICES_QUERY)?.row ?? {};\n const after = item.row ?? {};\n const columns = new Set<string>();\n for (const column of new Set([...Object.keys(before), ...Object.keys(after)])) {\n if (choiceIn(before, column) !== choiceIn(after, column)) columns.add(column);\n }\n return columns;\n}\n\n/** Whether an element's order or filter reads any of the columns. */\nfunction reads(el: Element, columns: Set<string>): boolean {\n const order = el.getAttribute(ATTR_ORDER);\n return (\n (order !== null && columns.has(order)) ||\n filtered(el).some((column) => columns.has(column))\n );\n}\n\n/**\n * Place again the rows of every element whose order or filter reads a choice\n * that changed. Each lands its query's kept answer again, whole, so it shows\n * what a round trip carrying the choice would have, and the server is asked\n * for nothing.\n */\nfunction rechoose(root: ParentNode, state: Kept, columns: Set<string>): void {\n for (const [query, item] of state.answers) {\n if (item.kind === KIND_ROW) continue;\n for (const el of everywhere(root, `[${ATTR_QUERY}=\"${query}\"]`)) {\n if (!state.landed.has(el) || el.closest(LEAVING)) continue;\n if (reads(el, columns)) landItem(el, item, rowsOptions(state, item));\n }\n }\n}\n\n/**\n * Fill every element that names a kept query and has had nothing land on it.\n * Filling one can build more — a live row holding a picker of its own — so\n * it goes round until a pass finds nothing new.\n */\nfunction fillArrivals(root: ParentNode, state: Kept): void {\n const { answers, landed } = state;\n for (let filled = true; filled;) {\n filled = false;\n for (const [query, item] of answers) {\n for (const el of everywhere(root, `[${ATTR_QUERY}=\"${query}\"]`)) {\n if (landed.has(el) || el.closest(LEAVING)) continue;\n landed.add(el);\n landItem(el, item, { ...rowsOptions(state, item), refill: true });\n filled = true;\n }\n }\n }\n}\n\n/** How response items land. */\nexport interface LandOptions {\n /**\n * Queries that may have nowhere to land without a warning. A query the hub\n * serves, such as `lb-url`, is always one: it lands wherever a chrome or\n * page names it, and nowhere otherwise.\n */\n quiet?: readonly string[];\n /** The items answer a request from this page. */\n requested?: boolean;\n}\n\n/**\n * Land response items. Every answer arrives through here, and is kept for\n * `root`, so that what arrives after it is filled from it — see forget().\n * An answer to `lb-choices` places again the rows its choices change. Once\n * everything has landed, each custom element placed since the last landing\n * is attached.\n */\nexport function applyResponse(\n root: ParentNode,\n items: ResponseItem[],\n options: LandOptions = {},\n): void {\n const state = keptFor(root);\n for (const item of items) {\n const choices =\n item.query === CHOICES_QUERY ? chosen(state, item) : new Set<string>();\n keep(state.answers, item);\n const targets = everywhere(root, `[${ATTR_QUERY}=\"${item.query}\"]`).filter(\n (el) => !el.closest(LEAVING),\n );\n if (\n targets.length === 0 &&\n !item.query.startsWith(LB_RESERVED_PREFIX) &&\n !options.quiet?.includes(item.query)\n ) {\n console.warn(`lb-hub: nothing names '${item.query}', skipping`);\n }\n for (const el of targets) {\n state.landed.add(el);\n landItem(el, item, {\n ...rowsOptions(state, item),\n requested: options.requested,\n });\n }\n if (choices.size > 0) rechoose(root, state, choices);\n }\n fillArrivals(root, state);\n attachPlaced();\n}\n\n/**\n * Place an element's rows by the order and the filter again, from the answer\n * kept for its query, with no round trip: what the user asks for once an\n * answer has left rows out of place. False when the element shows no rows\n * the hub holds.\n */\nexport function placeAgain(root: ParentNode, el: Element): boolean {\n const state = kept.get(root);\n const item = state?.answers.get(el.getAttribute(ATTR_QUERY) ?? \"\");\n if (!state || !item || item.kind === KIND_ROW || !state.landed.has(el)) {\n return false;\n }\n landItem(el, item, rowsOptions(state, item));\n return true;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"lb-apply.js","sourceRoot":"","sources":["../../hub/lb-apply.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference lib=\"dom\" />\n\n/**\n * Landing: rows from response items onto the elements that name their query.\n * `applyRows` fills a row template; `applyRow` fills one element.\n */\n\nimport {\n ATTR_COLUMN,\n ATTR_FILTER,\n FILTERS_COLUMN_QUERY,\n FILTERS_QUERY,\n SORT_COLUMN_ORDER,\n SORT_COLUMN_QUERY,\n SORT_QUERY,\n LB_RESERVED_PREFIX,\n ATTR_COLUMN_VALUE,\n ATTR_KEY_VALUE,\n ATTR_QUERY,\n ATTR_QUERY_ORDER,\n ATTR_QUERY_ROW_COUNT,\n ATTR_MANUAL,\n MANUAL_FILTER,\n MANUAL_ORDER,\n ATTR_QUERY_UNPLACED_COUNT,\n ATTR_ROW_CHANGED,\n ATTR_ROW_CREATED,\n ATTR_ROW_LEAVING,\n ATTR_ROW_LIVE,\n ATTR_ROW_MOVED,\n ATTR_ROW_REQUESTED,\n ATTR_ROW_UNPLACED,\n ATTR_SHOW,\n ATTR_URL_PARM,\n KIND_ROW,\n LIVE_ROW,\n ORDER_DESCENDING,\n REQUESTED_CHANGED,\n REQUESTED_CREATED,\n REQUESTED_MOVED,\n SHOW_NOT,\n} from \"../core/lb-constants.js\";\nimport {\n compareRows,\n isPatch,\n parseFilter,\n parseOrder,\n passes,\n type ColumnTypes,\n type FilterTerm,\n type OrderTerm,\n type ParmValue,\n type Patch,\n type HubLifecycle,\n type ResponseItem,\n type Row,\n type RowsResult,\n oneRow,\n} from \"../core/lb-types.js\";\nimport {\n attachPlaced,\n detachRemoved,\n LEAVING,\n PARKED,\n placed,\n upgradeAbsent,\n} from \"./lb-lifecycle.js\";\n\n/** A DocumentFragment's nodeType. Tier 3 has no `Node` global to read it from. */\nconst FRAGMENT_NODE = 11;\n\n/** An Element's nodeType, for the same reason. */\nconst ELEMENT_NODE = 1;\n\n/** A Text node's nodeType, for the same reason. */\nconst TEXT_NODE = 3;\n\n/**\n * The input types whose state is not their `value`, or cannot be set. A\n * checkbox's and a radio button's state is `checked`, and each is a control\n * by its own rule.\n */\nconst UNLANDED_INPUTS = [\"checkbox\", \"radio\", \"file\"];\n\n/** A control's value, whether it is native or a custom element. */\nexport interface Control extends Element {\n value: string;\n}\n\n/**\n * A native control whose state is its `value`: a `<select>`, a\n * `<textarea>`, or an `<input>` of any type but checkbox, radio and file.\n *\n * Told apart by tag name and type rather than by class, so it holds for an\n * element from any document.\n */\nfunction isNativeControl(el: Element): boolean {\n if (el.localName === \"select\" || el.localName === \"textarea\") return true;\n return (\n el.localName === \"input\" &&\n !UNLANDED_INPUTS.includes((el as HTMLInputElement).type)\n );\n}\n\n/**\n * A checkbox, whose state is `checked` rather than `value`. HTML's quirk,\n * and so the hub's: it lands and gathers by its checked state, so every other\n * part of the vocabulary treats it as any control.\n */\nfunction isCheckbox(el: Element): boolean {\n return (\n el.localName === \"input\" && (el as HTMLInputElement).type === \"checkbox\"\n );\n}\n\n/**\n * A radio button, whose state is `checked` as well. It is checked when its\n * own `value` is the value that landed, so a group of them naming one column\n * shows that value, and gathers the one checked.\n */\nexport function isRadio(el: Element): boolean {\n return el.localName === \"input\" && (el as HTMLInputElement).type === \"radio\";\n}\n\n/**\n * A form-associated custom element with a `value` property. HTML marks one\n * with `static formAssociated = true` on its class, and a control has a value.\n */\nexport function isFormAssociated(el: Element): boolean {\n const ctor = el.constructor as { formAssociated?: unknown };\n return ctor.formAssociated === true && \"value\" in el;\n}\n\n/**\n * A control: an `<input>`, `<select>` or `<textarea>`, a checkbox, a radio\n * button, or a\n * form-associated custom element with a `value` property. Landing and\n * gathering draw the same line, so a value read back is the one that landed\n * there.\n */\nexport function isControl(el: Element): el is Control {\n return (\n isNativeControl(el) || isCheckbox(el) || isRadio(el) || isFormAssociated(el)\n );\n}\n\n/**\n * A control that holds several values: a `<select multiple>`, or a checkbox\n * carrying a `value`, one of a set naming one column. A checkbox with no\n * `value` is a flag.\n */\nfunction holdsSeveral(el: Element): boolean {\n if (el.localName === \"select\") return (el as HTMLSelectElement).multiple;\n return isCheckbox(el) && el.hasAttribute(\"value\");\n}\n\n/** A landed value as the list of strings a control holding several shows. */\nfunction listOf(value: unknown): string[] {\n if (Array.isArray(value)) return value.map((v) => String(v));\n if (value === null || value === undefined || value === \"\") return [];\n return [String(value)];\n}\n\n/**\n * What a control gathers: a checkbox `\"true\"` or `\"false\"`, so unchecked\n * still says so, a `<select multiple>` the values of its selected options,\n * and any other control its `value`, which a custom element may give as\n * several.\n */\nfunction controlValue(el: Control): ParmValue {\n if (isCheckbox(el)) return String((el as HTMLInputElement).checked);\n if (el.localName === \"select\" && (el as HTMLSelectElement).multiple) {\n return [...(el as HTMLSelectElement).selectedOptions].map((o) => o.value);\n }\n const value: unknown = el.value;\n return Array.isArray(value) ? value.map((v) => String(v)) : el.value;\n}\n\n/**\n * Gather a control into `values` under its column. Of the radio buttons\n * naming one column, the one checked gives the value, and `\"\"` stands when\n * none is. Of the checkboxes in a set naming one column, the checked ones\n * give their values, and none checked gives none.\n */\nexport function gatherInto(\n values: Record<string, ParmValue>,\n column: string,\n el: Control,\n): void {\n if (isRadio(el) && !(el as HTMLInputElement).checked) {\n values[column] ??= \"\";\n return;\n }\n if (isCheckbox(el) && holdsSeveral(el)) {\n const had = values[column];\n const set = Array.isArray(had) ? had : [];\n values[column] = set;\n if ((el as HTMLInputElement).checked) set.push(el.value);\n return;\n }\n values[column] = controlValue(el);\n}\n\n/**\n * Set an element from a column. A control's `value` is set. A custom element\n * that is not a control keeps its content, which the builder placed there\n * from its element file, and renders the stamp instead. Any other element's\n * text content is set. Every one carries the value as `lb-column-value`.\n */\nfunction land(el: Element, value: unknown): void {\n if (holdsSeveral(el)) return landSeveral(el, value);\n // A custom element control takes several values as they are. Anything\n // else holds one, and shows the first, as a URL's parm reads.\n if (Array.isArray(value) && !isFormAssociated(el)) value = value[0];\n // Untouched, whatever the server sent: the browser decides what a\n // non-string looks like. See Row in core/lb-types.ts.\n if (value === null || value === undefined) {\n if (isCheckbox(el) || isRadio(el)) {\n (el as HTMLInputElement).checked = false;\n } else if (isControl(el)) el.value = \"\";\n else if (!el.localName.includes(\"-\") && el.localName !== \"input\") {\n el.textContent = \"\";\n }\n el.removeAttribute(ATTR_COLUMN_VALUE);\n return;\n }\n if (isCheckbox(el)) {\n // Off for false, and for what an unchecked checkbox gathers or an absent\n // query parm lands as, so a checkbox lands what it gathered even from a\n // query whose values are strings, such as lb-url.\n (el as HTMLInputElement).checked =\n value !== false && value !== \"false\" && value !== \"\";\n } else if (isRadio(el)) {\n (el as HTMLInputElement).checked =\n (el as HTMLInputElement).value === String(value);\n } else if (isControl(el)) {\n el.value = value as string;\n } else if (el.localName === \"input\") {\n console.warn(\n `lb-hub: a value does not land on <input type=\"${(el as HTMLInputElement).type}\">, ignoring`,\n el,\n );\n return;\n } else if (!el.localName.includes(\"-\")) {\n setText(el, String(value));\n }\n setStamp(el, ATTR_COLUMN_VALUE, String(value));\n}\n\n/**\n * Set a control that holds several values: a checkbox in a set is checked\n * when its `value` is among them, and a `<select multiple>` selects each\n * option whose `value` is.\n */\nfunction landSeveral(el: Element, value: unknown): void {\n const list = listOf(value);\n if (isCheckbox(el)) {\n (el as HTMLInputElement).checked = list.includes((el as HTMLInputElement).value);\n } else {\n for (const option of (el as HTMLSelectElement).options) {\n option.selected = list.includes(option.value);\n }\n }\n if (list.length === 0) el.removeAttribute(ATTR_COLUMN_VALUE);\n else setStamp(el, ATTR_COLUMN_VALUE, JSON.stringify(list));\n}\n\n/**\n * Set an element's text, unless it already holds exactly that text. Writing\n * the same text again replaces the text node, which is two mutations and a\n * style check for nothing.\n */\nfunction setText(el: Element, text: string): void {\n const only = el.firstChild;\n const same = only\n ? only === el.lastChild &&\n only.nodeType === TEXT_NODE &&\n (only as Text).data === text\n : text === \"\";\n if (!same) el.textContent = text;\n}\n\nfunction setStamp(el: Element, name: string, value: string): void {\n if (el.getAttribute(name) !== value) el.setAttribute(name, value);\n}\n\n/**\n * Whether an element under `root` belongs to root's query, rather than to a\n * query nested inside it.\n *\n * A descendant is root's unless something between it and root carries\n * `lb-query`. The element's own `lb-query` does not count: it names what the\n * element holds, and the row it reads from is its ancestors'. So a picker\n * carrying `lb-query` and `lb-column` is set from the row around it. Root's\n * own attribute does not count either: root is what is being filled.\n *\n * Root may be the content of a template holding an absent branch. The walk\n * up from an element inside it stops at the top of that content, which has\n * no parent, and the template it stands for was in scope already.\n */\nfunction inScope(\n root: Element | DocumentFragment,\n el: Element,\n): boolean {\n for (let node = el.parentElement; node && node !== root;) {\n if (node.hasAttribute(ATTR_QUERY)) return false;\n node = node.parentElement;\n }\n return true;\n}\n\n/**\n * Root if it matches, then every descendant in root's query that does.\n * Gathering finds columns through here. It does not reach into an absent\n * branch, so a live row is read back from the places a row lands that are\n * showing.\n */\nexport function within(root: Element, selector: string): Element[] {\n const found: Element[] = root.matches(selector) ? [root] : [];\n for (const el of root.querySelectorAll(selector)) {\n if (inScope(root, el)) found.push(el);\n }\n return found;\n}\n\n/**\n * Every descendant in root's query that matches, absent branches included.\n *\n * `querySelectorAll` does not enter template content, so an element that is\n * off would otherwise miss everything landed while it was away, and return\n * stale or with its rows empty. A template holding one is in root's query by\n * the ordinary rule, and its content is searched as if it stood there.\n */\nfunction below(\n root: Element | DocumentFragment,\n selector: string,\n): Element[] {\n const found: Element[] = [];\n for (const el of root.querySelectorAll(selector)) {\n if (inScope(root, el)) found.push(el);\n }\n for (const parked of root.querySelectorAll(PARKED)) {\n if (inScope(root, parked)) {\n found.push(\n ...below((parked as HTMLTemplateElement).content, selector),\n );\n }\n }\n return found;\n}\n\n/**\n * Every element in root that matches, absent branches included. A query is\n * looked up this way before any row is known, so nothing is filtered out.\n */\nfunction everywhere(root: ParentNode, selector: string): Element[] {\n const found = [...root.querySelectorAll(selector)];\n for (const parked of root.querySelectorAll(PARKED)) {\n const content = (parked as HTMLTemplateElement).content;\n found.push(...everywhere(content, selector));\n }\n return found;\n}\n\n/**\n * Put an element in the document or take it out, as its `lb-show` column\n * says.\n *\n * Off is inside a template that stands where the element stood, carrying the\n * same `lb-show`. The element is moved rather than rebuilt, so a custom\n * element keeps its instance and a control keeps what was typed into it. On\n * moves it back and the template goes.\n *\n * Landing reaches into that template, so both it and the element it holds\n * arrive here. The template decides; the element it holds, whose parent is\n * the template's content, is left to it.\n */\nfunction present(el: Element, on: boolean): void {\n if (el.localName === \"template\") {\n const branch = (el as HTMLTemplateElement).content.firstElementChild;\n if (on && branch) el.replaceWith(branch);\n return;\n }\n if (on || el.parentNode?.nodeType === FRAGMENT_NODE) return;\n const parked = el.ownerDocument.createElement(\"template\");\n parked.setAttribute(ATTR_SHOW, el.getAttribute(ATTR_SHOW)!);\n el.replaceWith(parked);\n parked.content.append(el);\n parkedIn.set(el, parked);\n}\n\n/** The template each absent element was last put in. */\nconst parkedIn = new WeakMap<Element, HTMLTemplateElement>();\n\n/**\n * Put a live row's element in the document or take it out, the element\n * itself being known. Its template, while it is in one, decides first, as it\n * does when landing finds both.\n */\nfunction presentPlaced(el: Element, on: boolean): void {\n const parked = parkedIn.get(el);\n if (parked && el.parentNode === parked.content) present(parked, on);\n present(el, on);\n}\n\n/**\n * Where one row's columns land and its conditions show, each list by the\n * attribute's value: `lb-column`'s, and `lb-show`'s with its `!`.\n */\ninterface Places {\n columns: Map<string, Element[]>;\n shows: Map<string, Element[]>;\n /** Every link whose `href` takes parms from the row. */\n links: Element[];\n}\n\nfunction addPlace(map: Map<string, Element[]>, name: string, el: Element): void {\n const list = map.get(name);\n if (list) list.push(el);\n else map.set(name, [el]);\n}\n\n/**\n * Note an element among the places: where its `lb-column` lands, and what\n * its `lb-show` decides. A template holding an absent branch decides for the\n * branch it holds, and is noted as that branch's.\n */\nfunction note(places: Places, el: Element): void {\n const column = el.getAttribute(ATTR_COLUMN);\n if (column !== null) {\n addPlace(places.columns, column, el);\n }\n if (el.hasAttribute(ATTR_URL_PARM)) places.links.push(el);\n const show = el.getAttribute(ATTR_SHOW);\n if (show === null) return;\n if (el.localName === \"template\") {\n const branch = (el as HTMLTemplateElement).content.firstElementChild;\n if (branch) parkedIn.set(branch, el as HTMLTemplateElement);\n return;\n }\n addPlace(places.shows, show, el);\n}\n\nfunction noPlaces(): Places {\n return { columns: new Map(), shows: new Map(), links: [] };\n}\n\n/** An element a row lands on, in any way. */\nconst PLACE = `[${ATTR_COLUMN}], [${ATTR_SHOW}], [${ATTR_URL_PARM}]`;\n\n/**\n * Note a row's root among its places: its own `lb-column` and `lb-url-parm`\n * count, as the row is its own. Its own `lb-show` never does.\n */\nfunction noteRoot(places: Places, root: Element): void {\n if (root.hasAttribute(ATTR_COLUMN)) {\n addPlace(places.columns, root.getAttribute(ATTR_COLUMN)!, root);\n }\n if (root.hasAttribute(ATTR_URL_PARM)) places.links.push(root);\n}\n\n/**\n * The places in root's query, found by searching: root's own `lb-column`\n * when `self`, and every one below it short of `stop`, absent branches\n * included.\n */\nfunction search(root: Element, self: boolean): Places {\n const places = noPlaces();\n if (self) noteRoot(places, root);\n for (const el of below(root, PLACE)) note(places, el);\n return places;\n}\n\n/**\n * A place's position in a row: child indices from the row's root, where a\n * template holding an absent branch counts its content as its children.\n */\ntype Path = number[];\n\nfunction kids(el: Element): HTMLCollection {\n return el.localName === \"template\"\n ? (el as HTMLTemplateElement).content.children\n : el.children;\n}\n\n/**\n * Where every place below a row template's root lies, worked out once for\n * the template and followed in each copy of it. The rule is search()'s: a\n * nested query's own attributes are this row's and what is inside it is not,\n * and template content is entered only for an absent branch.\n */\nfunction compile(row: Element): Path[] {\n const paths: Path[] = [];\n const walk = (el: Element, path: Path): void => {\n const children = kids(el);\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!;\n const at = [...path, i];\n if (child.matches(PLACE)) paths.push(at);\n if (child.hasAttribute(ATTR_QUERY)) continue;\n if (child.localName === \"template\" && !child.hasAttribute(ATTR_SHOW)) {\n continue;\n }\n walk(child, at);\n }\n };\n walk(row, []);\n return paths;\n}\n\n/**\n * A live row's places, by its template's paths: its root's own `lb-column`,\n * and the element at the end of each path. Followed before anything lands,\n * while the copy is as the template made it.\n */\nfunction placesBy(row: Element, paths: Path[]): Places {\n const places = noPlaces();\n noteRoot(places, row);\n for (const path of paths) {\n let el = row;\n for (const i of path) el = kids(el)[i]!;\n note(places, el);\n }\n return places;\n}\n\n/** Whether two column values are the same value. */\nfunction same(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n // Loadbare does not read a non-atomic value, but one may still arrive.\n return (\n typeof a === \"object\" &&\n typeof b === \"object\" &&\n a !== null &&\n b !== null &&\n JSON.stringify(a) === JSON.stringify(b)\n );\n}\n\n/**\n * Land a row on its places: each column's value where it lands, and the\n * conditions it decides.\n *\n * Only null and false are off. A string is never read, so \"false\" is on, and\n * the query spells a condition as a boolean or a null.\n */\nfunction fill(places: Places, row: Row): void {\n for (const [column, value] of Object.entries(row)) {\n for (const el of places.columns.get(column) ?? []) land(el, value);\n const on = value !== null && value !== false;\n for (const el of places.shows.get(column) ?? []) presentPlaced(el, on);\n for (const el of places.shows.get(`${SHOW_NOT}${column}`) ?? []) {\n presentPlaced(el, !on);\n }\n }\n}\n\n/**\n * Fill from one row: every `lb-column` and `lb-show` in root's query.\n *\n * With `self`, root's own `lb-column` counts, as a live row's does:\n * `<option>`'s content model is text, so an option row has to be the column\n * it displays. An element a `row` lands on is not its own ancestor, so its\n * own `lb-column` reads from the row around it and is left alone here. Root's\n * own `lb-show` never counts.\n */\nexport function applyRow(\n root: Element,\n row: Row,\n self = false,\n): void {\n const places = search(root, self);\n fill(places, row);\n link(places, row);\n}\n\n/** The `href` each link was written with, which every landing starts from. */\nconst bases = new WeakMap<Element, string>();\n\n/** Columns already reported as missing from a row, or as no parm's value. */\nconst unlinked = new Set<string>();\n\n/** The columns an element's `lb-url-parm` names. */\nfunction parmsOf(el: Element): string[] {\n return (el.getAttribute(ATTR_URL_PARM) ?? \"\")\n .split(\",\")\n .map((column) => column.trim())\n .filter((column) => column !== \"\");\n}\n\n/**\n * Write each link's `href` from the whole row: the `href` as written, with\n * each column its `lb-url-parm` names as the parm of the same name. A null,\n * empty or missing column leaves its parm off, as an empty value takes a\n * parm out of the URL.\n */\nfunction link(places: Places, row: Row): void {\n if (places.links.length === 0) return;\n // A row with no values is a blank, not a row missing its columns.\n const real = Object.values(row).some((v) => v !== null && v !== undefined);\n for (const el of places.links) {\n let base = bases.get(el);\n if (base === undefined) {\n base = el.getAttribute(\"href\") ?? \"\";\n bases.set(el, base);\n }\n const hashAt = base.indexOf(\"#\");\n const hash = hashAt < 0 ? \"\" : base.slice(hashAt);\n const rest = hashAt < 0 ? base : base.slice(0, hashAt);\n const queryAt = rest.indexOf(\"?\");\n const path = queryAt < 0 ? rest : rest.slice(0, queryAt);\n const parms = new URLSearchParams(queryAt < 0 ? \"\" : rest.slice(queryAt));\n for (const column of parmsOf(el)) {\n const value = row[column];\n if (value === undefined && real && !unlinked.has(column)) {\n unlinked.add(column);\n console.warn(\n `lb-hub: <a ${ATTR_URL_PARM}> names '${column}', which the row ` +\n `around it does not have`,\n );\n }\n const atomic =\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\";\n if (!atomic && value !== null && value !== undefined) {\n if (!unlinked.has(column)) {\n unlinked.add(column);\n console.warn(\n `lb-hub: '${column}' is no value a query parm can hold, and is ` +\n `left off the link`,\n );\n }\n }\n if (!atomic || value === \"\") parms.delete(column);\n else parms.set(column, String(value));\n }\n const query = parms.toString();\n const href = `${path}${query ? `?${query}` : \"\"}${hash}`;\n if (el.getAttribute(\"href\") !== href) el.setAttribute(\"href\", href);\n }\n}\n\n/**\n * A row naming every column root's query shows, each null: what landing it\n * leaves is root as it stands with no row. Absent branches are counted, so a\n * column only an absent element names is cleared too.\n */\nexport function blankRow(root: Element): Row {\n const row: Row = {};\n for (const el of below(root, `[${ATTR_COLUMN}]`)) {\n row[el.getAttribute(ATTR_COLUMN)!] = null;\n }\n for (const el of below(root, `[${ATTR_SHOW}]`)) {\n const show = el.getAttribute(ATTR_SHOW)!;\n row[show.startsWith(SHOW_NOT) ? show.slice(SHOW_NOT.length) : show] = null;\n }\n return row;\n}\n\n/**\n * The row template: the first `<template>` among the element's descendants,\n * outside any nested `lb-query`. A template holding an absent branch is not a\n * row template: rows land before the row template, so one inside the first\n * live row comes first in document order.\n */\nexport function templateIn(el: Element): HTMLTemplateElement | null {\n const template = within(el, `template:not([${ATTR_SHOW}])`).find(\n (t) => t !== el,\n );\n return (template as HTMLTemplateElement | undefined) ?? null;\n}\n\n/** What can take focus, before asking whether it can be operated. */\nconst FOCUSABLE =\n `a[href], button, input:not([type=\"hidden\"]), select, textarea, ` +\n `summary, [tabindex]:not([tabindex=\"-1\"]), ` +\n `[contenteditable]:not([contenteditable=\"false\"])`;\n\n/**\n * Focus the first element in `root` the user can operate: not disabled, not\n * in a closed dialog, not inert, not hidden, and one that took the focus\n * when asked. Nothing in a `<template>` is a candidate, so an absent\n * `lb-show` branch is passed over.\n */\nexport function focusIn(root: Element): void {\n const doc = root.ownerDocument;\n for (const el of root.querySelectorAll<HTMLElement>(FOCUSABLE)) {\n if (el.matches(\":disabled\")) continue;\n if (el.closest(`dialog:not([open]), [inert], [hidden]`)) continue;\n if (el.checkVisibility?.() === false) continue;\n el.focus();\n if (doc.activeElement === el) return;\n }\n}\n\n/** One live row: its key, its element, where it lands, and what it holds. */\ninterface Entry {\n key: string;\n el: Element;\n places: Places;\n /** Its columns, as landed so far. */\n data: Row;\n /**\n * Its columns as they were when it was last placed by the order.\n */\n placed: Row;\n /** Whether a filter the user chose hides it. */\n hidden: boolean;\n /** Whether it stands where the order would not put it. */\n unplaced: boolean;\n}\n\n/**\n * What the hub keeps about one element's rows between landings: the row\n * template the markup wrote, each live row by key, and the rows not yet\n * entered.\n */\ninterface List {\n /** The markup's row template. */\n top: HTMLTemplateElement;\n /** The row template, which every live row is copied from. */\n rowTemplate: HTMLTemplateElement;\n /** Where the row template's places lie, once a row has been made. */\n paths?: Path[];\n /** Every live row, by key. */\n byKey: Map<string, Entry>;\n /** The live rows, in the order they show. */\n rows: Entry[];\n /**\n * The rows not yet entered that `--lb-new` put in the list, in the order\n * they were added. They hold no data, so they are not placed or filtered,\n * and stand after every row, until the submit that carries them succeeds.\n */\n unentered: Element[];\n}\n\nconst lists = new WeakMap<Element, List>();\n\n/**\n * The list an element holds, found from its row template the first time\n * rows land on it, and kept after that.\n */\nfunction listFor(el: Element, template: HTMLTemplateElement): List | null {\n const found = lists.get(el);\n if (found) return found;\n const list: List = {\n top: template,\n rowTemplate: template,\n byKey: new Map(),\n rows: [],\n unentered: [],\n };\n // Live rows already in the markup, as a page rendered ahead of its data\n // ships them, are the list's from the start, in the order they stand.\n for (const row of el.querySelectorAll(LIVE_ROW)) {\n if (!inScope(el, row)) continue;\n const key = row.getAttribute(ATTR_KEY_VALUE)!;\n if (list.byKey.has(key)) {\n console.error(\n `lb-hub: <${el.localName}> shows two rows with the key '${key}'`,\n );\n }\n const entry: Entry = {\n key,\n el: row,\n places: search(row, true),\n data: {},\n placed: {},\n hidden: false,\n unplaced: false,\n };\n list.byKey.set(key, entry);\n list.rows.push(entry);\n }\n lists.set(el, list);\n return list;\n}\n\n/**\n * A new live row for a key, copied from the row template: upgraded, stamped\n * with its key, its places found by the template's paths, and no values yet.\n * It is in no document until it is placed.\n */\nfunction create(list: List, doc: Document, key: string): Entry {\n const template = list.rowTemplate.content.firstElementChild!;\n list.paths ??= compile(template);\n // Imported rather than cloned: template content belongs to a document with\n // no custom element definitions, so a clone would not upgrade until\n // inserted, and a form-associated control would be filled as if it were\n // not one.\n const el = doc.importNode(template, true);\n upgradeAbsent(el, doc);\n placed(el);\n el.setAttribute(ATTR_ROW_LIVE, \"\");\n el.setAttribute(ATTR_KEY_VALUE, key);\n nameRadios(el, key);\n const entry: Entry = {\n key,\n el,\n places: placesBy(el, list.paths),\n data: {},\n placed: {},\n hidden: false,\n unplaced: false,\n };\n list.byKey.set(key, entry);\n return entry;\n}\n\n/**\n * Put the rows not yet entered after every row: immediately after the list's\n * row template, which the rows land in front of, so placing them never moves\n * these.\n */\nfunction standLast(list: List): void {\n let at: Element = list.top;\n for (const row of list.unentered) {\n if (at.nextElementSibling !== row) at.after(row);\n at = row;\n }\n}\n\n/** Stamp a list's count: the rows it shows, and its rows not yet entered. */\nfunction recount(el: Element, list: List): void {\n const showing = list.rows.filter((entry) => !entry.hidden);\n setStamp(\n el,\n ATTR_QUERY_ROW_COUNT,\n String(showing.length + list.unentered.length),\n );\n}\n\n/**\n * Put a row not yet entered into a list: a live row copied from its row\n * template, keyed by the empty key, its controls at their HTML defaults and\n * its `lb-show` branches as for a row whose columns are all null. It sends\n * nothing; the submit of the form around the list carries it. False when the\n * element holds no row template.\n */\nexport function addUnentered(el: Element): boolean {\n const template = lists.get(el)?.top ?? templateIn(el);\n if (!template) return false;\n const list = listFor(el, template);\n if (!list) return false;\n const doc = el.ownerDocument;\n const source = list.rowTemplate.content.firstElementChild!;\n list.paths ??= compile(source);\n // Imported rather than cloned, for the reason a live row is.\n const row = doc.importNode(source, true);\n upgradeAbsent(row, doc);\n placed(row);\n row.setAttribute(ATTR_ROW_LIVE, \"\");\n row.setAttribute(ATTR_KEY_VALUE, \"\");\n nameRadios(row, \"\");\n for (const [show, els] of placesBy(row, list.paths).shows) {\n for (const shown of els) presentPlaced(shown, show.startsWith(SHOW_NOT));\n }\n list.unentered.push(row);\n standLast(list);\n recount(el, list);\n attachPlaced();\n return true;\n}\n\n/**\n * Take a row not yet entered out of its list, as a row leaves. False when\n * the row is not one `--lb-new` put in a list.\n */\nexport function discardUnentered(row: Element): boolean {\n const el = row.parentElement?.closest(`[${ATTR_QUERY}]`);\n const list = el ? lists.get(el) : undefined;\n const at = list?.unentered.indexOf(row) ?? -1;\n if (!el || !list || at < 0) return false;\n list.unentered.splice(at, 1);\n leaving(row, ATTR_ROW_LIVE, ATTR_ROW_LEAVING);\n depart([row]);\n recount(el, list);\n return true;\n}\n\n/**\n * Give each radio button of a new live row a group of its own. The browser\n * groups radio buttons by `name`, and a row template repeats one `name` in\n * every live row, so the hub follows the `name` written, or the column when\n * none is, with the row's key.\n */\nfunction nameRadios(row: Element, key: string): void {\n for (const el of below(row, `input[type=radio][${ATTR_COLUMN}]`)) {\n const name = el.getAttribute(\"name\") || el.getAttribute(ATTR_COLUMN)!;\n el.setAttribute(\"name\", `${name}-${key}`);\n }\n}\n\n/**\n * The rows that moved: rows whose values changed, and which now stand\n * somewhere else among the rows whose values did not. A neighbour a moved\n * row passed did not move, and neither did a row whose new values left it\n * where it was.\n */\nfunction movedRows(\n before: Entry[],\n after: Entry[],\n changed: ReadonlySet<Entry>,\n): Set<Entry> {\n const moved = new Set<Entry>();\n if (changed.size === 0) return moved;\n const stayed = new Set(before);\n // For each changed row, the nearest unchanged row on either side of it.\n const anchors = (rows: Entry[]): Map<Entry, (Entry | null)[]> => {\n const around = new Map<Entry, (Entry | null)[]>();\n const kept = rows.filter((row) => stayed.has(row));\n let last: Entry | null = null;\n for (const row of kept) {\n if (changed.has(row)) around.set(row, [last, null]);\n else last = row;\n }\n last = null;\n for (const row of kept.reverse()) {\n if (changed.has(row)) around.get(row)![1] = last;\n else last = row;\n }\n return around;\n };\n const was = anchors(before);\n for (const [row, [prior, following]] of anchors(after)) {\n const [p, f] = was.get(row)!;\n if (p !== prior || f !== following) moved.add(row);\n }\n return moved;\n}\n\n/**\n * Put a list's live rows in the order given, in front of the row template.\n * The run they share at the start and the run they share at the end stay\n * where they are, and what lies between goes in as one fragment.\n */\nfunction placeRows(list: List, next: Entry[]): void {\n const old = list.rows;\n const end = list.top;\n const most = Math.min(old.length, next.length);\n let start = 0;\n while (start < most && old[start] === next[start]) start++;\n let tail = 0;\n while (\n tail < most - start &&\n old[old.length - 1 - tail] === next[next.length - 1 - tail]\n ) {\n tail++;\n }\n const middle = next.slice(start, next.length - tail);\n if (middle.length === 0) {\n list.rows = next;\n return;\n }\n const ref = tail > 0 ? next[next.length - tail]!.el : end;\n const fragment = ref.ownerDocument!.createDocumentFragment();\n for (const item of middle) fragment.append(item.el);\n ref.parentNode!.insertBefore(fragment, ref);\n list.rows = next;\n}\n\n/** Mark an element as leaving: no longer live, and taking no input. */\nfunction leaving(el: Element, live: string, stamp: string): void {\n el.removeAttribute(live);\n el.removeAttribute(ATTR_ROW_REQUESTED);\n el.setAttribute(stamp, \"\");\n el.setAttribute(\"inert\", \"\");\n}\n\n/**\n * Take nodes out of the document once whatever their stylesheet started on\n * them has finished: at once when nothing is running. Asking for the running\n * animations computes the style, so it is asked once, after everything a\n * landing writes, and an animation keyed to the leaving stamp is among them.\n */\nfunction depart(nodes: ChildNode[]): void {\n const running: Animation[] = [];\n for (const node of nodes) {\n if (node.nodeType !== ELEMENT_NODE) continue;\n const el = node as Element & { getAnimations?: Element[\"getAnimations\"] };\n running.push(...(el.getAnimations?.({ subtree: true }) ?? []));\n }\n const go = (): void => {\n for (const node of nodes) node.remove();\n detachRemoved(nodes);\n };\n if (running.length === 0) go();\n else void Promise.allSettled(running.map((a) => a.finished)).then(go);\n}\n\n/**\n * The stamps of what happened to rows, set together: a stamp a row already\n * carries is taken off first and put back after the style has been computed\n * once for all of them, so an animation keyed to it plays again.\n */\nclass Stamps {\n private again: [Element, string][] = [];\n\n set(el: Element, name: string, on: boolean): void {\n const had = el.hasAttribute(name);\n if (had) el.removeAttribute(name);\n if (!on) return;\n if (had) this.again.push([el, name]);\n else el.setAttribute(name, \"\");\n }\n\n done(doc: Document): void {\n if (this.again.length === 0) return;\n void doc.defaultView?.getComputedStyle(this.again[0]![0]).animationName;\n for (const [el, name] of this.again) el.setAttribute(name, \"\");\n }\n}\n\n/** Show or hide an element for a filter, saying so only when it changes. */\nfunction hide(el: Element, hidden: boolean): void {\n if (el.hasAttribute(\"hidden\") !== hidden) el.toggleAttribute(\"hidden\", hidden);\n}\n\n/** The order to place rows by, or none when it cannot be read. */\nfunction termsOf(el: Element, order: string | undefined): OrderTerm[] {\n try {\n return parseOrder(order ?? \"\");\n } catch (err) {\n console.error(`lb-hub: <${el.localName}> ${(err as Error).message}`);\n return [];\n }\n}\n\n/** An order's terms written back as its text. */\nfunction orderText(terms: OrderTerm[]): string {\n return terms\n .map((term) => (term.descending ? ORDER_DESCENDING : \"\") + term.column)\n .join(\",\");\n}\n\n/** The user's choice in a column of `lb-choices`, when one is made. */\nfunction choiceIn(choices: Row | undefined, column: string): string | undefined {\n const value = choices?.[column];\n return value === null || value === undefined || value === \"\"\n ? undefined\n : String(value);\n}\n\n/** The columns an element's `lb-filter` names. */\nfunction filtered(el: Element): string[] {\n return (el.getAttribute(ATTR_FILTER) ?? \"\")\n .split(\",\")\n .map((column) => column.trim())\n .filter((column) => column !== \"\");\n}\n\n/**\n * The order an element's rows are placed by: its query's row of `lb-sort`.\n */\nfunction sortOf(state: Kept, query: string): string | undefined {\n const row = state.answers.get(SORT_QUERY)?.rows?.find(\n (r) => r[SORT_COLUMN_QUERY] === query,\n );\n const order = row?.[SORT_COLUMN_ORDER];\n return typeof order === \"string\" && order !== \"\" ? order : undefined;\n}\n\n/** The query's row of `lb-filters`, when it has one. */\nfunction filtersOf(state: Kept, query: string): Row | undefined {\n return state.answers.get(FILTERS_QUERY)?.rows?.find(\n (r) => r[FILTERS_COLUMN_QUERY] === query,\n );\n}\n\n/**\n * Whether a row passes every filter the user chose for the element: for each\n * column its `lb-filter` names, the filter in the query's row of\n * `lb-filters` of the same name.\n */\nfunction filterFor(\n el: Element,\n filters: Row | undefined,\n types: ColumnTypes,\n): (row: Row) => boolean {\n const terms: [string, FilterTerm[]][] = [];\n for (const column of filtered(el)) {\n const text = choiceIn(filters, column);\n const parsed = text === undefined ? [] : parseFilter(text);\n if (parsed.length > 0) terms.push([column, parsed]);\n }\n return (row) =>\n terms.every(([column, parsed]) =>\n passes(row[column], parsed, types[column]),\n );\n}\n\nfunction filterRow(entry: Entry, hidden: boolean): void {\n if (entry.hidden === hidden) return;\n entry.hidden = hidden;\n hide(entry.el, hidden);\n}\n\n/** Whether a row's columns as landed differ from what they were. */\nfunction differs(before: Row, after: Row): boolean {\n return Object.entries(after).some(\n ([column, value]) => !same(before[column], value),\n );\n}\n\n/** How a list of rows lands: in what order, and whether a request asked. */\nexport interface RowsOptions {\n /** The query's resolved order, from its row of `lb-sort`. */\n order?: string;\n /** The column types the server declared. */\n types?: ColumnTypes;\n /** The query's row of `lb-filters`. */\n filters?: Row;\n /**\n * The landing answers a request from this page, so a side the list\n * places by hand leaves its rows where they stand.\n */\n requested?: boolean;\n /**\n * Fill every row, changed or not: the element has not been filled for\n * real before, so what its rows show cannot be trusted.\n */\n refill?: boolean;\n /**\n * The document the page is in, where new rows are built. An element\n * `lb-show` holds absent is in its template's document, where nothing\n * upgrades, so its own would build rows whose controls are filled as if\n * they were not ones.\n */\n doc?: Document;\n}\n\n/**\n * Land rows through a row template: a live row per key, placed by the order.\n * A patch disturbs only what it names — rows it leaves out keep their\n * contents and their place.\n */\nexport function applyRows(\n el: Element,\n template: HTMLTemplateElement,\n keyColumn: string,\n result: RowsResult,\n options: RowsOptions = {},\n): void {\n const list = listFor(el, template);\n if (!list) return;\n const doc = options.doc ?? el.ownerDocument;\n const host = el as Element & HubLifecycle;\n const whole = !isPatch(result);\n const shown = list.rows;\n const focused = focusedRow(list, doc);\n\n // What a request did is said by this landing alone.\n for (const entry of shown) entry.el.removeAttribute(ATTR_ROW_REQUESTED);\n\n const arriving = new Map<string, Row>();\n for (const data of whole ? result : (result.rows ?? [])) {\n if (data[keyColumn] === undefined) {\n console.error(\n `lb-hub: a row for <${el.localName}> has no '${keyColumn}' column`,\n );\n continue;\n }\n // The key is stored on the row as an attribute and read back from\n // there, so it is compared as the string the attribute holds.\n const key = String(data[keyColumn]);\n if (arriving.has(key)) {\n console.error(\n `lb-hub: two rows for <${el.localName}> have the key '${key}'; ` +\n `the last one shows`,\n );\n arriving.delete(key);\n }\n arriving.set(key, data);\n }\n const dropped = whole\n ? []\n : (result.drop ?? []).map((key) => String(key));\n for (const key of dropped) arriving.delete(key);\n const gone = whole\n ? shown.filter((entry) => !arriving.has(entry.key))\n : dropped.flatMap((key) => list.byKey.get(key) ?? []);\n\n const created = new Set<Entry>();\n for (const key of arriving.keys()) {\n if (!list.byKey.has(key)) created.add(create(list, doc, key));\n }\n\n // The landing loop. A row whose values arrive as it already shows them is\n // left as it is, so a control the user has typed into and not committed\n // keeps what was typed. A row whose values changed is filled whole.\n const changed = new Set<Entry>();\n for (const [key, data] of arriving) {\n const entry = list.byKey.get(key)!;\n const fresh = created.has(entry);\n if (!fresh && differs(entry.data, data)) changed.add(entry);\n if (fresh || options.refill || changed.has(entry)) fill(entry.places, data);\n entry.data = { ...entry.data, ...data };\n // A link reads the whole row, which a patch may send only part of.\n if (fresh || options.refill || changed.has(entry)) {\n link(entry.places, entry.data);\n }\n }\n\n for (const entry of gone) {\n list.byKey.delete(entry.key);\n leaving(entry.el, ATTR_ROW_LIVE, ATTR_ROW_LEAVING);\n }\n\n // The order the rows arrived in for all rows, and for a patch the order\n // already showing with what is new after it. A sort keeps rows that\n // compare equal in this order.\n const stayed = shown.filter((entry) => list.byKey.get(entry.key) === entry);\n const terms = termsOf(el, options.order);\n const sort = (entries: Entry[]): Entry[] =>\n terms.length === 0\n ? entries\n : entries\n .map((entry, i) => ({ entry, i }))\n .sort(\n (a, b) =>\n compareRows(a.entry.data, b.entry.data, terms, options.types) ||\n a.i - b.i,\n )\n .map(({ entry }) => entry);\n const passing = filterFor(el, options.filters, options.types ?? {});\n\n const manual = options.requested ? manualOf(el) : NO_MANUAL;\n const touched = new Set([...changed, ...created]);\n // A row left out of place stays touched until the rows are placed again.\n for (const entry of shown) if (entry.unplaced) touched.add(entry);\n\n let order: Entry[];\n let out = new Set<Entry>();\n if (manual.order) {\n // What already shows stays where it stands, and what is new goes last.\n for (const entry of created) entry.placed = entry.data;\n order = [...stayed, ...created];\n out = movedRows(order, sort(order), touched);\n } else {\n order = sort(\n whole\n ? [...arriving.keys()].map((key) => list.byKey.get(key)!)\n : [...stayed, ...created],\n );\n }\n for (const entry of order) {\n const fails = !passing(entry.data);\n // A row the answer touched does not vanish from under the user.\n const kept = manual.filter && touched.has(entry) && !entry.hidden && fails;\n const hides = fails && !kept;\n filterRow(entry, hides);\n entry.placed = entry.data;\n // A row nobody sees stands nowhere the user would notice.\n entry.unplaced = !hides && (out.has(entry) || kept);\n }\n\n const moved = movedRows(stayed, order, changed);\n placeRows(list, order);\n refocus(list, focused);\n\n const stamps = new Stamps();\n for (const key of arriving.keys()) {\n const entry = list.byKey.get(key)!;\n const fresh = created.has(entry);\n const went = moved.has(entry);\n stamps.set(entry.el, ATTR_ROW_CREATED, fresh);\n stamps.set(entry.el, ATTR_ROW_CHANGED, changed.has(entry));\n stamps.set(entry.el, ATTR_ROW_MOVED, went);\n const requested = went\n ? REQUESTED_MOVED\n : fresh\n ? REQUESTED_CREATED\n : changed.has(entry)\n ? REQUESTED_CHANGED\n : null;\n if (options.requested && requested) {\n entry.el.setAttribute(ATTR_ROW_REQUESTED, requested);\n }\n }\n stamps.done(doc);\n let unplaced = 0;\n for (const entry of order) {\n if (entry.el.hasAttribute(ATTR_ROW_UNPLACED) !== entry.unplaced) {\n entry.el.toggleAttribute(ATTR_ROW_UNPLACED, entry.unplaced);\n }\n if (entry.unplaced) unplaced++;\n }\n\n const rows = list.rows.filter((entry) => !entry.hidden);\n // Counted from what the hub holds, which is what the rows show.\n setStamp(el, ATTR_QUERY_ROW_COUNT, String(rows.length + list.unentered.length));\n standLast(list);\n setStamp(el, ATTR_QUERY_UNPLACED_COUNT, String(unplaced));\n if (terms.length === 0) el.removeAttribute(ATTR_QUERY_ORDER);\n else setStamp(el, ATTR_QUERY_ORDER, orderText(terms));\n\n const departing: ChildNode[] = gone.map((entry) => entry.el);\n if (departing.length > 0) depart(departing);\n\n host.lbRowsLanded?.();\n}\n\n/** Which placements a list leaves to the user, as `lb-manual` names them. */\ninterface Manual {\n order: boolean;\n filter: boolean;\n}\n\nconst NO_MANUAL: Manual = { order: false, filter: false };\n\nfunction manualOf(el: Element): Manual {\n const sides = (el.getAttribute(ATTR_MANUAL) ?? \"\").split(/\\s+/);\n return {\n order: sides.includes(MANUAL_ORDER),\n filter: sides.includes(MANUAL_FILTER),\n };\n}\n\n/** The live row of a list holding the focus, and the element that has it. */\ninterface Focused {\n entry: Entry;\n active: HTMLElement;\n}\n\nfunction focusedRow(list: List, doc: Document): Focused | null {\n const active = doc.activeElement as HTMLElement | null;\n const row = active?.closest(LIVE_ROW);\n if (!active || !row) return null;\n const entry = list.byKey.get(row.getAttribute(ATTR_KEY_VALUE)!);\n return entry?.el === row ? { entry, active } : null;\n}\n\n/**\n * Keep the focus where the user had it once rows are placed: on the same\n * element, scrolled into view, when its row still shows; otherwise on the\n * first element the user can operate in the first row showing.\n */\nfunction refocus(list: List, focused: Focused | null): void {\n if (!focused) return;\n const { entry, active } = focused;\n const doc = active.ownerDocument;\n if (list.byKey.get(entry.key) === entry && !entry.hidden) {\n if (doc.activeElement === active || !active.isConnected) return;\n active.focus({ preventScroll: true });\n active.scrollIntoView?.({ block: \"nearest\" });\n return;\n }\n const first = list.rows.find((row) => !row.hidden);\n if (first) focusIn(first.el);\n}\n\n/** Land one response item on one element that names its query. */\nfunction landItem(\n el: Element,\n item: ResponseItem,\n options: RowsOptions = {},\n): void {\n const template = lists.get(el)?.top ?? templateIn(el);\n if (item.kind === KIND_ROW) {\n const row = oneRow(item);\n if (template) {\n applyRows(el, template, item.key, row ? [row] : [], options);\n return;\n }\n // No row: every column the element shows lands null, and the element\n // names no row.\n if (!row) {\n applyRow(el, blankRow(el));\n el.removeAttribute(ATTR_KEY_VALUE);\n return;\n }\n const key = row[item.key];\n applyRow(el, row);\n if (key !== undefined && key !== null) {\n setStamp(el, ATTR_KEY_VALUE, String(key));\n }\n return;\n }\n // A `rows` query with no row template lands nothing: an insert form names\n // the query it adds to, and shows none of its rows.\n if (!template) return;\n const result = item.patch ?? item.rows ?? [];\n applyRows(el, template, item.key, result, options);\n}\n\n/**\n * What landing keeps for one root: the last whole answer to each query, and\n * every element an answer has landed on. The user's sort and filters are\n * among the answers, as the answers to `lb-sort` and `lb-filters`.\n */\ninterface Kept {\n answers: Map<string, ResponseItem>;\n landed: WeakSet<Element>;\n /** The document the root is in. */\n doc: Document;\n}\n\nconst kept = new WeakMap<ParentNode, Kept>();\n\nfunction keptFor(root: ParentNode): Kept {\n let found = kept.get(root);\n if (!found) {\n const node = root as Node;\n found = {\n answers: new Map(),\n landed: new WeakSet(),\n doc: node.ownerDocument ?? (node as Document),\n };\n kept.set(root, found);\n }\n return found;\n}\n\n/** The answer kept for a query, as all of its rows. */\nexport function keptAnswer(\n root: ParentNode,\n query: string,\n): ResponseItem | undefined {\n return kept.get(root)?.answers.get(query);\n}\n\n/**\n * How a query's rows land: by its order, its column types, and the user's\n * choices. The order and types are the kept answer's, since only the answer\n * that loads the page carries them.\n */\nfunction rowsOptions(state: Kept, item: ResponseItem): RowsOptions {\n const declared = state.answers.get(item.query) ?? item;\n return {\n order: sortOf(state, item.query) ?? declared.order,\n types: declared.types,\n filters: filtersOf(state, item.query),\n doc: state.doc,\n };\n}\n\n/**\n * Drop what landing kept for a root. The hub calls it when it replaces the\n * page, since another page's query of the same name is another query, and\n * the user's choices were for the page they were made on.\n */\nexport function forget(root: ParentNode): void {\n kept.delete(root);\n}\n\n/**\n * All rows after a patch, as the elements it landed on now show them: a row\n * it names takes the columns it sends and keeps its place, a new one goes\n * last, and a dropped one goes.\n */\nfunction patched(rows: Row[], key: string, patch: Patch): Row[] {\n const byKey = new Map(rows.map((row) => [String(row[key]), row]));\n for (const row of patch.rows ?? []) {\n const k = String(row[key]);\n byKey.set(k, { ...byKey.get(k), ...row });\n }\n for (const k of patch.drop ?? []) byKey.delete(String(k));\n return [...byKey.values()];\n}\n\n/**\n * Keep an answer as all of the query's rows. A patch is applied to the\n * answer already kept; with none, it is not the whole of anything, and\n * nothing is kept.\n *\n * A query's order and column types arrive with the answer that loads the\n * page, and every answer after it, all rows or a patch, keeps them.\n */\nfunction keep(answers: Map<string, ResponseItem>, item: ResponseItem): void {\n const before = answers.get(item.query);\n const declared = {\n ...(before?.order !== undefined && { order: before.order }),\n ...(before?.types !== undefined && { types: before.types }),\n };\n if (!item.patch) {\n answers.set(item.query, { ...declared, ...item });\n return;\n }\n if (!before) return;\n const { patch: _, ...whole } = item;\n answers.set(item.query, {\n ...declared,\n ...whole,\n rows: patched(before.rows ?? [], item.key, item.patch),\n });\n}\n\n/** The queries whose sort or filters an answer changes. */\nfunction changedQueries(state: Kept, item: ResponseItem): Set<string> {\n const rowsOf = (answer: ResponseItem | undefined): Map<string, Row> => {\n const map = new Map<string, Row>();\n for (const row of answer?.rows ?? []) {\n const query = row[SORT_COLUMN_QUERY];\n if (typeof query === \"string\") map.set(query, row);\n }\n return map;\n };\n const before = rowsOf(state.answers.get(item.query));\n const after = rowsOf(item);\n const queries = new Set<string>();\n for (const query of new Set([...before.keys(), ...after.keys()])) {\n if (JSON.stringify(before.get(query)) !== JSON.stringify(after.get(query))) {\n queries.add(query);\n }\n }\n return queries;\n}\n\n/**\n * Place again the rows of every query whose sort or filters changed. Each\n * lands its query's kept answer again, whole, so it shows what a round trip\n * carrying the change would have, and the server is asked for nothing.\n */\nfunction rechoose(root: ParentNode, state: Kept, queries: Set<string>): void {\n for (const query of queries) {\n const item = state.answers.get(query);\n if (!item || item.kind === KIND_ROW) continue;\n for (const el of everywhere(root, `[${ATTR_QUERY}=\"${query}\"]`)) {\n if (!state.landed.has(el) || el.closest(LEAVING)) continue;\n landItem(el, item, rowsOptions(state, item));\n }\n }\n}\n\n/**\n * Fill every element that names a kept query and has had nothing land on it.\n * Filling one can build more — a live row holding a picker of its own — so\n * it goes round until a pass finds nothing new.\n */\nfunction fillArrivals(root: ParentNode, state: Kept): void {\n const { answers, landed } = state;\n for (let filled = true; filled;) {\n filled = false;\n for (const [query, item] of answers) {\n for (const el of everywhere(root, `[${ATTR_QUERY}=\"${query}\"]`)) {\n if (landed.has(el) || el.closest(LEAVING)) continue;\n landed.add(el);\n landItem(el, item, { ...rowsOptions(state, item), refill: true });\n filled = true;\n }\n }\n }\n}\n\n/** How response items land. */\nexport interface LandOptions {\n /**\n * Queries that may have nowhere to land without a warning. A query the hub\n * serves, such as `lb-url`, is always one: it lands wherever a chrome or\n * page names it, and nowhere otherwise.\n */\n quiet?: readonly string[];\n /** The items answer a request from this page. */\n requested?: boolean;\n}\n\n/**\n * Land response items. Every answer arrives through here, and is kept for\n * `root`, so that what arrives after it is filled from it — see forget().\n * An answer to `lb-sort` or `lb-filters` places again the rows it changes.\n * Once everything has landed, each custom element placed since the last\n * landing is attached.\n */\nexport function applyResponse(\n root: ParentNode,\n items: ResponseItem[],\n options: LandOptions = {},\n): void {\n const state = keptFor(root);\n for (const item of items) {\n const changed =\n item.query === SORT_QUERY || item.query === FILTERS_QUERY\n ? changedQueries(state, item)\n : new Set<string>();\n keep(state.answers, item);\n const targets = everywhere(root, `[${ATTR_QUERY}=\"${item.query}\"]`).filter(\n (el) => !el.closest(LEAVING),\n );\n if (\n targets.length === 0 &&\n !item.query.startsWith(LB_RESERVED_PREFIX) &&\n !options.quiet?.includes(item.query)\n ) {\n console.warn(`lb-hub: nothing names '${item.query}', skipping`);\n }\n for (const el of targets) {\n state.landed.add(el);\n landItem(el, item, {\n ...rowsOptions(state, item),\n requested: options.requested,\n });\n }\n if (changed.size > 0) rechoose(root, state, changed);\n }\n fillArrivals(root, state);\n attachPlaced();\n}\n\n/**\n * Place an element's rows by the order and the filter again, from the answer\n * kept for its query, with no round trip: what the user asks for once an\n * answer has left rows out of place. False when the element shows no rows\n * the hub holds.\n */\nexport function placeAgain(root: ParentNode, el: Element): boolean {\n const state = kept.get(root);\n const item = state?.answers.get(el.getAttribute(ATTR_QUERY) ?? \"\");\n if (!state || !item || item.kind === KIND_ROW || !state.landed.has(el)) {\n return false;\n }\n landItem(el, item, rowsOptions(state, item));\n return true;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lb-hub.browser.d.ts","sourceRoot":"","sources":["../../hub/lb-hub.browser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lb-hub.browser.d.ts","sourceRoot":"","sources":["../../hub/lb-hub.browser.ts"],"names":[],"mappings":"AAoGA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|