@loadbare/app 0.20.0 → 0.21.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.
@@ -92,6 +92,13 @@ export interface RowsOptions {
92
92
  * real before, so what its rows show cannot be trusted.
93
93
  */
94
94
  refill?: boolean;
95
+ /**
96
+ * The document the page is in, where new rows are built. An element
97
+ * `lb-show` holds absent is in its template's document, where nothing
98
+ * upgrades, so its own would build rows whose controls are filled as if
99
+ * they were not ones.
100
+ */
101
+ doc?: Document;
95
102
  }
96
103
  /**
97
104
  * Land rows through a row template.
@@ -136,8 +143,9 @@ export interface LandOptions {
136
143
  /** The items answer a request from this page. */
137
144
  requested?: boolean;
138
145
  /**
139
- * The element that sent the request. The list it was sent from inside
140
- * keeps its rows where they stand.
146
+ * The element that sent the request, or the live row a form that sent it
147
+ * is pointed at. The list it was sent from inside keeps its rows where
148
+ * they stand.
141
149
  */
142
150
  origin?: Element;
143
151
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lb-apply.d.ts","sourceRoot":"","sources":["../../hub/lb-apply.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lb-apply.d.ts","sourceRoot":"","sources":["../../hub/lb-apply.ts"],"names":[],"mappings":"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"}
@@ -1139,7 +1139,7 @@ export function applyRows(el, template, keyColumn, result, options = {}) {
1139
1139
  const list = listFor(el, template);
1140
1140
  if (!list)
1141
1141
  return;
1142
- const doc = el.ownerDocument;
1142
+ const doc = options.doc ?? el.ownerDocument;
1143
1143
  const host = el;
1144
1144
  const whole = !isPatch(result);
1145
1145
  const shown = rowsUnder(list.root);
@@ -1394,7 +1394,12 @@ const kept = new WeakMap();
1394
1394
  function keptFor(root) {
1395
1395
  let found = kept.get(root);
1396
1396
  if (!found) {
1397
- found = { answers: new Map(), landed: new WeakSet() };
1397
+ const node = root;
1398
+ found = {
1399
+ answers: new Map(),
1400
+ landed: new WeakSet(),
1401
+ doc: node.ownerDocument ?? node,
1402
+ };
1398
1403
  kept.set(root, found);
1399
1404
  }
1400
1405
  return found;
@@ -1414,6 +1419,7 @@ function rowsOptions(state, item) {
1414
1419
  order: declared.order,
1415
1420
  types: declared.types,
1416
1421
  choices: state.answers.get(CHOICES_QUERY)?.row ?? undefined,
1422
+ doc: state.doc,
1417
1423
  };
1418
1424
  }
1419
1425
  /**
@@ -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_QUERY_UNSORTED_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_UNSORTED,\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 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 * What a control gathers: a checkbox `\"true\"` or `\"false\"`, so unchecked\n * still says so, and any other control its `value`.\n */\nfunction controlValue(el: Control): string {\n return isCheckbox(el) ? String((el as HTMLInputElement).checked) : 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.\n */\nexport function gatherInto(\n values: Record<string, string>,\n column: string,\n el: Control,\n): void {\n if (isRadio(el) && !(el as HTMLInputElement).checked) {\n values[column] ??= \"\";\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 // 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 // Checked by the rule `lb-show` is on by: only null and false are off,\n // and no string is read.\n (el as HTMLInputElement).checked = value !== false;\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 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 unsorted: 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\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 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 unsorted: 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 unsorted: false,\n };\n list.byKey.set(key, entry);\n return entry;\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 from the first, as it was when last placed by 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]) for (const head of group.heads) fill(head, shown[0].placed);\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 /** The landing answers a request from this page. */\n requested?: boolean;\n /**\n * The request it answers was sent from inside this list, where the user\n * is working, so the rows already showing stay where they stand.\n */\n held?: 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\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 `held` for the user working in the list moves nothing already\n * showing, whole or a patch. A row it changed or created that the order\n * would put elsewhere, or that the filter would hide, stays and is stamped\n * unsorted until the rows are next placed by the order.\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 = 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 let order: Entry[];\n if (options.held) {\n // The user is working in this list: what already shows stays where it\n // stands, and what is new goes last 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 const touched = new Set([...changed, ...created]);\n for (const entry of order) if (entry.unsorted) touched.add(entry);\n const out = movedRows(order, sort(order), touched);\n for (const entry of order) {\n const fails = !passing(entry.data);\n // A row the user just changed does not vanish from under them.\n const kept = touched.has(entry) && !entry.hidden;\n filterRow(entry, fails && !kept);\n // A row stands in the group it was placed in until it is placed again.\n const moves = regrouped(entry, list, terms);\n if (!moves) entry.placed = entry.data;\n entry.unsorted = out.has(entry) || (kept && fails) || moves;\n }\n } else {\n order = sort(\n whole\n ? [...arriving.keys()].map((key) => list.byKey.get(key)!)\n : [...stayed, ...created],\n );\n for (const entry of order) {\n entry.placed = entry.data;\n entry.unsorted = false;\n filterRow(entry, !passing(entry.data));\n }\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 unsorted = 0;\n for (const entry of order) {\n if (entry.el.hasAttribute(ATTR_ROW_UNSORTED) !== entry.unsorted) {\n entry.el.toggleAttribute(ATTR_ROW_UNSORTED, entry.unsorted);\n }\n if (entry.unsorted) unsorted++;\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));\n setStamp(el, ATTR_QUERY_UNSORTED_COUNT, String(unsorted));\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/** 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}\n\nconst kept = new WeakMap<ParentNode, Kept>();\n\nfunction keptFor(root: ParentNode): Kept {\n let found = kept.get(root);\n if (!found) {\n found = { answers: new Map(), landed: new WeakSet() };\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 };\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 * The element that sent the request. The list it was sent from inside\n * keeps its rows where they stand.\n */\n origin?: Element;\n}\n\n/**\n * Whether a request from `origin` was sent from inside `el`'s list: `el` is\n * the nearest element carrying `lb-query` around it.\n */\nfunction sentFrom(el: Element, origin: Element | undefined): boolean {\n return origin?.parentElement?.closest(`[${ATTR_QUERY}]`) === el;\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 held: sentFrom(el, options.origin),\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 again, from the answer kept for its\n * query, with no round trip: what the user asks for once an edit has left\n * rows out of order. False when the element shows no rows the hub holds.\n */\nexport function resort(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 — 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_QUERY_UNSORTED_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_UNSORTED,\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 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 * What a control gathers: a checkbox `\"true\"` or `\"false\"`, so unchecked\n * still says so, and any other control its `value`.\n */\nfunction controlValue(el: Control): string {\n return isCheckbox(el) ? String((el as HTMLInputElement).checked) : 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.\n */\nexport function gatherInto(\n values: Record<string, string>,\n column: string,\n el: Control,\n): void {\n if (isRadio(el) && !(el as HTMLInputElement).checked) {\n values[column] ??= \"\";\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 // 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 // Checked by the rule `lb-show` is on by: only null and false are off,\n // and no string is read.\n (el as HTMLInputElement).checked = value !== false;\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 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 unsorted: 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\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 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 unsorted: 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 unsorted: false,\n };\n list.byKey.set(key, entry);\n return entry;\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 from the first, as it was when last placed by 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]) for (const head of group.heads) fill(head, shown[0].placed);\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 /** The landing answers a request from this page. */\n requested?: boolean;\n /**\n * The request it answers was sent from inside this list, where the user\n * is working, so the rows already showing stay where they stand.\n */\n held?: 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 `held` for the user working in the list moves nothing already\n * showing, whole or a patch. A row it changed or created that the order\n * would put elsewhere, or that the filter would hide, stays and is stamped\n * unsorted until the rows are next placed by the order.\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 let order: Entry[];\n if (options.held) {\n // The user is working in this list: what already shows stays where it\n // stands, and what is new goes last 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 const touched = new Set([...changed, ...created]);\n for (const entry of order) if (entry.unsorted) touched.add(entry);\n const out = movedRows(order, sort(order), touched);\n for (const entry of order) {\n const fails = !passing(entry.data);\n // A row the user just changed does not vanish from under them.\n const kept = touched.has(entry) && !entry.hidden;\n filterRow(entry, fails && !kept);\n // A row stands in the group it was placed in until it is placed again.\n const moves = regrouped(entry, list, terms);\n if (!moves) entry.placed = entry.data;\n entry.unsorted = out.has(entry) || (kept && fails) || moves;\n }\n } else {\n order = sort(\n whole\n ? [...arriving.keys()].map((key) => list.byKey.get(key)!)\n : [...stayed, ...created],\n );\n for (const entry of order) {\n entry.placed = entry.data;\n entry.unsorted = false;\n filterRow(entry, !passing(entry.data));\n }\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 unsorted = 0;\n for (const entry of order) {\n if (entry.el.hasAttribute(ATTR_ROW_UNSORTED) !== entry.unsorted) {\n entry.el.toggleAttribute(ATTR_ROW_UNSORTED, entry.unsorted);\n }\n if (entry.unsorted) unsorted++;\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));\n setStamp(el, ATTR_QUERY_UNSORTED_COUNT, String(unsorted));\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/** 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 * The element that sent the request, or the live row a form that sent it\n * is pointed at. The list it was sent from inside keeps its rows where\n * they stand.\n */\n origin?: Element;\n}\n\n/**\n * Whether a request from `origin` was sent from inside `el`'s list: `el` is\n * the nearest element carrying `lb-query` around it.\n */\nfunction sentFrom(el: Element, origin: Element | undefined): boolean {\n return origin?.parentElement?.closest(`[${ATTR_QUERY}]`) === el;\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 held: sentFrom(el, options.origin),\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 again, from the answer kept for its\n * query, with no round trip: what the user asks for once an edit has left\n * rows out of order. False when the element shows no rows the hub holds.\n */\nexport function resort(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"]}
@@ -750,6 +750,11 @@ class LbHub extends HTMLElement {
750
750
  withdraw(refused);
751
751
  }
752
752
  const at = here();
753
+ // A form pointed at a live row finishes an edit begun in that row, so
754
+ // its request is sent from inside the row's list. The row is the one it
755
+ // was pointed at when sent.
756
+ const saving = savedFrom.get(request);
757
+ const within = (saving && pointed.get(saving)) || origin;
753
758
  const items = await this.roundTrip(this.page, request, origin);
754
759
  if (items instanceof RefusedError)
755
760
  this.refused(request, items, origin);
@@ -765,7 +770,7 @@ class LbHub extends HTMLElement {
765
770
  const load = items.filter((item) => item !== url);
766
771
  landed = load;
767
772
  if (url === undefined) {
768
- applyResponse(this, load, { requested: true, origin });
773
+ applyResponse(this, load, { requested: true, origin: within });
769
774
  }
770
775
  else
771
776
  landed = await this.follow(url, load, origin);
@@ -776,9 +781,8 @@ class LbHub extends HTMLElement {
776
781
  select(box, false);
777
782
  }
778
783
  // A pointed form has done what it was pointed for, and lets go.
779
- const saved = savedFrom.get(request);
780
- if (saved)
781
- release(saved);
784
+ if (saving)
785
+ release(saving);
782
786
  else
783
787
  insertedFrom.get(request)?.reset();
784
788
  done(origin, request, landed);
@@ -1 +1 @@
1
- {"version":3,"file":"lb-hub.browser.js","sourceRoot":"","sources":["../../hub/lb-hub.browser.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference lib=\"dom\" />\n\nimport {\n ATTR_COLUMN,\n ATTR_COLUMN_VALUE,\n ATTR_KEY_VALUE,\n ATTR_PAGE,\n ATTR_PAGE_TITLE,\n ATTR_QUERY,\n ATTR_REQUEST,\n ATTR_REQUEST_ERROR,\n ATTR_REQUEST_PENDING,\n ATTR_REQUEST_REFUSED,\n ATTR_ROW_EDITING,\n ATTR_SELECT,\n ATTR_URL_LINK,\n ATTR_URL_PUSH,\n ATTR_URL_UNKNOWN,\n CHOICES_QUERY,\n COMMAND_EDIT,\n COMMAND_NEW,\n COMMAND_RELEASE,\n COMMAND_SORT,\n HUB_TAG_NAME,\n KIND_ROW,\n LB_DONE_EVENT_NAME,\n LB_ENDPOINT,\n LB_EVENT_NAME,\n LB_REFUSAL_STATUS,\n LB_REQUEST_TIMEOUT_MS,\n LB_COMMAND_PREFIX,\n LB_RESERVED_PREFIX,\n LIVE_ROW,\n REQUEST_ROW_DELETE,\n REQUEST_ROW_INSERT,\n REQUEST_ROW_UPDATE,\n URL_COLUMN_PAGE_LABEL,\n URL_COLUMN_PAGE_UNKNOWN,\n URL_COLUMN_PATH,\n URL_QUERY,\n} from \"../core/lb-constants.js\";\nimport {\n isRowRequest,\n nextLocation,\n pageNameFor,\n type GatheredRow,\n type HubRefusal,\n type HubRequest,\n type HubRequestDone,\n type HubResponse,\n type ResponseItem,\n type Row,\n} from \"../core/lb-types.js\";\nimport {\n applyResponse,\n applyRow,\n blankRow,\n focusIn,\n gatherInto,\n select,\n forget,\n isControl,\n isFormAssociated,\n keptAnswer,\n resort,\n within,\n type Control,\n} from \"./lb-apply.js\";\nimport {\n attachPlaced,\n detachRemoved,\n placed,\n requestDone,\n upgradeAbsent,\n} from \"./lb-lifecycle.js\";\n\nexport { applyResponse, applyRow } from \"./lb-apply.js\";\n\n/** What each request Loadbare provides cannot be issued without. */\nconst NEEDS: Record<string, readonly (keyof HubRequest)[]> = {\n [REQUEST_ROW_INSERT]: [\"query\", \"values\"],\n [REQUEST_ROW_UPDATE]: [\"query\", \"key\", \"values\"],\n [REQUEST_ROW_DELETE]: [\"query\", \"key\"],\n};\n\n/** The nearest ancestor carrying `lb-query`. An element is not its own. */\nfunction queryOf(el: Element): Element | null {\n return el.parentElement?.closest(`[${ATTR_QUERY}]`) ?? null;\n}\n\n/** The live row an element is, or is in. */\nfunction liveRowOf(el: Element): Element | null {\n return el.closest(LIVE_ROW);\n}\n\n/**\n * The key of the nearest ancestor row, when that row is of `query`: a live\n * row whose query it is, or the element a `row` of it landed on.\n */\nfunction keyFrom(el: Element, query: Element): string | undefined {\n // A live row is its own row; any other element's row is an ancestor.\n const row = el.matches(LIVE_ROW)\n ? el\n : el.parentElement?.closest(`[${ATTR_KEY_VALUE}]`);\n if (!row) return undefined;\n // A live row's key is its outer query's, even when the row names a query\n // of its own. Any other element's key is its own query's.\n const ofQuery = row.matches(LIVE_ROW)\n ? queryOf(row) === query\n : row === query;\n return ofQuery ? (row.getAttribute(ATTR_KEY_VALUE) ?? undefined) : undefined;\n}\n\n/**\n * Every control whose form owner is `form`: HTML's own list, which holds a\n * control nested in the form or joined to it by the `form` attribute, and a\n * form-associated custom element as well as a native control.\n */\nfunction controlsOf(form: HTMLFormElement): Element[] {\n return [...(form.elements as unknown as Iterable<Element>)];\n}\n\n/**\n * The form owner of an element that has one, as HTML reports it on the\n * element's `form` property.\n */\nfunction formOwnerOf(el: Element): HTMLFormElement | null {\n const owner = (el as { form?: unknown }).form;\n return owner && (owner as Element).localName === \"form\"\n ? (owner as HTMLFormElement)\n : null;\n}\n\n/** The group a request gathers from. */\ninterface Group {\n controls: Element[];\n /** Set when the group is a form, so a successful insert resets it. */\n form?: HTMLFormElement;\n /** What the group is: the form or the live row. */\n root: Element;\n}\n\n/**\n * The controls a request gathers — see docs/reference/data-binding.md,\n * \"Gathering\":\n *\n * 1. the element carrying `lb-request` has `lb-column`: it alone;\n * 2. the element is a `<form>`: the controls whose form owner it is;\n * 3. the element is in a live row: the controls in that live row;\n * 4. otherwise: the controls whose form owner is the element's.\n *\n * A control whose nearest `lb-query` is inside the group belongs to a query\n * nested in it, and is skipped.\n */\nfunction groupFor(el: Element): Group | null {\n if (el.hasAttribute(ATTR_COLUMN)) return { controls: [el], root: el };\n if (el.localName === \"form\") {\n const form = el as HTMLFormElement;\n return { controls: controlsOf(form), form, root: form };\n }\n const live = liveRowOf(el);\n if (live) return { controls: within(live, `[${ATTR_COLUMN}]`), root: live };\n const form = formOwnerOf(el);\n if (form) return { controls: controlsOf(form), form, root: form };\n return null;\n}\n\n/**\n * The gathered controls, with their values under their columns.\n *\n * A form also gathers the live rows of a query nested in its own, each with\n * the values of its own controls, under the nested query's name: a master's\n * details, entered beside it. One level only, since a query nested deeper\n * shows the same rows in every row around it, and its keys would repeat. A\n * live row gathers nothing nested.\n */\nfunction gather(group: Group | null): {\n controls: Control[];\n values: Record<string, string>;\n rows: Record<string, GatheredRow[]>;\n nestedControls: Control[];\n /** The element naming the form's own query, when the group is a form. */\n own: Element | null;\n} {\n const controls: Control[] = [];\n const values: Record<string, string> = {};\n const nestedControls: Control[] = [];\n const byQuery = new Map<string, Map<string, Record<string, string>>>();\n const form = group?.form;\n const own = form\n ? form.hasAttribute(ATTR_QUERY)\n ? form\n : queryOf(form)\n : null;\n for (const el of group?.controls ?? []) {\n const column = el.getAttribute(ATTR_COLUMN);\n if (column === null || !isControl(el)) continue;\n const nested = queryOf(el);\n if (nested && nested !== group!.root && group!.root.contains(nested)) {\n const live = liveRowOf(el);\n if (\n own &&\n queryOf(nested) === own &&\n live &&\n queryOf(live) === nested\n ) {\n const name = nested.getAttribute(ATTR_QUERY)!;\n const key = live.getAttribute(ATTR_KEY_VALUE)!;\n const set = byQuery.get(name) ?? new Map();\n byQuery.set(name, set);\n const row = set.get(key) ?? {};\n set.set(key, row);\n gatherInto(row, column, el);\n nestedControls.push(el);\n }\n continue;\n }\n controls.push(el);\n gatherInto(values, column, el);\n }\n const rows: Record<string, GatheredRow[]> = {};\n for (const [name, set] of byQuery) {\n rows[name] = [...set].map(([key, row]) => ({ key, values: row }));\n }\n return { controls, values, rows, nestedControls, own };\n}\n\n/** The controls each request gathered, so a refusal can find them. */\nconst gatheredFrom = new WeakMap<HubRequest, Element[]>();\n\n/** A request's round trip came back refused, with the handler's words. */\nclass RefusedError extends Error {\n constructor(readonly refusal: HubRefusal) {\n super(refusal.message ?? \"refused\");\n this.name = \"RefusedError\";\n }\n}\n\n/**\n * A refusal on show: the controls its request gathered, the controls that\n * carry its messages, and the element that committed, stamped with its\n * message. It stands until the user edits any control the request gathered,\n * since that makes a new question of the next submit.\n */\ninterface Shown {\n gathered: Element[];\n marked: Element[];\n origin: Element | undefined;\n}\n\nconst shown: Shown[] = [];\n\n/** A control that takes a message the way HTML's own do. */\ninterface Validates {\n setCustomValidity(message: string): void;\n reportValidity(): boolean;\n}\n\nfunction validates(el: Element): el is Element & Validates {\n const v = el as Partial<Validates>;\n return (\n typeof v.setCustomValidity === \"function\" &&\n typeof v.reportValidity === \"function\"\n );\n}\n\n/** Take a refusal off show: its messages, and the stamp on its origin. */\nfunction withdraw(refused: Shown): void {\n for (const el of refused.marked) (el as Element & Validates).setCustomValidity(\"\");\n refused.origin?.removeAttribute(ATTR_REQUEST_REFUSED);\n shown.splice(shown.indexOf(refused), 1);\n}\n\n/** Withdraw every refusal whose request gathered `el`, or what holds it. */\nfunction edited(target: Element): void {\n for (const refused of [...shown]) {\n if (refused.gathered.some((c) => c === target || c.contains(target))) {\n withdraw(refused);\n }\n }\n}\n\n/** The form each insert gathered from, until its round trip succeeds. */\nconst insertedFrom = new WeakMap<HubRequest, HTMLFormElement>();\n\n/**\n * Every form a button has pointed, with the live row it is pointed at: null\n * when it was started empty, for an insert.\n */\nconst pointed = new WeakMap<HTMLFormElement, Element | null>();\n\n/** The pointed form each request gathered from, until it succeeds. */\nconst savedFrom = new WeakMap<HubRequest, HTMLFormElement>();\n\n/**\n * The `lb-select` checkboxes showing for a query, under the hub an element\n * is in. One parked by `lb-show` is in template content, out of reach, so\n * only a selection the user can see counts.\n */\nfunction selectorsFor(el: Element, query: string): HTMLInputElement[] {\n const root = el.closest(HUB_TAG_NAME) ?? el.ownerDocument;\n return [...root.querySelectorAll<HTMLInputElement>(`[${ATTR_SELECT}]`)].filter(\n (box) => {\n const live = liveRowOf(box);\n return live !== null && queryOf(live)?.getAttribute(ATTR_QUERY) === query;\n },\n );\n}\n\n/** The keys of the rows a query's showing checkboxes select. */\nfunction selectedKeys(boxes: HTMLInputElement[]): string[] {\n return boxes\n .filter((box) => box.checked)\n .map((box) => liveRowOf(box)!.getAttribute(ATTR_KEY_VALUE)!);\n}\n\n/**\n * Complete a request from where its element sits. Every request passes\n * through here, whoever issued it; a field it already carries is its\n * issuer's to decide and is left as it is.\n *\n * False when the request cannot be issued, having said why, or when it is\n * an update or delete for a row not yet entered, which is not sent.\n */\nfunction complete(request: HubRequest | undefined, el: Element): boolean {\n if (!request?.name) {\n console.warn(`lb-hub: a request without a name, ignoring`, request);\n return false;\n }\n const { name } = request;\n if (name.startsWith(LB_RESERVED_PREFIX) && !isRowRequest(name)) {\n console.error(\n `lb-hub: '${name}' begins with '${LB_RESERVED_PREFIX}' but names no ` +\n `request Loadbare provides, ignoring`,\n );\n return false;\n }\n\n const group = groupFor(el);\n const { controls, values, rows, nestedControls, own } = gather(group);\n gatheredFrom.set(request, [...controls, ...nestedControls]);\n if (request.values === undefined && controls.length > 0) {\n request.values = values;\n }\n // A form's nested rows go with what it writes, and not with a delete. A\n // form of nested rows alone still writes, with no values of its own.\n if (\n request.rows === undefined &&\n Object.keys(rows).length > 0 &&\n name !== REQUEST_ROW_DELETE\n ) {\n request.rows = rows;\n request.values ??= {};\n }\n\n // The request is for the nearest `lb-query` of what it gathered, or of the\n // element itself when it gathered nothing.\n const queries = new Set(controls.map(queryOf));\n if (queries.size > 1) {\n console.error(\n `lb-hub: '${name}' gathered controls of more than one query, not sent`,\n el,\n );\n return false;\n }\n // A form of nested rows alone is for its own query, and keyed by the row\n // landed on it or the row it is pointed at, if any.\n if (controls.length === 0 && nestedControls.length > 0 && own) {\n request.query ??= own.getAttribute(ATTR_QUERY)!;\n const key = own.getAttribute(ATTR_KEY_VALUE);\n if (key !== null) request.key ??= key;\n } else {\n const from = controls[0] ?? el;\n const query = controls.length > 0 ? [...queries][0]! : queryOf(el);\n if (query) {\n request.query ??= query.getAttribute(ATTR_QUERY)!;\n const key = keyFrom(from, query);\n if (key !== undefined) request.key ??= key;\n }\n }\n\n // A query the hub serves has one row, keyed by the path, so a request for\n // one from anywhere on the page is for that row.\n if (request.query === URL_QUERY || request.query === CHOICES_QUERY) {\n request.key ??= location.pathname;\n }\n\n if (name === REQUEST_ROW_INSERT && group?.form) {\n insertedFrom.set(request, group.form);\n }\n if (group?.form && pointed.has(group.form)) {\n savedFrom.set(request, group.form);\n }\n\n // A row not yet entered: its key is empty, from a `row` the server\n // answered with no key yet, or from a form New pointed. It has no key to\n // send, and nothing on record to update or delete, so those two are not\n // sent. That is the row's state, not a mistake, and nothing is reported.\n const unentered = request.key === \"\";\n if (unentered) {\n delete request.key;\n if (name === REQUEST_ROW_UPDATE || name === REQUEST_ROW_DELETE) {\n return false;\n }\n }\n\n // A request that names no one row acts on the rows the user selected,\n // when its query shows checkboxes to select them by. An insert adds a row\n // and selects nothing. With none ticked, an update or a delete has\n // nothing to act on, and is not sent, as for a row not yet entered.\n if (\n request.key === undefined &&\n request.keys === undefined &&\n request.query !== undefined &&\n !unentered &&\n name !== REQUEST_ROW_INSERT\n ) {\n const boxes = selectorsFor(el, request.query);\n if (boxes.length > 0) {\n request.keys = selectedKeys(boxes);\n if (\n request.keys.length === 0 &&\n (name === REQUEST_ROW_UPDATE || name === REQUEST_ROW_DELETE)\n ) {\n return false;\n }\n }\n }\n\n const needs = NEEDS[name];\n if (needs) {\n const missing = needs.filter(\n (field) =>\n (request[field] === undefined &&\n !(field === \"key\" && request.keys !== undefined)) ||\n (field === \"values\" &&\n Object.keys(request.values!).length === 0 &&\n request.rows === undefined),\n );\n if (missing.length > 0) {\n console.error(\n `lb-hub: '${name}' from <${el.localName}> has no ` +\n `${missing.join(\", \")}, not sent`,\n el,\n );\n return false;\n }\n }\n return true;\n}\n\n/**\n * Commit: dispatch the request an element names, for the hub to complete. A\n * commit on an element whose round trip is in flight is ignored.\n */\nfunction commit(el: Element): void {\n if (el.hasAttribute(ATTR_REQUEST_PENDING)) return;\n const detail: HubRequest = { name: el.getAttribute(ATTR_REQUEST)! };\n el.dispatchEvent(new CustomEvent(LB_EVENT_NAME, { bubbles: true, detail }));\n}\n\n/** A submit button with a form owner commits with its form, never on click. */\nfunction isSubmitButton(el: Element): boolean {\n const type = (el as HTMLInputElement).type as string;\n const submits =\n (el.localName === \"button\" && type === \"submit\") ||\n (el.localName === \"input\" && (type === \"submit\" || type === \"image\"));\n return submits && formOwnerOf(el) !== null;\n}\n\n/**\n * HTML's interactive content: elements a click already means something to.\n * HTML forbids nesting them inside `<a>` or `<button>` so a click means one\n * thing, and the hub draws the same line.\n */\nconst INTERACTIVE = [\n \"a[href]\",\n \"button\",\n \"input:not([type=hidden])\",\n \"select\",\n \"textarea\",\n \"label\",\n \"details\",\n \"iframe\",\n \"embed\",\n \"audio[controls]\",\n \"video[controls]\",\n \"img[usemap]\",\n].join(\", \");\n\n/**\n * Whether a click on `target` is the click of `el`, the element carrying\n * `lb-request` above it: no interactive content lies between them. A click on\n * a control, link or button inside `el` belongs to that element.\n */\nfunction clicks(target: Element, el: Element): boolean {\n for (let node: Element | null = target; node && node !== el;) {\n if (node.matches(INTERACTIVE) || isFormAssociated(node)) return false;\n node = node.parentElement;\n }\n return true;\n}\n\n/** The page file's title, or its stub when it has none. */\nfunction titleOf(template: HTMLTemplateElement | null, page: string): string {\n return template?.getAttribute(ATTR_PAGE_TITLE) || page;\n}\n\n/**\n * The `<template>` a page ships in. The builder guarantees one per stub\n * (build/locations.ts refuses two page files sharing one), so a second match\n * here means the document was assembled by something else.\n */\nfunction pageHostFor(page: string): HTMLTemplateElement | null {\n const hosts: HTMLTemplateElement[] = [];\n for (const el of document.querySelectorAll(`template[${ATTR_PAGE}]`)) {\n if (el.getAttribute(ATTR_PAGE) === page) {\n hosts.push(el as HTMLTemplateElement);\n }\n }\n if (hosts.length > 1) {\n console.error(\n `lb-hub: ${hosts.length} pages carry ${ATTR_PAGE}=\"${page}\", ` +\n `using the first`,\n );\n }\n return hosts[0] ?? null;\n}\n\n/**\n * One round trip against the client-side deadline. Throws on a non-ok\n * response, a network failure or a timeout, so a caller can tell a failed\n * request from an empty answer.\n *\n * The stub names the path below the endpoint and the query string the\n * browser is showing rides after it verbatim, so every round trip reaches\n * the server with the query parms in hand.\n */\nasync function fetchItems(\n page: string,\n request?: HubRequest,\n): Promise<HubResponse> {\n const path = page.split(\"/\").map(encodeURIComponent).join(\"/\");\n const url = `${LB_ENDPOINT}/${path}${location.search}`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), LB_REQUEST_TIMEOUT_MS);\n try {\n // An empty body is how the hub asks for the page's queries.\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(request ?? {}),\n signal: controller.signal,\n });\n if (res.status === LB_REFUSAL_STATUS) {\n const body = (await res.json().catch(() => ({}))) as {\n refusal?: HubRefusal;\n };\n throw new RefusedError(body.refusal ?? {});\n }\n if (!res.ok) {\n throw new Error(`lb-hub: server responded ${res.status} for ${url}`);\n }\n return (await res.json()) as HubResponse;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** An element's round trip is in flight, or is not. */\nfunction pending(el: Element | undefined, on: boolean): void {\n if (!el) return;\n if (on) {\n el.removeAttribute(ATTR_REQUEST_ERROR);\n el.removeAttribute(ATTR_REQUEST_REFUSED);\n el.setAttribute(ATTR_REQUEST_PENDING, \"\");\n el.setAttribute(\"aria-busy\", \"true\");\n } else {\n el.removeAttribute(ATTR_REQUEST_PENDING);\n el.removeAttribute(\"aria-busy\");\n }\n}\n\n/**\n * Tell the element that committed how its request turned out: the custom\n * elements from it outward first, then any listener. Told after everything\n * the request brought back has landed, so each sees the page as the answer\n * left it, and `lb-request-pending` is already gone.\n */\nfunction done(\n origin: Element | undefined,\n request: HubRequest,\n landed: ResponseItem[] | Error,\n): void {\n const detail: HubRequestDone =\n landed instanceof RefusedError\n ? { request, items: [], error: landed, refusal: landed.refusal }\n : landed instanceof Error\n ? { request, items: [], error: landed }\n : { request, items: landed };\n if (!origin) return;\n requestDone(origin, detail);\n origin.dispatchEvent(\n new CustomEvent(LB_DONE_EVENT_NAME, { bubbles: true, detail }),\n );\n}\n\n/**\n * Focus the first element in `main` 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. Focus already in `main` is the user's,\n * and is left where it is.\n */\nfunction focusFirst(main: HTMLElement): void {\n if (main.contains(document.activeElement)) return;\n focusIn(main);\n}\n\n/**\n * Empty a form of whatever row it showed: every column it names lands as\n * null, so text and `lb-show` read as no row, and then the form resets, so\n * each control returns to its default.\n */\nfunction clear(form: HTMLFormElement): void {\n pointed.get(form)?.removeAttribute(ATTR_ROW_EDITING);\n applyRow(form, blankRow(form));\n form.reset();\n}\n\n/**\n * Point a form at a row: fill it from the row and key it by the row's key,\n * so gathering sends that key. With no row, the form starts empty and its\n * key is empty, for an insert. A form inside a `<dialog>` opens it.\n */\nfunction point(\n form: HTMLFormElement,\n row: Row | null,\n key: string,\n live: Element | null,\n): void {\n clear(form);\n if (row) applyRow(form, row);\n form.setAttribute(ATTR_KEY_VALUE, key);\n live?.setAttribute(ATTR_ROW_EDITING, \"\");\n pointed.set(form, live);\n const dialog = form.closest(\"dialog\");\n if (dialog && !dialog.open) dialog.showModal();\n focusIn(form);\n}\n\n/**\n * Let a pointed form go: empty it and drop its key. A form inside a\n * `<dialog>` closes it, and the dialog's `close` finds nothing left to do.\n */\nfunction release(form: HTMLFormElement): void {\n if (!pointed.has(form)) return;\n clear(form);\n form.removeAttribute(ATTR_KEY_VALUE);\n pointed.delete(form);\n const dialog = form.closest(\"dialog\");\n if (dialog?.open) dialog.close();\n}\n\n/**\n * The URL a round trip answers for: its path and its query string. An answer\n * that returns to another is not landed.\n */\nfunction here(): string {\n return location.pathname + location.search;\n}\n\n/** A plain primary click: no other button, no modifier, not yet handled. */\nfunction isPlainClick(e: MouseEvent): boolean {\n return (\n e.button === 0 &&\n !e.defaultPrevented &&\n !e.metaKey &&\n !e.ctrlKey &&\n !e.shiftKey &&\n !e.altKey\n );\n}\n\n/** The URL a row for `lb-url` leads to, by the rule the server follows. */\nfunction nextUrl(row: Row): { url: URL; moved: boolean } {\n const url = new URL(location.href);\n const next = nextLocation(pageNameFor(url.pathname), url.searchParams, row);\n const path = row[URL_COLUMN_PATH];\n if (typeof path === \"string\") url.pathname = path;\n url.search = next.parms.toString();\n return { url, moved: next.moved };\n}\n\n/**\n * The hub is a singleton outside <main>. It survives every page change,\n * so it needs no id to disambiguate it.\n */\nclass LbHub extends HTMLElement {\n private main!: HTMLElement;\n\n /**\n * The stub of the page in <main>. A page declares its own requests, so a\n * request says which page it came from, on the path below the endpoint.\n */\n private page = \"\";\n\n /**\n * Set when a page is entered, and cleared once its queries have landed\n * and focus has gone to its first control. A change of query parm on the\n * same page does not set it: the user is where they chose to be.\n */\n private entering = false;\n\n /**\n * What the hub has shown and not yet placed: the chrome when it starts,\n * and <main> each time it shows a page. Placed as the page's first answer\n * lands, so each custom element in it is filled before it is attached.\n */\n private unplaced: Element[] = [];\n\n connectedCallback() {\n this.main = this.querySelector(\"main\")!;\n\n // Completed in the capture phase, on the way down, so every ancestor\n // that sees the request on its way back up sees it whole. A request that\n // cannot be issued is stopped here, before anything sees it at all.\n this.addEventListener(\n LB_EVENT_NAME,\n (e: Event) => {\n const origin = e.target as Element;\n const request = (e as CustomEvent<HubRequest>).detail;\n if (!complete(request, origin)) e.stopPropagation();\n },\n { capture: true },\n );\n\n this.addEventListener(LB_EVENT_NAME, (e: Event) => {\n const request = (e as CustomEvent<HubRequest>).detail;\n // The element that issued the request, not e.currentTarget (the hub\n // itself, since the event bubbles).\n const origin = (e.target as Element | null) ?? undefined;\n if (request.query?.startsWith(LB_RESERVED_PREFIX)) {\n void this.answer(request, origin);\n return;\n }\n void this.send(request, origin);\n });\n\n // A form commits on submit. The submitter's own lb-request replaces the\n // form's, the way `formaction` replaces `action`.\n this.addEventListener(\"submit\", (e: SubmitEvent) => {\n const form = e.target as Element | null;\n if (!form) return;\n const submitter = e.submitter;\n const el = submitter?.hasAttribute(ATTR_REQUEST)\n ? submitter\n : form.hasAttribute(ATTR_REQUEST)\n ? form\n : null;\n if (!el) return;\n e.preventDefault();\n commit(el);\n });\n\n // A reset returns a form's controls to their defaults, so none of them\n // shows what landed any longer. The browser resets the controls; the\n // hub drops its own stamp from the same controls a submit gathers, and\n // any refusal they were answering.\n this.addEventListener(\"reset\", (e: Event) => {\n if (e.defaultPrevented) return;\n for (const el of controlsOf(e.target as HTMLFormElement)) {\n el.removeAttribute(ATTR_COLUMN_VALUE);\n edited(el);\n }\n });\n\n // An edit to anything a refused request gathered withdraws the refusal.\n // Heard on the way down, so a control's own request on change goes out\n // with its message already gone.\n for (const type of [\"input\", \"change\"]) {\n this.addEventListener(\n type,\n (e: Event) => {\n if (shown.length > 0) edited(e.target as Element);\n },\n { capture: true },\n );\n }\n\n // A selector selects its row, and is no column.\n this.addEventListener(\"change\", (e: Event) => {\n const box = e.target as Element | null;\n if (box?.hasAttribute(ATTR_SELECT)) {\n select(box, (box as HTMLInputElement).checked);\n }\n });\n\n // A control commits on change.\n this.addEventListener(\"change\", (e: Event) => {\n const el = e.target as Element | null;\n if (!el || !el.hasAttribute(ATTR_REQUEST) || !isControl(el)) return;\n commit(el);\n });\n\n // Anything else commits on click. A form commits on submit, a control on\n // change, and a submit button with its form. A click on interactive\n // content inside the element is that content's own.\n this.addEventListener(\"click\", (e: MouseEvent) => {\n const target = e.target as Element | null;\n const el = target?.closest(`[${ATTR_REQUEST}]`);\n if (!target || !el || !this.contains(el)) return;\n if (el.localName === \"form\" || isControl(el) || isSubmitButton(el)) {\n return;\n }\n if (!clicks(target, el)) return;\n e.preventDefault();\n commit(el);\n });\n\n // A link that opted in. Everything else is a real link, and so is a\n // click that opens a new tab or window. The link's URL is a row for\n // lb-url: its path, its query parms, and every other parm emptied. A\n // link pushes a history entry, as a link does.\n this.addEventListener(\"click\", (e: MouseEvent) => {\n const link = (e.target as Element | null)?.closest(`a[${ATTR_URL_LINK}]`);\n if (!link || !isPlainClick(e)) return;\n e.preventDefault();\n const href = new URL((link as HTMLAnchorElement).href);\n const row: Row = {};\n for (const name of new URLSearchParams(location.search).keys()) {\n row[name] = \"\";\n }\n for (const [name, value] of href.searchParams) row[name] = value;\n row[URL_COLUMN_PATH] = href.pathname;\n this.moveTo(row, true);\n void this.navigate();\n });\n\n // A button points a form with HTML's own commandfor and command, or asks\n // a list to sort. The command event goes to the element it names and\n // does not bubble, so it is heard on the way down.\n this.addEventListener(\n \"command\",\n (e: Event) => {\n const { command, source } = e as Event & {\n command?: string;\n source?: Element | null;\n };\n if (!command?.startsWith(LB_COMMAND_PREFIX)) return;\n if (command === COMMAND_SORT) {\n this.sort(e.target as Element);\n return;\n }\n const form = e.target as Element;\n if (form.localName !== \"form\" || !form.hasAttribute(ATTR_QUERY)) {\n console.error(\n `lb-hub: '${command}' is for a <form> carrying ${ATTR_QUERY}, ` +\n `not <${form.localName}>, ignoring`,\n form,\n );\n return;\n }\n this.command(command, form as HTMLFormElement, source ?? null);\n },\n { capture: true },\n );\n\n // A dialog closes however HTML closes it — Escape, a close command,\n // `method=\"dialog\"` — and a form pointed inside it lets go.\n this.addEventListener(\n \"close\",\n (e: Event) => {\n const dialog = e.target as Element;\n if (dialog.localName !== \"dialog\") return;\n for (const form of dialog.querySelectorAll(\"form\")) release(form);\n },\n { capture: true },\n );\n\n addEventListener(\"popstate\", () => void this.navigate());\n\n upgradeAbsent(this, document);\n this.unplaced = [...this.children];\n\n void this.navigate();\n }\n\n /**\n * A command for a form. Edit fills the form from the row the button sits\n * in, as the hub holds it: no round trip, since the user can only edit a\n * row they can see.\n */\n private command(\n command: string,\n form: HTMLFormElement,\n source: Element | null,\n ): void {\n const query = form.getAttribute(ATTR_QUERY)!;\n switch (command) {\n case COMMAND_EDIT: {\n const live = source ? liveRowOf(source) : null;\n if (!live || queryOf(live)?.getAttribute(ATTR_QUERY) !== query) {\n console.error(\n `lb-hub: '${command}' comes from no row of '${query}', ignoring`,\n source,\n );\n return;\n }\n const key = live.getAttribute(ATTR_KEY_VALUE)!;\n const item = keptAnswer(this, query);\n const row = item?.rows?.find((r) => String(r[item.key]) === key);\n if (!row) {\n console.error(\n `lb-hub: the hub holds no row of '${query}' keyed '${key}', ` +\n `ignoring`,\n );\n return;\n }\n point(form, row, key, live);\n return;\n }\n case COMMAND_NEW:\n point(form, null, \"\", null);\n return;\n case COMMAND_RELEASE:\n release(form);\n return;\n default:\n console.error(\n `lb-hub: '${command}' begins with '${LB_COMMAND_PREFIX}' but ` +\n `names no command Loadbare provides, ignoring`,\n );\n }\n }\n\n /**\n * Place a list's rows by the order again, from the rows the hub holds: no\n * round trip, since the user asks only to see what they already have in\n * order.\n */\n private sort(el: Element): void {\n if (!el.hasAttribute(ATTR_QUERY)) {\n console.error(\n `lb-hub: '${COMMAND_SORT}' is for an element carrying ` +\n `${ATTR_QUERY}, not <${el.localName}>, ignoring`,\n el,\n );\n return;\n }\n if (!resort(this, el)) {\n console.error(\n `lb-hub: '${COMMAND_SORT}' is for an element showing rows the hub ` +\n `holds, ignoring`,\n el,\n );\n }\n }\n\n /**\n * Send a request to the server and land its answer. An answer naming\n * `lb-url` moves the URL first; the server has already loaded the page\n * there, in the same round trip.\n */\n private async send(request: HubRequest, origin?: Element): Promise<void> {\n // Sending again answers the last refusal from here, whatever it said.\n for (const refused of shown.filter((r) => r.origin === origin)) {\n withdraw(refused);\n }\n const at = here();\n const items = await this.roundTrip(this.page, request, origin);\n if (items instanceof RefusedError) this.refused(request, items, origin);\n if (items instanceof Error) return done(origin, request, items);\n let landed: ResponseItem[] = [];\n // The server answered for the URL the request was sent from. A user who\n // moved while it was in flight, to another page or to other parms, is\n // looking at something it says nothing about, and on a URL that is not\n // the server's to change. The write still happened.\n if (here() === at) {\n const url = items.find((item) => item.query === URL_QUERY);\n const load = items.filter((item) => item !== url);\n landed = load;\n if (url === undefined) {\n applyResponse(this, load, { requested: true, origin });\n }\n else landed = await this.follow(url, load, origin);\n }\n // The selected rows have been acted on, and the selection is done.\n if (request.keys !== undefined && request.query !== undefined) {\n for (const box of selectorsFor(this, request.query)) select(box, false);\n }\n // A pointed form has done what it was pointed for, and lets go.\n const saved = savedFrom.get(request);\n if (saved) release(saved);\n else insertedFrom.get(request)?.reset();\n done(origin, request, landed);\n }\n\n /**\n * Show a refusal. The message for the request as a whole is stamped on the\n * element that committed, for a stylesheet to show. Each column's message\n * goes on the control the request gathered it from, as HTML's own\n * validity, and the first is reported: the browser shows its message\n * there and moves focus to it.\n */\n private refused(\n request: HubRequest,\n { refusal }: RefusedError,\n origin: Element | undefined,\n ): void {\n const gathered = gatheredFrom.get(request) ?? [];\n const marked: Element[] = [];\n for (const [column, message] of Object.entries(refusal.columns ?? {})) {\n const control = gathered.find(\n (c) => c.getAttribute(ATTR_COLUMN) === column,\n );\n if (!control || !validates(control)) {\n console.warn(\n `lb-hub: '${request.name}' was refused for '${column}', but ` +\n `gathered no control there that takes a message`,\n );\n continue;\n }\n control.setCustomValidity(message);\n marked.push(control);\n }\n origin?.setAttribute(ATTR_REQUEST_REFUSED, refusal.message ?? \"\");\n shown.push({ gathered, marked, origin });\n (marked[0] as (Element & Validates) | undefined)?.reportValidity();\n }\n\n /**\n * One round trip for a page: a request, or with none a page load. The\n * element that issued it carries `lb-request-pending` while it is in\n * flight, and `lb-request-error` when it fails. The error on failure.\n */\n private async roundTrip(\n page: string,\n request: HubRequest | undefined,\n origin: Element | undefined,\n ): Promise<HubResponse | Error> {\n pending(origin, true);\n try {\n return await fetchItems(page, request);\n } catch (err) {\n // A refusal is the handler's answer, not a failure: the request's\n // sender shows it, and nothing is reported.\n if (err instanceof RefusedError) return err;\n console.error(`lb-hub: request failed for '${page}'`, err);\n origin?.setAttribute(ATTR_REQUEST_ERROR, \"\");\n return err instanceof Error ? err : new Error(String(err));\n } finally {\n pending(origin, false);\n }\n }\n\n /**\n * Answer a request for a query the hub serves, with no round trip. The\n * hub serves `lb-url` and `lb-choices`, and updates them.\n */\n private async answer(request: HubRequest, origin?: Element): Promise<void> {\n if (request.query === CHOICES_QUERY && request.name === REQUEST_ROW_UPDATE) {\n return done(origin, request, [this.choose(request.values ?? {})]);\n }\n if (request.query !== URL_QUERY || request.name !== REQUEST_ROW_UPDATE) {\n const message =\n `lb-hub: '${request.name}' for '${request.query}' is not a request ` +\n `the hub answers, ignoring`;\n console.error(message);\n return done(origin, request, new Error(message));\n }\n const pushed = origin?.hasAttribute(ATTR_URL_PUSH) ?? false;\n if (!this.moveTo(request.values ?? {}, pushed)) {\n return done(origin, request, []);\n }\n done(origin, request, await this.navigate(origin));\n }\n\n /**\n * The user made choices: they join the ones already made, and the rows\n * that read them are placed again from what the hub holds. The server is\n * told, for a page that keeps them, and its answer lands like any other.\n * What landed: the row of `lb-choices`.\n */\n private choose(values: Record<string, string>): ResponseItem {\n const row: Row = {\n ...keptAnswer(this, CHOICES_QUERY)?.row,\n ...values,\n [URL_COLUMN_PATH]: location.pathname,\n };\n const item: ResponseItem = {\n query: CHOICES_QUERY,\n kind: KIND_ROW,\n key: URL_COLUMN_PATH,\n row,\n };\n applyResponse(this, [item]);\n void this.tell(row);\n return item;\n }\n\n /**\n * Send the server the user's choices, by `lb-row-update` for\n * `lb-choices`, which runs the page's `onChoices`. No element waits on\n * it, so none is pending, and a choice made while it is in flight is sent\n * in turn.\n */\n private async tell(row: Row): Promise<void> {\n const { [URL_COLUMN_PATH]: _, ...choices } = row;\n const values: Record<string, string> = {};\n for (const [column, value] of Object.entries(choices)) {\n values[column] = value === null || value === undefined ? \"\" : String(value);\n }\n const at = here();\n const items = await this.roundTrip(\n this.page,\n {\n name: REQUEST_ROW_UPDATE,\n query: CHOICES_QUERY,\n key: location.pathname,\n values,\n },\n undefined,\n );\n if (items instanceof Error || here() !== at) return;\n if (items.length > 0) applyResponse(this, items, { requested: true });\n }\n\n /**\n * Write a row for `lb-url` into the URL. A new page pushes a history\n * entry, and so does `push`; a change of query parms replaces the entry.\n * False when the URL is already the row's.\n */\n private moveTo(row: Row, push: boolean): boolean {\n const { url, moved } = nextUrl(row);\n if (url.href === location.href) return false;\n if (moved || push) history.pushState(null, \"\", url);\n else history.replaceState(null, \"\", url);\n return true;\n }\n\n /**\n * A server answer named `lb-url`: write the URL, then land the page the\n * server loaded there. A load that did not come back is asked for again,\n * without marking the element that issued the request: its write\n * succeeded, and an error would invite sending it twice.\n *\n * What landed: the `lb-url` item and the load, however it arrived. A load\n * asked for again that fails is not the request's failure.\n */\n private async follow(\n item: ResponseItem,\n load: ResponseItem[],\n origin?: Element,\n ): Promise<ResponseItem[]> {\n this.moveTo(item.row ?? {}, origin?.hasAttribute(ATTR_URL_PUSH) ?? false);\n if (load.length === 0) {\n const again = await this.navigate();\n return again instanceof Error ? [item] : [item, ...again];\n }\n const template = this.arrive();\n this.place();\n if (template) applyResponse(this, load);\n else attachPlaced();\n this.entered();\n return template ? [item, ...load] : [item];\n }\n\n /**\n * Load the page at the URL the browser is showing. Every way of arriving\n * comes through here — a cold load, a link, Back, a new query parm — so\n * each is the same page load and a URL always shows the same thing.\n *\n * Entering a page is the one operation that replaces what <main> holds.\n * Staying on it, with only the query parms changed, keeps what it has: the\n * queries re-run and land by key, so rows that come back keep their place.\n *\n * `origin` is the element whose request changed the URL, if one did, and\n * carries the round trip's pending and error state.\n *\n * What landed, or the error when the round trip failed. A load that\n * returns after the URL has moved again lands nothing: the load for where\n * the browser is now is already on its way, and may be here.\n */\n private async navigate(origin?: Element): Promise<ResponseItem[] | Error> {\n const template = this.arrive();\n if (!template) {\n this.place();\n attachPlaced();\n return [];\n }\n const at = here();\n const items = await this.roundTrip(this.page, undefined, origin);\n if (here() !== at) return items instanceof Error ? items : [];\n if (items instanceof Error) {\n this.place();\n attachPlaced();\n this.entered();\n return items;\n }\n // Entering the page moved the URL, as an application restoring what the\n // user last had on screen does: the server loaded the page there.\n const url = items.find((item) => item.query === URL_QUERY);\n if (url) {\n return this.follow(\n url,\n items.filter((item) => item !== url),\n origin,\n );\n }\n this.place();\n applyResponse(this, items);\n this.entered();\n return items;\n }\n\n /**\n * Place what the hub has shown since it last placed anything, for the\n * landing that follows to attach.\n */\n private place(): void {\n for (const root of this.unplaced) placed(root);\n this.unplaced = [];\n }\n\n /**\n * A page that was entered has landed its queries, so its first control\n * exists: a row cloned, a branch shown, a picker's options in place.\n */\n private entered(): void {\n if (!this.entering) return;\n this.entering = false;\n focusFirst(this.main);\n }\n\n /**\n * Show the page the path names, and land `lb-url`. Null when no page's\n * stub matches the path.\n */\n private arrive(): HTMLTemplateElement | null {\n const page = pageNameFor(location.pathname);\n const template = pageHostFor(page);\n if (template && page !== this.page) {\n this.page = page;\n // The template is already in the document, so the page's markup goes\n // in before its data arrives rather than leaving <main> empty. What\n // the last page's queries answered goes with it.\n const last = [...this.main.childNodes];\n this.main.replaceChildren(template.content.cloneNode(true));\n detachRemoved(last);\n upgradeAbsent(this.main, document);\n if (!this.unplaced.includes(this.main)) this.unplaced.push(this.main);\n forget(this);\n this.entering = true;\n this.landChoices();\n }\n this.landUrl(template ? titleOf(template, page) : null);\n // An app that ships `<body hidden>` (docs/reference/chrome.md) stays\n // invisible until there is something coherent to show.\n document.body.hidden = false;\n if (!template) {\n console.error(`lb-hub: no page for '${page}'`);\n const dialog = this.querySelector(`dialog[${ATTR_URL_UNKNOWN}]`);\n if (dialog && !(dialog as HTMLDialogElement).open) {\n (dialog as HTMLDialogElement).showModal();\n }\n }\n return template;\n }\n\n /**\n * The user's choices as a page begins: none made, so every column an\n * element under `lb-query=\"lb-choices\"` shows lands empty. Choices hold\n * until the page changes, unless the server restores them.\n */\n private landChoices(): void {\n const row: Row = {};\n for (const scope of this.querySelectorAll(\n `[${ATTR_QUERY}=\"${CHOICES_QUERY}\"]`,\n )) {\n for (const el of within(scope, `[${ATTR_COLUMN}]`)) {\n if (el !== scope) row[el.getAttribute(ATTR_COLUMN)!] = \"\";\n }\n }\n row[URL_COLUMN_PATH] = location.pathname;\n applyResponse(this, [\n { query: CHOICES_QUERY, kind: KIND_ROW, key: URL_COLUMN_PATH, row },\n ]);\n }\n\n /**\n * The hub's own query: one row, keyed by the path, whose other columns are\n * the query parms.\n *\n * The one exception to landing. A row sets the columns it names and\n * leaves the rest as they were, and a URL names only the parms it carries.\n * So the row also names, as empty, every column an element under\n * `lb-query=\"lb-url\"` shows: a control then shows what the address bar\n * says after Back as well as after a reload, and never a parm the URL has\n * dropped.\n */\n private landUrl(label: string | null): void {\n if (label !== null) document.title = label;\n const scopes = this.querySelectorAll(`[${ATTR_QUERY}=\"${URL_QUERY}\"]`);\n if (scopes.length === 0) return;\n const row: Row = {};\n for (const scope of scopes) {\n for (const el of within(scope, `[${ATTR_COLUMN}]`)) {\n if (el === scope) continue;\n row[el.getAttribute(ATTR_COLUMN)!] = \"\";\n }\n }\n for (const [name, value] of new URLSearchParams(location.search)) {\n row[name] = value;\n }\n row[URL_COLUMN_PATH] = location.pathname;\n row[URL_COLUMN_PAGE_LABEL] = label;\n row[URL_COLUMN_PAGE_UNKNOWN] = label === null;\n applyResponse(\n this,\n [{ query: URL_QUERY, kind: KIND_ROW, key: URL_COLUMN_PATH, row }],\n );\n }\n}\n\ncustomElements.define(HUB_TAG_NAME, LbHub);\n"]}
1
+ {"version":3,"file":"lb-hub.browser.js","sourceRoot":"","sources":["../../hub/lb-hub.browser.ts"],"names":[],"mappings":"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","sourcesContent":["/// <reference lib=\"dom\" />\n\nimport {\n ATTR_COLUMN,\n ATTR_COLUMN_VALUE,\n ATTR_KEY_VALUE,\n ATTR_PAGE,\n ATTR_PAGE_TITLE,\n ATTR_QUERY,\n ATTR_REQUEST,\n ATTR_REQUEST_ERROR,\n ATTR_REQUEST_PENDING,\n ATTR_REQUEST_REFUSED,\n ATTR_ROW_EDITING,\n ATTR_SELECT,\n ATTR_URL_LINK,\n ATTR_URL_PUSH,\n ATTR_URL_UNKNOWN,\n CHOICES_QUERY,\n COMMAND_EDIT,\n COMMAND_NEW,\n COMMAND_RELEASE,\n COMMAND_SORT,\n HUB_TAG_NAME,\n KIND_ROW,\n LB_DONE_EVENT_NAME,\n LB_ENDPOINT,\n LB_EVENT_NAME,\n LB_REFUSAL_STATUS,\n LB_REQUEST_TIMEOUT_MS,\n LB_COMMAND_PREFIX,\n LB_RESERVED_PREFIX,\n LIVE_ROW,\n REQUEST_ROW_DELETE,\n REQUEST_ROW_INSERT,\n REQUEST_ROW_UPDATE,\n URL_COLUMN_PAGE_LABEL,\n URL_COLUMN_PAGE_UNKNOWN,\n URL_COLUMN_PATH,\n URL_QUERY,\n} from \"../core/lb-constants.js\";\nimport {\n isRowRequest,\n nextLocation,\n pageNameFor,\n type GatheredRow,\n type HubRefusal,\n type HubRequest,\n type HubRequestDone,\n type HubResponse,\n type ResponseItem,\n type Row,\n} from \"../core/lb-types.js\";\nimport {\n applyResponse,\n applyRow,\n blankRow,\n focusIn,\n gatherInto,\n select,\n forget,\n isControl,\n isFormAssociated,\n keptAnswer,\n resort,\n within,\n type Control,\n} from \"./lb-apply.js\";\nimport {\n attachPlaced,\n detachRemoved,\n placed,\n requestDone,\n upgradeAbsent,\n} from \"./lb-lifecycle.js\";\n\nexport { applyResponse, applyRow } from \"./lb-apply.js\";\n\n/** What each request Loadbare provides cannot be issued without. */\nconst NEEDS: Record<string, readonly (keyof HubRequest)[]> = {\n [REQUEST_ROW_INSERT]: [\"query\", \"values\"],\n [REQUEST_ROW_UPDATE]: [\"query\", \"key\", \"values\"],\n [REQUEST_ROW_DELETE]: [\"query\", \"key\"],\n};\n\n/** The nearest ancestor carrying `lb-query`. An element is not its own. */\nfunction queryOf(el: Element): Element | null {\n return el.parentElement?.closest(`[${ATTR_QUERY}]`) ?? null;\n}\n\n/** The live row an element is, or is in. */\nfunction liveRowOf(el: Element): Element | null {\n return el.closest(LIVE_ROW);\n}\n\n/**\n * The key of the nearest ancestor row, when that row is of `query`: a live\n * row whose query it is, or the element a `row` of it landed on.\n */\nfunction keyFrom(el: Element, query: Element): string | undefined {\n // A live row is its own row; any other element's row is an ancestor.\n const row = el.matches(LIVE_ROW)\n ? el\n : el.parentElement?.closest(`[${ATTR_KEY_VALUE}]`);\n if (!row) return undefined;\n // A live row's key is its outer query's, even when the row names a query\n // of its own. Any other element's key is its own query's.\n const ofQuery = row.matches(LIVE_ROW)\n ? queryOf(row) === query\n : row === query;\n return ofQuery ? (row.getAttribute(ATTR_KEY_VALUE) ?? undefined) : undefined;\n}\n\n/**\n * Every control whose form owner is `form`: HTML's own list, which holds a\n * control nested in the form or joined to it by the `form` attribute, and a\n * form-associated custom element as well as a native control.\n */\nfunction controlsOf(form: HTMLFormElement): Element[] {\n return [...(form.elements as unknown as Iterable<Element>)];\n}\n\n/**\n * The form owner of an element that has one, as HTML reports it on the\n * element's `form` property.\n */\nfunction formOwnerOf(el: Element): HTMLFormElement | null {\n const owner = (el as { form?: unknown }).form;\n return owner && (owner as Element).localName === \"form\"\n ? (owner as HTMLFormElement)\n : null;\n}\n\n/** The group a request gathers from. */\ninterface Group {\n controls: Element[];\n /** Set when the group is a form, so a successful insert resets it. */\n form?: HTMLFormElement;\n /** What the group is: the form or the live row. */\n root: Element;\n}\n\n/**\n * The controls a request gathers — see docs/reference/data-binding.md,\n * \"Gathering\":\n *\n * 1. the element carrying `lb-request` has `lb-column`: it alone;\n * 2. the element is a `<form>`: the controls whose form owner it is;\n * 3. the element is in a live row: the controls in that live row;\n * 4. otherwise: the controls whose form owner is the element's.\n *\n * A control whose nearest `lb-query` is inside the group belongs to a query\n * nested in it, and is skipped.\n */\nfunction groupFor(el: Element): Group | null {\n if (el.hasAttribute(ATTR_COLUMN)) return { controls: [el], root: el };\n if (el.localName === \"form\") {\n const form = el as HTMLFormElement;\n return { controls: controlsOf(form), form, root: form };\n }\n const live = liveRowOf(el);\n if (live) return { controls: within(live, `[${ATTR_COLUMN}]`), root: live };\n const form = formOwnerOf(el);\n if (form) return { controls: controlsOf(form), form, root: form };\n return null;\n}\n\n/**\n * The gathered controls, with their values under their columns.\n *\n * A form also gathers the live rows of a query nested in its own, each with\n * the values of its own controls, under the nested query's name: a master's\n * details, entered beside it. One level only, since a query nested deeper\n * shows the same rows in every row around it, and its keys would repeat. A\n * live row gathers nothing nested.\n */\nfunction gather(group: Group | null): {\n controls: Control[];\n values: Record<string, string>;\n rows: Record<string, GatheredRow[]>;\n nestedControls: Control[];\n /** The element naming the form's own query, when the group is a form. */\n own: Element | null;\n} {\n const controls: Control[] = [];\n const values: Record<string, string> = {};\n const nestedControls: Control[] = [];\n const byQuery = new Map<string, Map<string, Record<string, string>>>();\n const form = group?.form;\n const own = form\n ? form.hasAttribute(ATTR_QUERY)\n ? form\n : queryOf(form)\n : null;\n for (const el of group?.controls ?? []) {\n const column = el.getAttribute(ATTR_COLUMN);\n if (column === null || !isControl(el)) continue;\n const nested = queryOf(el);\n if (nested && nested !== group!.root && group!.root.contains(nested)) {\n const live = liveRowOf(el);\n if (\n own &&\n queryOf(nested) === own &&\n live &&\n queryOf(live) === nested\n ) {\n const name = nested.getAttribute(ATTR_QUERY)!;\n const key = live.getAttribute(ATTR_KEY_VALUE)!;\n const set = byQuery.get(name) ?? new Map();\n byQuery.set(name, set);\n const row = set.get(key) ?? {};\n set.set(key, row);\n gatherInto(row, column, el);\n nestedControls.push(el);\n }\n continue;\n }\n controls.push(el);\n gatherInto(values, column, el);\n }\n const rows: Record<string, GatheredRow[]> = {};\n for (const [name, set] of byQuery) {\n rows[name] = [...set].map(([key, row]) => ({ key, values: row }));\n }\n return { controls, values, rows, nestedControls, own };\n}\n\n/** The controls each request gathered, so a refusal can find them. */\nconst gatheredFrom = new WeakMap<HubRequest, Element[]>();\n\n/** A request's round trip came back refused, with the handler's words. */\nclass RefusedError extends Error {\n constructor(readonly refusal: HubRefusal) {\n super(refusal.message ?? \"refused\");\n this.name = \"RefusedError\";\n }\n}\n\n/**\n * A refusal on show: the controls its request gathered, the controls that\n * carry its messages, and the element that committed, stamped with its\n * message. It stands until the user edits any control the request gathered,\n * since that makes a new question of the next submit.\n */\ninterface Shown {\n gathered: Element[];\n marked: Element[];\n origin: Element | undefined;\n}\n\nconst shown: Shown[] = [];\n\n/** A control that takes a message the way HTML's own do. */\ninterface Validates {\n setCustomValidity(message: string): void;\n reportValidity(): boolean;\n}\n\nfunction validates(el: Element): el is Element & Validates {\n const v = el as Partial<Validates>;\n return (\n typeof v.setCustomValidity === \"function\" &&\n typeof v.reportValidity === \"function\"\n );\n}\n\n/** Take a refusal off show: its messages, and the stamp on its origin. */\nfunction withdraw(refused: Shown): void {\n for (const el of refused.marked) (el as Element & Validates).setCustomValidity(\"\");\n refused.origin?.removeAttribute(ATTR_REQUEST_REFUSED);\n shown.splice(shown.indexOf(refused), 1);\n}\n\n/** Withdraw every refusal whose request gathered `el`, or what holds it. */\nfunction edited(target: Element): void {\n for (const refused of [...shown]) {\n if (refused.gathered.some((c) => c === target || c.contains(target))) {\n withdraw(refused);\n }\n }\n}\n\n/** The form each insert gathered from, until its round trip succeeds. */\nconst insertedFrom = new WeakMap<HubRequest, HTMLFormElement>();\n\n/**\n * Every form a button has pointed, with the live row it is pointed at: null\n * when it was started empty, for an insert.\n */\nconst pointed = new WeakMap<HTMLFormElement, Element | null>();\n\n/** The pointed form each request gathered from, until it succeeds. */\nconst savedFrom = new WeakMap<HubRequest, HTMLFormElement>();\n\n/**\n * The `lb-select` checkboxes showing for a query, under the hub an element\n * is in. One parked by `lb-show` is in template content, out of reach, so\n * only a selection the user can see counts.\n */\nfunction selectorsFor(el: Element, query: string): HTMLInputElement[] {\n const root = el.closest(HUB_TAG_NAME) ?? el.ownerDocument;\n return [...root.querySelectorAll<HTMLInputElement>(`[${ATTR_SELECT}]`)].filter(\n (box) => {\n const live = liveRowOf(box);\n return live !== null && queryOf(live)?.getAttribute(ATTR_QUERY) === query;\n },\n );\n}\n\n/** The keys of the rows a query's showing checkboxes select. */\nfunction selectedKeys(boxes: HTMLInputElement[]): string[] {\n return boxes\n .filter((box) => box.checked)\n .map((box) => liveRowOf(box)!.getAttribute(ATTR_KEY_VALUE)!);\n}\n\n/**\n * Complete a request from where its element sits. Every request passes\n * through here, whoever issued it; a field it already carries is its\n * issuer's to decide and is left as it is.\n *\n * False when the request cannot be issued, having said why, or when it is\n * an update or delete for a row not yet entered, which is not sent.\n */\nfunction complete(request: HubRequest | undefined, el: Element): boolean {\n if (!request?.name) {\n console.warn(`lb-hub: a request without a name, ignoring`, request);\n return false;\n }\n const { name } = request;\n if (name.startsWith(LB_RESERVED_PREFIX) && !isRowRequest(name)) {\n console.error(\n `lb-hub: '${name}' begins with '${LB_RESERVED_PREFIX}' but names no ` +\n `request Loadbare provides, ignoring`,\n );\n return false;\n }\n\n const group = groupFor(el);\n const { controls, values, rows, nestedControls, own } = gather(group);\n gatheredFrom.set(request, [...controls, ...nestedControls]);\n if (request.values === undefined && controls.length > 0) {\n request.values = values;\n }\n // A form's nested rows go with what it writes, and not with a delete. A\n // form of nested rows alone still writes, with no values of its own.\n if (\n request.rows === undefined &&\n Object.keys(rows).length > 0 &&\n name !== REQUEST_ROW_DELETE\n ) {\n request.rows = rows;\n request.values ??= {};\n }\n\n // The request is for the nearest `lb-query` of what it gathered, or of the\n // element itself when it gathered nothing.\n const queries = new Set(controls.map(queryOf));\n if (queries.size > 1) {\n console.error(\n `lb-hub: '${name}' gathered controls of more than one query, not sent`,\n el,\n );\n return false;\n }\n // A form of nested rows alone is for its own query, and keyed by the row\n // landed on it or the row it is pointed at, if any.\n if (controls.length === 0 && nestedControls.length > 0 && own) {\n request.query ??= own.getAttribute(ATTR_QUERY)!;\n const key = own.getAttribute(ATTR_KEY_VALUE);\n if (key !== null) request.key ??= key;\n } else {\n const from = controls[0] ?? el;\n const query = controls.length > 0 ? [...queries][0]! : queryOf(el);\n if (query) {\n request.query ??= query.getAttribute(ATTR_QUERY)!;\n const key = keyFrom(from, query);\n if (key !== undefined) request.key ??= key;\n }\n }\n\n // A query the hub serves has one row, keyed by the path, so a request for\n // one from anywhere on the page is for that row.\n if (request.query === URL_QUERY || request.query === CHOICES_QUERY) {\n request.key ??= location.pathname;\n }\n\n if (name === REQUEST_ROW_INSERT && group?.form) {\n insertedFrom.set(request, group.form);\n }\n if (group?.form && pointed.has(group.form)) {\n savedFrom.set(request, group.form);\n }\n\n // A row not yet entered: its key is empty, from a `row` the server\n // answered with no key yet, or from a form New pointed. It has no key to\n // send, and nothing on record to update or delete, so those two are not\n // sent. That is the row's state, not a mistake, and nothing is reported.\n const unentered = request.key === \"\";\n if (unentered) {\n delete request.key;\n if (name === REQUEST_ROW_UPDATE || name === REQUEST_ROW_DELETE) {\n return false;\n }\n }\n\n // A request that names no one row acts on the rows the user selected,\n // when its query shows checkboxes to select them by. An insert adds a row\n // and selects nothing. With none ticked, an update or a delete has\n // nothing to act on, and is not sent, as for a row not yet entered.\n if (\n request.key === undefined &&\n request.keys === undefined &&\n request.query !== undefined &&\n !unentered &&\n name !== REQUEST_ROW_INSERT\n ) {\n const boxes = selectorsFor(el, request.query);\n if (boxes.length > 0) {\n request.keys = selectedKeys(boxes);\n if (\n request.keys.length === 0 &&\n (name === REQUEST_ROW_UPDATE || name === REQUEST_ROW_DELETE)\n ) {\n return false;\n }\n }\n }\n\n const needs = NEEDS[name];\n if (needs) {\n const missing = needs.filter(\n (field) =>\n (request[field] === undefined &&\n !(field === \"key\" && request.keys !== undefined)) ||\n (field === \"values\" &&\n Object.keys(request.values!).length === 0 &&\n request.rows === undefined),\n );\n if (missing.length > 0) {\n console.error(\n `lb-hub: '${name}' from <${el.localName}> has no ` +\n `${missing.join(\", \")}, not sent`,\n el,\n );\n return false;\n }\n }\n return true;\n}\n\n/**\n * Commit: dispatch the request an element names, for the hub to complete. A\n * commit on an element whose round trip is in flight is ignored.\n */\nfunction commit(el: Element): void {\n if (el.hasAttribute(ATTR_REQUEST_PENDING)) return;\n const detail: HubRequest = { name: el.getAttribute(ATTR_REQUEST)! };\n el.dispatchEvent(new CustomEvent(LB_EVENT_NAME, { bubbles: true, detail }));\n}\n\n/** A submit button with a form owner commits with its form, never on click. */\nfunction isSubmitButton(el: Element): boolean {\n const type = (el as HTMLInputElement).type as string;\n const submits =\n (el.localName === \"button\" && type === \"submit\") ||\n (el.localName === \"input\" && (type === \"submit\" || type === \"image\"));\n return submits && formOwnerOf(el) !== null;\n}\n\n/**\n * HTML's interactive content: elements a click already means something to.\n * HTML forbids nesting them inside `<a>` or `<button>` so a click means one\n * thing, and the hub draws the same line.\n */\nconst INTERACTIVE = [\n \"a[href]\",\n \"button\",\n \"input:not([type=hidden])\",\n \"select\",\n \"textarea\",\n \"label\",\n \"details\",\n \"iframe\",\n \"embed\",\n \"audio[controls]\",\n \"video[controls]\",\n \"img[usemap]\",\n].join(\", \");\n\n/**\n * Whether a click on `target` is the click of `el`, the element carrying\n * `lb-request` above it: no interactive content lies between them. A click on\n * a control, link or button inside `el` belongs to that element.\n */\nfunction clicks(target: Element, el: Element): boolean {\n for (let node: Element | null = target; node && node !== el;) {\n if (node.matches(INTERACTIVE) || isFormAssociated(node)) return false;\n node = node.parentElement;\n }\n return true;\n}\n\n/** The page file's title, or its stub when it has none. */\nfunction titleOf(template: HTMLTemplateElement | null, page: string): string {\n return template?.getAttribute(ATTR_PAGE_TITLE) || page;\n}\n\n/**\n * The `<template>` a page ships in. The builder guarantees one per stub\n * (build/locations.ts refuses two page files sharing one), so a second match\n * here means the document was assembled by something else.\n */\nfunction pageHostFor(page: string): HTMLTemplateElement | null {\n const hosts: HTMLTemplateElement[] = [];\n for (const el of document.querySelectorAll(`template[${ATTR_PAGE}]`)) {\n if (el.getAttribute(ATTR_PAGE) === page) {\n hosts.push(el as HTMLTemplateElement);\n }\n }\n if (hosts.length > 1) {\n console.error(\n `lb-hub: ${hosts.length} pages carry ${ATTR_PAGE}=\"${page}\", ` +\n `using the first`,\n );\n }\n return hosts[0] ?? null;\n}\n\n/**\n * One round trip against the client-side deadline. Throws on a non-ok\n * response, a network failure or a timeout, so a caller can tell a failed\n * request from an empty answer.\n *\n * The stub names the path below the endpoint and the query string the\n * browser is showing rides after it verbatim, so every round trip reaches\n * the server with the query parms in hand.\n */\nasync function fetchItems(\n page: string,\n request?: HubRequest,\n): Promise<HubResponse> {\n const path = page.split(\"/\").map(encodeURIComponent).join(\"/\");\n const url = `${LB_ENDPOINT}/${path}${location.search}`;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), LB_REQUEST_TIMEOUT_MS);\n try {\n // An empty body is how the hub asks for the page's queries.\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(request ?? {}),\n signal: controller.signal,\n });\n if (res.status === LB_REFUSAL_STATUS) {\n const body = (await res.json().catch(() => ({}))) as {\n refusal?: HubRefusal;\n };\n throw new RefusedError(body.refusal ?? {});\n }\n if (!res.ok) {\n throw new Error(`lb-hub: server responded ${res.status} for ${url}`);\n }\n return (await res.json()) as HubResponse;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** An element's round trip is in flight, or is not. */\nfunction pending(el: Element | undefined, on: boolean): void {\n if (!el) return;\n if (on) {\n el.removeAttribute(ATTR_REQUEST_ERROR);\n el.removeAttribute(ATTR_REQUEST_REFUSED);\n el.setAttribute(ATTR_REQUEST_PENDING, \"\");\n el.setAttribute(\"aria-busy\", \"true\");\n } else {\n el.removeAttribute(ATTR_REQUEST_PENDING);\n el.removeAttribute(\"aria-busy\");\n }\n}\n\n/**\n * Tell the element that committed how its request turned out: the custom\n * elements from it outward first, then any listener. Told after everything\n * the request brought back has landed, so each sees the page as the answer\n * left it, and `lb-request-pending` is already gone.\n */\nfunction done(\n origin: Element | undefined,\n request: HubRequest,\n landed: ResponseItem[] | Error,\n): void {\n const detail: HubRequestDone =\n landed instanceof RefusedError\n ? { request, items: [], error: landed, refusal: landed.refusal }\n : landed instanceof Error\n ? { request, items: [], error: landed }\n : { request, items: landed };\n if (!origin) return;\n requestDone(origin, detail);\n origin.dispatchEvent(\n new CustomEvent(LB_DONE_EVENT_NAME, { bubbles: true, detail }),\n );\n}\n\n/**\n * Focus the first element in `main` 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. Focus already in `main` is the user's,\n * and is left where it is.\n */\nfunction focusFirst(main: HTMLElement): void {\n if (main.contains(document.activeElement)) return;\n focusIn(main);\n}\n\n/**\n * Empty a form of whatever row it showed: every column it names lands as\n * null, so text and `lb-show` read as no row, and then the form resets, so\n * each control returns to its default.\n */\nfunction clear(form: HTMLFormElement): void {\n pointed.get(form)?.removeAttribute(ATTR_ROW_EDITING);\n applyRow(form, blankRow(form));\n form.reset();\n}\n\n/**\n * Point a form at a row: fill it from the row and key it by the row's key,\n * so gathering sends that key. With no row, the form starts empty and its\n * key is empty, for an insert. A form inside a `<dialog>` opens it.\n */\nfunction point(\n form: HTMLFormElement,\n row: Row | null,\n key: string,\n live: Element | null,\n): void {\n clear(form);\n if (row) applyRow(form, row);\n form.setAttribute(ATTR_KEY_VALUE, key);\n live?.setAttribute(ATTR_ROW_EDITING, \"\");\n pointed.set(form, live);\n const dialog = form.closest(\"dialog\");\n if (dialog && !dialog.open) dialog.showModal();\n focusIn(form);\n}\n\n/**\n * Let a pointed form go: empty it and drop its key. A form inside a\n * `<dialog>` closes it, and the dialog's `close` finds nothing left to do.\n */\nfunction release(form: HTMLFormElement): void {\n if (!pointed.has(form)) return;\n clear(form);\n form.removeAttribute(ATTR_KEY_VALUE);\n pointed.delete(form);\n const dialog = form.closest(\"dialog\");\n if (dialog?.open) dialog.close();\n}\n\n/**\n * The URL a round trip answers for: its path and its query string. An answer\n * that returns to another is not landed.\n */\nfunction here(): string {\n return location.pathname + location.search;\n}\n\n/** A plain primary click: no other button, no modifier, not yet handled. */\nfunction isPlainClick(e: MouseEvent): boolean {\n return (\n e.button === 0 &&\n !e.defaultPrevented &&\n !e.metaKey &&\n !e.ctrlKey &&\n !e.shiftKey &&\n !e.altKey\n );\n}\n\n/** The URL a row for `lb-url` leads to, by the rule the server follows. */\nfunction nextUrl(row: Row): { url: URL; moved: boolean } {\n const url = new URL(location.href);\n const next = nextLocation(pageNameFor(url.pathname), url.searchParams, row);\n const path = row[URL_COLUMN_PATH];\n if (typeof path === \"string\") url.pathname = path;\n url.search = next.parms.toString();\n return { url, moved: next.moved };\n}\n\n/**\n * The hub is a singleton outside <main>. It survives every page change,\n * so it needs no id to disambiguate it.\n */\nclass LbHub extends HTMLElement {\n private main!: HTMLElement;\n\n /**\n * The stub of the page in <main>. A page declares its own requests, so a\n * request says which page it came from, on the path below the endpoint.\n */\n private page = \"\";\n\n /**\n * Set when a page is entered, and cleared once its queries have landed\n * and focus has gone to its first control. A change of query parm on the\n * same page does not set it: the user is where they chose to be.\n */\n private entering = false;\n\n /**\n * What the hub has shown and not yet placed: the chrome when it starts,\n * and <main> each time it shows a page. Placed as the page's first answer\n * lands, so each custom element in it is filled before it is attached.\n */\n private unplaced: Element[] = [];\n\n connectedCallback() {\n this.main = this.querySelector(\"main\")!;\n\n // Completed in the capture phase, on the way down, so every ancestor\n // that sees the request on its way back up sees it whole. A request that\n // cannot be issued is stopped here, before anything sees it at all.\n this.addEventListener(\n LB_EVENT_NAME,\n (e: Event) => {\n const origin = e.target as Element;\n const request = (e as CustomEvent<HubRequest>).detail;\n if (!complete(request, origin)) e.stopPropagation();\n },\n { capture: true },\n );\n\n this.addEventListener(LB_EVENT_NAME, (e: Event) => {\n const request = (e as CustomEvent<HubRequest>).detail;\n // The element that issued the request, not e.currentTarget (the hub\n // itself, since the event bubbles).\n const origin = (e.target as Element | null) ?? undefined;\n if (request.query?.startsWith(LB_RESERVED_PREFIX)) {\n void this.answer(request, origin);\n return;\n }\n void this.send(request, origin);\n });\n\n // A form commits on submit. The submitter's own lb-request replaces the\n // form's, the way `formaction` replaces `action`.\n this.addEventListener(\"submit\", (e: SubmitEvent) => {\n const form = e.target as Element | null;\n if (!form) return;\n const submitter = e.submitter;\n const el = submitter?.hasAttribute(ATTR_REQUEST)\n ? submitter\n : form.hasAttribute(ATTR_REQUEST)\n ? form\n : null;\n if (!el) return;\n e.preventDefault();\n commit(el);\n });\n\n // A reset returns a form's controls to their defaults, so none of them\n // shows what landed any longer. The browser resets the controls; the\n // hub drops its own stamp from the same controls a submit gathers, and\n // any refusal they were answering.\n this.addEventListener(\"reset\", (e: Event) => {\n if (e.defaultPrevented) return;\n for (const el of controlsOf(e.target as HTMLFormElement)) {\n el.removeAttribute(ATTR_COLUMN_VALUE);\n edited(el);\n }\n });\n\n // An edit to anything a refused request gathered withdraws the refusal.\n // Heard on the way down, so a control's own request on change goes out\n // with its message already gone.\n for (const type of [\"input\", \"change\"]) {\n this.addEventListener(\n type,\n (e: Event) => {\n if (shown.length > 0) edited(e.target as Element);\n },\n { capture: true },\n );\n }\n\n // A selector selects its row, and is no column.\n this.addEventListener(\"change\", (e: Event) => {\n const box = e.target as Element | null;\n if (box?.hasAttribute(ATTR_SELECT)) {\n select(box, (box as HTMLInputElement).checked);\n }\n });\n\n // A control commits on change.\n this.addEventListener(\"change\", (e: Event) => {\n const el = e.target as Element | null;\n if (!el || !el.hasAttribute(ATTR_REQUEST) || !isControl(el)) return;\n commit(el);\n });\n\n // Anything else commits on click. A form commits on submit, a control on\n // change, and a submit button with its form. A click on interactive\n // content inside the element is that content's own.\n this.addEventListener(\"click\", (e: MouseEvent) => {\n const target = e.target as Element | null;\n const el = target?.closest(`[${ATTR_REQUEST}]`);\n if (!target || !el || !this.contains(el)) return;\n if (el.localName === \"form\" || isControl(el) || isSubmitButton(el)) {\n return;\n }\n if (!clicks(target, el)) return;\n e.preventDefault();\n commit(el);\n });\n\n // A link that opted in. Everything else is a real link, and so is a\n // click that opens a new tab or window. The link's URL is a row for\n // lb-url: its path, its query parms, and every other parm emptied. A\n // link pushes a history entry, as a link does.\n this.addEventListener(\"click\", (e: MouseEvent) => {\n const link = (e.target as Element | null)?.closest(`a[${ATTR_URL_LINK}]`);\n if (!link || !isPlainClick(e)) return;\n e.preventDefault();\n const href = new URL((link as HTMLAnchorElement).href);\n const row: Row = {};\n for (const name of new URLSearchParams(location.search).keys()) {\n row[name] = \"\";\n }\n for (const [name, value] of href.searchParams) row[name] = value;\n row[URL_COLUMN_PATH] = href.pathname;\n this.moveTo(row, true);\n void this.navigate();\n });\n\n // A button points a form with HTML's own commandfor and command, or asks\n // a list to sort. The command event goes to the element it names and\n // does not bubble, so it is heard on the way down.\n this.addEventListener(\n \"command\",\n (e: Event) => {\n const { command, source } = e as Event & {\n command?: string;\n source?: Element | null;\n };\n if (!command?.startsWith(LB_COMMAND_PREFIX)) return;\n if (command === COMMAND_SORT) {\n this.sort(e.target as Element);\n return;\n }\n const form = e.target as Element;\n if (form.localName !== \"form\" || !form.hasAttribute(ATTR_QUERY)) {\n console.error(\n `lb-hub: '${command}' is for a <form> carrying ${ATTR_QUERY}, ` +\n `not <${form.localName}>, ignoring`,\n form,\n );\n return;\n }\n this.command(command, form as HTMLFormElement, source ?? null);\n },\n { capture: true },\n );\n\n // A dialog closes however HTML closes it — Escape, a close command,\n // `method=\"dialog\"` — and a form pointed inside it lets go.\n this.addEventListener(\n \"close\",\n (e: Event) => {\n const dialog = e.target as Element;\n if (dialog.localName !== \"dialog\") return;\n for (const form of dialog.querySelectorAll(\"form\")) release(form);\n },\n { capture: true },\n );\n\n addEventListener(\"popstate\", () => void this.navigate());\n\n upgradeAbsent(this, document);\n this.unplaced = [...this.children];\n\n void this.navigate();\n }\n\n /**\n * A command for a form. Edit fills the form from the row the button sits\n * in, as the hub holds it: no round trip, since the user can only edit a\n * row they can see.\n */\n private command(\n command: string,\n form: HTMLFormElement,\n source: Element | null,\n ): void {\n const query = form.getAttribute(ATTR_QUERY)!;\n switch (command) {\n case COMMAND_EDIT: {\n const live = source ? liveRowOf(source) : null;\n if (!live || queryOf(live)?.getAttribute(ATTR_QUERY) !== query) {\n console.error(\n `lb-hub: '${command}' comes from no row of '${query}', ignoring`,\n source,\n );\n return;\n }\n const key = live.getAttribute(ATTR_KEY_VALUE)!;\n const item = keptAnswer(this, query);\n const row = item?.rows?.find((r) => String(r[item.key]) === key);\n if (!row) {\n console.error(\n `lb-hub: the hub holds no row of '${query}' keyed '${key}', ` +\n `ignoring`,\n );\n return;\n }\n point(form, row, key, live);\n return;\n }\n case COMMAND_NEW:\n point(form, null, \"\", null);\n return;\n case COMMAND_RELEASE:\n release(form);\n return;\n default:\n console.error(\n `lb-hub: '${command}' begins with '${LB_COMMAND_PREFIX}' but ` +\n `names no command Loadbare provides, ignoring`,\n );\n }\n }\n\n /**\n * Place a list's rows by the order again, from the rows the hub holds: no\n * round trip, since the user asks only to see what they already have in\n * order.\n */\n private sort(el: Element): void {\n if (!el.hasAttribute(ATTR_QUERY)) {\n console.error(\n `lb-hub: '${COMMAND_SORT}' is for an element carrying ` +\n `${ATTR_QUERY}, not <${el.localName}>, ignoring`,\n el,\n );\n return;\n }\n if (!resort(this, el)) {\n console.error(\n `lb-hub: '${COMMAND_SORT}' is for an element showing rows the hub ` +\n `holds, ignoring`,\n el,\n );\n }\n }\n\n /**\n * Send a request to the server and land its answer. An answer naming\n * `lb-url` moves the URL first; the server has already loaded the page\n * there, in the same round trip.\n */\n private async send(request: HubRequest, origin?: Element): Promise<void> {\n // Sending again answers the last refusal from here, whatever it said.\n for (const refused of shown.filter((r) => r.origin === origin)) {\n withdraw(refused);\n }\n const at = here();\n // A form pointed at a live row finishes an edit begun in that row, so\n // its request is sent from inside the row's list. The row is the one it\n // was pointed at when sent.\n const saving = savedFrom.get(request);\n const within = (saving && pointed.get(saving)) || origin;\n const items = await this.roundTrip(this.page, request, origin);\n if (items instanceof RefusedError) this.refused(request, items, origin);\n if (items instanceof Error) return done(origin, request, items);\n let landed: ResponseItem[] = [];\n // The server answered for the URL the request was sent from. A user who\n // moved while it was in flight, to another page or to other parms, is\n // looking at something it says nothing about, and on a URL that is not\n // the server's to change. The write still happened.\n if (here() === at) {\n const url = items.find((item) => item.query === URL_QUERY);\n const load = items.filter((item) => item !== url);\n landed = load;\n if (url === undefined) {\n applyResponse(this, load, { requested: true, origin: within });\n }\n else landed = await this.follow(url, load, origin);\n }\n // The selected rows have been acted on, and the selection is done.\n if (request.keys !== undefined && request.query !== undefined) {\n for (const box of selectorsFor(this, request.query)) select(box, false);\n }\n // A pointed form has done what it was pointed for, and lets go.\n if (saving) release(saving);\n else insertedFrom.get(request)?.reset();\n done(origin, request, landed);\n }\n\n /**\n * Show a refusal. The message for the request as a whole is stamped on the\n * element that committed, for a stylesheet to show. Each column's message\n * goes on the control the request gathered it from, as HTML's own\n * validity, and the first is reported: the browser shows its message\n * there and moves focus to it.\n */\n private refused(\n request: HubRequest,\n { refusal }: RefusedError,\n origin: Element | undefined,\n ): void {\n const gathered = gatheredFrom.get(request) ?? [];\n const marked: Element[] = [];\n for (const [column, message] of Object.entries(refusal.columns ?? {})) {\n const control = gathered.find(\n (c) => c.getAttribute(ATTR_COLUMN) === column,\n );\n if (!control || !validates(control)) {\n console.warn(\n `lb-hub: '${request.name}' was refused for '${column}', but ` +\n `gathered no control there that takes a message`,\n );\n continue;\n }\n control.setCustomValidity(message);\n marked.push(control);\n }\n origin?.setAttribute(ATTR_REQUEST_REFUSED, refusal.message ?? \"\");\n shown.push({ gathered, marked, origin });\n (marked[0] as (Element & Validates) | undefined)?.reportValidity();\n }\n\n /**\n * One round trip for a page: a request, or with none a page load. The\n * element that issued it carries `lb-request-pending` while it is in\n * flight, and `lb-request-error` when it fails. The error on failure.\n */\n private async roundTrip(\n page: string,\n request: HubRequest | undefined,\n origin: Element | undefined,\n ): Promise<HubResponse | Error> {\n pending(origin, true);\n try {\n return await fetchItems(page, request);\n } catch (err) {\n // A refusal is the handler's answer, not a failure: the request's\n // sender shows it, and nothing is reported.\n if (err instanceof RefusedError) return err;\n console.error(`lb-hub: request failed for '${page}'`, err);\n origin?.setAttribute(ATTR_REQUEST_ERROR, \"\");\n return err instanceof Error ? err : new Error(String(err));\n } finally {\n pending(origin, false);\n }\n }\n\n /**\n * Answer a request for a query the hub serves, with no round trip. The\n * hub serves `lb-url` and `lb-choices`, and updates them.\n */\n private async answer(request: HubRequest, origin?: Element): Promise<void> {\n if (request.query === CHOICES_QUERY && request.name === REQUEST_ROW_UPDATE) {\n return done(origin, request, [this.choose(request.values ?? {})]);\n }\n if (request.query !== URL_QUERY || request.name !== REQUEST_ROW_UPDATE) {\n const message =\n `lb-hub: '${request.name}' for '${request.query}' is not a request ` +\n `the hub answers, ignoring`;\n console.error(message);\n return done(origin, request, new Error(message));\n }\n const pushed = origin?.hasAttribute(ATTR_URL_PUSH) ?? false;\n if (!this.moveTo(request.values ?? {}, pushed)) {\n return done(origin, request, []);\n }\n done(origin, request, await this.navigate(origin));\n }\n\n /**\n * The user made choices: they join the ones already made, and the rows\n * that read them are placed again from what the hub holds. The server is\n * told, for a page that keeps them, and its answer lands like any other.\n * What landed: the row of `lb-choices`.\n */\n private choose(values: Record<string, string>): ResponseItem {\n const row: Row = {\n ...keptAnswer(this, CHOICES_QUERY)?.row,\n ...values,\n [URL_COLUMN_PATH]: location.pathname,\n };\n const item: ResponseItem = {\n query: CHOICES_QUERY,\n kind: KIND_ROW,\n key: URL_COLUMN_PATH,\n row,\n };\n applyResponse(this, [item]);\n void this.tell(row);\n return item;\n }\n\n /**\n * Send the server the user's choices, by `lb-row-update` for\n * `lb-choices`, which runs the page's `onChoices`. No element waits on\n * it, so none is pending, and a choice made while it is in flight is sent\n * in turn.\n */\n private async tell(row: Row): Promise<void> {\n const { [URL_COLUMN_PATH]: _, ...choices } = row;\n const values: Record<string, string> = {};\n for (const [column, value] of Object.entries(choices)) {\n values[column] = value === null || value === undefined ? \"\" : String(value);\n }\n const at = here();\n const items = await this.roundTrip(\n this.page,\n {\n name: REQUEST_ROW_UPDATE,\n query: CHOICES_QUERY,\n key: location.pathname,\n values,\n },\n undefined,\n );\n if (items instanceof Error || here() !== at) return;\n if (items.length > 0) applyResponse(this, items, { requested: true });\n }\n\n /**\n * Write a row for `lb-url` into the URL. A new page pushes a history\n * entry, and so does `push`; a change of query parms replaces the entry.\n * False when the URL is already the row's.\n */\n private moveTo(row: Row, push: boolean): boolean {\n const { url, moved } = nextUrl(row);\n if (url.href === location.href) return false;\n if (moved || push) history.pushState(null, \"\", url);\n else history.replaceState(null, \"\", url);\n return true;\n }\n\n /**\n * A server answer named `lb-url`: write the URL, then land the page the\n * server loaded there. A load that did not come back is asked for again,\n * without marking the element that issued the request: its write\n * succeeded, and an error would invite sending it twice.\n *\n * What landed: the `lb-url` item and the load, however it arrived. A load\n * asked for again that fails is not the request's failure.\n */\n private async follow(\n item: ResponseItem,\n load: ResponseItem[],\n origin?: Element,\n ): Promise<ResponseItem[]> {\n this.moveTo(item.row ?? {}, origin?.hasAttribute(ATTR_URL_PUSH) ?? false);\n if (load.length === 0) {\n const again = await this.navigate();\n return again instanceof Error ? [item] : [item, ...again];\n }\n const template = this.arrive();\n this.place();\n if (template) applyResponse(this, load);\n else attachPlaced();\n this.entered();\n return template ? [item, ...load] : [item];\n }\n\n /**\n * Load the page at the URL the browser is showing. Every way of arriving\n * comes through here — a cold load, a link, Back, a new query parm — so\n * each is the same page load and a URL always shows the same thing.\n *\n * Entering a page is the one operation that replaces what <main> holds.\n * Staying on it, with only the query parms changed, keeps what it has: the\n * queries re-run and land by key, so rows that come back keep their place.\n *\n * `origin` is the element whose request changed the URL, if one did, and\n * carries the round trip's pending and error state.\n *\n * What landed, or the error when the round trip failed. A load that\n * returns after the URL has moved again lands nothing: the load for where\n * the browser is now is already on its way, and may be here.\n */\n private async navigate(origin?: Element): Promise<ResponseItem[] | Error> {\n const template = this.arrive();\n if (!template) {\n this.place();\n attachPlaced();\n return [];\n }\n const at = here();\n const items = await this.roundTrip(this.page, undefined, origin);\n if (here() !== at) return items instanceof Error ? items : [];\n if (items instanceof Error) {\n this.place();\n attachPlaced();\n this.entered();\n return items;\n }\n // Entering the page moved the URL, as an application restoring what the\n // user last had on screen does: the server loaded the page there.\n const url = items.find((item) => item.query === URL_QUERY);\n if (url) {\n return this.follow(\n url,\n items.filter((item) => item !== url),\n origin,\n );\n }\n this.place();\n applyResponse(this, items);\n this.entered();\n return items;\n }\n\n /**\n * Place what the hub has shown since it last placed anything, for the\n * landing that follows to attach.\n */\n private place(): void {\n for (const root of this.unplaced) placed(root);\n this.unplaced = [];\n }\n\n /**\n * A page that was entered has landed its queries, so its first control\n * exists: a row cloned, a branch shown, a picker's options in place.\n */\n private entered(): void {\n if (!this.entering) return;\n this.entering = false;\n focusFirst(this.main);\n }\n\n /**\n * Show the page the path names, and land `lb-url`. Null when no page's\n * stub matches the path.\n */\n private arrive(): HTMLTemplateElement | null {\n const page = pageNameFor(location.pathname);\n const template = pageHostFor(page);\n if (template && page !== this.page) {\n this.page = page;\n // The template is already in the document, so the page's markup goes\n // in before its data arrives rather than leaving <main> empty. What\n // the last page's queries answered goes with it.\n const last = [...this.main.childNodes];\n this.main.replaceChildren(template.content.cloneNode(true));\n detachRemoved(last);\n upgradeAbsent(this.main, document);\n if (!this.unplaced.includes(this.main)) this.unplaced.push(this.main);\n forget(this);\n this.entering = true;\n this.landChoices();\n }\n this.landUrl(template ? titleOf(template, page) : null);\n // An app that ships `<body hidden>` (docs/reference/chrome.md) stays\n // invisible until there is something coherent to show.\n document.body.hidden = false;\n if (!template) {\n console.error(`lb-hub: no page for '${page}'`);\n const dialog = this.querySelector(`dialog[${ATTR_URL_UNKNOWN}]`);\n if (dialog && !(dialog as HTMLDialogElement).open) {\n (dialog as HTMLDialogElement).showModal();\n }\n }\n return template;\n }\n\n /**\n * The user's choices as a page begins: none made, so every column an\n * element under `lb-query=\"lb-choices\"` shows lands empty. Choices hold\n * until the page changes, unless the server restores them.\n */\n private landChoices(): void {\n const row: Row = {};\n for (const scope of this.querySelectorAll(\n `[${ATTR_QUERY}=\"${CHOICES_QUERY}\"]`,\n )) {\n for (const el of within(scope, `[${ATTR_COLUMN}]`)) {\n if (el !== scope) row[el.getAttribute(ATTR_COLUMN)!] = \"\";\n }\n }\n row[URL_COLUMN_PATH] = location.pathname;\n applyResponse(this, [\n { query: CHOICES_QUERY, kind: KIND_ROW, key: URL_COLUMN_PATH, row },\n ]);\n }\n\n /**\n * The hub's own query: one row, keyed by the path, whose other columns are\n * the query parms.\n *\n * The one exception to landing. A row sets the columns it names and\n * leaves the rest as they were, and a URL names only the parms it carries.\n * So the row also names, as empty, every column an element under\n * `lb-query=\"lb-url\"` shows: a control then shows what the address bar\n * says after Back as well as after a reload, and never a parm the URL has\n * dropped.\n */\n private landUrl(label: string | null): void {\n if (label !== null) document.title = label;\n const scopes = this.querySelectorAll(`[${ATTR_QUERY}=\"${URL_QUERY}\"]`);\n if (scopes.length === 0) return;\n const row: Row = {};\n for (const scope of scopes) {\n for (const el of within(scope, `[${ATTR_COLUMN}]`)) {\n if (el === scope) continue;\n row[el.getAttribute(ATTR_COLUMN)!] = \"\";\n }\n }\n for (const [name, value] of new URLSearchParams(location.search)) {\n row[name] = value;\n }\n row[URL_COLUMN_PATH] = location.pathname;\n row[URL_COLUMN_PAGE_LABEL] = label;\n row[URL_COLUMN_PAGE_UNKNOWN] = label === null;\n applyResponse(\n this,\n [{ query: URL_QUERY, kind: KIND_ROW, key: URL_COLUMN_PATH, row }],\n );\n }\n}\n\ncustomElements.define(HUB_TAG_NAME, LbHub);\n"]}
@@ -312,9 +312,12 @@ puts it somewhere else, so all rows landing again unchanged move nothing.
312
312
  A landing that answers a request sent from inside a list moves none of that
313
313
  list's rows. The request is from inside the list when the list is the
314
314
  nearest element carrying `lb-query` around the element that sent it: a
315
- control in a live row, or a ghost row. A form elsewhere on the page is not
316
- inside the list. A user who changes a value sees the value change, and the
317
- row stays where they were working:
315
+ control in a live row, or a ghost row. A form that
316
+ [`--lb-edit`](#editing-a-row-in-one-form) pointed at a live row finishes an
317
+ edit begun in that row, so its request is from inside the row's list,
318
+ wherever the form sits. Any other form elsewhere on the page is not inside
319
+ the list. A user who changes a value sees the value change, and the row
320
+ stays where they were working:
318
321
 
319
322
  | The answer | The row |
320
323
  |------------------------------------------|---------------------------------------------------|
@@ -1033,6 +1036,12 @@ An `lb-show` in the form reads from the row it was pointed at. With no row,
1033
1036
  every column is null, so `lb-show="!id"` shows only while entering a new
1034
1037
  row.
1035
1038
 
1039
+ A request from a form Edit pointed is sent from inside the row's list, so
1040
+ the row stays where the user was working, even when the filter would now
1041
+ hide it or the order would move it; see
1042
+ [Rows the user is working in](#rows-the-user-is-working-in). A form New
1043
+ pointed is not inside any list, and its rows are placed by the order.
1044
+
1036
1045
  A successful request from the form lets it go, as Cancel does: the form
1037
1046
  empties, its controls return to their defaults, and the stamps go. A failed
1038
1047
  one leaves the form as the user had it, to correct.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@loadbare/app",
3
3
  "description": "High performance web app framework for server-bound applications",
4
- "version": "0.20.0",
4
+ "version": "0.21.0",
5
5
  "type": "module",
6
6
  "files": [
7
7
  "dist",
@@ -191,8 +191,8 @@ row is filled from the nested query's last answer, whatever order they land
191
191
  in.
192
192
 
193
193
  **A `rows` query declares its order, and the hub places every row by it.**
194
- An edit sent from inside a list leaves that list's rows where they stand,
195
- stamped `lb-row-unsorted` where out of order, until the page loads, the
194
+ An edit sent from inside a list, or from a form `--lb-edit` pointed at one
195
+ of its rows, leaves that list's rows where they stand, stamped `lb-row-unsorted` where out of order, until the page loads, the
196
196
  user's order or filter changes, or a button with `commandfor` naming the
197
197
  list sends `command="--lb-sort"`, which places them with no round trip;
198
198
  show it by `[lb-query-unsorted-count]`. Never refresh to make rows hold
@@ -312,9 +312,12 @@ puts it somewhere else, so all rows landing again unchanged move nothing.
312
312
  A landing that answers a request sent from inside a list moves none of that
313
313
  list's rows. The request is from inside the list when the list is the
314
314
  nearest element carrying `lb-query` around the element that sent it: a
315
- control in a live row, or a ghost row. A form elsewhere on the page is not
316
- inside the list. A user who changes a value sees the value change, and the
317
- row stays where they were working:
315
+ control in a live row, or a ghost row. A form that
316
+ [`--lb-edit`](#editing-a-row-in-one-form) pointed at a live row finishes an
317
+ edit begun in that row, so its request is from inside the row's list,
318
+ wherever the form sits. Any other form elsewhere on the page is not inside
319
+ the list. A user who changes a value sees the value change, and the row
320
+ stays where they were working:
318
321
 
319
322
  | The answer | The row |
320
323
  |------------------------------------------|---------------------------------------------------|
@@ -1033,6 +1036,12 @@ An `lb-show` in the form reads from the row it was pointed at. With no row,
1033
1036
  every column is null, so `lb-show="!id"` shows only while entering a new
1034
1037
  row.
1035
1038
 
1039
+ A request from a form Edit pointed is sent from inside the row's list, so
1040
+ the row stays where the user was working, even when the filter would now
1041
+ hide it or the order would move it; see
1042
+ [Rows the user is working in](#rows-the-user-is-working-in). A form New
1043
+ pointed is not inside any list, and its rows are placed by the order.
1044
+
1036
1045
  A successful request from the form lets it go, as Cancel does: the form
1037
1046
  empties, its controls return to their defaults, and the stamps go. A failed
1038
1047
  one leaves the form as the user had it, to correct.