@conduction/nextcloud-vue 2.145.0 → 2.147.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.
Files changed (79) hide show
  1. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue2.js.map +1 -1
  2. package/dist/esm/components/CnAiCompanion/CnAiChatPanel.vue3.js.map +1 -1
  3. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue.js +1 -1
  4. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue2.js.map +1 -1
  5. package/dist/esm/components/CnChecklistRunWidget/CnChecklistRunWidget.vue3.js.map +1 -1
  6. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +12 -2
  7. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  8. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +42 -30
  9. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  10. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +22 -0
  11. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  12. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +2 -1
  13. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  14. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue.js +1 -1
  15. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -1
  16. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -1
  17. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
  18. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +112 -15
  19. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  20. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +40 -16
  21. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  22. package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
  23. package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
  24. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js +1 -0
  25. package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
  26. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue.js +1 -1
  27. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js +21 -2
  28. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js.map +1 -1
  29. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue3.js.map +1 -1
  30. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue.js +1 -1
  31. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue2.js +2 -2
  32. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue2.js.map +1 -1
  33. package/dist/esm/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue3.js.map +1 -1
  34. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  35. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  36. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  37. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue.js +1 -1
  38. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue2.js.map +1 -1
  39. package/dist/esm/components/CnRetentionWidget/CnRetentionWidget.vue3.js.map +1 -1
  40. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  41. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  42. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  43. package/dist/esm/library-style.js +1 -1
  44. package/dist/esm/nextcloud-vue.css +634 -301
  45. package/dist/esm/utils/detailObjectContext.js +7 -2
  46. package/dist/esm/utils/detailObjectContext.js.map +1 -1
  47. package/dist/esm/utils/objectParties.js +30 -1
  48. package/dist/esm/utils/objectParties.js.map +1 -1
  49. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  50. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  51. package/dist/esm/utils/visibleWhen.js +6 -0
  52. package/dist/esm/utils/visibleWhen.js.map +1 -1
  53. package/dist/nextcloud-vue.cjs.js +362 -138
  54. package/dist/nextcloud-vue.cjs.js.map +2 -2
  55. package/dist/nextcloud-vue.css +634 -301
  56. package/package.json +1 -1
  57. package/src/components/CnAiCompanion/CnAiChatPanel.vue +3 -0
  58. package/src/components/CnChecklistRunWidget/CnChecklistRunWidget.vue +4 -2
  59. package/src/components/CnDataTable/CnDataTable.vue +19 -2
  60. package/src/components/CnDetailPage/CnDetailPage.md +1 -0
  61. package/src/components/CnDetailPage/CnDetailPage.vue +23 -0
  62. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +1 -0
  63. package/src/components/CnFactsWidget/CnFactsWidget.vue +168 -16
  64. package/src/components/CnNotesCard/CnNotesCard.vue +7 -2
  65. package/src/components/CnNotificationMatrix/CnNotificationMatrix.vue +21 -2
  66. package/src/components/CnObjectPartiesWidget/CnObjectPartiesWidget.vue +2 -1
  67. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +1 -0
  68. package/src/components/CnRetentionWidget/CnRetentionWidget.vue +2 -0
  69. package/src/components/CnTabsWidget/CnTabsWidget.vue +6 -1
  70. package/src/css/dialog.css +7 -0
  71. package/src/css/look-board-detail.css +152 -8
  72. package/src/css/look-board-index.css +78 -0
  73. package/src/css/look-board.css +33 -3
  74. package/src/css/table.css +9 -0
  75. package/src/schemas/app-manifest-v2.schema.json +2 -2
  76. package/src/utils/detailObjectContext.js +7 -2
  77. package/src/utils/objectParties.js +29 -0
  78. package/src/utils/validateManifestV2.compiled.js +2 -2
  79. package/src/utils/visibleWhen.js +6 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CnDataTable.vue2.js","sources":["../../../../src/components/CnDataTable/CnDataTable.vue"],"sourcesContent":["<template>\n\t<div\n\t\tclass=\"cn-table-container\"\n\t\tdata-testid=\"cn-object-list\"\n\t\t:class=\"{\n\t\t\t'cn-table-container--board': isBoardLook,\n\t\t\t'cn-table-container--title-plain': isBoardLook && rowTitle === 'plain',\n\t\t\t'cn-table-container--title-text': isBoardLook && rowTitle === 'text',\n\t\t\t'cn-table-container--title-strong': isBoardLook && rowTitle === 'strong',\n\t\t\t'cn-table-container--scrollable': scrollable,\n\t\t\t'cn-table-container--borderless': borderless,\n\t\t\t'cn-table-container--fill': fillHeight,\n\t\t}\">\n\t\t<!-- Optional card header (folded from the retired CnTableWidget): a title\n\t\t + total-count badge. Only rendered when `title` is set; bare table\n\t\t usage is unchanged. -->\n\t\t<div v-if=\"title\" class=\"cn-data-table__header\">\n\t\t\t<h3 class=\"cn-data-table__title\">\n\t\t\t\t{{ title }}\n\t\t\t</h3>\n\t\t\t<span v-if=\"totalRowCount > 0\" class=\"cn-data-table__count\">\n\t\t\t\t{{ totalRowCount }}\n\t\t\t</span>\n\t\t</div>\n\n\t\t<!-- Active header filters, one removable chip each. -->\n\t\t<ul\n\t\t\tv-if=\"filterChips && !isLoading && activeColumnFilterChips.length > 0\"\n\t\t\tclass=\"cn-data-table__filter-chips\"\n\t\t\t:aria-label=\"activeFiltersLabel\"\n\t\t\tdata-testid=\"cn-table-filter-chips\">\n\t\t\t<li v-for=\"chip in activeColumnFilterChips\" :key=\"chip.key\" class=\"cn-data-table__filter-chip\">\n\t\t\t\t<span>{{ chip.text }}</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-data-table__filter-chip-remove\"\n\t\t\t\t\t:aria-label=\"chip.removeLabel\"\n\t\t\t\t\tdata-testid=\"cn-table-filter-chip-remove\"\n\t\t\t\t\t@click=\"clearColumnFilter(chip.col)\">\n\t\t\t\t\t×\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<CnColumnFilterPopover\n\t\t\tv-if=\"openFilterColumn\"\n\t\t\t:key=\"openFilterKey\"\n\t\t\t:def=\"filterDefFor(openFilterColumn)\"\n\t\t\t:state=\"columnFilterStateFor(openFilterColumn)\"\n\t\t\t:label=\"translateLabel(openFilterColumn.label)\"\n\t\t\t:anchorRect=\"filterAnchorRect\"\n\t\t\t:register=\"filterRegister\"\n\t\t\t@apply=\"(state) => applyColumnFilter(openFilterColumn, state)\"\n\t\t\t@close=\"closeColumnFilter\" />\n\n\t\t<!-- Loading State -->\n\t\t<div v-if=\"isLoading\" class=\"cn-table-loading\" data-testid=\"cn-object-list-loading\">\n\t\t\t<!-- Decorative: the adjacent <p> already carries the accessible\n\t\t\t name (loadingText), so the spinner is hidden from the\n\t\t\t accessibility tree rather than exposed as an unlabelled\n\t\t\t role=\"img\" (WCAG 1.1.1 / axe \"role-img-alt\"). -->\n\t\t\t<NcLoadingIcon :size=\"32\" aria-hidden=\"true\" />\n\t\t\t<p>{{ loadingText }}</p>\n\t\t</div>\n\n\t\t<!-- Table. The horizontal scroll lives on this wrapper, NOT on\n\t\t `.cn-table-container`: `overflow-x: auto` on the container coerces\n\t\t its `overflow-y` from `visible` to `auto` (CSS forbids mixing\n\t\t `visible` with a non-visible value), which silently made the\n\t\t container the nearest scrollport. The sticky footer then anchored\n\t\t to a container that never scrolls, so \"View all\" scrolled away with\n\t\t the rows instead of pinning to the bottom of the enclosing widget. -->\n\t\t<!-- The horizontal scrollport must be reachable by keyboard: a region\n\t\t that scrolls but cannot take focus gives a keyboard-only user no\n\t\t way to reach the columns past the fold (axe\n\t\t `scrollable-region-focusable`, serious; WCAG 2.1.1).\n\n\t\t Gated on ACTUAL overflow rather than applied unconditionally, for\n\t\t two reasons. A table that fits needs no scrolling, so a permanent\n\t\t tab stop would put every table in the fleet on the keyboard path\n\t\t for nothing. And the axe rule itself only applies to elements that\n\t\t really are scrollable, so the conditional attribute is present in\n\t\t exactly the cases the rule evaluates.\n\n\t\t `role=\"group\"`, NOT `role=\"region\"`: this element is nested inside\n\t\t `.cn-widget-wrapper__content[role=\"region\"]` on the dashboard-widget\n\t\t path, and a second landmark there would surface as a duplicate.\n\t\t `group` is nameable but is not a landmark. A name is required\n\t\t rather than optional — `aria-label` is PROHIBITED on a role-less\n\t\t generic element, so a bare `tabindex` div would trade this\n\t\t violation for `aria-prohibited-attr` plus an unlabelled mystery\n\t\t stop in the tab order. -->\n\t\t<div\n\t\t\tv-else\n\t\t\tref=\"scrollEl\"\n\t\t\tclass=\"cn-data-table__scroll\"\n\t\t\t:tabindex=\"isScrollable ? 0 : undefined\"\n\t\t\t:role=\"isScrollable ? 'group' : undefined\"\n\t\t\t:aria-label=\"isScrollable ? scrollRegionLabel : undefined\">\n\t\t\t<table\n\t\t\t\tclass=\"cn-data-table\"\n\t\t\t\t:class=\"{ 'cn-data-table--fixed': fixedLayout, 'cn-data-table--fit': fitWidth }\"\n\t\t\t\tdata-testid=\"cn-object-list-table\">\n\t\t\t\t<!-- Without a drawn header row the columns are still named for a\n\t\t\t\t screen reader: plain header cells, collapsed and visually\n\t\t\t\t hidden, with no controls to land on. -->\n\t\t\t\t<thead v-if=\"hideHeader\" class=\"cn-data-table__hidden-head\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th v-if=\"selectable\" scope=\"col\" />\n\t\t\t\t\t\t<th v-if=\"rowIcon\" scope=\"col\" />\n\t\t\t\t\t\t<th v-for=\"col in effectiveColumns\" :key=\"col.key\" scope=\"col\">\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ translateLabel(col.label) }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th v-if=\"$slots['row-actions']\" scope=\"col\">\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ actionsColumnLabel }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<thead v-else>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<!-- Checkbox column -->\n\t\t\t\t\t\t<th\n\t\t\t\t\t\t\tv-if=\"selectable\"\n\t\t\t\t\t\t\tclass=\"cn-table-col--checkbox\"\n\t\t\t\t\t\t\t:class=\"pinClass(0)\"\n\t\t\t\t\t\t\t:style=\"pinStyle(0)\">\n\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t:modelValue=\"allSelected\"\n\t\t\t\t\t\t\t\t:indeterminate=\"someSelected && !allSelected\"\n\t\t\t\t\t\t\t\t:aria-label=\"selectAllLabel\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"toggleSelectAll\" />\n\t\t\t\t\t\t</th>\n\n\t\t\t\t\t\t<!-- Leading icon column (header is intentionally blank) -->\n\t\t\t\t\t\t<th\n\t\t\t\t\t\t\tv-if=\"rowIcon\"\n\t\t\t\t\t\t\tclass=\"cn-table-col--icon\"\n\t\t\t\t\t\t\t:class=\"pinClass(selectable ? 1 : 0)\"\n\t\t\t\t\t\t\t:style=\"pinStyle(selectable ? 1 : 0)\" />\n\n\t\t\t\t\t\t<!-- Data columns -->\n\t\t\t\t\t\t<th\n\t\t\t\t\t\t\tv-for=\"(col, colIndex) in effectiveColumns\"\n\t\t\t\t\t\t\t:key=\"col.key\"\n\t\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t\tcol.sortable ? 'cn-table-header--sortable' : '',\n\t\t\t\t\t\t\t\tcol.class || '',\n\t\t\t\t\t\t\t\tpinClass(leadingCount + colIndex),\n\t\t\t\t\t\t\t\tisGrowColumn(col) ? 'cn-table-col--grow' : '',\n\t\t\t\t\t\t\t\tcolIndex === titleColumnIndex ? 'cn-table-head--title' : '',\n\t\t\t\t\t\t\t]\"\n\t\t\t\t\t\t\t:style=\"{ ...(col.width ? { width: col.width } : {}), ...pinStyle(leadingCount + colIndex) }\"\n\t\t\t\t\t\t\t:aria-sort=\"ariaSortFor(col)\"\n\t\t\t\t\t\t\t:data-filtered=\"isColumnFiltered(col) ? 'true' : null\"\n\t\t\t\t\t\t\t:title=\"translateLabel(col.description) || null\"\n\t\t\t\t\t\t\t@click=\"col.sortable ? onHeaderClick(col.key, $event) : null\"\n\t\t\t\t\t\t\t@keydown.enter=\"col.sortable ? onHeaderKeydown(col.key, $event) : null\">\n\t\t\t\t\t\t\t<!-- The sort control is a real button named by the column\n\t\t\t\t\t\t\t label; the header's `aria-sort` carries the state. Its\n\t\t\t\t\t\t\t click and Enter bubble to the header's own handlers, so\n\t\t\t\t\t\t\t a click anywhere in the header still sorts. -->\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tv-if=\"col.sortable\"\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-header__sort\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-table-header-sort\">\n\t\t\t\t\t\t\t\t<span :class=\"col.description ? 'cn-table-header--described' : ''\">{{ translateLabel(col.label) }}</span>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"sortKeyIndex(col.key) !== -1\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-header__chevron cn-table-sort-indicator\"\n\t\t\t\t\t\t\t\t\t:data-sort-direction=\"effectiveSortKeys[sortKeyIndex(col.key)].order === 'asc' ? 'asc' : 'desc'\">\n\t\t\t\t\t\t\t\t\t<ChevronUp v-if=\"effectiveSortKeys[sortKeyIndex(col.key)].order === 'asc'\" :size=\"14\" />\n\t\t\t\t\t\t\t\t\t<ChevronDown v-else :size=\"14\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-header__chevron cn-table-header__chevron--idle\">\n\t\t\t\t\t\t\t\t\t<ChevronDown :size=\"14\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"sortBadgeFor(col.key) !== null\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-sort-badge\">\n\t\t\t\t\t\t\t\t\t{{ sortBadgeFor(col.key) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<span v-else :class=\"col.description ? 'cn-table-header--described' : ''\">\n\t\t\t\t\t\t\t\t{{ translateLabel(col.label) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<!-- Header filter: a real button, so it is reachable with Tab\n\t\t\t\t\t\t\t and its click and Enter never also sort the column. -->\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tv-if=\"filterDefFor(col)\"\n\t\t\t\t\t\t\t\t:ref=\"'filterButton-' + col.key\"\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-header__filter\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-table-header__filter--active': isColumnFiltered(col) }\"\n\t\t\t\t\t\t\t\t:aria-label=\"filterButtonLabel(col)\"\n\t\t\t\t\t\t\t\taria-haspopup=\"dialog\"\n\t\t\t\t\t\t\t\t:aria-expanded=\"openFilterKey === col.key ? 'true' : 'false'\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-table-header-filter\"\n\t\t\t\t\t\t\t\t@click.stop=\"toggleColumnFilter(col, $event)\"\n\t\t\t\t\t\t\t\t@keydown.enter.stop>\n\t\t\t\t\t\t\t\t<FilterOutline :size=\"14\" />\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"isColumnFiltered(col)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-header__filter-dot\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-table-header-filter-dot\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</th>\n\n\t\t\t\t\t\t<!-- Actions column -->\n\t\t\t\t\t\t<th v-if=\"$slots['row-actions']\" class=\"cn-table-col--actions\">\n\t\t\t\t\t\t\t<!-- The board look names the column for assistive tech; the menu buttons below it are the only thing drawn. -->\n\t\t\t\t\t\t\t<span v-if=\"isBoardLook\" class=\"hidden-visually\">{{ actionsColumnLabel }}</span>\n\t\t\t\t\t\t\t<!-- @slot Header cell content above the row-actions column (blank by default). -->\n\t\t\t\t\t\t\t<slot name=\"actions-header\" />\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\n\t\t\t\t<tbody>\n\t\t\t\t\t<!-- Empty state -->\n\t\t\t\t\t<tr v-if=\"effectiveRows.length === 0\" class=\"cn-table-empty\" data-testid=\"cn-object-list-empty\">\n\t\t\t\t\t\t<td :colspan=\"totalColumns\">\n\t\t\t\t\t\t\t<!-- @slot Empty-state content shown when there are no rows (defaults to `emptyText`, or why an unavailable personal lens is empty). -->\n\t\t\t\t\t\t\t<slot name=\"empty\">\n\t\t\t\t\t\t\t\t<span v-if=\"lensReasonText\" class=\"cn-table-empty__lens-reason\" data-testid=\"cn-data-table-lens-reason\">{{ lensReasonText }}</span>\n\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t{{ translateLabel(emptyText) }}\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</slot>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\n\t\t\t\t\t<!-- Data rows -->\n\t\t\t\t\t<template\n\t\t\t\t\t\tv-for=\"(row, rowIndex) in effectiveRows\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:key=\"row[rowKey]\">\n\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t:draggable=\"reorderable ? 'true' : undefined\"\n\t\t\t\t\t\t\tclass=\"cn-table-row\"\n\t\t\t\t\t\t\tdata-testid=\"cn-object-row\"\n\t\t\t\t\t\t\t:data-testid-row-id=\"row[rowKey]\"\n\t\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t\tisSelected(row) ? 'cn-table-row--selected' : '',\n\t\t\t\t\t\t\t\trowLinks[String(row[rowKey])] ? 'cn-table-row--linked' : '',\n\t\t\t\t\t\t\t\tisUnreadRow(row) ? 'cn-table-row--unread' : '',\n\t\t\t\t\t\t\t\trowClass ? rowClass(row) : '',\n\t\t\t\t\t\t\t\treorderable ? 'cn-table-row--reorderable' : '',\n\t\t\t\t\t\t\t\tdragOverIndex === rowIndex ? 'cn-table-row--drop-target' : '',\n\t\t\t\t\t\t\t]\"\n\t\t\t\t\t\t\t@dragstart=\"onRowDragStart(rowIndex, $event)\"\n\t\t\t\t\t\t\t@dragover=\"onRowDragOver(rowIndex, $event)\"\n\t\t\t\t\t\t\t@dragleave=\"onRowDragLeave(rowIndex)\"\n\t\t\t\t\t\t\t@drop=\"onRowDrop(row, rowIndex, $event)\"\n\t\t\t\t\t\t\t@dragend=\"onRowDragEnd\"\n\t\t\t\t\t\t\t@mousedown=\"onRowMouseDown\"\n\t\t\t\t\t\t\t@click=\"onRowClick(row, $event)\"\n\t\t\t\t\t\t\t@auxclick=\"onRowAuxClick(row, $event)\"\n\t\t\t\t\t\t\t@contextmenu=\"onRowContextMenu(row, $event)\">\n\t\t\t\t\t\t\t<!-- Checkbox -->\n\t\t\t\t\t\t\t<td v-if=\"selectable\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-col--checkbox\"\n\t\t\t\t\t\t\t\t:class=\"pinClass(0)\"\n\t\t\t\t\t\t\t\t:style=\"pinStyle(0)\"\n\t\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t\t@auxclick.stop>\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\t:modelValue=\"isSelected(row)\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"selectRowLabel\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleSelect(row)\" />\n\t\t\t\t\t\t\t</td>\n\n\t\t\t\t\t\t\t<!-- Leading icon -->\n\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\tv-if=\"rowIcon\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-col--icon\"\n\t\t\t\t\t\t\t\t:class=\"[pinClass(selectable ? 1 : 0), 'cn-table-col--icon-' + iconTone]\"\n\t\t\t\t\t\t\t\t:style=\"pinStyle(selectable ? 1 : 0)\">\n\t\t\t\t\t\t\t\t<CnIcon :name=\"getRowIcon(row)\" :size=\"20\" />\n\t\t\t\t\t\t\t</td>\n\n\t\t\t\t\t\t\t<!-- Data cells -->\n\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\tv-for=\"(col, colIndex) in effectiveColumns\"\n\t\t\t\t\t\t\t\t:key=\"col.key\"\n\t\t\t\t\t\t\t\t:class=\"[col.class || '', col.cellClass || '', cellClass ? cellClass(row, col) : '', pinClass(leadingCount + colIndex), colIndex === titleColumnIndex ? 'cn-table-col--title' : '', isGrowColumn(col) ? 'cn-table-col--grow' : '']\"\n\t\t\t\t\t\t\t\t:style=\"{ ...(col.width ? { maxWidth: col.width } : {}), ...pinStyle(leadingCount + colIndex) }\"\n\t\t\t\t\t\t\t\t@mouseenter=\"titleWhenClipped\">\n\t\t\t\t\t\t\t\t<!-- A row with a `rowClickRoute` is a real link: this anchor\n\t\t\t\t\t\t\t\t is stretched over the whole row by CSS, so hovering shows\n\t\t\t\t\t\t\t\t the URL, a middle or ctrl click opens a new tab natively,\n\t\t\t\t\t\t\t\t and the row is reachable with Tab. The row's own click\n\t\t\t\t\t\t\t\t handlers treat it as a nested control and leave it be. -->\n\t\t\t\t\t\t\t\t<a v-if=\"colIndex === titleColumnIndex && rowLinks[String(row[rowKey])]\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-row__link\"\n\t\t\t\t\t\t\t\t\t:href=\"rowLinks[String(row[rowKey])].href\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"rowLinkLabel(row, col)\"\n\t\t\t\t\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-row-link\"\n\t\t\t\t\t\t\t\t\t@mousemove=\"linkTitleAtPointer\"\n\t\t\t\t\t\t\t\t\t@click=\"onRowLinkClick(row, $event)\" />\n\t\t\t\t\t\t\t\t<!-- The padlock rides the FIRST data cell, beside whatever\n\t\t\t\t\t\t\t\t names the row. Deliberately OUTSIDE the #column-<key>\n\t\t\t\t\t\t\t\t slot: a consumer overriding that column's rendering is\n\t\t\t\t\t\t\t\t customising their own data, not opting out of being told\n\t\t\t\t\t\t\t\t the record is locked. It renders nothing when unlocked,\n\t\t\t\t\t\t\t\t so an unlocked table is byte-for-byte what it was. -->\n\t\t\t\t\t\t\t\t<CnUnreadMarker\n\t\t\t\t\t\t\t\t\tv-if=\"colIndex === titleColumnIndex && isUnreadRow(row)\" />\n\t\t\t\t\t\t\t\t<CnLockIndicator\n\t\t\t\t\t\t\t\t\tv-if=\"colIndex === titleColumnIndex\"\n\t\t\t\t\t\t\t\t\t:object=\"row\"\n\t\t\t\t\t\t\t\t\t:size=\"16\" />\n\t\t\t\t\t\t\t\t<!-- Declared state indicators ride the first data cell\n\t\t\t\t\t\t\t\t beside the padlock. Each one renders as an icon WITH a\n\t\t\t\t\t\t\t\t text alternative and a tooltip, never as colour alone,\n\t\t\t\t\t\t\t\t and an indicator the page did not declare cannot appear\n\t\t\t\t\t\t\t\t however the record is shaped. Past the cap the rest move\n\t\t\t\t\t\t\t\t into the row menu, because a row of nine icons is not a\n\t\t\t\t\t\t\t\t row anyone can triage at a glance. -->\n\t\t\t\t\t\t\t\t<span v-if=\"colIndex === titleColumnIndex && indicatorsFor(row).shown.length > 0\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-row-indicators\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-row-indicators\">\n\t\t\t\t\t\t\t\t\t<span v-for=\"indicator in indicatorsFor(row).shown\"\n\t\t\t\t\t\t\t\t\t\t:key=\"indicator.id || indicator.field\"\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-table-row-indicator\"\n\t\t\t\t\t\t\t\t\t\t:title=\"translateLabel(indicator.tooltip || indicator.text)\"\n\t\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-row-indicator-${indicator.id || indicator.field}`\">\n\t\t\t\t\t\t\t\t\t\t<CnIcon :name=\"indicator.icon || 'InformationOutline'\" :size=\"16\" />\n\t\t\t\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ translateLabel(indicator.text) }}</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<!-- A muted line above the value, from `col.overline` or\n\t\t\t\t\t\t\t\t `col.overlineText` (\"Zaken van\" over the organisation). -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"overlineValue(row, col)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__overline\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-cell-overline\">{{ overlineValue(row, col) }}</span>\n\t\t\t\t\t\t\t\t<!-- @slot Per-column cell override (`#column-<key>`), scoped with { row, value }. Wins over CnCellRenderer. -->\n\t\t\t\t\t\t\t\t<slot :name=\"'column-' + col.key\" :row=\"row\" :value=\"cellValue(row, col)\">\n\t\t\t\t\t\t\t\t\t<!-- Every column renders through CnCellRenderer: it resolves\n\t\t\t\t\t\t\t\t col.formatter / col.widget against the injected registries\n\t\t\t\t\t\t\t\t (cnFormatters / cnCellWidgets), uses the schema property when\n\t\t\t\t\t\t\t\t one is available (else {}) for type-aware rendering, and\n\t\t\t\t\t\t\t\t falls back to formatValue(). Columns with `aggregate` get a\n\t\t\t\t\t\t\t\t count of related objects (see cellValue/loadAggregates). The\n\t\t\t\t\t\t\t\t #column-{key} slot still wins. -->\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tv-if=\"isTextZero(row, col)\"\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__zero\"\n\t\t\t\t\t\t\t\t\t\tdata-testid=\"cn-cell-zero\">{{ cellValue(row, col) }}</span>\n\t\t\t\t\t\t\t\t\t<CnCellRenderer\n\t\t\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t\t\t:value=\"cellValue(row, col)\"\n\t\t\t\t\t\t\t\t\t\t:property=\"columnProperty(col)\"\n\t\t\t\t\t\t\t\t\t\t:formatter=\"col.formatter || null\"\n\t\t\t\t\t\t\t\t\t\t:formatterOptions=\"col.formatterOptions || null\"\n\t\t\t\t\t\t\t\t\t\t:widget=\"col.widget || null\"\n\t\t\t\t\t\t\t\t\t\t:widgetProps=\"col.widgetProps || undefined\"\n\t\t\t\t\t\t\t\t\t\t:secondary=\"col.widget === 'avatar' ? secondaryValue(row, col) : ''\"\n\t\t\t\t\t\t\t\t\t\t:format=\"columnFormat(col)\"\n\t\t\t\t\t\t\t\t\t\t:row=\"row\"\n\t\t\t\t\t\t\t\t\t\t:rowKey=\"rowKey\" />\n\t\t\t\t\t\t\t\t</slot>\n\t\t\t\t\t\t\t\t<!-- Pills beside the value, from `col.pills`: each one whose\n\t\t\t\t\t\t\t\t condition holds on the row (\"Geheimhouding\", DqContacten). -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"cellPills(row, col).length > 0\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__pills\">\n\t\t\t\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t\t\t\tv-for=\"(pill, pillIndex) in cellPills(row, col)\"\n\t\t\t\t\t\t\t\t\t\t:key=\"pillIndex\"\n\t\t\t\t\t\t\t\t\t\t:label=\"pill.label\"\n\t\t\t\t\t\t\t\t\t\t:variant=\"pill.variant\"\n\t\t\t\t\t\t\t\t\t\tdata-testid=\"cn-cell-pill\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<!-- A second, muted line under the value, from `col.secondary`:\n\t\t\t\t\t\t\t\t a field key, a \"{field} · {other}\" template, or a function\n\t\t\t\t\t\t\t\t of the row. Lets one column read \"title\" over \"number ·\n\t\t\t\t\t\t\t\t requester\" without a custom cell. -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"col.widget !== 'avatar' && secondaryValue(row, col)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__secondary\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-cell-secondary\">{{ secondaryValue(row, col) }}</span>\n\t\t\t\t\t\t\t\t<!-- A row that entered a file-content search through an attached\n\t\t\t\t\t\t\t\t file names it (OpenRegister `@self.matchedFile`): plain text,\n\t\t\t\t\t\t\t\t file name only, under the first cell. -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"colIndex === titleColumnIndex && matchedFileOf(row)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__secondary cn-table-cell__matched-file\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-row-matched-file\">{{ matchedFileLabel(row) }}</span>\n\t\t\t\t\t\t\t</td>\n\n\t\t\t\t\t\t\t<!-- Row actions -->\n\t\t\t\t\t\t\t<td v-if=\"$slots['row-actions']\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-col--actions\"\n\t\t\t\t\t\t\t\t:class=\"[cellClass ? cellClass(row, { key: 'actions' }) : '']\"\n\t\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t\t@auxclick.stop>\n\t\t\t\t\t\t\t\t<!-- @slot Per-row actions menu (e.g. a CnRowActions), scoped with { row }. Supplying it adds the trailing actions column. -->\n\t\t\t\t\t\t\t\t<slot name=\"row-actions\" :row=\"row\" />\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<!-- A full-width row under each data row, for what belongs to\n\t\t\t\t\t\t that row (its child records). Not draggable and not a drop\n\t\t\t\t\t\t target: a reorder moves the data rows only. -->\n\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\tv-if=\"$slots['row-detail']\"\n\t\t\t\t\t\t\tclass=\"cn-table-row-detail\"\n\t\t\t\t\t\t\tdata-testid=\"cn-row-detail\"\n\t\t\t\t\t\t\t:data-testid-row-id=\"row[rowKey]\">\n\t\t\t\t\t\t\t<td :colspan=\"totalColumns\" class=\"cn-table-row-detail__cell\">\n\t\t\t\t\t\t\t\t<!-- @slot Content under a data row, across the full width (e.g. that row's child records), scoped with { row }. -->\n\t\t\t\t\t\t\t\t<slot name=\"row-detail\" :row=\"row\" />\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</template>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\n\t\t<!-- Optional footer. A `#footer` scoped slot lets a host render its own\n\t\t footer link (e.g. a \"+ New\" create action or an always-shown\n\t\t \"View all\") with its own click handler — useful when the widget runs\n\t\t outside a vue-router context (the built-in link uses $router). When\n\t\t no slot is given, the built-in \"View all\" control (folded from the\n\t\t retired CnTableWidget) is shown for a `limit`-ed subset.\n\n\t\t The control is a real link (with an href) when the router resolves\n\t\t `viewAllRoute` to a URL, and a real button otherwise. An `<a>`\n\t\t without an href has no link role and is not keyboard focusable\n\t\t (WCAG 2.1.1, 4.1.2), so it is never rendered. -->\n\t\t<div\n\t\t\tv-if=\"$slots.footer || (viewAllRoute && totalRowCount > effectiveRows.length)\"\n\t\t\tclass=\"cn-data-table__footer\">\n\t\t\t<!-- @slot Custom footer content, scoped with { total, shown } (defaults to the built-in \"View all\" link). -->\n\t\t\t<slot name=\"footer\" :total=\"totalRowCount\" :shown=\"effectiveRows.length\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"viewAllHref\"\n\t\t\t\t\tclass=\"cn-data-table__view-all\"\n\t\t\t\t\t:href=\"viewAllHref\"\n\t\t\t\t\t@click=\"onViewAll\">\n\t\t\t\t\t{{ viewAllLabel }}\n\t\t\t\t</a>\n\t\t\t\t<button\n\t\t\t\t\tv-else\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-data-table__view-all\"\n\t\t\t\t\t@click=\"onViewAll\">\n\t\t\t\t\t{{ viewAllLabel }}\n\t\t\t\t</button>\n\t\t\t</slot>\n\t\t</div>\n\t\t<!-- `pageSize`: the board's pager under the rows, \"4 of 7\" and the\n\t\t page buttons (DqCatalogus). -->\n\t\t<CnPagination\n\t\t\tv-if=\"pageSize > 0 && totalRowCount > pageSize\"\n\t\t\tvariant=\"board\"\n\t\t\tclass=\"cn-data-table__pager\"\n\t\t\t:currentPage=\"currentPage\"\n\t\t\t:totalPages=\"pageCount\"\n\t\t\t:totalItems=\"totalRowCount\"\n\t\t\t:currentPageSize=\"pageSize\"\n\t\t\tdata-testid=\"cn-data-table-pager\"\n\t\t\t@pageChanged=\"currentPage = $event\" />\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcCheckboxRadioSwitch, NcLoadingIcon } from '@nextcloud/vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport FilterOutline from 'vue-material-design-icons/FilterOutline.vue'\nimport CnPagination from '../CnPagination/CnPagination.vue'\nimport CnColumnFilterPopover from './CnColumnFilterPopover.vue'\nimport { useClickDragGuard } from '../../composables/useClickDragGuard.js'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { isAppInstalled } from '../../utils/appInstalled.js'\nimport { clearedColumnFilterParams, columnFilterDef, columnFilterParams, columnFilterState, isColumnFilterActive, isColumnSortable } from '../../utils/columnFilters.js'\nimport { fillTemplate, joinTemplateParts } from '../../utils/fillTemplate.js'\nimport { lensUnavailableText, readLensReports } from '../../utils/lensAvailability.js'\nimport { followLinkClick, openRowTarget, resolveHref } from '../../utils/linkNavigation.js'\nimport { nextSortState } from '../../utils/multiColumnSort.js'\nimport { fetchRowAggregate } from '../../utils/rowAggregate.js'\nimport { isNewTabClick, isNewTabHandled, isRowMiddleClick, markNewTabHandled, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'\nimport { DEFAULT_ROW_INDICATOR_CAP, indicatorApplies, resolveRowIndicators } from '../../utils/rowIndicators.js'\nimport { columnsFromSchema } from '../../utils/schema.js'\nimport { CnCellRenderer } from '../CnCellRenderer/index.js'\nimport { CnIcon } from '../CnIcon/index.js'\nimport { CnLockIndicator } from '../CnLockIndicator/index.js'\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\nimport { CnUnreadMarker } from '../CnUnreadMarker/index.js'\n\n// CnDataTable has no scoped styles of its own — its entire look lives in the\n// shared table stylesheet. Import it here so the table is styled even when the\n// consuming app does not pull in the library's global css/index.css.\nimport '../../css/table.css'\n\n/**\n * CnDataTable — Generic sortable data table for list views.\n *\n * Replaces the copy-pasted `<table class=\"viewTable\">` HTML pattern found in\n * every list view across OpenRegister, Pipelinq, and Dossiq. Supports sorting,\n * row selection, custom cell rendering via scoped slots, loading states,\n * and empty states.\n *\n * Sorting: a plain click on a sortable header is single-sort (cycle asc → desc → cleared), unchanged from before.\n * Shift+click (or Shift+Enter on a focused header) appends the column as a secondary/tertiary sort key, capped at 3, with numbered priority badges (1, 2, 3) once two or more rendered, sortable columns are sorted.\n * A sort key whose column is not rendered, or not sortable, still sorts, but is not counted or numbered, and `aria-sort` goes to the first sort key whose column is rendered and sortable.\n * Pass `sortKeys: [{key, order}, ...]` for multi-sort (falls back to the legacy `sortKey`/`sortOrder` props when empty).\n * The `sort` event payload is extended, not replaced: `{key, order}` still mirrors the primary key exactly as before; a new `keys` field carries the full ordered list.\n * See `src/utils/multiColumnSort.js` for the state machine.\n *\n * When a `schema` prop is provided, columns are auto-generated from schema\n * properties and cells render through CnCellRenderer for type-aware formatting\n * (dates, booleans, UUIDs, enums, etc.). Scoped slots still override individual\n * columns when needed.\n *\n * Manual columns (backwards compatible)\n * ```vue\n * <CnDataTable\n * :columns=\"[\n * { key: 'name', label: 'Name', sortable: true },\n * { key: 'email', label: 'Email' },\n * ]\"\n * :rows=\"clients\"\n * @row-click=\"openClient\" />\n * ```\n *\n * Schema-driven (auto columns)\n * ```vue\n * <CnDataTable :schema=\"schema\" :rows=\"objects\" />\n * ```\n *\n * Schema with overrides and custom cell\n * ```vue\n * <CnDataTable\n * :schema=\"schema\"\n * :exclude-columns=\"['description']\"\n * :column-overrides=\"{ status: { width: '200px' } }\"\n * :rows=\"objects\">\n * <template #column-status=\"{ row, value }\">\n * <QuickStatusDropdown :case-obj=\"row\" />\n * </template>\n * </CnDataTable>\n * ```\n */\n\n/**\n * Column keys that name an object's system dates in OpenRegister's `@self`\n * block. A column may declare one as its key (`@self.created`); it renders as\n * a date-time although the schema has no property behind it.\n *\n * @type {string[]}\n */\nconst SYSTEM_DATE_KEYS = ['@self.created', '@self.updated', '@self.published', '@self.depublished']\n\n/**\n * Whether a column's aggregate is read from the host app's endpoint.\n *\n * @param {object} col The column.\n * @return {boolean} True for `aggregate.endpoint` with `aggregate.key`.\n */\nfunction isEndpointAggregate(col) {\n\tconst agg = col && col.aggregate\n\treturn !!agg && typeof agg.endpoint === 'string' && agg.endpoint !== '' && typeof agg.key === 'string' && agg.key !== ''\n}\n\nexport default {\n\tname: 'CnDataTable',\n\n\tcomponents: {\n\t\tNcLoadingIcon,\n\t\tNcCheckboxRadioSwitch,\n\t\tCnCellRenderer,\n\t\tCnColumnFilterPopover,\n\t\tCnIcon,\n\t\tCnLockIndicator,\n\t\tCnStatusBadge,\n\t\tCnPagination,\n\t\tCnUnreadMarker,\n\t\tChevronDown,\n\t\tChevronUp,\n\t\tFilterOutline,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Consumer translation function, provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id, e.g.\n\t\t * `t.bind(null, 'docudesk')`). Column headers come from schema\n\t\t * property titles, which are authored in English as the canonical\n\t\t * source (API predictability); the visible label is resolved through\n\t\t * this function so it follows the user's language, with the English\n\t\t * source key living in each app's l10n files. Defaults to identity\n\t\t * when the table is used standalone (no CnAppRoot ancestor).\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The look CnAppRoot provides. Under `board` the table is the white card of the screens. */\n\t\tcnLook: { default: 'nextcloud' },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * Column definitions (manual mode).\n\t\t * Not required when `schema` is provided.\n\t\t * Each entry may be a full column object OR a bare string key; bare strings\n\t\t * are normalised to `{ key, label }` by `effectiveColumns` so manifest-driven\n\t\t * pages that pass `config.columns` as a string array work without extra mapping.\n\t\t *\n\t\t * `description` renders as the header cell's tooltip and marks the label with a\n\t\t * dotted underline, so a column whose meaning is not obvious from its name (a\n\t\t * maturity level, a computed score, a domain term) can explain itself where the\n\t\t * reader is looking. `columnsFromSchema` fills it from the JSON Schema property\n\t\t * description automatically, so schema-driven tables get it for free.\n\t\t *\n\t\t * `secondary` draws a second, muted line under the cell's value: a field\n\t\t * key (`\"number\"`), a template with `{field}` placeholders\n\t\t * (`\"{number} · {requester}\"`, dotted paths allowed; `{startAt|weekday}`\n\t\t * formats through `fillTemplate`), or a function of the row. Empty fields leave their placeholder blank; a line that\n\t\t * resolves to nothing is not drawn. `secondaryLabels` names a field's\n\t\t * values on that line, `{ field: { value: label, '*': label } }`\n\t\t * (i18n keys; `'*'` for any other value).\n\t\t *\n\t\t * `link: true` makes that column the one that names the row: it carries\n\t\t * the row link and the title look. Without it the first column does.\n\t\t *\n\t\t * @type {Array<{key: string, label: string, description: string, sortable: boolean, width: string, class: string, cellClass: string, link: boolean, secondary: (string|((row: object) => string)), secondaryLabels: object}|string>}\n\t\t */\n\t\tcolumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Optional leading icon shown at the start of every row. Either a static\n\t\t * MDI icon name (PascalCase, e.g. `'FileDocumentOutline'`) applied to all\n\t\t * rows, or a function `(row) => iconName` to vary it per row. The icon is\n\t\t * resolved through the shared CnIcon registry. Unset = no icon column.\n\t\t *\n\t\t * @type {string | ((row: object) => string) | null}\n\t\t */\n\t\trowIcon: {\n\t\t\ttype: [String, Function],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The tone of the leading icon's tile in the board look: `primary`\n\t\t * (default), `teal` or `neutral` (DqOrganisaties draws a teal tile).\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\trowIconTone: {\n\t\t\ttype: String,\n\t\t\tdefault: 'primary',\n\t\t},\n\n\t\t/**\n\t\t * State indicators a page declares for its rows. Each entry is\n\t\t * `{ id, field, equals?, in?, icon, text, tooltip? }`: `field` is a\n\t\t * dotted path on the row, the condition is `equals`, `in`, or plain\n\t\t * truthiness when neither is given, `icon` is a CnIcon name, and `text`\n\t\t * is the text alternative. An entry without `text` does not render,\n\t\t * because an icon with no text is colour and shape alone.\n\t\t *\n\t\t * The page declares which indicators exist. A record cannot add one the\n\t\t * page has not declared, however it is shaped. A page declaring none\n\t\t * renders its rows exactly as before.\n\t\t *\n\t\t * @type {Array<{id?: string, field: string, equals?: (string|number|boolean|null), in?: Array, icon?: string, text: string, tooltip?: string}>}\n\t\t */\n\t\trowIndicators: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * How many declared indicators render on the row itself. The rest are\n\t\t * available from `indicatorsFor(row).overflow` for the row menu.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\trowIndicatorCap: {\n\t\t\ttype: Number,\n\t\t\tdefault: DEFAULT_ROW_INDICATOR_CAP,\n\t\t},\n\n\t\t/**\n\t\t * Schema object with `properties` field (schema-driven mode).\n\t\t * When provided, columns are auto-generated from schema properties.\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Per-column overrides when using schema mode: { key: { width, label, sortable, ... } } */\n\t\tcolumnOverrides: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Column keys to exclude when using schema mode */\n\t\texcludeColumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Column keys to include when using schema mode (whitelist) */\n\t\tincludeColumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Row data array. Each row should have a unique identifier (see rowKey). */\n\t\trows: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Whether data is loading (shows loading spinner) */\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current sort column key */\n\t\tsortKey: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Current sort order: 'asc', 'desc', or null (no sort) */\n\t\tsortOrder: {\n\t\t\ttype: String,\n\t\t\tdefault: 'asc',\n\t\t\tvalidator: (v) => v === null || ['asc', 'desc'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Ordered multi-column sort state: `[{ key, order }, ...]` (priority\n\t\t * order, 0 to 3 entries). Optional — when empty (the default), the\n\t\t * table falls back to the legacy `sortKey`/`sortOrder` props, so\n\t\t * single-sort hosts are completely unaffected. Shift+click a\n\t\t * sortable header to append/cycle a secondary or tertiary key (see\n\t\t * `src/utils/multiColumnSort.js`).\n\t\t *\n\t\t * @type {Array<{key: string, order: 'asc'|'desc'}>}\n\t\t */\n\t\tsortKeys: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Whether rows can be selected with checkboxes */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Array of currently selected row IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Property name used as unique row identifier */\n\t\trowKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'id',\n\t\t},\n\n\t\t/** Text shown when there are no rows */\n\t\temptyText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No items found'),\n\t\t},\n\n\t\t/**\n\t\t * App wording for an unavailable personal lens in self-fetch mode,\n\t\t * keyed `<lens>.<reason>` (`recent.audit-trail-disabled`) or\n\t\t * `<reason>`. Without it the library's object-neutral text is shown\n\t\t * when the response reports `@self.lenses.<lens>.available: false`.\n\t\t *\n\t\t * @type {{[key: string]: string}|null}\n\t\t * @spec openspec/changes/lens-says-why-it-is-empty/specs/personal-lens-availability/spec.md#requirement-an-unavailable-lens-explains-its-empty-page\n\t\t */\n\t\tlensReasonTexts: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Function returning CSS class(es) for a row: (row) => string|object */\n\t\trowClass: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Function returning CSS class(es) for a data cell: (row, col) => string|object */\n\t\tcellClass: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Whether to constrain table height and make it scrollable */\n\t\tscrollable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Text shown while loading */\n\t\tloadingText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Loading…'),\n\t\t},\n\n\t\t/**\n\t\t * Accessible name for the select-all checkbox in the header row.\n\t\t * Used as the checkbox's `aria-label` so screen readers announce a\n\t\t * named control (WCAG 4.1.2). Defaults to the lib's translation of\n\t\t * \"Select all rows\".\n\t\t */\n\t\tselectAllLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Select all rows'),\n\t\t},\n\n\t\t/**\n\t\t * Accessible name for a per-row select checkbox. Used as the\n\t\t * checkbox's `aria-label` so screen readers announce a named control\n\t\t * (WCAG 4.1.2). Defaults to the lib's translation of \"Select row\".\n\t\t */\n\t\tselectRowLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Select row'),\n\t\t},\n\n\t\t/**\n\t\t * Optional card title rendered in a header above the table. When set, the\n\t\t * table reads as a self-contained card (the container's own border/radius\n\t\t * is the card chrome). Folded in from the retired CnTableWidget.\n\t\t */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Draw an unread record (`@self.unread`) in bold with the unread dot.\n\t\t * Off, every row reads alike whatever its read state.\n\t\t *\n\t\t * @spec openspec/changes/screens-index-board-gaps/specs/index-list-board-look/spec.md#requirement-unread-rows-are-marked-only-where-the-reader-asked-for-them\n\t\t */\n\t\tshowUnread: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * How the board look draws the title column: `link` (the default) is\n\t\t * the 15px weight 600 underlined title of the DqZaken board; `plain` is\n\t\t * the 15px bold title without an underline and a 13px muted secondary\n\t\t * line, as the PqTickets and OcPublicaties boards draw it; `text` is an\n\t\t * ordinary cell, for a log table whose first column is a date\n\t\t * (DqZaakContact); `strong` is the cell's own size at weight 600 in the\n\t\t * main ink without an underline, the name column of a card's list\n\t\t * (DqZaaktypeStatussen). The row stays clickable either way. The\n\t\t * Nextcloud look ignores it.\n\t\t *\n\t\t * @spec openspec/changes/screens-table-rows-parity/specs/index-list-board-look/spec.md#requirement-a-row-title-can-be-plain-text\n\t\t * @spec openspec/changes/board-log-table-plain-cells/specs/board-log-table-plain-cells/spec.md#requirement-a-tables-title-column-can-read-as-plain-text\n\t\t */\n\t\trowTitle: {\n\t\t\ttype: String,\n\t\t\tdefault: 'link',\n\t\t\tvalidator: (value) => ['link', 'plain', 'text', 'strong'].includes(value),\n\t\t},\n\n\t\t/**\n\t\t * Drop the container's card chrome (border, radius, shadow) so the table\n\t\t * sits flush inside a parent that already provides a card (e.g. a\n\t\t * CnWidgetWrapper dashboard slot). Folded in from CnTableWidget.\n\t\t */\n\t\tborderless: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Fill the height of the parent (a flex-column card / widget content\n\t\t * area) so the optional `#footer` is pushed to the bottom instead of\n\t\t * floating directly under a short list. When the list is long enough to\n\t\t * overflow, the footer stays pinned via its sticky rule. No-op outside a\n\t\t * height-constrained parent. Opt-in so ordinary in-flow tables are\n\t\t * unaffected.\n\t\t */\n\t\tfillHeight: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * How many data columns are pinned to the start of the table. They (and the\n\t\t * selection and icon columns, which are pinned whenever any column is) stay\n\t\t * in view when the table scrolls sideways.\n\t\t */\n\t\tpinnedCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * Let the reader drag rows into another order. A drop emits `row-move`\n\t\t * with the row and its old and new index; the host stores the order.\n\t\t */\n\t\treorderable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Hide the column-header row (`<thead>`). Useful for compact dashboard\n\t\t * list widgets that want a plain bordered-row list without column labels.\n\t\t */\n\t\thideHeader: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Switch the table to `table-layout: fixed`, making each column's `width`\n\t\t * authoritative instead of a hint the browser may override. Opt in when a\n\t\t * column's content would otherwise dictate the layout — a long unbreakable\n\t\t * value (a PHP FQCN, a UUID) widens its column under the default auto\n\t\t * layout and can render past the cell box into its neighbour, while any\n\t\t * column left unsized soaks up all remaining width. Cells also break long\n\t\t * words rather than overflowing. Columns with no `width` share whatever\n\t\t * space is left, so size every column when you want exact control.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tfixedLayout: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Fit the table to its container instead of letting it grow past it.\n\t\t * One column takes the room that is left and cuts its text with an\n\t\t * ellipsis (the full value stays in the tooltip); every other column\n\t\t * keeps its content on one line at its own width, so trailing columns\n\t\t * such as a date stay visible in a narrow tile. The column that grows\n\t\t * is the first with `grow: true`, else the one keyed `title` or `name`,\n\t\t * else the first column. CnWidgetObjectTable turns this on.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @spec openspec/changes/narrow-object-table-widgets/specs/narrow-object-table-widgets/spec.md#requirement-a-narrow-object-table-keeps-its-trailing-columns-in-view\n\t\t */\n\t\tfitWidth: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Max number of rows to display. When the total exceeds it, only the first\n\t\t * `limit` render and the \"View all\" footer appears (with `viewAllRoute`).\n\t\t * 0 = show all. Folded in from CnTableWidget.\n\t\t */\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * Rows per page. Above 0 the table shows one page of its rows and the\n\t\t * board's pager under them (\"4 of 7\", page buttons, Next) once there is\n\t\t * more than one page. Pages the rows the table holds; 0 (the default)\n\t\t * shows them all, or the first `limit`.\n\t\t *\n\t\t * @spec openspec/changes/object-table-pager/specs/object-table/spec.md#requirement-an-object-table-can-page-its-rows\n\t\t */\n\t\tpageSize: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * vue-router route object for the \"View all\" footer link. The footer only\n\t\t * shows when set AND the rows are a `limit`-ed subset. Folded in from CnTableWidget.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tviewAllRoute: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Pre-translated \"View all\" footer label. */\n\t\tviewAllLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'View all'),\n\t\t},\n\n\t\t/**\n\t\t * Self-fetch mode (folded from CnTableWidget): the OpenRegister register\n\t\t * id/slug. When `register` + `schemaId` are set and no `rows` are passed,\n\t\t * the table fetches `/apps/openregister/api/objects/{register}/{schemaId}`.\n\t\t *\n\t\t * @type {string|number|null}\n\t\t */\n\t\tregister: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Self-fetch mode (folded from CnTableWidget): the OpenRegister schema\n\t\t * id used together with `register`. (Distinct from the `schema` prop,\n\t\t * which is a JSON Schema object for column generation.)\n\t\t *\n\t\t * @type {string|number|null}\n\t\t */\n\t\tschemaId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Extra query parameters sent with the self-fetch request (register +\n\t\t * schemaId mode) — e.g. a resolved filter map, `_order[field]` ordering,\n\t\t * or `_limit`. Changing it re-triggers the self-fetch, so a host widget\n\t\t * (CnWidgetObjectTable's declarative `source`) can drive filtering and\n\t\t * ordering without re-implementing the fetch. Ignored when external\n\t\t * `rows` are supplied.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tfetchParams: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Convenience navigation (folded from CnTableWidget): a function that\n\t\t * receives a row and returns the vue-router route it opens. When set,\n\t\t * each row renders as a real link to that route, stretched over the\n\t\t * row: a click navigates there (the `row-click` event still fires), and\n\t\t * a ctrl/cmd/shift or middle click opens it in a new tab. A table whose\n\t\t * row click selects (`selectable` without `rowClickToView`) gets no link.\n\t\t *\n\t\t * @type {((row: object) => object)|null}\n\t\t */\n\t\trowClickRoute: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * When true, a row-body click emits `row-click` (for navigation) even\n\t\t * while `selectable` — selection then happens only via the checkbox\n\t\t * column. Lets \"click row = open, tick box = select\" coexist. Default\n\t\t * false keeps the legacy behaviour (selectable rows select on body click).\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\trowClickToView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Show a filter button in every header whose column can filter (see\n\t\t * `columnFilterDef`): enum, boolean, text, number, date and reference\n\t\t * columns backed by a schema property. A column opts out with\n\t\t * `filterable: false`. Applying a filter emits `column-filter`; the\n\t\t * host owns the filter state and passes it back as `activeFilters`.\n\t\t *\n\t\t * @spec openspec/changes/table-header-sort-and-filter/specs/cn-data-table/spec.md#requirement-every-backed-column-filters-from-its-header\n\t\t */\n\t\tfilterable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * The schema the header filters read instead of `schema`: a page that\n\t\t * filters through other fields than the rows' own (a named source's\n\t\t * search fields) hands them here. Null: the header filters read `schema`.\n\t\t *\n\t\t * @spec openspec/changes/named-source-header-filters/specs/index-page/spec.md#requirement-a-named-source-can-filter-from-its-column-headers-through-its-search-fields\n\t\t */\n\t\tfilterSchema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Draw the active header filters as removable chips above the table.\n\t\t * A host that lists them itself (the index page's board Active line)\n\t\t * turns this off, so a filter is not shown twice.\n\t\t *\n\t\t * @spec openspec/changes/index-table-filter-chips-once/specs/cn-data-table/spec.md#requirement-a-host-that-lists-the-active-filters-itself-turns-the-table-chips-off\n\t\t */\n\t\tfilterChips: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * The active filter map, `{ paramKey: values[] }`: the same map the\n\t\t * facet sidebar writes, so a header filter and a sidebar filter on one\n\t\t * field show the same state.\n\t\t */\n\t\tactiveFilters: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Register slug a reference column's filter searches in when the column names none. */\n\t\tfilterRegister: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['row-click', 'row-aux-click', 'row-context-menu', 'row-move', 'select', 'select-all', 'sort', 'view-all', 'column-filter'],\n\n\tsetup() {\n\t\t// Tell a deliberate row click apart from a text-selection drag.\n\t\treturn useClickDragGuard()\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t/** Index of the row being dragged, or -1. */\n\t\t\tdragFromIndex: -1,\n\t\t\t/** Index of the row a drag is over, or -1. */\n\t\t\tdragOverIndex: -1,\n\t\t\t/** Left offsets (px) of the leading pinned cells, measured from the header. */\n\t\t\tpinOffsets: [],\n\t\t\t/** Key of the column whose filter panel is open, or ''. */\n\t\t\topenFilterKey: '',\n\t\t\t/** The open filter button's bounding rect, to place the panel. */\n\t\t\tfilterAnchorRect: null,\n\t\t\t/**\n\t\t\t * Resolved aggregate-column values, keyed by `String(row[rowKey])`\n\t\t\t * then by column key. Populated by `loadAggregates()` for columns\n\t\t\t * that declare `aggregate` (see CnIndexPage's manifest config).\n\t\t\t *\n\t\t\t * @type {{[rowId: string]: {[colKey: string]: number}}}\n\t\t\t */\n\t\t\taggregateValues: {},\n\t\t\t/**\n\t\t\t * Columns whose endpoint aggregate answered `available: false`, by\n\t\t\t * column key; such a column is not drawn.\n\t\t\t *\n\t\t\t * @type {{[colKey: string]: boolean}}\n\t\t\t */\n\t\t\taggregateUnavailable: {},\n\t\t\t/**\n\t\t\t * Whether the table currently overflows its scrollport horizontally.\n\t\t\t * Drives the keyboard tab stop on `.cn-data-table__scroll`; see the\n\t\t\t * comment on that element.\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tisScrollable: false,\n\t\t\t/** True while a batch of aggregate-count requests is in flight. */\n\t\t\taggregateLoading: false,\n\t\t\t/** Monotonic id used to discard a stale aggregate batch when `rows` changes mid-flight. */\n\t\t\taggregateRequestId: 0,\n\t\t\t/** Rows fetched in self-fetch mode (register + schemaId). */\n\t\t\tfetchedRows: [],\n\t\t\t/** The page shown under `pageSize`. */\n\t\t\tcurrentPage: 1,\n\t\t\t/** Personal-lens reports (`@self.lenses`) of the latest self-fetch response. */\n\t\t\tfetchedLenses: {},\n\t\t\t/** True while a self-fetch request is in flight. */\n\t\t\tselfFetchLoading: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The leading icon tile's tone, one the board look draws.\n\t\t *\n\t\t * @return {string} `primary`, `teal` or `neutral`.\n\t\t * @spec openspec/changes/board-row-icon-tile/specs/data-table/spec.md#requirement-a-board-tables-leading-icon-sits-on-a-tile\n\t\t */\n\t\ticonTone() {\n\t\t\treturn ['primary', 'teal', 'neutral'].includes(this.rowIconTone) ? this.rowIconTone : 'primary'\n\t\t},\n\n\t\t/**\n\t\t * Whether the table is drawn as the board look's white card.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisBoardLook() {\n\t\t\treturn normalizeLook(this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of the row-actions column.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsColumnLabel() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * Why the self-fetched list is empty when a personal lens could not\n\t\t * answer (openregister#4514), or `''` to keep `emptyText`. Only the\n\t\t * table's own fetch reports: external `rows` carry no report.\n\t\t *\n\t\t * @return {string}\n\t\t * @spec openspec/changes/lens-says-why-it-is-empty/specs/personal-lens-availability/spec.md#requirement-an-unavailable-lens-explains-its-empty-page\n\t\t */\n\t\tlensReasonText() {\n\t\t\tif (this.rows && this.rows.length > 0) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst text = lensUnavailableText(this.fetchedLenses, this.lensReasonTexts)\n\t\t\treturn text ? this.translateLabel(text) : ''\n\t\t},\n\n\t\t/** @return {number} Leading cells before the data columns (selection, icon). */\n\t\t/**\n\t\t * The key of the column that takes the spare width under `fitWidth`:\n\t\t * the first with `grow: true`, else `title` or `name`, else the first.\n\t\t *\n\t\t * @return {string|null} The column key, or null when not fitting.\n\t\t * @spec openspec/changes/narrow-object-table-widgets/specs/narrow-object-table-widgets/spec.md#requirement-a-narrow-object-table-keeps-its-trailing-columns-in-view\n\t\t */\n\t\t/**\n\t\t * The column that names the row: it carries the row link, the title\n\t\t * look and the unread, lock and indicator marks. The first column with\n\t\t * `link: true`, else the first column (DqTeamwachtrij puts the waiting\n\t\t * time first and links the case title in the second).\n\t\t *\n\t\t * @return {number} The index in `effectiveColumns`.\n\t\t * @spec openspec/changes/screens-index-board-gaps/specs/index-list-board-look/spec.md#requirement-a-column-can-carry-the-row-link\n\t\t */\n\t\ttitleColumnIndex() {\n\t\t\tconst index = this.effectiveColumns.findIndex((c) => c && c.link === true)\n\t\t\treturn index === -1 ? 0 : index\n\t\t},\n\n\t\tgrowColumnKey() {\n\t\t\tif (!this.fitWidth || this.effectiveColumns.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst cols = this.effectiveColumns\n\t\t\tconst chosen = cols.find((c) => c && c.grow === true)\n\t\t\t\t|| cols.find((c) => c && c.key === 'title')\n\t\t\t\t|| cols.find((c) => c && c.key === 'name')\n\t\t\t\t|| cols[0]\n\t\t\treturn chosen ? chosen.key : null\n\t\t},\n\n\t\tleadingCount() {\n\t\t\treturn (this.selectable ? 1 : 0) + (this.rowIcon ? 1 : 0)\n\t\t},\n\n\t\t/**\n\t\t * Accessible name for the horizontal scrollport when it becomes a tab\n\t\t * stop. Prefers the table's own `title` so the announcement identifies\n\t\t * WHICH table the user has landed in — several can share a dashboard.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tscrollRegionLabel() {\n\t\t\treturn this.title\n\t\t\t\t? t('nextcloud-vue', '{title} — scrollable table', { title: this.title })\n\t\t\t\t: t('nextcloud-vue', 'Scrollable table')\n\t\t},\n\n\t\t/**\n\t\t * The row source: external `rows` when provided, else the self-fetched\n\t\t * rows (register + schemaId mode). External rows always win.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tsourceRows() {\n\t\t\tif (this.rows && this.rows.length > 0) {\n\t\t\t\treturn this.rows\n\t\t\t}\n\t\t\tif (this.register !== null && this.register !== undefined && this.schemaId !== null && this.schemaId !== undefined) {\n\t\t\t\treturn this.fetchedRows\n\t\t\t}\n\t\t\treturn this.rows\n\t\t},\n\n\t\t/**\n\t\t * The rows actually rendered — `sourceRows` capped to `limit` (0 = all).\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\teffectiveRows() {\n\t\t\tif (this.pageSize > 0) {\n\t\t\t\tconst page = Math.min(this.currentPage, this.pageCount)\n\t\t\t\treturn this.sourceRows.slice((page - 1) * this.pageSize, page * this.pageSize)\n\t\t\t}\n\t\t\treturn this.limit > 0 ? this.sourceRows.slice(0, this.limit) : this.sourceRows\n\t\t},\n\n\t\t/**\n\t\t * The number of pages under `pageSize` (at least 1).\n\t\t *\n\t\t * @spec openspec/changes/object-table-pager/specs/object-table/spec.md#requirement-an-object-table-can-page-its-rows\n\t\t * @return {number}\n\t\t */\n\t\tpageCount() {\n\t\t\treturn this.pageSize > 0 ? Math.max(1, Math.ceil(this.sourceRows.length / this.pageSize)) : 1\n\t\t},\n\n\t\t/**\n\t\t * Total row count before the `limit` cap (drives the count badge + the\n\t\t * \"View all\" footer condition).\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\ttotalRowCount() {\n\t\t\treturn this.sourceRows.length\n\t\t},\n\n\t\t/**\n\t\t * The URL the router resolves `viewAllRoute` to, or `null` when there is\n\t\t * no route or no router (a widget mounted outside a vue-router context).\n\t\t * Decides whether the \"View all\" footer renders as a link or a button.\n\t\t *\n\t\t * @return {string|null}\n\t\t */\n\t\tviewAllHref() {\n\t\t\tif (!this.viewAllRoute || !this.$router || typeof this.$router.resolve !== 'function') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst resolved = this.$router.resolve(this.viewAllRoute)\n\t\t\t\treturn (resolved && resolved.href) || null\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the loading state — the external `loading` prop OR a\n\t\t * self-fetch in flight.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisLoading() {\n\t\t\treturn this.loading || this.selfFetchLoading\n\t\t},\n\n\t\t/**\n\t\t * Effective columns: schema-generated or manually provided.\n\t\t * Schema columns take precedence when schema is provided and no manual columns given.\n\t\t */\n\t\teffectiveColumns() {\n\t\t\treturn this.allColumns.filter((c) => !this.isAggregateHidden(c))\n\t\t},\n\n\t\t/**\n\t\t * Every column the table is configured with, before an endpoint\n\t\t * aggregate whose source is absent is left out (see `effectiveColumns`).\n\t\t *\n\t\t * @return {Array<object>} The columns.\n\t\t */\n\t\tallColumns() {\n\t\t\tconst cols = (this.schema && this.columns.length === 0)\n\t\t\t\t? columnsFromSchema(this.schema, {\n\t\t\t\t\t\texclude: this.excludeColumns,\n\t\t\t\t\t\tinclude: this.includeColumns,\n\t\t\t\t\t\toverrides: this.columnOverrides,\n\t\t\t\t\t})\n\t\t\t\t: this.columns\n\t\t\t// Every column backed by a schema property sorts unless it says\n\t\t\t// `sortable: false`; object columns from a manifest used to need an\n\t\t\t// explicit flag and so could not sort at all.\n\t\t\tconst withSort = (c) => (c && typeof c === 'object' ? { ...c, sortable: isColumnSortable(c, this.schema) } : c)\n\t\t\tif (!(cols || []).some((c) => typeof c === 'string')) {\n\t\t\t\treturn (cols || []).map(withSort)\n\t\t\t}\n\t\t\tconst schemaCols = this.schema\n\t\t\t\t? columnsFromSchema(this.schema, { overrides: this.columnOverrides })\n\t\t\t\t: []\n\t\t\tconst byKey = new Map(schemaCols.map((c) => [c.key, c]))\n\t\t\treturn (cols || []).map((c) => {\n\t\t\t\tif (typeof c !== 'string') {\n\t\t\t\t\treturn withSort(c)\n\t\t\t\t}\n\t\t\t\treturn byKey.get(c) || { key: c, label: c, sortable: true }\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The active ordered sort-key list: the `sortKeys` prop when non-empty,\n\t\t * else a single-entry list derived from the legacy `sortKey`/`sortOrder`\n\t\t * props (empty when neither is active). Every header/badge/aria-sort\n\t\t * computation reads this so single-sort hosts (no `sortKeys` passed)\n\t\t * render exactly as before.\n\t\t *\n\t\t * @return {Array<{key: string, order: 'asc'|'desc'}>}\n\t\t */\n\t\t/**\n\t\t * The link each row opens, keyed by row key: the `rowClickRoute`\n\t\t * location and its href. Empty when rows have no route, or when a row\n\t\t * click selects instead of navigating.\n\t\t *\n\t\t * @return {{[key: string]: {target: object, href: string}}}\n\t\t */\n\t\trowLinks() {\n\t\t\tconst links = {}\n\t\t\tif (!this.rowClickRoute || !this.$router || (this.selectable && !this.rowClickToView)) {\n\t\t\t\treturn links\n\t\t\t}\n\t\t\tfor (const row of this.effectiveRows) {\n\t\t\t\tconst route = this.rowClickRoute(row)\n\t\t\t\tif (!route) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst target = typeof route === 'string' ? { path: route } : route\n\t\t\t\tconst href = resolveHref(target, this.$router)\n\t\t\t\tif (href) {\n\t\t\t\t\tlinks[String(row[this.rowKey])] = { target, href }\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn links\n\t\t},\n\n\t\t/**\n\t\t * The column whose filter panel is open, or null.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\topenFilterColumn() {\n\t\t\tif (!this.openFilterKey) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.effectiveColumns.find((c) => c && c.key === this.openFilterKey && this.filterDefFor(c)) || null\n\t\t},\n\n\t\t/**\n\t\t * One chip per column with an active header filter.\n\t\t *\n\t\t * @return {Array<{key: string, col: object, text: string, removeLabel: string}>}\n\t\t */\n\t\tactiveColumnFilterChips() {\n\t\t\tif (!this.filterable) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.effectiveColumns\n\t\t\t\t.filter((c) => c && this.isColumnFiltered(c))\n\t\t\t\t.map((col) => {\n\t\t\t\t\tconst label = this.translateLabel(col.label)\n\t\t\t\t\tconst text = t('nextcloud-vue', '{column}: {value}', { column: label, value: this.columnFilterSummary(col) })\n\t\t\t\t\treturn { key: col.key, col, text, removeLabel: t('nextcloud-vue', 'Remove filter {column}', { column: label }) }\n\t\t\t\t})\n\t\t},\n\n\t\tactiveFiltersLabel() {\n\t\t\treturn t('nextcloud-vue', 'Active filters')\n\t\t},\n\n\t\teffectiveSortKeys() {\n\t\t\tif (this.sortKeys && this.sortKeys.length > 0) {\n\t\t\t\treturn this.sortKeys\n\t\t\t}\n\t\t\tif (this.sortKey) {\n\t\t\t\treturn [{ key: this.sortKey, order: this.sortOrder || 'asc' }]\n\t\t\t}\n\t\t\treturn []\n\t\t},\n\n\t\t/**\n\t\t * The active sort keys whose column renders a sort indicator, in priority order and deduplicated by first occurrence. Only these are counted and numbered by the priority badge.\n\t\t *\n\t\t * @return {Array<{key: string, order: 'asc'|'desc'}>}\n\t\t */\n\t\trenderedSortKeys() {\n\t\t\tconst shown = new Set(this.effectiveColumns.filter((c) => c && c.sortable).map((c) => c.key))\n\t\t\tconst seen = new Set()\n\t\t\treturn this.effectiveSortKeys.filter((k) => {\n\t\t\t\tif (!k || !shown.has(k.key) || seen.has(k.key)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tseen.add(k.key)\n\t\t\t\treturn true\n\t\t\t})\n\t\t},\n\n\t\ttotalColumns() {\n\t\t\tlet count = this.effectiveColumns.length\n\t\t\tif (this.selectable) {\n\t\t\t\tcount++\n\t\t\t}\n\t\t\tif (this.rowIcon) {\n\t\t\t\tcount++\n\t\t\t}\n\t\t\tif (this.$slots['row-actions']) {\n\t\t\t\tcount++\n\t\t\t}\n\t\t\treturn count\n\t\t},\n\n\t\t/**\n\t\t * Stable signature of the self-fetch inputs so the watcher refetches\n\t\t * only on a real change (register / schemaId / fetchParams).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselfFetchKey() {\n\t\t\treturn JSON.stringify({\n\t\t\t\tregister: this.register,\n\t\t\t\tschemaId: this.schemaId,\n\t\t\t\tfetchParams: this.fetchParams || null,\n\t\t\t})\n\t\t},\n\n\t\tallSelected() {\n\t\t\treturn this.effectiveRows.length > 0\n\t\t\t\t&& this.effectiveRows.every((row) => this.selectedIds.includes(row[this.rowKey]))\n\t\t},\n\n\t\tsomeSelected() {\n\t\t\treturn this.effectiveRows.some((row) => this.selectedIds.includes(row[this.rowKey]))\n\t\t},\n\t},\n\n\twatch: {\n\t\trows: {\n\t\t\thandler() {\n\t\t\t\tthis.loadAggregates()\n\t\t\t},\n\t\t},\n\n\t\tpageCount(count) {\n\t\t\tif (this.currentPage > count) {\n\t\t\t\tthis.currentPage = count\n\t\t\t}\n\t\t},\n\n\t\teffectiveColumns: {\n\t\t\thandler() {\n\t\t\t\tthis.loadAggregates()\n\t\t\t},\n\n\t\t\tdeep: false,\n\t\t},\n\n\t\t/**\n\t\t * Re-run the self-fetch when its inputs (register, schemaId, or the\n\t\t * host-driven `fetchParams`) change — a token-resolved filter (e.g.\n\t\t * `@workspace.*`) can change after mount. External rows still win.\n\t\t */\n\t\tselfFetchKey() {\n\t\t\tif ((!this.rows || this.rows.length === 0) && this.register !== null && this.register !== undefined && this.schemaId !== null && this.schemaId !== undefined) {\n\t\t\t\tthis.fetchData()\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.loadAggregates()\n\t\t// Self-fetch mode: pull rows from OpenRegister when register + schemaId\n\t\t// are given and no external rows were passed (folded from CnTableWidget).\n\t\tif ((!this.rows || this.rows.length === 0) && this.register !== null && this.register !== undefined && this.schemaId !== null && this.schemaId !== undefined) {\n\t\t\tthis.fetchData()\n\t\t}\n\t\tthis.observeScrollOverflow()\n\t},\n\n\tupdated() {\n\t\t// Columns and rows can change after mount (self-fetch resolving, a\n\t\t// column toggled), and either can flip the table between fitting and\n\t\t// overflowing. ResizeObserver alone would miss a change that alters\n\t\t// content width without resizing the box.\n\t\tthis.measureScrollOverflow()\n\t},\n\n\tbeforeUnmount() {\n\t\tthis.disconnectScrollOverflow()\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Start dragging a row (`reorderable` only).\n\t\t *\n\t\t * @param {number} index The row's index.\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowDragStart(index, event) {\n\t\t\tif (!this.reorderable) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.dragFromIndex = index\n\t\t\tif (event && event.dataTransfer) {\n\t\t\t\tevent.dataTransfer.effectAllowed = 'move'\n\t\t\t\tevent.dataTransfer.setData('text/plain', String(index))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Accept a dragged row over this one.\n\t\t *\n\t\t * @param {number} index The row's index.\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowDragOver(index, event) {\n\t\t\tif (!this.reorderable || this.dragFromIndex < 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.dragOverIndex = index\n\t\t},\n\n\t\t/**\n\t\t * The drag left this row.\n\t\t *\n\t\t * @param {number} index The row's index.\n\t\t * @return {void}\n\t\t */\n\t\tonRowDragLeave(index) {\n\t\t\tif (this.dragOverIndex === index) {\n\t\t\t\tthis.dragOverIndex = -1\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Drop the dragged row here.\n\t\t *\n\t\t * @param {object} row The row dropped on.\n\t\t * @param {number} index Its index.\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowDrop(row, index, event) {\n\t\t\tif (!this.reorderable || this.dragFromIndex < 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tconst from = this.dragFromIndex\n\t\t\tthis.onRowDragEnd()\n\t\t\tif (from !== index) {\n\t\t\t\t/**\n\t\t\t\t * A row was dragged to another place (`reorderable`). Payload:\n\t\t\t\t * `{ row, from, to }`, the dragged row and its old and new index.\n\t\t\t\t *\n\t\t\t\t * @event row-move\n\t\t\t\t */\n\t\t\t\tthis.$emit('row-move', { row: this.effectiveRows[from], from, to: index })\n\t\t\t}\n\t\t},\n\n\t\t/** End a drag. */\n\t\tonRowDragEnd() {\n\t\t\tthis.dragFromIndex = -1\n\t\t\tthis.dragOverIndex = -1\n\t\t},\n\n\t\t/**\n\t\t * Whether a column is the one that takes the spare width (`fitWidth`).\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @return {boolean}\n\t\t */\n\t\tisGrowColumn(col) {\n\t\t\treturn this.growColumnKey !== null && !!col && col.key === this.growColumnKey\n\t\t},\n\n\t\t/**\n\t\t * Whether a row's record changed since the user last looked\n\t\t * (`@self.unread`), when `showUnread` is on. A row without the marker\n\t\t * renders as it always did.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {boolean} True when the row is unread.\n\t\t */\n\t\tisUnreadRow(row) {\n\t\t\treturn this.showUnread && !!(row && row['@self'] && row['@self'].unread === true)\n\t\t},\n\n\t\t/**\n\t\t * The attached file a row was found through in a file-content search.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {string} The file name, or '' when the row matched on a field.\n\t\t */\n\t\tmatchedFileOf(row) {\n\t\t\tconst name = row && row['@self'] && row['@self'].matchedFile\n\t\t\treturn typeof name === 'string' ? name : ''\n\t\t},\n\n\t\t/**\n\t\t * The \"Found in {file}\" line for a row found through an attached file.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {string} The translated line.\n\t\t */\n\t\tmatchedFileLabel(row) {\n\t\t\treturn t('nextcloud-vue', 'Found in {file}', { file: this.matchedFileOf(row) })\n\t\t},\n\n\t\t/**\n\t\t * The declared indicators that apply to one row, split into the ones\n\t\t * that fit on the row and the ones that go to the row menu.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {{shown: Array<object>, overflow: Array<object>}}\n\t\t * @spec openspec/changes/working-list-row-actions/specs/index-page/spec.md\n\t\t */\n\t\tindicatorsFor(row) {\n\t\t\treturn resolveRowIndicators(this.rowIndicators, row, this.rowIndicatorCap)\n\t\t},\n\n\t\t/**\n\t\t * A row link covers the whole row, so no cell sees the pointer. Give\n\t\t * the link the full text of the clipped cell under the pointer as its\n\t\t * title, the hover that `titleWhenClipped` gives an unlinked cell.\n\t\t *\n\t\t * @param {MouseEvent} event The move event on the row link.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tlinkTitleAtPointer(event) {\n\t\t\tconst link = event.currentTarget\n\t\t\tconst row = link?.closest?.('tr')\n\t\t\tif (!row || typeof document.elementsFromPoint !== 'function') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst cell = document.elementsFromPoint(event.clientX, event.clientY)\n\t\t\t\t.find((el) => el.tagName === 'TD' && row.contains(el))\n\t\t\t// An empty title, not none: the first cell's own clipped title would\n\t\t\t// otherwise show over the whole row.\n\t\t\tconst clipped = cell && cell.scrollWidth - cell.clientWidth > 1\n\t\t\tlink.setAttribute('title', clipped ? (cell.textContent || '').trim() : '')\n\t\t},\n\n\t\t/**\n\t\t * Give a cell its full text on hover, and only when it is cut short.\n\t\t *\n\t\t * Cells are one line with an ellipsis, so a long value is readable only\n\t\t * as far as the column goes. A `title` on every cell would answer that,\n\t\t * and would also put a tooltip on the cells that need none — repeating\n\t\t * back what is already on screen.\n\t\t *\n\t\t * Read on ENTER rather than on render: `scrollWidth > clientWidth` forces\n\t\t * layout, and doing it per cell per paint would cost a reflow for a\n\t\t * tooltip almost none of them want. On enter it is one read of one cell,\n\t\t * and it is re-read every time, so a column resized since the last hover\n\t\t * answers for its new width rather than its old one.\n\t\t *\n\t\t * @param {MouseEvent} event The enter event.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\ttitleWhenClipped(event) {\n\t\t\tconst el = event.currentTarget\n\t\t\tif (!el) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// 1px of tolerance, as the scrollport check uses: sub-pixel rounding\n\t\t\t// otherwise reports a cell that visually fits as clipped.\n\t\t\tif (el.scrollWidth - el.clientWidth > 1) {\n\t\t\t\tel.setAttribute('title', (el.textContent || '').trim())\n\t\t\t} else {\n\t\t\t\tel.removeAttribute('title')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether the cell at this position (selection, icon, then data columns)\n\t\t * is pinned. Position 0 is the first cell of the row.\n\t\t *\n\t\t * @param {number} index The cell's position in the row.\n\t\t * @return {boolean} True for a pinned cell.\n\t\t */\n\t\tisPinnedAt(index) {\n\t\t\treturn this.pinnedCount > 0 && index < this.leadingCount + this.pinnedCount\n\t\t},\n\n\t\t/**\n\t\t * CSS classes of a pinned cell; the last pinned one gets the edge.\n\t\t *\n\t\t * @param {number} index The cell's position in the row.\n\t\t * @return {object} The class map.\n\t\t */\n\t\tpinClass(index) {\n\t\t\tconst pinned = this.isPinnedAt(index)\n\t\t\treturn {\n\t\t\t\t'cn-table-col--pinned': pinned,\n\t\t\t\t'cn-table-col--pinned-last': pinned && index === this.leadingCount + this.pinnedCount - 1,\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Sticky offset of a pinned cell: the summed width of the cells before it.\n\t\t *\n\t\t * @param {number} index The cell's position in the row.\n\t\t * @return {object} The inline style, empty for a cell that scrolls.\n\t\t */\n\t\tpinStyle(index) {\n\t\t\tif (!this.isPinnedAt(index)) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn { left: `${this.pinOffsets[index] || 0}px` }\n\t\t},\n\n\t\t/**\n\t\t * Measure the pinned cells so each sticky offset is the width of those\n\t\t * before it. Cheap when nothing is pinned.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tmeasurePins() {\n\t\t\tif (this.pinnedCount <= 0) {\n\t\t\t\tif (this.pinOffsets.length > 0) {\n\t\t\t\t\tthis.pinOffsets = []\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst row = this.$el && this.$el.querySelector ? this.$el.querySelector('thead tr, tbody tr') : null\n\t\t\tif (!row) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst count = this.leadingCount + this.pinnedCount\n\t\t\tconst offsets = []\n\t\t\tlet left = 0\n\t\t\tfor (let i = 0; i < count && i < row.children.length; i++) {\n\t\t\t\toffsets.push(left)\n\t\t\t\tleft += row.children[i].offsetWidth || 0\n\t\t\t}\n\t\t\tif (offsets.join() !== this.pinOffsets.join()) {\n\t\t\t\tthis.pinOffsets = offsets\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Start watching the scrollport for horizontal overflow.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tobserveScrollOverflow() {\n\t\t\tthis.measureScrollOverflow()\n\t\t\tif (typeof ResizeObserver === 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis._scrollObserver = new ResizeObserver(() => this.measureScrollOverflow())\n\t\t\tconst el = this.$refs.scrollEl\n\t\t\tif (el) {\n\t\t\t\tthis._scrollObserver.observe(el)\n\t\t\t\t// The table itself, not just the port: a column widening pushes\n\t\t\t\t// the content past the fold without the port changing size.\n\t\t\t\tconst table = el.querySelector('table')\n\t\t\t\tif (table) {\n\t\t\t\t\tthis._scrollObserver.observe(table)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Recompute whether the scrollport overflows horizontally.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tmeasureScrollOverflow() {\n\t\t\tthis.measurePins()\n\t\t\tconst el = this.$refs.scrollEl\n\t\t\t// 1px of tolerance: sub-pixel layout rounding otherwise reports a\n\t\t\t// table that visually fits as scrollable, which would put a tab\n\t\t\t// stop on it for no reachable content.\n\t\t\tconst next = !!el && (el.scrollWidth - el.clientWidth) > 1\n\t\t\tif (next !== this.isScrollable) {\n\t\t\t\tthis.isScrollable = next\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Tear down the overflow observer.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tdisconnectScrollOverflow() {\n\t\t\tif (this._scrollObserver) {\n\t\t\t\tthis._scrollObserver.disconnect()\n\t\t\t\tthis._scrollObserver = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Resolve a column header label through the consumer's translation\n\t\t * function. Column labels originate from schema property titles\n\t\t * (English canonical source); this makes the rendered header follow\n\t\t * the user's language when the host app provides `cnTranslate`, and\n\t\t * returns the label unchanged when it does not.\n\t\t *\n\t\t * @param {string} label The English source label (schema property title).\n\t\t * @return {string} The translated label, or the input unchanged.\n\t\t */\n\t\ttranslateLabel(label) {\n\t\t\tif (!label) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\treturn fn(label)\n\t\t},\n\n\t\t/**\n\t\t * Self-fetch rows from OpenRegister (register + schemaId mode). Best-effort:\n\t\t * any failure leaves the fetched rows empty. Folded from CnTableWidget.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fetchData() {\n\t\t\tthis.selfFetchLoading = true\n\t\t\ttry {\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schemaId}', {\n\t\t\t\t\tregister: String(this.register),\n\t\t\t\t\tschemaId: String(this.schemaId),\n\t\t\t\t})\n\t\t\t\tconst { data } = await axios.get(url, {\n\t\t\t\t\theaders: { 'OCS-APIREQUEST': 'true' },\n\t\t\t\t\t...(this.fetchParams ? { params: this.fetchParams } : {}),\n\t\t\t\t})\n\t\t\t\tthis.fetchedRows = (data && data.results) || (Array.isArray(data) ? data : [])\n\t\t\t\tthis.fetchedLenses = readLensReports(data)\n\t\t\t} catch {\n\t\t\t\tthis.fetchedRows = []\n\t\t\t\tthis.fetchedLenses = {}\n\t\t\t} finally {\n\t\t\t\tthis.selfFetchLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Activate the \"View all\" footer control: emit `view-all`, then push\n\t\t * `viewAllRoute` through the router when there is one. A plain left\n\t\t * click on the link is handled in-app; a modified click (ctrl/cmd/\n\t\t * shift/middle) is left to the browser so \"open in new tab\" keeps\n\t\t * working on the real href.\n\t\t *\n\t\t * @param {MouseEvent} [event] The click event, when triggered by one.\n\t\t * @return {void}\n\t\t */\n\t\tonViewAll(event) {\n\t\t\tconst modified = Boolean(event && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button))\n\t\t\tif (event && !modified) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\t\t\t/** @event view-all Emitted when the built-in \"View all\" footer control is activated. Payload: the `viewAllRoute` object. */\n\t\t\tthis.$emit('view-all', this.viewAllRoute)\n\t\t\tif (modified) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.viewAllRoute && this.$router) {\n\t\t\t\tthis.$router.push(this.viewAllRoute).catch(() => {})\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Resolve the leading-row icon name for a row. Returns the static\n\t\t * `rowIcon` string, or the result of the `rowIcon(row)` function.\n\t\t *\n\t\t * @param {object} row The row object.\n\t\t * @return {string} The MDI icon name (PascalCase).\n\t\t */\n\t\tgetRowIcon(row) {\n\t\t\treturn typeof this.rowIcon === 'function' ? this.rowIcon(row) : this.rowIcon\n\t\t},\n\n\t\t/**\n\t\t * Get a cell value from a row using dot-notation key.\n\t\t *\n\t\t * OpenRegister system/metadata fields (created, updated, owner, uri,\n\t\t * size, register, schema, ...) live under the object's `@self` block.\n\t\t * For a flat key we fall back to `@self` when the top level has no\n\t\t * value, so sidebar-enabled metadata columns resolve. Top-level fields\n\t\t * always win, keeping existing behaviour unchanged.\n\t\t *\n\t\t * @param {object} row The row data\n\t\t * @param {string} key The column key (supports dot notation: 'address.city')\n\t\t * @return {unknown} The cell value\n\t\t */\n\t\tgetCellValue(row, key) {\n\t\t\tif (typeof key !== 'string') {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tif (key.includes('.')) {\n\t\t\t\treturn key.split('.').reduce((obj, k) => obj?.[k], row)\n\t\t\t}\n\t\t\tif (row?.[key] === undefined && row?.['@self'] && typeof row['@self'] === 'object') {\n\t\t\t\treturn row['@self'][key]\n\t\t\t}\n\t\t\treturn row?.[key]\n\t\t},\n\n\t\t/**\n\t\t * Get the schema property definition for a column key, or `{}` when\n\t\t * there is no schema (manual mode) or no matching property. The result\n\t\t * is handed to `CnCellRenderer` for type-aware rendering; an empty\n\t\t * object makes it fall back to `formatValue()` (plain truncated text).\n\t\t *\n\t\t * @param {string} key Column key\n\t\t * @return {object} Property definition (possibly empty).\n\t\t */\n\t\tgetSchemaProperty(key) {\n\t\t\treturn this.schema?.properties?.[key] || {}\n\t\t},\n\n\t\t/**\n\t\t * Effective property definition handed to CnCellRenderer for a column:\n\t\t * the schema property augmented with the column's own `type`/`format`/\n\t\t * `enum`/`enumLabels` hints. Lets synthesized columns that have no\n\t\t * schema property (e.g. metadata fields with `format: 'date-time'` /\n\t\t * `'uri'`, or a dotted path into a reference this table was never\n\t\t * handed a `:schema` for at all) still get type-aware rendering.\n\t\t * `enumLabels` rides with `enum` rather than getting its own `if`\n\t\t * branch: a column can't usefully declare labels without also\n\t\t * declaring the codes they label. A column `colorMap` (raw value to\n\t\t * badge variant) colours the enum pill from the manifest and wins over\n\t\t * the schema property's own `colorMap` / `x-color-map`. A column with\n\t\t * `valueField` takes that field's property.\n\t\t *\n\t\t * @param {object} col Column definition.\n\t\t * @spec openspec/changes/screens-table-footer-and-system-dates-parity/specs/index-list-board-look/spec.md#requirement-a-system-date-can-be-a-column\n\t\t * @return {object} Property definition for CnCellRenderer.\n\t\t * @spec openspec/changes/screens-cell-pill-parity/specs/cell-pill-tones/spec.md#requirement-a-manifest-column-colours-its-enum-pills\n\t\t */\n\t\tcolumnProperty(col) {\n\t\t\tconst base = this.getSchemaProperty(this.columnValueField(col))\n\t\t\t// A system date (`@self.created`, `@self.updated`, ...) has no\n\t\t\t// schema property behind it; it renders as a date-time.\n\t\t\tif (Object.keys(base).length === 0 && SYSTEM_DATE_KEYS.includes(col.key) && !col.type && !col.format) {\n\t\t\t\treturn { type: 'string', format: 'date-time' }\n\t\t\t}\n\t\t\tconst colorMap = col && col.colorMap && typeof col.colorMap === 'object' && !Array.isArray(col.colorMap) ? col.colorMap : null\n\t\t\tif (col && (col.format || col.type || col.enum || colorMap)) {\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\t...(col.type ? { type: col.type } : {}),\n\t\t\t\t\t...(col.format ? { format: col.format } : {}),\n\t\t\t\t\t...(col.enum ? { enum: col.enum, enumLabels: col.enumLabels || base.enumLabels } : {}),\n\t\t\t\t\t...(colorMap ? { colorMap } : {}),\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\n\t\t/**\n\t\t * Declarative cell-format spec handed to CnCellRenderer's `format` prop\n\t\t * (an object: `{ style, currency, decimals, ... }`). `col.format` is\n\t\t * overloaded — for schema-derived columns it is the schema format STRING\n\t\t * (`'date'`, `'uri'`, ...), which is NOT a declarative spec and drives\n\t\t * type-aware rendering via `columnProperty()` instead. Only forward an\n\t\t * object here, so a string schema-format no longer trips CnCellRenderer's\n\t\t * `Object`-typed `format` prop (Vue prop-type warning).\n\t\t *\n\t\t * @param {object} col Column definition.\n\t\t * @return {object|null} The declarative format spec, or null.\n\t\t */\n\t\tcolumnFormat(col) {\n\t\t\treturn (col && typeof col.format === 'object') ? col.format : null\n\t\t},\n\n\t\t/**\n\t\t * The pills a cell draws beside its value: each `col.pills` entry\n\t\t * (`{ field, equals | in | ..., label, variant? }`, the row-indicator\n\t\t * condition grammar) whose condition holds on the row, its label\n\t\t * translated.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @param {object} col The column definition.\n\t\t * @return {Array<{label: string, variant: string}>} The pills, in declared order.\n\t\t * @spec openspec/changes/column-cell-pills/specs/data-table/spec.md#requirement-a-column-can-put-a-pill-beside-a-cells-value\n\t\t */\n\t\tcellPills(row, col) {\n\t\t\tif (!col || !Array.isArray(col.pills) || col.pills.length === 0) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn col.pills\n\t\t\t\t.filter((pill) => pill && typeof pill.label === 'string' && pill.label !== '' && typeof pill.field === 'string' && indicatorApplies(pill, row || {}))\n\t\t\t\t.map((pill) => ({ label: this.translateLabel(pill.label), variant: typeof pill.variant === 'string' ? pill.variant : 'default' }))\n\t\t},\n\n\t\t/**\n\t\t * The secondary line of a cell, from `col.secondary`: a function is\n\t\t * called with the row; a string with `{field}` placeholders is a\n\t\t * template filled from the row (dotted paths allowed), where a\n\t\t * `{field|format}` token is formatted by `fillTemplate` (\"{startAt|weekday}\"\n\t\t * reads \"wo 7 okt\"); any other string is a field key. Returns '' when\n\t\t * there is nothing to draw.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-a-table-column-carries-a-secondary-line\n\t\t * @param {object} row The row.\n\t\t * @param {object} col The column definition.\n\t\t * @return {string} The secondary text, or ''.\n\t\t */\n\t\tsecondaryValue(row, col) {\n\t\t\treturn this.cellLineValue(row, col?.secondary, col)\n\t\t},\n\n\t\t/**\n\t\t * The muted line above a cell's value, from `col.overline` (read like\n\t\t * `secondary`) or else `col.overlineText`, a fixed text in the host's\n\t\t * translation (PtToegangsverzoeken \"Zaken van\"). Returns '' when there\n\t\t * is nothing to draw.\n\t\t *\n\t\t * @spec openspec/changes/table-cell-overline/specs/data-table/spec.md#requirement-a-table-column-can-carry-a-muted-line-above-its-value\n\t\t * @param {object} row The row.\n\t\t * @param {object} col The column definition.\n\t\t * @return {string} The overline text, or ''.\n\t\t */\n\t\toverlineValue(row, col) {\n\t\t\tconst fromRow = this.cellLineValue(row, col?.overline, col)\n\t\t\tif (fromRow !== '') {\n\t\t\t\treturn fromRow\n\t\t\t}\n\t\t\treturn typeof col?.overlineText === 'string' && col.overlineText !== '' ? this.translateLabel(col.overlineText) : ''\n\t\t},\n\n\t\t/**\n\t\t * One extra line of a cell from its spec: a function is called with the\n\t\t * row; a string with `{field}` placeholders is a template filled from\n\t\t * the row; any other string is a field key. Shared by `secondary` and\n\t\t * `overline`.\n\t\t *\n\t\t * @spec openspec/changes/table-cell-overline/specs/data-table/spec.md#requirement-a-table-column-can-carry-a-muted-line-above-its-value\n\t\t * @param {object} row The row.\n\t\t * @param {Function|string|undefined} spec The line's spec.\n\t\t * @param {object} [col] The column, for its `secondaryLabels`.\n\t\t * @return {string} The text, or ''.\n\t\t */\n\t\tcellLineValue(row, spec, col) {\n\t\t\tif (typeof spec === 'function') {\n\t\t\t\tconst out = spec(row)\n\t\t\t\treturn out === null || out === undefined ? '' : String(out)\n\t\t\t}\n\t\t\tif (typeof spec !== 'string' || spec === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tif (spec.includes('{')) {\n\t\t\t\tconst filled = joinTemplateParts(spec, (key) => (key.includes('|')\n\t\t\t\t\t? fillTemplate(`{${key}}`, row)\n\t\t\t\t\t: this.secondaryFieldText(row, key, col)))\n\t\t\t\t// A template whose every field is empty leaves only separators:\n\t\t\t\t// nothing worth a line.\n\t\t\t\treturn /[\\p{L}\\p{N}]/u.test(filled) ? filled.trim() : ''\n\t\t\t}\n\t\t\treturn this.secondaryFieldText(row, spec, col)\n\t\t},\n\n\t\t/**\n\t\t * The text of one field on a secondary line. A value the column's\n\t\t * `secondaryLabels[key]` names reads as that label, else as its `'*'`\n\t\t * label, translated. An enum field reads as its label (`x-enum-labels`,\n\t\t * in the user's language), as an enum cell does, so \"regular\" reads\n\t\t * \"Gewone vergadering\". Anything else is the stored value as text.\n\t\t *\n\t\t * @spec openspec/changes/screens-secondary-enum-label/specs/data-table/spec.md\n\t\t * @param {object} row The row.\n\t\t * @param {string} key The field key (dotted paths allowed).\n\t\t * @param {object} [col] The column, for its `secondaryLabels`.\n\t\t * @return {string} The text, or '' when the field is empty.\n\t\t */\n\t\tsecondaryFieldText(row, key, col) {\n\t\t\tconst value = this.getCellValue(row, key)\n\t\t\tif (value === null || value === undefined) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst named = col?.secondaryLabels?.[key]\n\t\t\tif (named && typeof named === 'object' && typeof value !== 'object') {\n\t\t\t\tconst label = Object.hasOwn(named, String(value)) ? named[String(value)] : named['*']\n\t\t\t\tif (typeof label === 'string' && label !== '') {\n\t\t\t\t\treturn this.translateLabel(label)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst property = this.getSchemaProperty(key)\n\t\t\tif (typeof value !== 'object' && value !== '' && Array.isArray(property.enum) && property.enum.length > 0) {\n\t\t\t\tconst labels = property.enumLabels || property['x-enum-labels'] || {}\n\t\t\t\treturn this.translateLabel(labels[String(value)] || String(value))\n\t\t\t}\n\t\t\treturn String(value)\n\t\t},\n\n\t\t/**\n\t\t * Value to render in a cell. For a column that declares `aggregate`\n\t\t * (a count of related objects), returns the cached count once\n\t\t * `loadAggregates()` has resolved it (or `'…'` while pending, `'—'`\n\t\t * if it failed / there's nothing to count). A count of zero reads as\n\t\t * `aggregate.zeroLabel` when the column sets one (\"None\", which the\n\t\t * app's `cnTranslate` turns into \"Geen\" as the boards draw it); without\n\t\t * it the cell shows `0` as before. Otherwise the row's value of the\n\t\t * column's `valueField` (else its key) via `getCellValue`.\n\t\t *\n\t\t * @spec openspec/changes/aggregate-zero-label/specs/aggregate-zero-label/spec.md#requirement-a-count-column-can-name-zero\n\t\t * @spec openspec/changes/cell-config-growth/specs/cell-config-growth/spec.md#requirement-a-column-can-show-one-field-and-sort-on-another\n\t\t * @param {object} row The row data.\n\t\t * @param {object} col The column definition.\n\t\t * @return {unknown} The value handed to the slot / CnCellRenderer.\n\t\t */\n\t\tcellValue(row, col) {\n\t\t\tif (col && col.aggregate) {\n\t\t\t\tconst cached = this.aggregateValues[String(row[this.rowKey])]\n\t\t\t\tconst v = cached ? cached[col.key] : undefined\n\t\t\t\tif (v === undefined) {\n\t\t\t\t\treturn this.aggregateLoading ? '…' : '—'\n\t\t\t\t}\n\t\t\t\tif (v === null && !(typeof col.aggregate.zeroLabel === 'string' && col.aggregate.zeroLabel !== '')) {\n\t\t\t\t\treturn '—'\n\t\t\t\t}\n\t\t\t\tconst zeroLabel = col.aggregate.zeroLabel\n\t\t\t\tif ((v === 0 || v === '0' || v === null) && typeof zeroLabel === 'string' && zeroLabel !== '') {\n\t\t\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(zeroLabel) : zeroLabel\n\t\t\t\t}\n\t\t\t\treturn v\n\t\t\t}\n\t\t\treturn this.getCellValue(row, this.columnValueField(col))\n\t\t},\n\n\t\t/**\n\t\t * Whether an aggregate cell shows its `zeroLabel` as muted text instead\n\t\t * of through the column's widget (`aggregate.zeroAs: \"text\"`): a count\n\t\t * of zero, or a max with nothing to read.\n\t\t *\n\t\t * @param {object} row The row data.\n\t\t * @param {object} col The column definition.\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/aggregate-zero-as-text/specs/index-page/spec.md#requirement-a-count-column-can-show-its-zero-label-as-text\n\t\t */\n\t\tisTextZero(row, col) {\n\t\t\tconst aggregate = col && col.aggregate\n\t\t\tif (!aggregate || aggregate.zeroAs !== 'text' || typeof aggregate.zeroLabel !== 'string' || aggregate.zeroLabel === '') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst cached = this.aggregateValues[String(row[this.rowKey])]\n\t\t\tconst v = cached ? cached[col.key] : undefined\n\t\t\treturn v === 0 || v === '0' || v === null\n\t\t},\n\n\t\t/**\n\t\t * The row field a column's cell shows: `col.valueField` when set, else\n\t\t * `col.key`. The key stays what the header sorts and filters on, so a\n\t\t * column can sort on a stored order and show the word it orders.\n\t\t *\n\t\t * @param {object} col Column definition.\n\t\t * @return {string} The field to read.\n\t\t * @spec openspec/changes/cell-config-growth/specs/cell-config-growth/spec.md#requirement-a-column-can-show-one-field-and-sort-on-another\n\t\t */\n\t\tcolumnValueField(col) {\n\t\t\treturn col && typeof col.valueField === 'string' && col.valueField !== '' ? col.valueField : col.key\n\t\t},\n\n\t\t/**\n\t\t * For every column that declares `aggregate`, issue one request per\n\t\t * visible row against the related OpenRegister collection and cache the\n\t\t * answer in `aggregateValues`: `op: \"count\"` asks `_limit=0` for the\n\t\t * total, `op: \"max\"` asks for the one object with the highest `field`\n\t\t * (`_limit=1`, sorted descending) and keeps that value, null when there\n\t\t * is none (shown as `zeroLabel`, else a dash).\n\t\t * Batched with `Promise.all`; a per-request failure degrades that one\n\t\t * cell to `'—'` (logged), never the page. A monotonic request id\n\t\t * discards a stale batch when `rows` / columns change mid-flight.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/masked-formatter-max-aggregate/specs/index-page/spec.md#requirement-a-column-aggregate-can-take-the-highest-value\n\t\t */\n\t\tasync loadAggregates() {\n\t\t\tconst aggCols = this.effectiveColumns.filter((c) => c && c.aggregate && (isEndpointAggregate(c) || c.aggregate.op === 'count' || (c.aggregate.op === 'max' && c.aggregate.field)))\n\t\t\tif (aggCols.length === 0) {\n\t\t\t\tif (Object.keys(this.aggregateValues).length > 0) {\n\t\t\t\t\tthis.aggregateValues = {}\n\t\t\t\t}\n\t\t\t\tthis.aggregateLoading = false\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst id = ++this.aggregateRequestId\n\t\t\tthis.aggregateLoading = true\n\t\t\tconst next = {}\n\t\t\tconst jobs = []\n\t\t\tfor (const row of this.rows) {\n\t\t\t\tconst rowKey = String(row[this.rowKey])\n\t\t\t\tnext[rowKey] = {}\n\t\t\t\tfor (const col of aggCols) {\n\t\t\t\t\tconst agg = col.aggregate\n\t\t\t\t\tif (isEndpointAggregate(col)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif (!agg.register || !agg.schema) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\t// `max`: the highest `field` among the related objects, as the\n\t\t\t\t\t// first of them sorted on it descending (\"Laatste contact\").\n\t\t\t\t\tjobs.push(fetchRowAggregate(agg, row, (r, path) => this.getCellValue(r, path))\n\t\t\t\t\t\t.then((value) => {\n\t\t\t\t\t\t\tnext[rowKey][col.key] = value\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\tconsole.warn(`[CnDataTable] aggregate \"${col.key}\" count failed for row ${rowKey}`, e)\n\t\t\t\t\t\t\tnext[rowKey][col.key] = undefined\n\t\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const col of aggCols.filter(isEndpointAggregate)) {\n\t\t\t\tjobs.push(this.loadEndpointAggregate(col, next, id))\n\t\t\t}\n\t\t\tawait Promise.all(jobs)\n\t\t\tif (id !== this.aggregateRequestId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.aggregateValues = next\n\t\t\tthis.aggregateLoading = false\n\t\t},\n\n\t\t/**\n\t\t * Whether a column is left out: an aggregate whose `requiresApp` is\n\t\t * not installed, or whose endpoint answered `available: false`.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @return {boolean} True when the column is not drawn.\n\t\t * @spec openspec/changes/aggregate-from-endpoint/specs/cn-data-table/spec.md\n\t\t */\n\t\tisAggregateHidden(col) {\n\t\t\tconst agg = col && typeof col === 'object' ? col.aggregate : null\n\t\t\tif (!agg) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (typeof agg.requiresApp === 'string' && agg.requiresApp !== '' && !isAppInstalled(agg.requiresApp)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn this.aggregateUnavailable[col.key] === true\n\t\t},\n\n\t\t/**\n\t\t * Read an endpoint aggregate for the visible rows in one request:\n\t\t * GET `aggregate.endpoint` with `keys` (the rows' `aggregate.key`\n\t\t * values), answered by `{ available, values: { key: value } }`. A row\n\t\t * the answer does not name, or with no key, counts 0. `available: false`\n\t\t * hides the column.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @param {object} next The values being built, by row then column.\n\t\t * @param {number} id The batch id, to drop a stale answer.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/aggregate-from-endpoint/specs/cn-data-table/spec.md\n\t\t */\n\t\tasync loadEndpointAggregate(col, next, id) {\n\t\t\tconst agg = col.aggregate\n\t\t\tconst keyOf = (row) => {\n\t\t\t\tconst value = this.getCellValue(row, agg.key)\n\t\t\t\treturn value === undefined || value === null || value === '' ? '' : String(value)\n\t\t\t}\n\t\t\tconst keys = [...new Set(this.rows.map(keyOf).filter((k) => k !== ''))]\n\t\t\tlet values = {}\n\t\t\tif (keys.length > 0) {\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await axios.get(generateUrl(agg.endpoint), { params: { keys } })\n\t\t\t\t\tconst body = (res && res.data) || {}\n\t\t\t\t\tif (body.available === false) {\n\t\t\t\t\t\tif (id === this.aggregateRequestId) {\n\t\t\t\t\t\t\tthis.aggregateUnavailable = { ...this.aggregateUnavailable, [col.key]: true }\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tvalues = body.values && typeof body.values === 'object' ? body.values : {}\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`[CnDataTable] aggregate \"${col.key}\" endpoint failed`, e)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const row of this.rows) {\n\t\t\t\tconst k = keyOf(row)\n\t\t\t\tnext[String(row[this.rowKey])][col.key] = k !== '' && values[k] !== undefined ? values[k] : 0\n\t\t\t}\n\t\t},\n\n\t\tisSelected(row) {\n\t\t\treturn this.selectedIds.includes(row[this.rowKey])\n\t\t},\n\n\t\t/**\n\t\t * Row-body click: toggles selection when `selectable` (ignoring drags),\n\t\t * otherwise emits `row-click` for navigation.\n\t\t *\n\t\t * @param {object} row The clicked row object\n\t\t * @param {MouseEvent} [event] The originating click event.\n\t\t */\n\t\tonRowClick(row, event) {\n\t\t\tif (this.wasDrag(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.selectable && !this.rowClickToView) {\n\t\t\t\tthis.toggleSelect(row)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.emitRowClick(row, event)\n\t\t},\n\n\t\t/**\n\t\t * Row mousedown: record the press for the drag guard, and on a row a\n\t\t * middle click opens, keep the browser from starting autoscroll.\n\t\t *\n\t\t * @param {MouseEvent} event The mousedown event.\n\t\t */\n\t\tonRowMouseDown(event) {\n\t\t\tthis.onPointerDown(event)\n\t\t\tif (!this.selectable || this.rowClickToView) {\n\t\t\t\tpreventMiddleClickAutoscroll(event)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Row-body middle click: emits `row-aux-click`, not `row-click`, so an\n\t\t * existing `row-click` listener that navigates never moves the current\n\t\t * tab away; `rowClickRoute` still opens the row in a new tab. Ignored\n\t\t * for other buttons, nested controls, drags and select-on-click tables.\n\t\t *\n\t\t * @param {object} row The clicked row object\n\t\t * @param {MouseEvent} event The originating auxclick event.\n\t\t */\n\t\tonRowAuxClick(row, event) {\n\t\t\tif (!isRowMiddleClick(event) || this.wasDrag(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.selectable && !this.rowClickToView) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event row-aux-click Emitted on a row-body middle click, under the same conditions as `row-click`, so a host can open the row in a new tab (see `openRowTarget`). Payload: `(row, event)` — the clicked row object and the native auxclick event.\n\t\t\t * @type {object} The clicked row object.\n\t\t\t */\n\t\t\tthis.$emit('row-aux-click', row, event)\n\t\t\tthis.followRowClickRoute(row, event)\n\t\t},\n\n\t\t/**\n\t\t * Emit `row-click` and follow `rowClickRoute` when set.\n\t\t *\n\t\t * @param {object} row The clicked row object\n\t\t * @param {MouseEvent} [event] The originating click event.\n\t\t */\n\t\temitRowClick(row, event) {\n\t\t\t/**\n\t\t\t * @event row-click Emitted on a row-body click for navigation. Fires when `selectable` is false, OR when `rowClickToView` is set (selection then happens via the checkbox column). Payload: `(row, event)` — the clicked row object and the native click event, so a host can open the row in a new tab on a ctrl/cmd/shift click (see `openRowTarget`). A middle click emits `row-aux-click` instead.\n\t\t\t * @type {object} The clicked row object.\n\t\t\t */\n\t\t\tthis.$emit('row-click', row, event)\n\t\t\tthis.followRowClickRoute(row, event)\n\t\t},\n\n\t\t/**\n\t\t * Follow `rowClickRoute` for a row click: in place, or in a new tab on\n\t\t * a ctrl/cmd/shift or middle click.\n\t\t *\n\t\t * @param {object} row The clicked row object\n\t\t * @param {MouseEvent} [event] The originating click or auxclick event.\n\t\t */\n\t\tfollowRowClickRoute(row, event) {\n\t\t\t// A new-tab click opens the route in a new tab, unless a listener\n\t\t\t// already did.\n\t\t\tif (this.rowClickRoute && this.$router && !isNewTabHandled(event)) {\n\t\t\t\tconst route = this.rowClickRoute(row)\n\t\t\t\tif (route) {\n\t\t\t\t\tmarkNewTabHandled(event, openRowTarget(event, typeof route === 'string' ? { path: route } : route, this.$router))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * A plain or alt click on a row link routes in place; a new-tab click\n\t\t * is left to the browser, which opens the href itself.\n\t\t *\n\t\t * @param {object} row The row the link belongs to.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonRowLinkClick(row, event) {\n\t\t\tconst link = this.rowLinks[String(row[this.rowKey])]\n\t\t\tif (!link) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Alt-click on a link downloads it; a row opens like a plain click.\n\t\t\tif (event.altKey && !isNewTabClick(event) && !event.defaultPrevented) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.$router.push(link.target).catch(() => {})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowLinkClick(event, link.target, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * The row link's accessible name: the row's first cell when it holds\n\t\t * plain text, else a generic name.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @param {object} col The first data column.\n\t\t * @return {string}\n\t\t */\n\t\trowLinkLabel(row, col) {\n\t\t\tconst value = this.cellValue(row, col)\n\t\t\tif (['string', 'number'].includes(typeof value) && String(value).trim() !== '') {\n\t\t\t\treturn String(value)\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Open row')\n\t\t},\n\n\t\t/**\n\t\t * Row right-click: forward the row + originating event so a host can\n\t\t * open a context menu. The browser menu is prevented, except on a row\n\t\t * link when no host listens, so its link actions stay available.\n\t\t *\n\t\t * @param {object} row The right-clicked row object.\n\t\t * @param {MouseEvent} event The originating contextmenu event.\n\t\t */\n\t\tonRowContextMenu(row, event) {\n\t\t\tconst fromRowLink = event.target?.closest?.('.cn-table-row__link')\n\t\t\t// `$.vnode.props`, not `$attrs`: a declared emit is stripped from `$attrs`.\n\t\t\tif (!fromRowLink || this.$.vnode.props?.onRowContextMenu) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event row-context-menu Emitted on a row right-click (contextmenu) for hosts that render a context menu.\n\t\t\t * @type {{ row: object, event: MouseEvent }}\n\t\t\t */\n\t\t\tthis.$emit('row-context-menu', { row, event })\n\t\t},\n\n\t\t/**\n\t\t * Index of `key` within `effectiveSortKeys`, or -1 when not active.\n\t\t * Used by the template for the arrow.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @return {number}\n\t\t */\n\t\tsortKeyIndex(key) {\n\t\t\treturn this.effectiveSortKeys.findIndex((k) => k && k.key === key)\n\t\t},\n\n\t\t/**\n\t\t * The 1-based priority badge for `key` among the rendered sort keys, or null when fewer than two rendered columns are sorted or `key` is not one of them.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @return {number|null}\n\t\t */\n\t\tsortBadgeFor(key) {\n\t\t\tif (this.renderedSortKeys.length < 2) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst index = this.renderedSortKeys.findIndex((k) => k.key === key)\n\t\t\treturn index === -1 ? null : index + 1\n\t\t},\n\n\t\t/**\n\t\t * `aria-sort` value for a column header: `'ascending'`/`'descending'` for the first rendered sort key only, per WCAG guidance that `aria-sort` describes single-column sort state.\n\t\t * `null` omits the attribute entirely (unsorted, not sortable, or not the first rendered sort key).\n\t\t *\n\t\t * @param {object} col Column definition.\n\t\t * @return {string|null}\n\t\t */\n\t\tariaSortFor(col) {\n\t\t\tif (!col.sortable) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst primary = this.renderedSortKeys[0]\n\t\t\tif (!primary || primary.key !== col.key) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn primary.order === 'asc' ? 'ascending' : 'descending'\n\t\t},\n\n\t\t/**\n\t\t * Header click: plain click = single-sort (existing behavior,\n\t\t * unchanged); shift+click appends/cycles the column as a secondary or\n\t\t * tertiary sort key. See `src/utils/multiColumnSort.js`.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @param {MouseEvent} [event] The originating click event.\n\t\t */\n\t\t/**\n\t\t * The filter definition for a column, or null when it does not filter\n\t\t * (header filters off, `filterable: false`, or nothing to filter on).\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @return {object|null}\n\t\t */\n\t\tfilterDefFor(col) {\n\t\t\tif (!this.filterable || !col) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn columnFilterDef(col, this.filterSchema || this.schema)\n\t\t},\n\n\t\tcolumnFilterStateFor(col) {\n\t\t\treturn columnFilterState(this.filterDefFor(col), this.activeFilters)\n\t\t},\n\n\t\tisColumnFiltered(col) {\n\t\t\tconst def = this.filterDefFor(col)\n\t\t\treturn !!def && isColumnFilterActive(def, this.activeFilters)\n\t\t},\n\n\t\tfilterButtonLabel(col) {\n\t\t\tconst column = this.translateLabel(col.label)\n\t\t\treturn this.isColumnFiltered(col)\n\t\t\t\t? t('nextcloud-vue', 'Filter by {column}, active', { column })\n\t\t\t\t: t('nextcloud-vue', 'Filter by {column}', { column })\n\t\t},\n\n\t\t/**\n\t\t * Short text for an active filter: the picked labels, or the range.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @return {string}\n\t\t */\n\t\tcolumnFilterSummary(col) {\n\t\t\tconst def = this.filterDefFor(col)\n\t\t\tconst state = this.columnFilterStateFor(col)\n\t\t\tif (!def) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tif (def.kind === 'enum') {\n\t\t\t\tconst labels = Object.fromEntries((def.options || []).map((o) => [o.value, o.label]))\n\t\t\t\treturn state.values.map((v) => this.translateLabel(labels[v] || v)).join(', ')\n\t\t\t}\n\t\t\tif (def.kind === 'reference') {\n\t\t\t\treturn n('nextcloud-vue', '{count} selected', '{count} selected', state.values.length, { count: state.values.length })\n\t\t\t}\n\t\t\tif (def.kind === 'number' || def.kind === 'date') {\n\t\t\t\tif (state.from && state.to) {\n\t\t\t\t\treturn t('nextcloud-vue', '{from} to {to}', { from: state.from, to: state.to })\n\t\t\t\t}\n\t\t\t\treturn state.from\n\t\t\t\t\t? t('nextcloud-vue', 'from {value}', { value: state.from })\n\t\t\t\t\t: t('nextcloud-vue', 'up to {value}', { value: state.to })\n\t\t\t}\n\t\t\tif (def.kind === 'boolean') {\n\t\t\t\treturn state.value === 'true' ? t('nextcloud-vue', 'Yes') : t('nextcloud-vue', 'No')\n\t\t\t}\n\t\t\treturn state.value\n\t\t},\n\n\t\t/**\n\t\t * Open or close a column's filter panel under its button.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @param {Event} event The click.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleColumnFilter(col, event) {\n\t\t\tif (this.openFilterKey === col.key) {\n\t\t\t\tthis.closeColumnFilter()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst target = event && event.currentTarget\n\t\t\tthis.filterAnchorRect = target && typeof target.getBoundingClientRect === 'function'\n\t\t\t\t? target.getBoundingClientRect()\n\t\t\t\t: null\n\t\t\tthis.openFilterKey = col.key\n\t\t},\n\n\t\t/**\n\t\t * Close the open panel and give focus back to its button.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tcloseColumnFilter() {\n\t\t\tconst key = this.openFilterKey\n\t\t\tthis.openFilterKey = ''\n\t\t\tif (!key) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst ref = this.$refs['filterButton-' + key]\n\t\t\t\tconst button = Array.isArray(ref) ? ref[0] : ref\n\t\t\t\tif (button && typeof button.focus === 'function') {\n\t\t\t\t\tbutton.focus()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Apply a panel's state: emit the query parameters it stands for.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @param {object} state The panel state.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/table-header-sort-and-filter/specs/cn-data-table/spec.md#requirement-a-header-filter-speaks-the-sidebars-query-language\n\t\t */\n\t\tapplyColumnFilter(col, state) {\n\t\t\tconst def = this.filterDefFor(col)\n\t\t\tif (def) {\n\t\t\t\t/**\n\t\t\t\t * @event column-filter A header filter was applied or cleared.\n\t\t\t\t * @type {{ key: string, params: object }} `params` maps each query parameter the column owns to its values; an empty list clears it.\n\t\t\t\t */\n\t\t\t\tthis.$emit('column-filter', { key: col.key, params: columnFilterParams(def, state) })\n\t\t\t}\n\t\t\tthis.closeColumnFilter()\n\t\t},\n\n\t\tclearColumnFilter(col) {\n\t\t\tconst def = this.filterDefFor(col)\n\t\t\tif (def) {\n\t\t\t\tthis.$emit('column-filter', { key: col.key, params: clearedColumnFilterParams(def) })\n\t\t\t}\n\t\t},\n\n\t\tonHeaderClick(key, event) {\n\t\t\tthis.applySort(key, !!(event && event.shiftKey))\n\t\t},\n\n\t\t/**\n\t\t * Header keydown: `Enter` = plain click, `Shift+Enter` = shift+click.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @param {KeyboardEvent} event The originating keydown event.\n\t\t */\n\t\tonHeaderKeydown(key, event) {\n\t\t\tif (event.key !== 'Enter') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.applySort(key, !!event.shiftKey)\n\t\t},\n\n\t\t/**\n\t\t * Compute and emit the next sort state for a header interaction.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @param {boolean} append `true` for a shift+click/shift+Enter (append/cycle a secondary key).\n\t\t */\n\t\tapplySort(key, append) {\n\t\t\tconst keys = nextSortState(this.effectiveSortKeys, key, { append })\n\t\t\tconst primary = keys[0] || null\n\t\t\t/**\n\t\t\t * @event sort Emitted when a sortable column header is clicked (plain click) or shift-clicked (multi-sort).\n\t\t\t * @type {{ key: string|null, order: 'asc'|'desc'|null, keys: Array<{key: string, order: 'asc'|'desc'}> }}\n\t\t\t * `key`/`order` mirror the PRIMARY (first) active sort key exactly as the pre-multi-sort single-key\n\t\t\t * contract did (`null`/`null` when cleared) — existing listeners destructuring `{ key, order }` are\n\t\t\t * unaffected. `keys` is new: the full ordered list (0 to 3 entries) for multi-sort-aware hosts.\n\t\t\t */\n\t\t\tthis.$emit('sort', {\n\t\t\t\tkey: primary ? primary.key : null,\n\t\t\t\torder: primary ? primary.order : null,\n\t\t\t\tkeys,\n\t\t\t})\n\t\t},\n\n\t\ttoggleSelect(row) {\n\t\t\tconst id = row[this.rowKey]\n\t\t\tconst newIds = this.isSelected(row)\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\n\t\t\t\t: [...this.selectedIds, id]\n\t\t\t/** @event select Emitted when row selection changes. Payload: array of selected IDs. */\n\t\t\tthis.$emit('select', newIds)\n\t\t},\n\n\t\ttoggleSelectAll() {\n\t\t\tif (this.allSelected) {\n\t\t\t\t// Remove only current page IDs, preserving cross-page selections\n\t\t\t\tconst currentPageIds = new Set(this.rows.map((row) => row[this.rowKey]))\n\t\t\t\tthis.$emit('select', this.selectedIds.filter((id) => !currentPageIds.has(id)))\n\t\t\t} else {\n\t\t\t\t// Add current page IDs to existing selections\n\t\t\t\tconst merged = new Set([...this.selectedIds, ...this.rows.map((row) => row[this.rowKey])])\n\t\t\t\tthis.$emit('select', [...merged])\n\t\t\t}\n\t\t\t/** @event select-all Emitted when select-all checkbox is toggled. */\n\t\t\tthis.$emit('select-all', !this.allSelected)\n\t\t},\n\t},\n}\n</script>\n"],"names":["CnCellRenderer","CnColumnFilterPopover","CnIcon","CnLockIndicator","CnStatusBadge","CnPagination","CnUnreadMarker","t","axios","n"],"mappings":"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"}
1
+ {"version":3,"file":"CnDataTable.vue2.js","sources":["../../../../src/components/CnDataTable/CnDataTable.vue"],"sourcesContent":["<template>\n\t<div\n\t\tclass=\"cn-table-container\"\n\t\tdata-testid=\"cn-object-list\"\n\t\t:class=\"{\n\t\t\t'cn-table-container--board': isBoardLook,\n\t\t\t'cn-table-container--title-plain': isBoardLook && rowTitle === 'plain',\n\t\t\t'cn-table-container--title-text': isBoardLook && rowTitle === 'text',\n\t\t\t'cn-table-container--title-strong': isBoardLook && rowTitle === 'strong',\n\t\t\t'cn-table-container--scrollable': scrollable,\n\t\t\t'cn-table-container--borderless': borderless,\n\t\t\t'cn-table-container--fill': fillHeight,\n\t\t}\">\n\t\t<!-- Optional card header (folded from the retired CnTableWidget): a title\n\t\t + total-count badge. Only rendered when `title` is set; bare table\n\t\t usage is unchanged. -->\n\t\t<div v-if=\"title\" class=\"cn-data-table__header\">\n\t\t\t<h3 class=\"cn-data-table__title\">\n\t\t\t\t{{ title }}\n\t\t\t</h3>\n\t\t\t<span v-if=\"totalRowCount > 0\" class=\"cn-data-table__count\">\n\t\t\t\t{{ totalRowCount }}\n\t\t\t</span>\n\t\t</div>\n\n\t\t<!-- Active header filters, one removable chip each. -->\n\t\t<ul\n\t\t\tv-if=\"filterChips && !isLoading && activeColumnFilterChips.length > 0\"\n\t\t\tclass=\"cn-data-table__filter-chips\"\n\t\t\t:aria-label=\"activeFiltersLabel\"\n\t\t\tdata-testid=\"cn-table-filter-chips\">\n\t\t\t<li v-for=\"chip in activeColumnFilterChips\" :key=\"chip.key\" class=\"cn-data-table__filter-chip\">\n\t\t\t\t<span>{{ chip.text }}</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-data-table__filter-chip-remove\"\n\t\t\t\t\t:aria-label=\"chip.removeLabel\"\n\t\t\t\t\tdata-testid=\"cn-table-filter-chip-remove\"\n\t\t\t\t\t@click=\"clearColumnFilter(chip.col)\">\n\t\t\t\t\t×\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t</ul>\n\n\t\t<CnColumnFilterPopover\n\t\t\tv-if=\"openFilterColumn\"\n\t\t\t:key=\"openFilterKey\"\n\t\t\t:def=\"filterDefFor(openFilterColumn)\"\n\t\t\t:state=\"columnFilterStateFor(openFilterColumn)\"\n\t\t\t:label=\"translateLabel(openFilterColumn.label)\"\n\t\t\t:anchorRect=\"filterAnchorRect\"\n\t\t\t:register=\"filterRegister\"\n\t\t\t@apply=\"(state) => applyColumnFilter(openFilterColumn, state)\"\n\t\t\t@close=\"closeColumnFilter\" />\n\n\t\t<!-- Loading State -->\n\t\t<div v-if=\"isLoading\" class=\"cn-table-loading\" data-testid=\"cn-object-list-loading\">\n\t\t\t<!-- Decorative: the adjacent <p> already carries the accessible\n\t\t\t name (loadingText), so the spinner is hidden from the\n\t\t\t accessibility tree rather than exposed as an unlabelled\n\t\t\t role=\"img\" (WCAG 1.1.1 / axe \"role-img-alt\"). -->\n\t\t\t<NcLoadingIcon :size=\"32\" aria-hidden=\"true\" />\n\t\t\t<p>{{ loadingText }}</p>\n\t\t</div>\n\n\t\t<!-- Table. The horizontal scroll lives on this wrapper, NOT on\n\t\t `.cn-table-container`: `overflow-x: auto` on the container coerces\n\t\t its `overflow-y` from `visible` to `auto` (CSS forbids mixing\n\t\t `visible` with a non-visible value), which silently made the\n\t\t container the nearest scrollport. The sticky footer then anchored\n\t\t to a container that never scrolls, so \"View all\" scrolled away with\n\t\t the rows instead of pinning to the bottom of the enclosing widget. -->\n\t\t<!-- The horizontal scrollport must be reachable by keyboard: a region\n\t\t that scrolls but cannot take focus gives a keyboard-only user no\n\t\t way to reach the columns past the fold (axe\n\t\t `scrollable-region-focusable`, serious; WCAG 2.1.1).\n\n\t\t Gated on ACTUAL overflow rather than applied unconditionally, for\n\t\t two reasons. A table that fits needs no scrolling, so a permanent\n\t\t tab stop would put every table in the fleet on the keyboard path\n\t\t for nothing. And the axe rule itself only applies to elements that\n\t\t really are scrollable, so the conditional attribute is present in\n\t\t exactly the cases the rule evaluates.\n\n\t\t `role=\"group\"`, NOT `role=\"region\"`: this element is nested inside\n\t\t `.cn-widget-wrapper__content[role=\"region\"]` on the dashboard-widget\n\t\t path, and a second landmark there would surface as a duplicate.\n\t\t `group` is nameable but is not a landmark. A name is required\n\t\t rather than optional — `aria-label` is PROHIBITED on a role-less\n\t\t generic element, so a bare `tabindex` div would trade this\n\t\t violation for `aria-prohibited-attr` plus an unlabelled mystery\n\t\t stop in the tab order. -->\n\t\t<div\n\t\t\tv-else\n\t\t\tref=\"scrollEl\"\n\t\t\tclass=\"cn-data-table__scroll\"\n\t\t\t:tabindex=\"isScrollable ? 0 : undefined\"\n\t\t\t:role=\"isScrollable ? 'group' : undefined\"\n\t\t\t:aria-label=\"isScrollable ? scrollRegionLabel : undefined\">\n\t\t\t<table\n\t\t\t\tclass=\"cn-data-table\"\n\t\t\t\t:class=\"{ 'cn-data-table--fixed': fixedLayout, 'cn-data-table--fit': fitWidth }\"\n\t\t\t\tdata-testid=\"cn-object-list-table\">\n\t\t\t\t<!-- Without a drawn header row the columns are still named for a\n\t\t\t\t screen reader: plain header cells, collapsed and visually\n\t\t\t\t hidden, with no controls to land on. -->\n\t\t\t\t<thead v-if=\"hideHeader\" class=\"cn-data-table__hidden-head\">\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th v-if=\"selectable\" scope=\"col\" />\n\t\t\t\t\t\t<th v-if=\"rowIcon\" scope=\"col\" />\n\t\t\t\t\t\t<th v-for=\"col in effectiveColumns\" :key=\"col.key\" scope=\"col\">\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ translateLabel(col.label) }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t\t<th v-if=\"$slots['row-actions']\" scope=\"col\">\n\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ actionsColumnLabel }}</span>\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<thead v-else>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<!-- Checkbox column -->\n\t\t\t\t\t\t<th\n\t\t\t\t\t\t\tv-if=\"selectable\"\n\t\t\t\t\t\t\tclass=\"cn-table-col--checkbox\"\n\t\t\t\t\t\t\t:class=\"pinClass(0)\"\n\t\t\t\t\t\t\t:style=\"pinStyle(0)\">\n\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t:modelValue=\"allSelected\"\n\t\t\t\t\t\t\t\t:indeterminate=\"someSelected && !allSelected\"\n\t\t\t\t\t\t\t\t:aria-label=\"selectAllLabel\"\n\t\t\t\t\t\t\t\t@update:modelValue=\"toggleSelectAll\" />\n\t\t\t\t\t\t</th>\n\n\t\t\t\t\t\t<!-- Leading icon column (header is intentionally blank) -->\n\t\t\t\t\t\t<th\n\t\t\t\t\t\t\tv-if=\"rowIcon\"\n\t\t\t\t\t\t\tclass=\"cn-table-col--icon\"\n\t\t\t\t\t\t\t:class=\"pinClass(selectable ? 1 : 0)\"\n\t\t\t\t\t\t\t:style=\"pinStyle(selectable ? 1 : 0)\" />\n\n\t\t\t\t\t\t<!-- Data columns -->\n\t\t\t\t\t\t<th\n\t\t\t\t\t\t\tv-for=\"(col, colIndex) in effectiveColumns\"\n\t\t\t\t\t\t\t:key=\"col.key\"\n\t\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t\tcol.sortable ? 'cn-table-header--sortable' : '',\n\t\t\t\t\t\t\t\tcol.class || '',\n\t\t\t\t\t\t\t\tpinClass(leadingCount + colIndex),\n\t\t\t\t\t\t\t\tisGrowColumn(col) ? 'cn-table-col--grow' : '',\n\t\t\t\t\t\t\t\tcolIndex === titleColumnIndex ? 'cn-table-head--title' : '',\n\t\t\t\t\t\t\t]\"\n\t\t\t\t\t\t\t:style=\"{ ...(col.width ? { width: col.width } : {}), ...pinStyle(leadingCount + colIndex) }\"\n\t\t\t\t\t\t\t:aria-sort=\"ariaSortFor(col)\"\n\t\t\t\t\t\t\t:data-filtered=\"isColumnFiltered(col) ? 'true' : null\"\n\t\t\t\t\t\t\t:title=\"translateLabel(col.description) || null\"\n\t\t\t\t\t\t\t@click=\"col.sortable ? onHeaderClick(col.key, $event) : null\"\n\t\t\t\t\t\t\t@keydown.enter=\"col.sortable ? onHeaderKeydown(col.key, $event) : null\">\n\t\t\t\t\t\t\t<!-- The sort control is a real button named by the column\n\t\t\t\t\t\t\t label; the header's `aria-sort` carries the state. Its\n\t\t\t\t\t\t\t click and Enter bubble to the header's own handlers, so\n\t\t\t\t\t\t\t a click anywhere in the header still sorts. -->\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tv-if=\"col.sortable\"\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-header__sort\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-table-header-sort\">\n\t\t\t\t\t\t\t\t<span :class=\"col.description ? 'cn-table-header--described' : ''\">{{ translateLabel(col.label) }}</span>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"sortKeyIndex(col.key) !== -1\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-header__chevron cn-table-sort-indicator\"\n\t\t\t\t\t\t\t\t\t:data-sort-direction=\"effectiveSortKeys[sortKeyIndex(col.key)].order === 'asc' ? 'asc' : 'desc'\">\n\t\t\t\t\t\t\t\t\t<ChevronUp v-if=\"effectiveSortKeys[sortKeyIndex(col.key)].order === 'asc'\" :size=\"14\" />\n\t\t\t\t\t\t\t\t\t<ChevronDown v-else :size=\"14\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-header__chevron cn-table-header__chevron--idle\">\n\t\t\t\t\t\t\t\t\t<ChevronDown :size=\"14\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"sortBadgeFor(col.key) !== null\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-sort-badge\">\n\t\t\t\t\t\t\t\t\t{{ sortBadgeFor(col.key) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<span v-else :class=\"col.description ? 'cn-table-header--described' : ''\">\n\t\t\t\t\t\t\t\t{{ translateLabel(col.label) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<!-- Header filter: a real button, so it is reachable with Tab\n\t\t\t\t\t\t\t and its click and Enter never also sort the column. -->\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tv-if=\"filterDefFor(col)\"\n\t\t\t\t\t\t\t\t:ref=\"'filterButton-' + col.key\"\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-header__filter\"\n\t\t\t\t\t\t\t\t:class=\"{ 'cn-table-header__filter--active': isColumnFiltered(col) }\"\n\t\t\t\t\t\t\t\t:aria-label=\"filterButtonLabel(col)\"\n\t\t\t\t\t\t\t\taria-haspopup=\"dialog\"\n\t\t\t\t\t\t\t\t:aria-expanded=\"openFilterKey === col.key ? 'true' : 'false'\"\n\t\t\t\t\t\t\t\tdata-testid=\"cn-table-header-filter\"\n\t\t\t\t\t\t\t\t@click.stop=\"toggleColumnFilter(col, $event)\"\n\t\t\t\t\t\t\t\t@keydown.enter.stop>\n\t\t\t\t\t\t\t\t<FilterOutline :size=\"14\" />\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"isColumnFiltered(col)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-header__filter-dot\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-table-header-filter-dot\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</th>\n\n\t\t\t\t\t\t<!-- Actions column -->\n\t\t\t\t\t\t<th v-if=\"$slots['row-actions']\" class=\"cn-table-col--actions\">\n\t\t\t\t\t\t\t<!-- The board look names the column for assistive tech; the menu buttons below it are the only thing drawn. -->\n\t\t\t\t\t\t\t<span v-if=\"isBoardLook\" class=\"hidden-visually\">{{ actionsColumnLabel }}</span>\n\t\t\t\t\t\t\t<!-- @slot Header cell content above the row-actions column (blank by default). -->\n\t\t\t\t\t\t\t<slot name=\"actions-header\" />\n\t\t\t\t\t\t</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\n\t\t\t\t<tbody>\n\t\t\t\t\t<!-- Empty state -->\n\t\t\t\t\t<tr v-if=\"effectiveRows.length === 0\" class=\"cn-table-empty\" data-testid=\"cn-object-list-empty\">\n\t\t\t\t\t\t<td :colspan=\"totalColumns\">\n\t\t\t\t\t\t\t<!-- @slot Empty-state content shown when there are no rows (defaults to `emptyText`, or why an unavailable personal lens is empty). -->\n\t\t\t\t\t\t\t<slot name=\"empty\">\n\t\t\t\t\t\t\t\t<span v-if=\"lensReasonText\" class=\"cn-table-empty__lens-reason\" data-testid=\"cn-data-table-lens-reason\">{{ lensReasonText }}</span>\n\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t{{ translateLabel(emptyText) }}\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</slot>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\n\t\t\t\t\t<!-- Data rows -->\n\t\t\t\t\t<template\n\t\t\t\t\t\tv-for=\"(row, rowIndex) in effectiveRows\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:key=\"row[rowKey]\">\n\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t:draggable=\"reorderable ? 'true' : undefined\"\n\t\t\t\t\t\t\tclass=\"cn-table-row\"\n\t\t\t\t\t\t\tdata-testid=\"cn-object-row\"\n\t\t\t\t\t\t\t:data-testid-row-id=\"row[rowKey]\"\n\t\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t\tisSelected(row) ? 'cn-table-row--selected' : '',\n\t\t\t\t\t\t\t\trowLinks[String(row[rowKey])] ? 'cn-table-row--linked' : '',\n\t\t\t\t\t\t\t\tisUnreadRow(row) ? 'cn-table-row--unread' : '',\n\t\t\t\t\t\t\t\trowClass ? rowClass(row) : '',\n\t\t\t\t\t\t\t\treorderable ? 'cn-table-row--reorderable' : '',\n\t\t\t\t\t\t\t\tdragOverIndex === rowIndex ? 'cn-table-row--drop-target' : '',\n\t\t\t\t\t\t\t]\"\n\t\t\t\t\t\t\t@dragstart=\"onRowDragStart(rowIndex, $event)\"\n\t\t\t\t\t\t\t@dragover=\"onRowDragOver(rowIndex, $event)\"\n\t\t\t\t\t\t\t@dragleave=\"onRowDragLeave(rowIndex)\"\n\t\t\t\t\t\t\t@drop=\"onRowDrop(row, rowIndex, $event)\"\n\t\t\t\t\t\t\t@dragend=\"onRowDragEnd\"\n\t\t\t\t\t\t\t@mousedown=\"onRowMouseDown\"\n\t\t\t\t\t\t\t@click=\"onRowClick(row, $event)\"\n\t\t\t\t\t\t\t@auxclick=\"onRowAuxClick(row, $event)\"\n\t\t\t\t\t\t\t@contextmenu=\"onRowContextMenu(row, $event)\">\n\t\t\t\t\t\t\t<!-- Checkbox -->\n\t\t\t\t\t\t\t<td v-if=\"selectable\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-col--checkbox\"\n\t\t\t\t\t\t\t\t:class=\"pinClass(0)\"\n\t\t\t\t\t\t\t\t:style=\"pinStyle(0)\"\n\t\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t\t@auxclick.stop>\n\t\t\t\t\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t\t\t\t\t:modelValue=\"isSelected(row)\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"selectRowLabel\"\n\t\t\t\t\t\t\t\t\t@update:modelValue=\"toggleSelect(row)\" />\n\t\t\t\t\t\t\t</td>\n\n\t\t\t\t\t\t\t<!-- Leading icon -->\n\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\tv-if=\"rowIcon\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-col--icon\"\n\t\t\t\t\t\t\t\t:class=\"[pinClass(selectable ? 1 : 0), 'cn-table-col--icon-' + iconTone]\"\n\t\t\t\t\t\t\t\t:style=\"pinStyle(selectable ? 1 : 0)\">\n\t\t\t\t\t\t\t\t<CnIcon :name=\"getRowIcon(row)\" :size=\"20\" />\n\t\t\t\t\t\t\t</td>\n\n\t\t\t\t\t\t\t<!-- Data cells -->\n\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\tv-for=\"(col, colIndex) in effectiveColumns\"\n\t\t\t\t\t\t\t\t:key=\"col.key\"\n\t\t\t\t\t\t\t\t:class=\"[col.class || '', col.cellClass || '', cellClass ? cellClass(row, col) : '', pinClass(leadingCount + colIndex), colIndex === titleColumnIndex ? 'cn-table-col--title' : '', isGrowColumn(col) ? 'cn-table-col--grow' : '']\"\n\t\t\t\t\t\t\t\t:style=\"{ ...(col.width ? { maxWidth: col.width } : {}), ...pinStyle(leadingCount + colIndex) }\"\n\t\t\t\t\t\t\t\t@mouseenter=\"titleWhenClipped\">\n\t\t\t\t\t\t\t\t<!-- A row with a `rowClickRoute` is a real link: this anchor\n\t\t\t\t\t\t\t\t is stretched over the whole row by CSS, so hovering shows\n\t\t\t\t\t\t\t\t the URL, a middle or ctrl click opens a new tab natively,\n\t\t\t\t\t\t\t\t and the row is reachable with Tab. The row's own click\n\t\t\t\t\t\t\t\t handlers treat it as a nested control and leave it be. -->\n\t\t\t\t\t\t\t\t<a v-if=\"colIndex === titleColumnIndex && rowLinks[String(row[rowKey])]\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-row__link\"\n\t\t\t\t\t\t\t\t\t:href=\"rowLinks[String(row[rowKey])].href\"\n\t\t\t\t\t\t\t\t\t:aria-label=\"rowLinkLabel(row, col)\"\n\t\t\t\t\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-row-link\"\n\t\t\t\t\t\t\t\t\t@mousemove=\"linkTitleAtPointer\"\n\t\t\t\t\t\t\t\t\t@click=\"onRowLinkClick(row, $event)\" />\n\t\t\t\t\t\t\t\t<!-- The padlock rides the FIRST data cell, beside whatever\n\t\t\t\t\t\t\t\t names the row. Deliberately OUTSIDE the #column-<key>\n\t\t\t\t\t\t\t\t slot: a consumer overriding that column's rendering is\n\t\t\t\t\t\t\t\t customising their own data, not opting out of being told\n\t\t\t\t\t\t\t\t the record is locked. It renders nothing when unlocked,\n\t\t\t\t\t\t\t\t so an unlocked table is byte-for-byte what it was. -->\n\t\t\t\t\t\t\t\t<!-- A reorderable row shows where to take hold of it, before its name. -->\n\t\t\t\t\t\t\t\t<span v-if=\"reorderable && colIndex === 0\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-row__handle\"\n\t\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-row-reorder-handle\">\n\t\t\t\t\t\t\t\t\t<DragVertical :size=\"16\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<CnUnreadMarker\n\t\t\t\t\t\t\t\t\tv-if=\"colIndex === titleColumnIndex && isUnreadRow(row)\" />\n\t\t\t\t\t\t\t\t<CnLockIndicator\n\t\t\t\t\t\t\t\t\tv-if=\"colIndex === titleColumnIndex\"\n\t\t\t\t\t\t\t\t\t:object=\"row\"\n\t\t\t\t\t\t\t\t\t:size=\"16\" />\n\t\t\t\t\t\t\t\t<!-- Declared state indicators ride the first data cell\n\t\t\t\t\t\t\t\t beside the padlock. Each one renders as an icon WITH a\n\t\t\t\t\t\t\t\t text alternative and a tooltip, never as colour alone,\n\t\t\t\t\t\t\t\t and an indicator the page did not declare cannot appear\n\t\t\t\t\t\t\t\t however the record is shaped. Past the cap the rest move\n\t\t\t\t\t\t\t\t into the row menu, because a row of nine icons is not a\n\t\t\t\t\t\t\t\t row anyone can triage at a glance. -->\n\t\t\t\t\t\t\t\t<span v-if=\"colIndex === titleColumnIndex && indicatorsFor(row).shown.length > 0\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-row-indicators\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-row-indicators\">\n\t\t\t\t\t\t\t\t\t<span v-for=\"indicator in indicatorsFor(row).shown\"\n\t\t\t\t\t\t\t\t\t\t:key=\"indicator.id || indicator.field\"\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-table-row-indicator\"\n\t\t\t\t\t\t\t\t\t\t:title=\"translateLabel(indicator.tooltip || indicator.text)\"\n\t\t\t\t\t\t\t\t\t\t:data-testid=\"`cn-row-indicator-${indicator.id || indicator.field}`\">\n\t\t\t\t\t\t\t\t\t\t<CnIcon :name=\"indicator.icon || 'InformationOutline'\" :size=\"16\" />\n\t\t\t\t\t\t\t\t\t\t<span class=\"hidden-visually\">{{ translateLabel(indicator.text) }}</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<!-- A muted line above the value, from `col.overline` or\n\t\t\t\t\t\t\t\t `col.overlineText` (\"Zaken van\" over the organisation). -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"overlineValue(row, col)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__overline\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-cell-overline\">{{ overlineValue(row, col) }}</span>\n\t\t\t\t\t\t\t\t<!-- @slot Per-column cell override (`#column-<key>`), scoped with { row, value }. Wins over CnCellRenderer. -->\n\t\t\t\t\t\t\t\t<slot :name=\"'column-' + col.key\" :row=\"row\" :value=\"cellValue(row, col)\">\n\t\t\t\t\t\t\t\t\t<!-- Every column renders through CnCellRenderer: it resolves\n\t\t\t\t\t\t\t\t col.formatter / col.widget against the injected registries\n\t\t\t\t\t\t\t\t (cnFormatters / cnCellWidgets), uses the schema property when\n\t\t\t\t\t\t\t\t one is available (else {}) for type-aware rendering, and\n\t\t\t\t\t\t\t\t falls back to formatValue(). Columns with `aggregate` get a\n\t\t\t\t\t\t\t\t count of related objects (see cellValue/loadAggregates). The\n\t\t\t\t\t\t\t\t #column-{key} slot still wins. -->\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tv-if=\"isTextZero(row, col)\"\n\t\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__zero\"\n\t\t\t\t\t\t\t\t\t\tdata-testid=\"cn-cell-zero\">{{ cellValue(row, col) }}</span>\n\t\t\t\t\t\t\t\t\t<CnCellRenderer\n\t\t\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t\t\t:value=\"cellValue(row, col)\"\n\t\t\t\t\t\t\t\t\t\t:property=\"columnProperty(col)\"\n\t\t\t\t\t\t\t\t\t\t:formatter=\"col.formatter || null\"\n\t\t\t\t\t\t\t\t\t\t:formatterOptions=\"col.formatterOptions || null\"\n\t\t\t\t\t\t\t\t\t\t:widget=\"col.widget || null\"\n\t\t\t\t\t\t\t\t\t\t:widgetProps=\"col.widgetProps || undefined\"\n\t\t\t\t\t\t\t\t\t\t:secondary=\"col.widget === 'avatar' ? secondaryValue(row, col) : ''\"\n\t\t\t\t\t\t\t\t\t\t:format=\"columnFormat(col)\"\n\t\t\t\t\t\t\t\t\t\t:row=\"row\"\n\t\t\t\t\t\t\t\t\t\t:rowKey=\"rowKey\" />\n\t\t\t\t\t\t\t\t</slot>\n\t\t\t\t\t\t\t\t<!-- Pills beside the value, from `col.pills`: each one whose\n\t\t\t\t\t\t\t\t condition holds on the row (\"Geheimhouding\", DqContacten). -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"cellPills(row, col).length > 0\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__pills\">\n\t\t\t\t\t\t\t\t\t<CnStatusBadge\n\t\t\t\t\t\t\t\t\t\tv-for=\"(pill, pillIndex) in cellPills(row, col)\"\n\t\t\t\t\t\t\t\t\t\t:key=\"pillIndex\"\n\t\t\t\t\t\t\t\t\t\t:label=\"pill.label\"\n\t\t\t\t\t\t\t\t\t\t:variant=\"pill.variant\"\n\t\t\t\t\t\t\t\t\t\tdata-testid=\"cn-cell-pill\" />\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<!-- A second, muted line under the value, from `col.secondary`:\n\t\t\t\t\t\t\t\t a field key, a \"{field} · {other}\" template, or a function\n\t\t\t\t\t\t\t\t of the row. Lets one column read \"title\" over \"number ·\n\t\t\t\t\t\t\t\t requester\" without a custom cell. -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"col.widget !== 'avatar' && secondaryValue(row, col)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__secondary\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-cell-secondary\">{{ secondaryValue(row, col) }}</span>\n\t\t\t\t\t\t\t\t<!-- A row that entered a file-content search through an attached\n\t\t\t\t\t\t\t\t file names it (OpenRegister `@self.matchedFile`): plain text,\n\t\t\t\t\t\t\t\t file name only, under the first cell. -->\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tv-if=\"colIndex === titleColumnIndex && matchedFileOf(row)\"\n\t\t\t\t\t\t\t\t\tclass=\"cn-table-cell__secondary cn-table-cell__matched-file\"\n\t\t\t\t\t\t\t\t\tdata-testid=\"cn-row-matched-file\">{{ matchedFileLabel(row) }}</span>\n\t\t\t\t\t\t\t</td>\n\n\t\t\t\t\t\t\t<!-- Row actions -->\n\t\t\t\t\t\t\t<td v-if=\"$slots['row-actions']\"\n\t\t\t\t\t\t\t\tclass=\"cn-table-col--actions\"\n\t\t\t\t\t\t\t\t:class=\"[cellClass ? cellClass(row, { key: 'actions' }) : '']\"\n\t\t\t\t\t\t\t\t@click.stop\n\t\t\t\t\t\t\t\t@auxclick.stop>\n\t\t\t\t\t\t\t\t<!-- @slot Per-row actions menu (e.g. a CnRowActions), scoped with { row }. Supplying it adds the trailing actions column. -->\n\t\t\t\t\t\t\t\t<slot name=\"row-actions\" :row=\"row\" />\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<!-- A full-width row under each data row, for what belongs to\n\t\t\t\t\t\t that row (its child records). Not draggable and not a drop\n\t\t\t\t\t\t target: a reorder moves the data rows only. -->\n\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\tv-if=\"$slots['row-detail']\"\n\t\t\t\t\t\t\tclass=\"cn-table-row-detail\"\n\t\t\t\t\t\t\tdata-testid=\"cn-row-detail\"\n\t\t\t\t\t\t\t:data-testid-row-id=\"row[rowKey]\">\n\t\t\t\t\t\t\t<td :colspan=\"totalColumns\" class=\"cn-table-row-detail__cell\">\n\t\t\t\t\t\t\t\t<!-- @slot Content under a data row, across the full width (e.g. that row's child records), scoped with { row }. -->\n\t\t\t\t\t\t\t\t<slot name=\"row-detail\" :row=\"row\" />\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</template>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\n\t\t<!-- Optional footer. A `#footer` scoped slot lets a host render its own\n\t\t footer link (e.g. a \"+ New\" create action or an always-shown\n\t\t \"View all\") with its own click handler — useful when the widget runs\n\t\t outside a vue-router context (the built-in link uses $router). When\n\t\t no slot is given, the built-in \"View all\" control (folded from the\n\t\t retired CnTableWidget) is shown for a `limit`-ed subset.\n\n\t\t The control is a real link (with an href) when the router resolves\n\t\t `viewAllRoute` to a URL, and a real button otherwise. An `<a>`\n\t\t without an href has no link role and is not keyboard focusable\n\t\t (WCAG 2.1.1, 4.1.2), so it is never rendered. -->\n\t\t<div\n\t\t\tv-if=\"$slots.footer || (viewAllRoute && totalRowCount > effectiveRows.length)\"\n\t\t\tclass=\"cn-data-table__footer\">\n\t\t\t<!-- @slot Custom footer content, scoped with { total, shown } (defaults to the built-in \"View all\" link). -->\n\t\t\t<slot name=\"footer\" :total=\"totalRowCount\" :shown=\"effectiveRows.length\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"viewAllHref\"\n\t\t\t\t\tclass=\"cn-data-table__view-all\"\n\t\t\t\t\t:href=\"viewAllHref\"\n\t\t\t\t\t@click=\"onViewAll\">\n\t\t\t\t\t{{ viewAllLabel }}\n\t\t\t\t</a>\n\t\t\t\t<button\n\t\t\t\t\tv-else\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-data-table__view-all\"\n\t\t\t\t\t@click=\"onViewAll\">\n\t\t\t\t\t{{ viewAllLabel }}\n\t\t\t\t</button>\n\t\t\t</slot>\n\t\t</div>\n\t\t<!-- `pageSize`: the board's pager under the rows, \"4 of 7\" and the\n\t\t page buttons (DqCatalogus). -->\n\t\t<CnPagination\n\t\t\tv-if=\"pageSize > 0 && totalRowCount > pageSize\"\n\t\t\tvariant=\"board\"\n\t\t\tclass=\"cn-data-table__pager\"\n\t\t\t:currentPage=\"currentPage\"\n\t\t\t:totalPages=\"pageCount\"\n\t\t\t:totalItems=\"totalRowCount\"\n\t\t\t:currentPageSize=\"pageSize\"\n\t\t\tdata-testid=\"cn-data-table-pager\"\n\t\t\t@pageChanged=\"currentPage = $event\" />\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcCheckboxRadioSwitch, NcLoadingIcon } from '@nextcloud/vue'\nimport ChevronDown from 'vue-material-design-icons/ChevronDown.vue'\nimport ChevronUp from 'vue-material-design-icons/ChevronUp.vue'\nimport DragVertical from 'vue-material-design-icons/DragVertical.vue'\nimport FilterOutline from 'vue-material-design-icons/FilterOutline.vue'\nimport CnPagination from '../CnPagination/CnPagination.vue'\nimport CnColumnFilterPopover from './CnColumnFilterPopover.vue'\nimport { useClickDragGuard } from '../../composables/useClickDragGuard.js'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { isAppInstalled } from '../../utils/appInstalled.js'\nimport { clearedColumnFilterParams, columnFilterDef, columnFilterParams, columnFilterState, isColumnFilterActive, isColumnSortable } from '../../utils/columnFilters.js'\nimport { fillTemplate, joinTemplateParts } from '../../utils/fillTemplate.js'\nimport { lensUnavailableText, readLensReports } from '../../utils/lensAvailability.js'\nimport { followLinkClick, openRowTarget, resolveHref } from '../../utils/linkNavigation.js'\nimport { nextSortState } from '../../utils/multiColumnSort.js'\nimport { fetchRowAggregate } from '../../utils/rowAggregate.js'\nimport { isNewTabClick, isNewTabHandled, isRowMiddleClick, markNewTabHandled, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'\nimport { DEFAULT_ROW_INDICATOR_CAP, indicatorApplies, resolveRowIndicators } from '../../utils/rowIndicators.js'\nimport { columnsFromSchema } from '../../utils/schema.js'\nimport { CnCellRenderer } from '../CnCellRenderer/index.js'\nimport { CnIcon } from '../CnIcon/index.js'\nimport { CnLockIndicator } from '../CnLockIndicator/index.js'\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\nimport { CnUnreadMarker } from '../CnUnreadMarker/index.js'\n\n// CnDataTable has no scoped styles of its own — its entire look lives in the\n// shared table stylesheet. Import it here so the table is styled even when the\n// consuming app does not pull in the library's global css/index.css.\nimport '../../css/table.css'\n\n/**\n * CnDataTable — Generic sortable data table for list views.\n *\n * Replaces the copy-pasted `<table class=\"viewTable\">` HTML pattern found in\n * every list view across OpenRegister, Pipelinq, and Dossiq. Supports sorting,\n * row selection, custom cell rendering via scoped slots, loading states,\n * and empty states.\n *\n * Sorting: a plain click on a sortable header is single-sort (cycle asc → desc → cleared), unchanged from before.\n * Shift+click (or Shift+Enter on a focused header) appends the column as a secondary/tertiary sort key, capped at 3, with numbered priority badges (1, 2, 3) once two or more rendered, sortable columns are sorted.\n * A sort key whose column is not rendered, or not sortable, still sorts, but is not counted or numbered, and `aria-sort` goes to the first sort key whose column is rendered and sortable.\n * Pass `sortKeys: [{key, order}, ...]` for multi-sort (falls back to the legacy `sortKey`/`sortOrder` props when empty).\n * The `sort` event payload is extended, not replaced: `{key, order}` still mirrors the primary key exactly as before; a new `keys` field carries the full ordered list.\n * See `src/utils/multiColumnSort.js` for the state machine.\n *\n * When a `schema` prop is provided, columns are auto-generated from schema\n * properties and cells render through CnCellRenderer for type-aware formatting\n * (dates, booleans, UUIDs, enums, etc.). Scoped slots still override individual\n * columns when needed.\n *\n * Manual columns (backwards compatible)\n * ```vue\n * <CnDataTable\n * :columns=\"[\n * { key: 'name', label: 'Name', sortable: true },\n * { key: 'email', label: 'Email' },\n * ]\"\n * :rows=\"clients\"\n * @row-click=\"openClient\" />\n * ```\n *\n * Schema-driven (auto columns)\n * ```vue\n * <CnDataTable :schema=\"schema\" :rows=\"objects\" />\n * ```\n *\n * Schema with overrides and custom cell\n * ```vue\n * <CnDataTable\n * :schema=\"schema\"\n * :exclude-columns=\"['description']\"\n * :column-overrides=\"{ status: { width: '200px' } }\"\n * :rows=\"objects\">\n * <template #column-status=\"{ row, value }\">\n * <QuickStatusDropdown :case-obj=\"row\" />\n * </template>\n * </CnDataTable>\n * ```\n */\n\n/**\n * Column keys that name an object's system dates in OpenRegister's `@self`\n * block. A column may declare one as its key (`@self.created`); it renders as\n * a date-time although the schema has no property behind it.\n *\n * @type {string[]}\n */\nconst SYSTEM_DATE_KEYS = ['@self.created', '@self.updated', '@self.published', '@self.depublished']\n\n/**\n * Whether a column's aggregate is read from the host app's endpoint.\n *\n * @param {object} col The column.\n * @return {boolean} True for `aggregate.endpoint` with `aggregate.key`.\n */\nfunction isEndpointAggregate(col) {\n\tconst agg = col && col.aggregate\n\treturn !!agg && typeof agg.endpoint === 'string' && agg.endpoint !== '' && typeof agg.key === 'string' && agg.key !== ''\n}\n\nexport default {\n\tname: 'CnDataTable',\n\n\tcomponents: {\n\t\tNcLoadingIcon,\n\t\tNcCheckboxRadioSwitch,\n\t\tCnCellRenderer,\n\t\tCnColumnFilterPopover,\n\t\tCnIcon,\n\t\tCnLockIndicator,\n\t\tCnStatusBadge,\n\t\tCnPagination,\n\t\tCnUnreadMarker,\n\t\tChevronDown,\n\t\tDragVertical,\n\t\tChevronUp,\n\t\tFilterOutline,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Consumer translation function, provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id, e.g.\n\t\t * `t.bind(null, 'docudesk')`). Column headers come from schema\n\t\t * property titles, which are authored in English as the canonical\n\t\t * source (API predictability); the visible label is resolved through\n\t\t * this function so it follows the user's language, with the English\n\t\t * source key living in each app's l10n files. Defaults to identity\n\t\t * when the table is used standalone (no CnAppRoot ancestor).\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The look CnAppRoot provides. Under `board` the table is the white card of the screens. */\n\t\tcnLook: { default: 'nextcloud' },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * Column definitions (manual mode).\n\t\t * Not required when `schema` is provided.\n\t\t * Each entry may be a full column object OR a bare string key; bare strings\n\t\t * are normalised to `{ key, label }` by `effectiveColumns` so manifest-driven\n\t\t * pages that pass `config.columns` as a string array work without extra mapping.\n\t\t *\n\t\t * `description` renders as the header cell's tooltip and marks the label with a\n\t\t * dotted underline, so a column whose meaning is not obvious from its name (a\n\t\t * maturity level, a computed score, a domain term) can explain itself where the\n\t\t * reader is looking. `columnsFromSchema` fills it from the JSON Schema property\n\t\t * description automatically, so schema-driven tables get it for free.\n\t\t *\n\t\t * `secondary` draws a second, muted line under the cell's value: a field\n\t\t * key (`\"number\"`), a template with `{field}` placeholders\n\t\t * (`\"{number} · {requester}\"`, dotted paths allowed; `{startAt|weekday}`\n\t\t * formats through `fillTemplate`), or a function of the row. Empty fields leave their placeholder blank; a line that\n\t\t * resolves to nothing is not drawn. `secondaryLabels` names a field's\n\t\t * values on that line, `{ field: { value: label, '*': label } }`\n\t\t * (i18n keys; `'*'` for any other value).\n\t\t *\n\t\t * `link: true` makes that column the one that names the row: it carries\n\t\t * the row link and the title look. Without it the first column does.\n\t\t *\n\t\t * `emptyValue` is what a row without a value holds in that column, so a\n\t\t * `badge` column draws a pill on every row.\n\t\t *\n\t\t * @type {Array<{key: string, label: string, description: string, sortable: boolean, width: string, class: string, cellClass: string, link: boolean, secondary: (string|((row: object) => string)), secondaryLabels: object, emptyValue: unknown}|string>}\n\t\t */\n\t\tcolumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Optional leading icon shown at the start of every row. Either a static\n\t\t * MDI icon name (PascalCase, e.g. `'FileDocumentOutline'`) applied to all\n\t\t * rows, or a function `(row) => iconName` to vary it per row. The icon is\n\t\t * resolved through the shared CnIcon registry. Unset = no icon column.\n\t\t *\n\t\t * @type {string | ((row: object) => string) | null}\n\t\t */\n\t\trowIcon: {\n\t\t\ttype: [String, Function],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * The tone of the leading icon's tile in the board look: `primary`\n\t\t * (default), `teal` or `neutral` (DqOrganisaties draws a teal tile).\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\trowIconTone: {\n\t\t\ttype: String,\n\t\t\tdefault: 'primary',\n\t\t},\n\n\t\t/**\n\t\t * State indicators a page declares for its rows. Each entry is\n\t\t * `{ id, field, equals?, in?, icon, text, tooltip? }`: `field` is a\n\t\t * dotted path on the row, the condition is `equals`, `in`, or plain\n\t\t * truthiness when neither is given, `icon` is a CnIcon name, and `text`\n\t\t * is the text alternative. An entry without `text` does not render,\n\t\t * because an icon with no text is colour and shape alone.\n\t\t *\n\t\t * The page declares which indicators exist. A record cannot add one the\n\t\t * page has not declared, however it is shaped. A page declaring none\n\t\t * renders its rows exactly as before.\n\t\t *\n\t\t * @type {Array<{id?: string, field: string, equals?: (string|number|boolean|null), in?: Array, icon?: string, text: string, tooltip?: string}>}\n\t\t */\n\t\trowIndicators: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * How many declared indicators render on the row itself. The rest are\n\t\t * available from `indicatorsFor(row).overflow` for the row menu.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\trowIndicatorCap: {\n\t\t\ttype: Number,\n\t\t\tdefault: DEFAULT_ROW_INDICATOR_CAP,\n\t\t},\n\n\t\t/**\n\t\t * Schema object with `properties` field (schema-driven mode).\n\t\t * When provided, columns are auto-generated from schema properties.\n\t\t */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Per-column overrides when using schema mode: { key: { width, label, sortable, ... } } */\n\t\tcolumnOverrides: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Column keys to exclude when using schema mode */\n\t\texcludeColumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Column keys to include when using schema mode (whitelist) */\n\t\tincludeColumns: {\n\t\t\ttype: Array,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Row data array. Each row should have a unique identifier (see rowKey). */\n\t\trows: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Whether data is loading (shows loading spinner) */\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current sort column key */\n\t\tsortKey: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Current sort order: 'asc', 'desc', or null (no sort) */\n\t\tsortOrder: {\n\t\t\ttype: String,\n\t\t\tdefault: 'asc',\n\t\t\tvalidator: (v) => v === null || ['asc', 'desc'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Ordered multi-column sort state: `[{ key, order }, ...]` (priority\n\t\t * order, 0 to 3 entries). Optional — when empty (the default), the\n\t\t * table falls back to the legacy `sortKey`/`sortOrder` props, so\n\t\t * single-sort hosts are completely unaffected. Shift+click a\n\t\t * sortable header to append/cycle a secondary or tertiary key (see\n\t\t * `src/utils/multiColumnSort.js`).\n\t\t *\n\t\t * @type {Array<{key: string, order: 'asc'|'desc'}>}\n\t\t */\n\t\tsortKeys: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Whether rows can be selected with checkboxes */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Array of currently selected row IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Property name used as unique row identifier */\n\t\trowKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'id',\n\t\t},\n\n\t\t/** Text shown when there are no rows */\n\t\temptyText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No items found'),\n\t\t},\n\n\t\t/**\n\t\t * App wording for an unavailable personal lens in self-fetch mode,\n\t\t * keyed `<lens>.<reason>` (`recent.audit-trail-disabled`) or\n\t\t * `<reason>`. Without it the library's object-neutral text is shown\n\t\t * when the response reports `@self.lenses.<lens>.available: false`.\n\t\t *\n\t\t * @type {{[key: string]: string}|null}\n\t\t * @spec openspec/changes/lens-says-why-it-is-empty/specs/personal-lens-availability/spec.md#requirement-an-unavailable-lens-explains-its-empty-page\n\t\t */\n\t\tlensReasonTexts: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Function returning CSS class(es) for a row: (row) => string|object */\n\t\trowClass: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Function returning CSS class(es) for a data cell: (row, col) => string|object */\n\t\tcellClass: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Whether to constrain table height and make it scrollable */\n\t\tscrollable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Text shown while loading */\n\t\tloadingText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Loading…'),\n\t\t},\n\n\t\t/**\n\t\t * Accessible name for the select-all checkbox in the header row.\n\t\t * Used as the checkbox's `aria-label` so screen readers announce a\n\t\t * named control (WCAG 4.1.2). Defaults to the lib's translation of\n\t\t * \"Select all rows\".\n\t\t */\n\t\tselectAllLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Select all rows'),\n\t\t},\n\n\t\t/**\n\t\t * Accessible name for a per-row select checkbox. Used as the\n\t\t * checkbox's `aria-label` so screen readers announce a named control\n\t\t * (WCAG 4.1.2). Defaults to the lib's translation of \"Select row\".\n\t\t */\n\t\tselectRowLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Select row'),\n\t\t},\n\n\t\t/**\n\t\t * Optional card title rendered in a header above the table. When set, the\n\t\t * table reads as a self-contained card (the container's own border/radius\n\t\t * is the card chrome). Folded in from the retired CnTableWidget.\n\t\t */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Draw an unread record (`@self.unread`) in bold with the unread dot.\n\t\t * Off, every row reads alike whatever its read state.\n\t\t *\n\t\t * @spec openspec/changes/screens-index-board-gaps/specs/index-list-board-look/spec.md#requirement-unread-rows-are-marked-only-where-the-reader-asked-for-them\n\t\t */\n\t\tshowUnread: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * How the board look draws the title column: `link` (the default) is\n\t\t * the 15px weight 600 underlined title of the DqZaken board; `plain` is\n\t\t * the 15px bold title without an underline and a 13px muted secondary\n\t\t * line, as the PqTickets and OcPublicaties boards draw it; `text` is an\n\t\t * ordinary cell, for a log table whose first column is a date\n\t\t * (DqZaakContact); `strong` is the cell's own size at weight 600 in the\n\t\t * main ink without an underline, the name column of a card's list\n\t\t * (DqZaaktypeStatussen). The row stays clickable either way. The\n\t\t * Nextcloud look ignores it.\n\t\t *\n\t\t * @spec openspec/changes/screens-table-rows-parity/specs/index-list-board-look/spec.md#requirement-a-row-title-can-be-plain-text\n\t\t * @spec openspec/changes/board-log-table-plain-cells/specs/board-log-table-plain-cells/spec.md#requirement-a-tables-title-column-can-read-as-plain-text\n\t\t */\n\t\trowTitle: {\n\t\t\ttype: String,\n\t\t\tdefault: 'link',\n\t\t\tvalidator: (value) => ['link', 'plain', 'text', 'strong'].includes(value),\n\t\t},\n\n\t\t/**\n\t\t * Drop the container's card chrome (border, radius, shadow) so the table\n\t\t * sits flush inside a parent that already provides a card (e.g. a\n\t\t * CnWidgetWrapper dashboard slot). Folded in from CnTableWidget.\n\t\t */\n\t\tborderless: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Fill the height of the parent (a flex-column card / widget content\n\t\t * area) so the optional `#footer` is pushed to the bottom instead of\n\t\t * floating directly under a short list. When the list is long enough to\n\t\t * overflow, the footer stays pinned via its sticky rule. No-op outside a\n\t\t * height-constrained parent. Opt-in so ordinary in-flow tables are\n\t\t * unaffected.\n\t\t */\n\t\tfillHeight: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * How many data columns are pinned to the start of the table. They (and the\n\t\t * selection and icon columns, which are pinned whenever any column is) stay\n\t\t * in view when the table scrolls sideways.\n\t\t */\n\t\tpinnedCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * Let the reader drag rows into another order. A drop emits `row-move`\n\t\t * with the row and its old and new index; the host stores the order.\n\t\t */\n\t\treorderable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Hide the column-header row (`<thead>`). Useful for compact dashboard\n\t\t * list widgets that want a plain bordered-row list without column labels.\n\t\t */\n\t\thideHeader: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Switch the table to `table-layout: fixed`, making each column's `width`\n\t\t * authoritative instead of a hint the browser may override. Opt in when a\n\t\t * column's content would otherwise dictate the layout — a long unbreakable\n\t\t * value (a PHP FQCN, a UUID) widens its column under the default auto\n\t\t * layout and can render past the cell box into its neighbour, while any\n\t\t * column left unsized soaks up all remaining width. Cells also break long\n\t\t * words rather than overflowing. Columns with no `width` share whatever\n\t\t * space is left, so size every column when you want exact control.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tfixedLayout: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Fit the table to its container instead of letting it grow past it.\n\t\t * One column takes the room that is left and cuts its text with an\n\t\t * ellipsis (the full value stays in the tooltip); every other column\n\t\t * keeps its content on one line at its own width, so trailing columns\n\t\t * such as a date stay visible in a narrow tile. The column that grows\n\t\t * is the first with `grow: true`, else the one keyed `title` or `name`,\n\t\t * else the first column. CnWidgetObjectTable turns this on.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @spec openspec/changes/narrow-object-table-widgets/specs/narrow-object-table-widgets/spec.md#requirement-a-narrow-object-table-keeps-its-trailing-columns-in-view\n\t\t */\n\t\tfitWidth: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Max number of rows to display. When the total exceeds it, only the first\n\t\t * `limit` render and the \"View all\" footer appears (with `viewAllRoute`).\n\t\t * 0 = show all. Folded in from CnTableWidget.\n\t\t */\n\t\tlimit: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * Rows per page. Above 0 the table shows one page of its rows and the\n\t\t * board's pager under them (\"4 of 7\", page buttons, Next) once there is\n\t\t * more than one page. Pages the rows the table holds; 0 (the default)\n\t\t * shows them all, or the first `limit`.\n\t\t *\n\t\t * @spec openspec/changes/object-table-pager/specs/object-table/spec.md#requirement-an-object-table-can-page-its-rows\n\t\t */\n\t\tpageSize: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/**\n\t\t * vue-router route object for the \"View all\" footer link. The footer only\n\t\t * shows when set AND the rows are a `limit`-ed subset. Folded in from CnTableWidget.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tviewAllRoute: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Pre-translated \"View all\" footer label. */\n\t\tviewAllLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'View all'),\n\t\t},\n\n\t\t/**\n\t\t * Self-fetch mode (folded from CnTableWidget): the OpenRegister register\n\t\t * id/slug. When `register` + `schemaId` are set and no `rows` are passed,\n\t\t * the table fetches `/apps/openregister/api/objects/{register}/{schemaId}`.\n\t\t *\n\t\t * @type {string|number|null}\n\t\t */\n\t\tregister: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Self-fetch mode (folded from CnTableWidget): the OpenRegister schema\n\t\t * id used together with `register`. (Distinct from the `schema` prop,\n\t\t * which is a JSON Schema object for column generation.)\n\t\t *\n\t\t * @type {string|number|null}\n\t\t */\n\t\tschemaId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Extra query parameters sent with the self-fetch request (register +\n\t\t * schemaId mode) — e.g. a resolved filter map, `_order[field]` ordering,\n\t\t * or `_limit`. Changing it re-triggers the self-fetch, so a host widget\n\t\t * (CnWidgetObjectTable's declarative `source`) can drive filtering and\n\t\t * ordering without re-implementing the fetch. Ignored when external\n\t\t * `rows` are supplied.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tfetchParams: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Convenience navigation (folded from CnTableWidget): a function that\n\t\t * receives a row and returns the vue-router route it opens. When set,\n\t\t * each row renders as a real link to that route, stretched over the\n\t\t * row: a click navigates there (the `row-click` event still fires), and\n\t\t * a ctrl/cmd/shift or middle click opens it in a new tab. A table whose\n\t\t * row click selects (`selectable` without `rowClickToView`) gets no link.\n\t\t *\n\t\t * @type {((row: object) => object)|null}\n\t\t */\n\t\trowClickRoute: {\n\t\t\ttype: Function,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * When true, a row-body click emits `row-click` (for navigation) even\n\t\t * while `selectable` — selection then happens only via the checkbox\n\t\t * column. Lets \"click row = open, tick box = select\" coexist. Default\n\t\t * false keeps the legacy behaviour (selectable rows select on body click).\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\trowClickToView: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Show a filter button in every header whose column can filter (see\n\t\t * `columnFilterDef`): enum, boolean, text, number, date and reference\n\t\t * columns backed by a schema property. A column opts out with\n\t\t * `filterable: false`. Applying a filter emits `column-filter`; the\n\t\t * host owns the filter state and passes it back as `activeFilters`.\n\t\t *\n\t\t * @spec openspec/changes/table-header-sort-and-filter/specs/cn-data-table/spec.md#requirement-every-backed-column-filters-from-its-header\n\t\t */\n\t\tfilterable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * The schema the header filters read instead of `schema`: a page that\n\t\t * filters through other fields than the rows' own (a named source's\n\t\t * search fields) hands them here. Null: the header filters read `schema`.\n\t\t *\n\t\t * @spec openspec/changes/named-source-header-filters/specs/index-page/spec.md#requirement-a-named-source-can-filter-from-its-column-headers-through-its-search-fields\n\t\t */\n\t\tfilterSchema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Draw the active header filters as removable chips above the table.\n\t\t * A host that lists them itself (the index page's board Active line)\n\t\t * turns this off, so a filter is not shown twice.\n\t\t *\n\t\t * @spec openspec/changes/index-table-filter-chips-once/specs/cn-data-table/spec.md#requirement-a-host-that-lists-the-active-filters-itself-turns-the-table-chips-off\n\t\t */\n\t\tfilterChips: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * The active filter map, `{ paramKey: values[] }`: the same map the\n\t\t * facet sidebar writes, so a header filter and a sidebar filter on one\n\t\t * field show the same state.\n\t\t */\n\t\tactiveFilters: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Register slug a reference column's filter searches in when the column names none. */\n\t\tfilterRegister: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['row-click', 'row-aux-click', 'row-context-menu', 'row-move', 'select', 'select-all', 'sort', 'view-all', 'column-filter'],\n\n\tsetup() {\n\t\t// Tell a deliberate row click apart from a text-selection drag.\n\t\treturn useClickDragGuard()\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\t/** Index of the row being dragged, or -1. */\n\t\t\tdragFromIndex: -1,\n\t\t\t/** Index of the row a drag is over, or -1. */\n\t\t\tdragOverIndex: -1,\n\t\t\t/** Left offsets (px) of the leading pinned cells, measured from the header. */\n\t\t\tpinOffsets: [],\n\t\t\t/** Key of the column whose filter panel is open, or ''. */\n\t\t\topenFilterKey: '',\n\t\t\t/** The open filter button's bounding rect, to place the panel. */\n\t\t\tfilterAnchorRect: null,\n\t\t\t/**\n\t\t\t * Resolved aggregate-column values, keyed by `String(row[rowKey])`\n\t\t\t * then by column key. Populated by `loadAggregates()` for columns\n\t\t\t * that declare `aggregate` (see CnIndexPage's manifest config).\n\t\t\t *\n\t\t\t * @type {{[rowId: string]: {[colKey: string]: number}}}\n\t\t\t */\n\t\t\taggregateValues: {},\n\t\t\t/**\n\t\t\t * Columns whose endpoint aggregate answered `available: false`, by\n\t\t\t * column key; such a column is not drawn.\n\t\t\t *\n\t\t\t * @type {{[colKey: string]: boolean}}\n\t\t\t */\n\t\t\taggregateUnavailable: {},\n\t\t\t/**\n\t\t\t * Whether the table currently overflows its scrollport horizontally.\n\t\t\t * Drives the keyboard tab stop on `.cn-data-table__scroll`; see the\n\t\t\t * comment on that element.\n\t\t\t *\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tisScrollable: false,\n\t\t\t/** True while a batch of aggregate-count requests is in flight. */\n\t\t\taggregateLoading: false,\n\t\t\t/** Monotonic id used to discard a stale aggregate batch when `rows` changes mid-flight. */\n\t\t\taggregateRequestId: 0,\n\t\t\t/** Rows fetched in self-fetch mode (register + schemaId). */\n\t\t\tfetchedRows: [],\n\t\t\t/** The page shown under `pageSize`. */\n\t\t\tcurrentPage: 1,\n\t\t\t/** Personal-lens reports (`@self.lenses`) of the latest self-fetch response. */\n\t\t\tfetchedLenses: {},\n\t\t\t/** True while a self-fetch request is in flight. */\n\t\t\tselfFetchLoading: false,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The leading icon tile's tone, one the board look draws.\n\t\t *\n\t\t * @return {string} `primary`, `teal` or `neutral`.\n\t\t * @spec openspec/changes/board-row-icon-tile/specs/data-table/spec.md#requirement-a-board-tables-leading-icon-sits-on-a-tile\n\t\t */\n\t\ticonTone() {\n\t\t\treturn ['primary', 'teal', 'neutral'].includes(this.rowIconTone) ? this.rowIconTone : 'primary'\n\t\t},\n\n\t\t/**\n\t\t * Whether the table is drawn as the board look's white card.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisBoardLook() {\n\t\t\treturn normalizeLook(this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of the row-actions column.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsColumnLabel() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * Why the self-fetched list is empty when a personal lens could not\n\t\t * answer (openregister#4514), or `''` to keep `emptyText`. Only the\n\t\t * table's own fetch reports: external `rows` carry no report.\n\t\t *\n\t\t * @return {string}\n\t\t * @spec openspec/changes/lens-says-why-it-is-empty/specs/personal-lens-availability/spec.md#requirement-an-unavailable-lens-explains-its-empty-page\n\t\t */\n\t\tlensReasonText() {\n\t\t\tif (this.rows && this.rows.length > 0) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst text = lensUnavailableText(this.fetchedLenses, this.lensReasonTexts)\n\t\t\treturn text ? this.translateLabel(text) : ''\n\t\t},\n\n\t\t/** @return {number} Leading cells before the data columns (selection, icon). */\n\t\t/**\n\t\t * The key of the column that takes the spare width under `fitWidth`:\n\t\t * the first with `grow: true`, else `title` or `name`, else the first.\n\t\t *\n\t\t * @return {string|null} The column key, or null when not fitting.\n\t\t * @spec openspec/changes/narrow-object-table-widgets/specs/narrow-object-table-widgets/spec.md#requirement-a-narrow-object-table-keeps-its-trailing-columns-in-view\n\t\t */\n\t\t/**\n\t\t * The column that names the row: it carries the row link, the title\n\t\t * look and the unread, lock and indicator marks. The first column with\n\t\t * `link: true`, else the first column (DqTeamwachtrij puts the waiting\n\t\t * time first and links the case title in the second).\n\t\t *\n\t\t * @return {number} The index in `effectiveColumns`.\n\t\t * @spec openspec/changes/screens-index-board-gaps/specs/index-list-board-look/spec.md#requirement-a-column-can-carry-the-row-link\n\t\t */\n\t\ttitleColumnIndex() {\n\t\t\tconst index = this.effectiveColumns.findIndex((c) => c && c.link === true)\n\t\t\treturn index === -1 ? 0 : index\n\t\t},\n\n\t\tgrowColumnKey() {\n\t\t\tif (!this.fitWidth || this.effectiveColumns.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst cols = this.effectiveColumns\n\t\t\tconst chosen = cols.find((c) => c && c.grow === true)\n\t\t\t\t|| cols.find((c) => c && c.key === 'title')\n\t\t\t\t|| cols.find((c) => c && c.key === 'name')\n\t\t\t\t|| cols[0]\n\t\t\treturn chosen ? chosen.key : null\n\t\t},\n\n\t\tleadingCount() {\n\t\t\treturn (this.selectable ? 1 : 0) + (this.rowIcon ? 1 : 0)\n\t\t},\n\n\t\t/**\n\t\t * Accessible name for the horizontal scrollport when it becomes a tab\n\t\t * stop. Prefers the table's own `title` so the announcement identifies\n\t\t * WHICH table the user has landed in — several can share a dashboard.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tscrollRegionLabel() {\n\t\t\treturn this.title\n\t\t\t\t? t('nextcloud-vue', '{title} — scrollable table', { title: this.title })\n\t\t\t\t: t('nextcloud-vue', 'Scrollable table')\n\t\t},\n\n\t\t/**\n\t\t * The row source: external `rows` when provided, else the self-fetched\n\t\t * rows (register + schemaId mode). External rows always win.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tsourceRows() {\n\t\t\tif (this.rows && this.rows.length > 0) {\n\t\t\t\treturn this.rows\n\t\t\t}\n\t\t\tif (this.register !== null && this.register !== undefined && this.schemaId !== null && this.schemaId !== undefined) {\n\t\t\t\treturn this.fetchedRows\n\t\t\t}\n\t\t\treturn this.rows\n\t\t},\n\n\t\t/**\n\t\t * The rows actually rendered — `sourceRows` capped to `limit` (0 = all).\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\teffectiveRows() {\n\t\t\tif (this.pageSize > 0) {\n\t\t\t\tconst page = Math.min(this.currentPage, this.pageCount)\n\t\t\t\treturn this.sourceRows.slice((page - 1) * this.pageSize, page * this.pageSize)\n\t\t\t}\n\t\t\treturn this.limit > 0 ? this.sourceRows.slice(0, this.limit) : this.sourceRows\n\t\t},\n\n\t\t/**\n\t\t * The number of pages under `pageSize` (at least 1).\n\t\t *\n\t\t * @spec openspec/changes/object-table-pager/specs/object-table/spec.md#requirement-an-object-table-can-page-its-rows\n\t\t * @return {number}\n\t\t */\n\t\tpageCount() {\n\t\t\treturn this.pageSize > 0 ? Math.max(1, Math.ceil(this.sourceRows.length / this.pageSize)) : 1\n\t\t},\n\n\t\t/**\n\t\t * Total row count before the `limit` cap (drives the count badge + the\n\t\t * \"View all\" footer condition).\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\ttotalRowCount() {\n\t\t\treturn this.sourceRows.length\n\t\t},\n\n\t\t/**\n\t\t * The URL the router resolves `viewAllRoute` to, or `null` when there is\n\t\t * no route or no router (a widget mounted outside a vue-router context).\n\t\t * Decides whether the \"View all\" footer renders as a link or a button.\n\t\t *\n\t\t * @return {string|null}\n\t\t */\n\t\tviewAllHref() {\n\t\t\tif (!this.viewAllRoute || !this.$router || typeof this.$router.resolve !== 'function') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst resolved = this.$router.resolve(this.viewAllRoute)\n\t\t\t\treturn (resolved && resolved.href) || null\n\t\t\t} catch {\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the loading state — the external `loading` prop OR a\n\t\t * self-fetch in flight.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisLoading() {\n\t\t\treturn this.loading || this.selfFetchLoading\n\t\t},\n\n\t\t/**\n\t\t * Effective columns: schema-generated or manually provided.\n\t\t * Schema columns take precedence when schema is provided and no manual columns given.\n\t\t */\n\t\teffectiveColumns() {\n\t\t\treturn this.allColumns.filter((c) => !this.isAggregateHidden(c))\n\t\t},\n\n\t\t/**\n\t\t * Every column the table is configured with, before an endpoint\n\t\t * aggregate whose source is absent is left out (see `effectiveColumns`).\n\t\t *\n\t\t * @return {Array<object>} The columns.\n\t\t */\n\t\tallColumns() {\n\t\t\tconst cols = (this.schema && this.columns.length === 0)\n\t\t\t\t? columnsFromSchema(this.schema, {\n\t\t\t\t\t\texclude: this.excludeColumns,\n\t\t\t\t\t\tinclude: this.includeColumns,\n\t\t\t\t\t\toverrides: this.columnOverrides,\n\t\t\t\t\t})\n\t\t\t\t: this.columns\n\t\t\t// Every column backed by a schema property sorts unless it says\n\t\t\t// `sortable: false`; object columns from a manifest used to need an\n\t\t\t// explicit flag and so could not sort at all.\n\t\t\tconst withSort = (c) => (c && typeof c === 'object' ? { ...c, sortable: isColumnSortable(c, this.schema) } : c)\n\t\t\tif (!(cols || []).some((c) => typeof c === 'string')) {\n\t\t\t\treturn (cols || []).map(withSort)\n\t\t\t}\n\t\t\tconst schemaCols = this.schema\n\t\t\t\t? columnsFromSchema(this.schema, { overrides: this.columnOverrides })\n\t\t\t\t: []\n\t\t\tconst byKey = new Map(schemaCols.map((c) => [c.key, c]))\n\t\t\treturn (cols || []).map((c) => {\n\t\t\t\tif (typeof c !== 'string') {\n\t\t\t\t\treturn withSort(c)\n\t\t\t\t}\n\t\t\t\treturn byKey.get(c) || { key: c, label: c, sortable: true }\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * The active ordered sort-key list: the `sortKeys` prop when non-empty,\n\t\t * else a single-entry list derived from the legacy `sortKey`/`sortOrder`\n\t\t * props (empty when neither is active). Every header/badge/aria-sort\n\t\t * computation reads this so single-sort hosts (no `sortKeys` passed)\n\t\t * render exactly as before.\n\t\t *\n\t\t * @return {Array<{key: string, order: 'asc'|'desc'}>}\n\t\t */\n\t\t/**\n\t\t * The link each row opens, keyed by row key: the `rowClickRoute`\n\t\t * location and its href. Empty when rows have no route, or when a row\n\t\t * click selects instead of navigating.\n\t\t *\n\t\t * @return {{[key: string]: {target: object, href: string}}}\n\t\t */\n\t\trowLinks() {\n\t\t\tconst links = {}\n\t\t\tif (!this.rowClickRoute || !this.$router || (this.selectable && !this.rowClickToView)) {\n\t\t\t\treturn links\n\t\t\t}\n\t\t\tfor (const row of this.effectiveRows) {\n\t\t\t\tconst route = this.rowClickRoute(row)\n\t\t\t\tif (!route) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst target = typeof route === 'string' ? { path: route } : route\n\t\t\t\tconst href = resolveHref(target, this.$router)\n\t\t\t\tif (href) {\n\t\t\t\t\tlinks[String(row[this.rowKey])] = { target, href }\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn links\n\t\t},\n\n\t\t/**\n\t\t * The column whose filter panel is open, or null.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\topenFilterColumn() {\n\t\t\tif (!this.openFilterKey) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn this.effectiveColumns.find((c) => c && c.key === this.openFilterKey && this.filterDefFor(c)) || null\n\t\t},\n\n\t\t/**\n\t\t * One chip per column with an active header filter.\n\t\t *\n\t\t * @return {Array<{key: string, col: object, text: string, removeLabel: string}>}\n\t\t */\n\t\tactiveColumnFilterChips() {\n\t\t\tif (!this.filterable) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn this.effectiveColumns\n\t\t\t\t.filter((c) => c && this.isColumnFiltered(c))\n\t\t\t\t.map((col) => {\n\t\t\t\t\tconst label = this.translateLabel(col.label)\n\t\t\t\t\tconst text = t('nextcloud-vue', '{column}: {value}', { column: label, value: this.columnFilterSummary(col) })\n\t\t\t\t\treturn { key: col.key, col, text, removeLabel: t('nextcloud-vue', 'Remove filter {column}', { column: label }) }\n\t\t\t\t})\n\t\t},\n\n\t\tactiveFiltersLabel() {\n\t\t\treturn t('nextcloud-vue', 'Active filters')\n\t\t},\n\n\t\teffectiveSortKeys() {\n\t\t\tif (this.sortKeys && this.sortKeys.length > 0) {\n\t\t\t\treturn this.sortKeys\n\t\t\t}\n\t\t\tif (this.sortKey) {\n\t\t\t\treturn [{ key: this.sortKey, order: this.sortOrder || 'asc' }]\n\t\t\t}\n\t\t\treturn []\n\t\t},\n\n\t\t/**\n\t\t * The active sort keys whose column renders a sort indicator, in priority order and deduplicated by first occurrence. Only these are counted and numbered by the priority badge.\n\t\t *\n\t\t * @return {Array<{key: string, order: 'asc'|'desc'}>}\n\t\t */\n\t\trenderedSortKeys() {\n\t\t\tconst shown = new Set(this.effectiveColumns.filter((c) => c && c.sortable).map((c) => c.key))\n\t\t\tconst seen = new Set()\n\t\t\treturn this.effectiveSortKeys.filter((k) => {\n\t\t\t\tif (!k || !shown.has(k.key) || seen.has(k.key)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tseen.add(k.key)\n\t\t\t\treturn true\n\t\t\t})\n\t\t},\n\n\t\ttotalColumns() {\n\t\t\tlet count = this.effectiveColumns.length\n\t\t\tif (this.selectable) {\n\t\t\t\tcount++\n\t\t\t}\n\t\t\tif (this.rowIcon) {\n\t\t\t\tcount++\n\t\t\t}\n\t\t\tif (this.$slots['row-actions']) {\n\t\t\t\tcount++\n\t\t\t}\n\t\t\treturn count\n\t\t},\n\n\t\t/**\n\t\t * Stable signature of the self-fetch inputs so the watcher refetches\n\t\t * only on a real change (register / schemaId / fetchParams).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselfFetchKey() {\n\t\t\treturn JSON.stringify({\n\t\t\t\tregister: this.register,\n\t\t\t\tschemaId: this.schemaId,\n\t\t\t\tfetchParams: this.fetchParams || null,\n\t\t\t})\n\t\t},\n\n\t\tallSelected() {\n\t\t\treturn this.effectiveRows.length > 0\n\t\t\t\t&& this.effectiveRows.every((row) => this.selectedIds.includes(row[this.rowKey]))\n\t\t},\n\n\t\tsomeSelected() {\n\t\t\treturn this.effectiveRows.some((row) => this.selectedIds.includes(row[this.rowKey]))\n\t\t},\n\t},\n\n\twatch: {\n\t\trows: {\n\t\t\thandler() {\n\t\t\t\tthis.loadAggregates()\n\t\t\t},\n\t\t},\n\n\t\tpageCount(count) {\n\t\t\tif (this.currentPage > count) {\n\t\t\t\tthis.currentPage = count\n\t\t\t}\n\t\t},\n\n\t\teffectiveColumns: {\n\t\t\thandler() {\n\t\t\t\tthis.loadAggregates()\n\t\t\t},\n\n\t\t\tdeep: false,\n\t\t},\n\n\t\t/**\n\t\t * Re-run the self-fetch when its inputs (register, schemaId, or the\n\t\t * host-driven `fetchParams`) change — a token-resolved filter (e.g.\n\t\t * `@workspace.*`) can change after mount. External rows still win.\n\t\t */\n\t\tselfFetchKey() {\n\t\t\tif ((!this.rows || this.rows.length === 0) && this.register !== null && this.register !== undefined && this.schemaId !== null && this.schemaId !== undefined) {\n\t\t\t\tthis.fetchData()\n\t\t\t}\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.loadAggregates()\n\t\t// Self-fetch mode: pull rows from OpenRegister when register + schemaId\n\t\t// are given and no external rows were passed (folded from CnTableWidget).\n\t\tif ((!this.rows || this.rows.length === 0) && this.register !== null && this.register !== undefined && this.schemaId !== null && this.schemaId !== undefined) {\n\t\t\tthis.fetchData()\n\t\t}\n\t\tthis.observeScrollOverflow()\n\t},\n\n\tupdated() {\n\t\t// Columns and rows can change after mount (self-fetch resolving, a\n\t\t// column toggled), and either can flip the table between fitting and\n\t\t// overflowing. ResizeObserver alone would miss a change that alters\n\t\t// content width without resizing the box.\n\t\tthis.measureScrollOverflow()\n\t},\n\n\tbeforeUnmount() {\n\t\tthis.disconnectScrollOverflow()\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Start dragging a row (`reorderable` only).\n\t\t *\n\t\t * @param {number} index The row's index.\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowDragStart(index, event) {\n\t\t\tif (!this.reorderable) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.dragFromIndex = index\n\t\t\tif (event && event.dataTransfer) {\n\t\t\t\tevent.dataTransfer.effectAllowed = 'move'\n\t\t\t\tevent.dataTransfer.setData('text/plain', String(index))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Accept a dragged row over this one.\n\t\t *\n\t\t * @param {number} index The row's index.\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowDragOver(index, event) {\n\t\t\tif (!this.reorderable || this.dragFromIndex < 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.dragOverIndex = index\n\t\t},\n\n\t\t/**\n\t\t * The drag left this row.\n\t\t *\n\t\t * @param {number} index The row's index.\n\t\t * @return {void}\n\t\t */\n\t\tonRowDragLeave(index) {\n\t\t\tif (this.dragOverIndex === index) {\n\t\t\t\tthis.dragOverIndex = -1\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Drop the dragged row here.\n\t\t *\n\t\t * @param {object} row The row dropped on.\n\t\t * @param {number} index Its index.\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowDrop(row, index, event) {\n\t\t\tif (!this.reorderable || this.dragFromIndex < 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tconst from = this.dragFromIndex\n\t\t\tthis.onRowDragEnd()\n\t\t\tif (from !== index) {\n\t\t\t\t/**\n\t\t\t\t * A row was dragged to another place (`reorderable`). Payload:\n\t\t\t\t * `{ row, from, to }`, the dragged row and its old and new index.\n\t\t\t\t *\n\t\t\t\t * @event row-move\n\t\t\t\t */\n\t\t\t\tthis.$emit('row-move', { row: this.effectiveRows[from], from, to: index })\n\t\t\t}\n\t\t},\n\n\t\t/** End a drag. */\n\t\tonRowDragEnd() {\n\t\t\tthis.dragFromIndex = -1\n\t\t\tthis.dragOverIndex = -1\n\t\t},\n\n\t\t/**\n\t\t * Whether a column is the one that takes the spare width (`fitWidth`).\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @return {boolean}\n\t\t */\n\t\tisGrowColumn(col) {\n\t\t\treturn this.growColumnKey !== null && !!col && col.key === this.growColumnKey\n\t\t},\n\n\t\t/**\n\t\t * Whether a row's record changed since the user last looked\n\t\t * (`@self.unread`), when `showUnread` is on. A row without the marker\n\t\t * renders as it always did.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {boolean} True when the row is unread.\n\t\t */\n\t\tisUnreadRow(row) {\n\t\t\treturn this.showUnread && !!(row && row['@self'] && row['@self'].unread === true)\n\t\t},\n\n\t\t/**\n\t\t * The attached file a row was found through in a file-content search.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {string} The file name, or '' when the row matched on a field.\n\t\t */\n\t\tmatchedFileOf(row) {\n\t\t\tconst name = row && row['@self'] && row['@self'].matchedFile\n\t\t\treturn typeof name === 'string' ? name : ''\n\t\t},\n\n\t\t/**\n\t\t * The \"Found in {file}\" line for a row found through an attached file.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {string} The translated line.\n\t\t */\n\t\tmatchedFileLabel(row) {\n\t\t\treturn t('nextcloud-vue', 'Found in {file}', { file: this.matchedFileOf(row) })\n\t\t},\n\n\t\t/**\n\t\t * The declared indicators that apply to one row, split into the ones\n\t\t * that fit on the row and the ones that go to the row menu.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @return {{shown: Array<object>, overflow: Array<object>}}\n\t\t * @spec openspec/changes/working-list-row-actions/specs/index-page/spec.md\n\t\t */\n\t\tindicatorsFor(row) {\n\t\t\treturn resolveRowIndicators(this.rowIndicators, row, this.rowIndicatorCap)\n\t\t},\n\n\t\t/**\n\t\t * A row link covers the whole row, so no cell sees the pointer. Give\n\t\t * the link the full text of the clipped cell under the pointer as its\n\t\t * title, the hover that `titleWhenClipped` gives an unlinked cell.\n\t\t *\n\t\t * @param {MouseEvent} event The move event on the row link.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tlinkTitleAtPointer(event) {\n\t\t\tconst link = event.currentTarget\n\t\t\tconst row = link?.closest?.('tr')\n\t\t\tif (!row || typeof document.elementsFromPoint !== 'function') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst cell = document.elementsFromPoint(event.clientX, event.clientY)\n\t\t\t\t.find((el) => el.tagName === 'TD' && row.contains(el))\n\t\t\t// An empty title, not none: the first cell's own clipped title would\n\t\t\t// otherwise show over the whole row.\n\t\t\tconst clipped = cell && cell.scrollWidth - cell.clientWidth > 1\n\t\t\tlink.setAttribute('title', clipped ? (cell.textContent || '').trim() : '')\n\t\t},\n\n\t\t/**\n\t\t * Give a cell its full text on hover, and only when it is cut short.\n\t\t *\n\t\t * Cells are one line with an ellipsis, so a long value is readable only\n\t\t * as far as the column goes. A `title` on every cell would answer that,\n\t\t * and would also put a tooltip on the cells that need none — repeating\n\t\t * back what is already on screen.\n\t\t *\n\t\t * Read on ENTER rather than on render: `scrollWidth > clientWidth` forces\n\t\t * layout, and doing it per cell per paint would cost a reflow for a\n\t\t * tooltip almost none of them want. On enter it is one read of one cell,\n\t\t * and it is re-read every time, so a column resized since the last hover\n\t\t * answers for its new width rather than its old one.\n\t\t *\n\t\t * @param {MouseEvent} event The enter event.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\ttitleWhenClipped(event) {\n\t\t\tconst el = event.currentTarget\n\t\t\tif (!el) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// 1px of tolerance, as the scrollport check uses: sub-pixel rounding\n\t\t\t// otherwise reports a cell that visually fits as clipped.\n\t\t\tif (el.scrollWidth - el.clientWidth > 1) {\n\t\t\t\tel.setAttribute('title', (el.textContent || '').trim())\n\t\t\t} else {\n\t\t\t\tel.removeAttribute('title')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether the cell at this position (selection, icon, then data columns)\n\t\t * is pinned. Position 0 is the first cell of the row.\n\t\t *\n\t\t * @param {number} index The cell's position in the row.\n\t\t * @return {boolean} True for a pinned cell.\n\t\t */\n\t\tisPinnedAt(index) {\n\t\t\treturn this.pinnedCount > 0 && index < this.leadingCount + this.pinnedCount\n\t\t},\n\n\t\t/**\n\t\t * CSS classes of a pinned cell; the last pinned one gets the edge.\n\t\t *\n\t\t * @param {number} index The cell's position in the row.\n\t\t * @return {object} The class map.\n\t\t */\n\t\tpinClass(index) {\n\t\t\tconst pinned = this.isPinnedAt(index)\n\t\t\treturn {\n\t\t\t\t'cn-table-col--pinned': pinned,\n\t\t\t\t'cn-table-col--pinned-last': pinned && index === this.leadingCount + this.pinnedCount - 1,\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Sticky offset of a pinned cell: the summed width of the cells before it.\n\t\t *\n\t\t * @param {number} index The cell's position in the row.\n\t\t * @return {object} The inline style, empty for a cell that scrolls.\n\t\t */\n\t\tpinStyle(index) {\n\t\t\tif (!this.isPinnedAt(index)) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn { left: `${this.pinOffsets[index] || 0}px` }\n\t\t},\n\n\t\t/**\n\t\t * Measure the pinned cells so each sticky offset is the width of those\n\t\t * before it. Cheap when nothing is pinned.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tmeasurePins() {\n\t\t\tif (this.pinnedCount <= 0) {\n\t\t\t\tif (this.pinOffsets.length > 0) {\n\t\t\t\t\tthis.pinOffsets = []\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst row = this.$el && this.$el.querySelector ? this.$el.querySelector('thead tr, tbody tr') : null\n\t\t\tif (!row) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst count = this.leadingCount + this.pinnedCount\n\t\t\tconst offsets = []\n\t\t\tlet left = 0\n\t\t\tfor (let i = 0; i < count && i < row.children.length; i++) {\n\t\t\t\toffsets.push(left)\n\t\t\t\tleft += row.children[i].offsetWidth || 0\n\t\t\t}\n\t\t\tif (offsets.join() !== this.pinOffsets.join()) {\n\t\t\t\tthis.pinOffsets = offsets\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Start watching the scrollport for horizontal overflow.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tobserveScrollOverflow() {\n\t\t\tthis.measureScrollOverflow()\n\t\t\tif (typeof ResizeObserver === 'undefined') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis._scrollObserver = new ResizeObserver(() => this.measureScrollOverflow())\n\t\t\tconst el = this.$refs.scrollEl\n\t\t\tif (el) {\n\t\t\t\tthis._scrollObserver.observe(el)\n\t\t\t\t// The table itself, not just the port: a column widening pushes\n\t\t\t\t// the content past the fold without the port changing size.\n\t\t\t\tconst table = el.querySelector('table')\n\t\t\t\tif (table) {\n\t\t\t\t\tthis._scrollObserver.observe(table)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Recompute whether the scrollport overflows horizontally.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tmeasureScrollOverflow() {\n\t\t\tthis.measurePins()\n\t\t\tconst el = this.$refs.scrollEl\n\t\t\t// 1px of tolerance: sub-pixel layout rounding otherwise reports a\n\t\t\t// table that visually fits as scrollable, which would put a tab\n\t\t\t// stop on it for no reachable content.\n\t\t\tconst next = !!el && (el.scrollWidth - el.clientWidth) > 1\n\t\t\tif (next !== this.isScrollable) {\n\t\t\t\tthis.isScrollable = next\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Tear down the overflow observer.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tdisconnectScrollOverflow() {\n\t\t\tif (this._scrollObserver) {\n\t\t\t\tthis._scrollObserver.disconnect()\n\t\t\t\tthis._scrollObserver = null\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Resolve a column header label through the consumer's translation\n\t\t * function. Column labels originate from schema property titles\n\t\t * (English canonical source); this makes the rendered header follow\n\t\t * the user's language when the host app provides `cnTranslate`, and\n\t\t * returns the label unchanged when it does not.\n\t\t *\n\t\t * @param {string} label The English source label (schema property title).\n\t\t * @return {string} The translated label, or the input unchanged.\n\t\t */\n\t\ttranslateLabel(label) {\n\t\t\tif (!label) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\treturn fn(label)\n\t\t},\n\n\t\t/**\n\t\t * Self-fetch rows from OpenRegister (register + schemaId mode). Best-effort:\n\t\t * any failure leaves the fetched rows empty. Folded from CnTableWidget.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fetchData() {\n\t\t\tthis.selfFetchLoading = true\n\t\t\ttry {\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schemaId}', {\n\t\t\t\t\tregister: String(this.register),\n\t\t\t\t\tschemaId: String(this.schemaId),\n\t\t\t\t})\n\t\t\t\tconst { data } = await axios.get(url, {\n\t\t\t\t\theaders: { 'OCS-APIREQUEST': 'true' },\n\t\t\t\t\t...(this.fetchParams ? { params: this.fetchParams } : {}),\n\t\t\t\t})\n\t\t\t\tthis.fetchedRows = (data && data.results) || (Array.isArray(data) ? data : [])\n\t\t\t\tthis.fetchedLenses = readLensReports(data)\n\t\t\t} catch {\n\t\t\t\tthis.fetchedRows = []\n\t\t\t\tthis.fetchedLenses = {}\n\t\t\t} finally {\n\t\t\t\tthis.selfFetchLoading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Activate the \"View all\" footer control: emit `view-all`, then push\n\t\t * `viewAllRoute` through the router when there is one. A plain left\n\t\t * click on the link is handled in-app; a modified click (ctrl/cmd/\n\t\t * shift/middle) is left to the browser so \"open in new tab\" keeps\n\t\t * working on the real href.\n\t\t *\n\t\t * @param {MouseEvent} [event] The click event, when triggered by one.\n\t\t * @return {void}\n\t\t */\n\t\tonViewAll(event) {\n\t\t\tconst modified = Boolean(event && (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button))\n\t\t\tif (event && !modified) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\t\t\t/** @event view-all Emitted when the built-in \"View all\" footer control is activated. Payload: the `viewAllRoute` object. */\n\t\t\tthis.$emit('view-all', this.viewAllRoute)\n\t\t\tif (modified) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.viewAllRoute && this.$router) {\n\t\t\t\tthis.$router.push(this.viewAllRoute).catch(() => {})\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Resolve the leading-row icon name for a row. Returns the static\n\t\t * `rowIcon` string, or the result of the `rowIcon(row)` function.\n\t\t *\n\t\t * @param {object} row The row object.\n\t\t * @return {string} The MDI icon name (PascalCase).\n\t\t */\n\t\tgetRowIcon(row) {\n\t\t\treturn typeof this.rowIcon === 'function' ? this.rowIcon(row) : this.rowIcon\n\t\t},\n\n\t\t/**\n\t\t * Get a cell value from a row using dot-notation key.\n\t\t *\n\t\t * OpenRegister system/metadata fields (created, updated, owner, uri,\n\t\t * size, register, schema, ...) live under the object's `@self` block.\n\t\t * For a flat key we fall back to `@self` when the top level has no\n\t\t * value, so sidebar-enabled metadata columns resolve. Top-level fields\n\t\t * always win, keeping existing behaviour unchanged.\n\t\t *\n\t\t * @param {object} row The row data\n\t\t * @param {string} key The column key (supports dot notation: 'address.city')\n\t\t * @return {unknown} The cell value\n\t\t */\n\t\tgetCellValue(row, key) {\n\t\t\tif (typeof key !== 'string') {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\tif (key.includes('.')) {\n\t\t\t\treturn key.split('.').reduce((obj, k) => obj?.[k], row)\n\t\t\t}\n\t\t\tif (row?.[key] === undefined && row?.['@self'] && typeof row['@self'] === 'object') {\n\t\t\t\treturn row['@self'][key]\n\t\t\t}\n\t\t\treturn row?.[key]\n\t\t},\n\n\t\t/**\n\t\t * Get the schema property definition for a column key, or `{}` when\n\t\t * there is no schema (manual mode) or no matching property. The result\n\t\t * is handed to `CnCellRenderer` for type-aware rendering; an empty\n\t\t * object makes it fall back to `formatValue()` (plain truncated text).\n\t\t *\n\t\t * @param {string} key Column key\n\t\t * @return {object} Property definition (possibly empty).\n\t\t */\n\t\tgetSchemaProperty(key) {\n\t\t\treturn this.schema?.properties?.[key] || {}\n\t\t},\n\n\t\t/**\n\t\t * Effective property definition handed to CnCellRenderer for a column:\n\t\t * the schema property augmented with the column's own `type`/`format`/\n\t\t * `enum`/`enumLabels` hints. Lets synthesized columns that have no\n\t\t * schema property (e.g. metadata fields with `format: 'date-time'` /\n\t\t * `'uri'`, or a dotted path into a reference this table was never\n\t\t * handed a `:schema` for at all) still get type-aware rendering.\n\t\t * `enumLabels` rides with `enum` rather than getting its own `if`\n\t\t * branch: a column can't usefully declare labels without also\n\t\t * declaring the codes they label. A column `colorMap` (raw value to\n\t\t * badge variant) colours the enum pill from the manifest and wins over\n\t\t * the schema property's own `colorMap` / `x-color-map`. A column with\n\t\t * `valueField` takes that field's property.\n\t\t *\n\t\t * @param {object} col Column definition.\n\t\t * @spec openspec/changes/screens-table-footer-and-system-dates-parity/specs/index-list-board-look/spec.md#requirement-a-system-date-can-be-a-column\n\t\t * @return {object} Property definition for CnCellRenderer.\n\t\t * @spec openspec/changes/screens-cell-pill-parity/specs/cell-pill-tones/spec.md#requirement-a-manifest-column-colours-its-enum-pills\n\t\t */\n\t\tcolumnProperty(col) {\n\t\t\tconst base = this.getSchemaProperty(this.columnValueField(col))\n\t\t\t// A system date (`@self.created`, `@self.updated`, ...) has no\n\t\t\t// schema property behind it; it renders as a date-time.\n\t\t\tif (Object.keys(base).length === 0 && SYSTEM_DATE_KEYS.includes(col.key) && !col.type && !col.format) {\n\t\t\t\treturn { type: 'string', format: 'date-time' }\n\t\t\t}\n\t\t\tconst colorMap = col && col.colorMap && typeof col.colorMap === 'object' && !Array.isArray(col.colorMap) ? col.colorMap : null\n\t\t\tif (col && (col.format || col.type || col.enum || colorMap)) {\n\t\t\t\treturn {\n\t\t\t\t\t...base,\n\t\t\t\t\t...(col.type ? { type: col.type } : {}),\n\t\t\t\t\t...(col.format ? { format: col.format } : {}),\n\t\t\t\t\t...(col.enum ? { enum: col.enum, enumLabels: col.enumLabels || base.enumLabels } : {}),\n\t\t\t\t\t...(colorMap ? { colorMap } : {}),\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn base\n\t\t},\n\n\t\t/**\n\t\t * Declarative cell-format spec handed to CnCellRenderer's `format` prop\n\t\t * (an object: `{ style, currency, decimals, ... }`). `col.format` is\n\t\t * overloaded — for schema-derived columns it is the schema format STRING\n\t\t * (`'date'`, `'uri'`, ...), which is NOT a declarative spec and drives\n\t\t * type-aware rendering via `columnProperty()` instead. Only forward an\n\t\t * object here, so a string schema-format no longer trips CnCellRenderer's\n\t\t * `Object`-typed `format` prop (Vue prop-type warning).\n\t\t *\n\t\t * @param {object} col Column definition.\n\t\t * @return {object|null} The declarative format spec, or null.\n\t\t */\n\t\tcolumnFormat(col) {\n\t\t\treturn (col && typeof col.format === 'object') ? col.format : null\n\t\t},\n\n\t\t/**\n\t\t * The pills a cell draws beside its value: each `col.pills` entry\n\t\t * (`{ field, equals | in | ..., label, variant? }`, the row-indicator\n\t\t * condition grammar) whose condition holds on the row, its label\n\t\t * translated.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @param {object} col The column definition.\n\t\t * @return {Array<{label: string, variant: string}>} The pills, in declared order.\n\t\t * @spec openspec/changes/column-cell-pills/specs/data-table/spec.md#requirement-a-column-can-put-a-pill-beside-a-cells-value\n\t\t */\n\t\tcellPills(row, col) {\n\t\t\tif (!col || !Array.isArray(col.pills) || col.pills.length === 0) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn col.pills\n\t\t\t\t.filter((pill) => pill && typeof pill.label === 'string' && pill.label !== '' && typeof pill.field === 'string' && indicatorApplies(pill, row || {}))\n\t\t\t\t.map((pill) => ({ label: this.translateLabel(pill.label), variant: typeof pill.variant === 'string' ? pill.variant : 'default' }))\n\t\t},\n\n\t\t/**\n\t\t * The secondary line of a cell, from `col.secondary`: a function is\n\t\t * called with the row; a string with `{field}` placeholders is a\n\t\t * template filled from the row (dotted paths allowed), where a\n\t\t * `{field|format}` token is formatted by `fillTemplate` (\"{startAt|weekday}\"\n\t\t * reads \"wo 7 okt\"); any other string is a field key. Returns '' when\n\t\t * there is nothing to draw.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-a-table-column-carries-a-secondary-line\n\t\t * @param {object} row The row.\n\t\t * @param {object} col The column definition.\n\t\t * @return {string} The secondary text, or ''.\n\t\t */\n\t\tsecondaryValue(row, col) {\n\t\t\treturn this.cellLineValue(row, col?.secondary, col)\n\t\t},\n\n\t\t/**\n\t\t * The muted line above a cell's value, from `col.overline` (read like\n\t\t * `secondary`) or else `col.overlineText`, a fixed text in the host's\n\t\t * translation (PtToegangsverzoeken \"Zaken van\"). Returns '' when there\n\t\t * is nothing to draw.\n\t\t *\n\t\t * @spec openspec/changes/table-cell-overline/specs/data-table/spec.md#requirement-a-table-column-can-carry-a-muted-line-above-its-value\n\t\t * @param {object} row The row.\n\t\t * @param {object} col The column definition.\n\t\t * @return {string} The overline text, or ''.\n\t\t */\n\t\toverlineValue(row, col) {\n\t\t\tconst fromRow = this.cellLineValue(row, col?.overline, col)\n\t\t\tif (fromRow !== '') {\n\t\t\t\treturn fromRow\n\t\t\t}\n\t\t\treturn typeof col?.overlineText === 'string' && col.overlineText !== '' ? this.translateLabel(col.overlineText) : ''\n\t\t},\n\n\t\t/**\n\t\t * One extra line of a cell from its spec: a function is called with the\n\t\t * row; a string with `{field}` placeholders is a template filled from\n\t\t * the row; any other string is a field key. Shared by `secondary` and\n\t\t * `overline`.\n\t\t *\n\t\t * @spec openspec/changes/table-cell-overline/specs/data-table/spec.md#requirement-a-table-column-can-carry-a-muted-line-above-its-value\n\t\t * @param {object} row The row.\n\t\t * @param {Function|string|undefined} spec The line's spec.\n\t\t * @param {object} [col] The column, for its `secondaryLabels`.\n\t\t * @return {string} The text, or ''.\n\t\t */\n\t\tcellLineValue(row, spec, col) {\n\t\t\tif (typeof spec === 'function') {\n\t\t\t\tconst out = spec(row)\n\t\t\t\treturn out === null || out === undefined ? '' : String(out)\n\t\t\t}\n\t\t\tif (typeof spec !== 'string' || spec === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tif (spec.includes('{')) {\n\t\t\t\tconst filled = joinTemplateParts(spec, (key) => (key.includes('|')\n\t\t\t\t\t? fillTemplate(`{${key}}`, row)\n\t\t\t\t\t: this.secondaryFieldText(row, key, col)))\n\t\t\t\t// A template whose every field is empty leaves only separators:\n\t\t\t\t// nothing worth a line.\n\t\t\t\treturn /[\\p{L}\\p{N}]/u.test(filled) ? filled.trim() : ''\n\t\t\t}\n\t\t\treturn this.secondaryFieldText(row, spec, col)\n\t\t},\n\n\t\t/**\n\t\t * The text of one field on a secondary line. A value the column's\n\t\t * `secondaryLabels[key]` names reads as that label, else as its `'*'`\n\t\t * label, translated. An enum field reads as its label (`x-enum-labels`,\n\t\t * in the user's language), as an enum cell does, so \"regular\" reads\n\t\t * \"Gewone vergadering\". Anything else is the stored value as text.\n\t\t *\n\t\t * @spec openspec/changes/screens-secondary-enum-label/specs/data-table/spec.md\n\t\t * @param {object} row The row.\n\t\t * @param {string} key The field key (dotted paths allowed).\n\t\t * @param {object} [col] The column, for its `secondaryLabels`.\n\t\t * @return {string} The text, or '' when the field is empty.\n\t\t */\n\t\tsecondaryFieldText(row, key, col) {\n\t\t\tconst value = this.getCellValue(row, key)\n\t\t\tif (value === null || value === undefined) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst named = col?.secondaryLabels?.[key]\n\t\t\tif (named && typeof named === 'object' && typeof value !== 'object') {\n\t\t\t\tconst label = Object.hasOwn(named, String(value)) ? named[String(value)] : named['*']\n\t\t\t\tif (typeof label === 'string' && label !== '') {\n\t\t\t\t\treturn this.translateLabel(label)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst property = this.getSchemaProperty(key)\n\t\t\tif (typeof value !== 'object' && value !== '' && Array.isArray(property.enum) && property.enum.length > 0) {\n\t\t\t\tconst labels = property.enumLabels || property['x-enum-labels'] || {}\n\t\t\t\treturn this.translateLabel(labels[String(value)] || String(value))\n\t\t\t}\n\t\t\treturn String(value)\n\t\t},\n\n\t\t/**\n\t\t * Value to render in a cell. For a column that declares `aggregate`\n\t\t * (a count of related objects), returns the cached count once\n\t\t * `loadAggregates()` has resolved it (or `'…'` while pending, `'—'`\n\t\t * if it failed / there's nothing to count). A count of zero reads as\n\t\t * `aggregate.zeroLabel` when the column sets one (\"None\", which the\n\t\t * app's `cnTranslate` turns into \"Geen\" as the boards draw it); without\n\t\t * it the cell shows `0` as before. Otherwise the row's value of the\n\t\t * column's `valueField` (else its key) via `getCellValue`.\n\t\t *\n\t\t * @spec openspec/changes/aggregate-zero-label/specs/aggregate-zero-label/spec.md#requirement-a-count-column-can-name-zero\n\t\t * @spec openspec/changes/cell-config-growth/specs/cell-config-growth/spec.md#requirement-a-column-can-show-one-field-and-sort-on-another\n\t\t * @param {object} row The row data.\n\t\t * @param {object} col The column definition.\n\t\t * @return {unknown} The value handed to the slot / CnCellRenderer.\n\t\t */\n\t\tcellValue(row, col) {\n\t\t\tif (col && col.aggregate) {\n\t\t\t\tconst cached = this.aggregateValues[String(row[this.rowKey])]\n\t\t\t\tconst v = cached ? cached[col.key] : undefined\n\t\t\t\tif (v === undefined) {\n\t\t\t\t\treturn this.aggregateLoading ? '…' : '—'\n\t\t\t\t}\n\t\t\t\tif (v === null && !(typeof col.aggregate.zeroLabel === 'string' && col.aggregate.zeroLabel !== '')) {\n\t\t\t\t\treturn '—'\n\t\t\t\t}\n\t\t\t\tconst zeroLabel = col.aggregate.zeroLabel\n\t\t\t\tif ((v === 0 || v === '0' || v === null) && typeof zeroLabel === 'string' && zeroLabel !== '') {\n\t\t\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate(zeroLabel) : zeroLabel\n\t\t\t\t}\n\t\t\t\treturn v\n\t\t\t}\n\t\t\tconst value = this.getCellValue(row, this.columnValueField(col))\n\t\t\t// `emptyValue`: what a row without a value holds, so a badge column draws one for every row.\n\t\t\tif ((value === null || value === undefined || value === '') && col && Object.hasOwn(col, 'emptyValue')) {\n\t\t\t\treturn col.emptyValue\n\t\t\t}\n\t\t\treturn value\n\t\t},\n\n\t\t/**\n\t\t * Whether an aggregate cell shows its `zeroLabel` as muted text instead\n\t\t * of through the column's widget (`aggregate.zeroAs: \"text\"`): a count\n\t\t * of zero, or a max with nothing to read.\n\t\t *\n\t\t * @param {object} row The row data.\n\t\t * @param {object} col The column definition.\n\t\t * @return {boolean}\n\t\t * @spec openspec/changes/aggregate-zero-as-text/specs/index-page/spec.md#requirement-a-count-column-can-show-its-zero-label-as-text\n\t\t */\n\t\tisTextZero(row, col) {\n\t\t\tconst aggregate = col && col.aggregate\n\t\t\tif (!aggregate || aggregate.zeroAs !== 'text' || typeof aggregate.zeroLabel !== 'string' || aggregate.zeroLabel === '') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst cached = this.aggregateValues[String(row[this.rowKey])]\n\t\t\tconst v = cached ? cached[col.key] : undefined\n\t\t\treturn v === 0 || v === '0' || v === null\n\t\t},\n\n\t\t/**\n\t\t * The row field a column's cell shows: `col.valueField` when set, else\n\t\t * `col.key`. The key stays what the header sorts and filters on, so a\n\t\t * column can sort on a stored order and show the word it orders.\n\t\t *\n\t\t * @param {object} col Column definition.\n\t\t * @return {string} The field to read.\n\t\t * @spec openspec/changes/cell-config-growth/specs/cell-config-growth/spec.md#requirement-a-column-can-show-one-field-and-sort-on-another\n\t\t */\n\t\tcolumnValueField(col) {\n\t\t\treturn col && typeof col.valueField === 'string' && col.valueField !== '' ? col.valueField : col.key\n\t\t},\n\n\t\t/**\n\t\t * For every column that declares `aggregate`, issue one request per\n\t\t * visible row against the related OpenRegister collection and cache the\n\t\t * answer in `aggregateValues`: `op: \"count\"` asks `_limit=0` for the\n\t\t * total, `op: \"max\"` asks for the one object with the highest `field`\n\t\t * (`_limit=1`, sorted descending) and keeps that value, null when there\n\t\t * is none (shown as `zeroLabel`, else a dash).\n\t\t * Batched with `Promise.all`; a per-request failure degrades that one\n\t\t * cell to `'—'` (logged), never the page. A monotonic request id\n\t\t * discards a stale batch when `rows` / columns change mid-flight.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/masked-formatter-max-aggregate/specs/index-page/spec.md#requirement-a-column-aggregate-can-take-the-highest-value\n\t\t */\n\t\tasync loadAggregates() {\n\t\t\tconst aggCols = this.effectiveColumns.filter((c) => c && c.aggregate && (isEndpointAggregate(c) || c.aggregate.op === 'count' || (c.aggregate.op === 'max' && c.aggregate.field)))\n\t\t\tif (aggCols.length === 0) {\n\t\t\t\tif (Object.keys(this.aggregateValues).length > 0) {\n\t\t\t\t\tthis.aggregateValues = {}\n\t\t\t\t}\n\t\t\t\tthis.aggregateLoading = false\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst id = ++this.aggregateRequestId\n\t\t\tthis.aggregateLoading = true\n\t\t\tconst next = {}\n\t\t\tconst jobs = []\n\t\t\tfor (const row of this.rows) {\n\t\t\t\tconst rowKey = String(row[this.rowKey])\n\t\t\t\tnext[rowKey] = {}\n\t\t\t\tfor (const col of aggCols) {\n\t\t\t\t\tconst agg = col.aggregate\n\t\t\t\t\tif (isEndpointAggregate(col)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif (!agg.register || !agg.schema) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\t// `max`: the highest `field` among the related objects, as the\n\t\t\t\t\t// first of them sorted on it descending (\"Laatste contact\").\n\t\t\t\t\tjobs.push(fetchRowAggregate(agg, row, (r, path) => this.getCellValue(r, path))\n\t\t\t\t\t\t.then((value) => {\n\t\t\t\t\t\t\tnext[rowKey][col.key] = value\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch((e) => {\n\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\tconsole.warn(`[CnDataTable] aggregate \"${col.key}\" count failed for row ${rowKey}`, e)\n\t\t\t\t\t\t\tnext[rowKey][col.key] = undefined\n\t\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const col of aggCols.filter(isEndpointAggregate)) {\n\t\t\t\tjobs.push(this.loadEndpointAggregate(col, next, id))\n\t\t\t}\n\t\t\tawait Promise.all(jobs)\n\t\t\tif (id !== this.aggregateRequestId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.aggregateValues = next\n\t\t\tthis.aggregateLoading = false\n\t\t},\n\n\t\t/**\n\t\t * Whether a column is left out: an aggregate whose `requiresApp` is\n\t\t * not installed, or whose endpoint answered `available: false`.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @return {boolean} True when the column is not drawn.\n\t\t * @spec openspec/changes/aggregate-from-endpoint/specs/cn-data-table/spec.md\n\t\t */\n\t\tisAggregateHidden(col) {\n\t\t\tconst agg = col && typeof col === 'object' ? col.aggregate : null\n\t\t\tif (!agg) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (typeof agg.requiresApp === 'string' && agg.requiresApp !== '' && !isAppInstalled(agg.requiresApp)) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn this.aggregateUnavailable[col.key] === true\n\t\t},\n\n\t\t/**\n\t\t * Read an endpoint aggregate for the visible rows in one request:\n\t\t * GET `aggregate.endpoint` with `keys` (the rows' `aggregate.key`\n\t\t * values), answered by `{ available, values: { key: value } }`. A row\n\t\t * the answer does not name, or with no key, counts 0. `available: false`\n\t\t * hides the column.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @param {object} next The values being built, by row then column.\n\t\t * @param {number} id The batch id, to drop a stale answer.\n\t\t * @return {Promise<void>}\n\t\t * @spec openspec/changes/aggregate-from-endpoint/specs/cn-data-table/spec.md\n\t\t */\n\t\tasync loadEndpointAggregate(col, next, id) {\n\t\t\tconst agg = col.aggregate\n\t\t\tconst keyOf = (row) => {\n\t\t\t\tconst value = this.getCellValue(row, agg.key)\n\t\t\t\treturn value === undefined || value === null || value === '' ? '' : String(value)\n\t\t\t}\n\t\t\tconst keys = [...new Set(this.rows.map(keyOf).filter((k) => k !== ''))]\n\t\t\tlet values = {}\n\t\t\tif (keys.length > 0) {\n\t\t\t\ttry {\n\t\t\t\t\tconst res = await axios.get(generateUrl(agg.endpoint), { params: { keys } })\n\t\t\t\t\tconst body = (res && res.data) || {}\n\t\t\t\t\tif (body.available === false) {\n\t\t\t\t\t\tif (id === this.aggregateRequestId) {\n\t\t\t\t\t\t\tthis.aggregateUnavailable = { ...this.aggregateUnavailable, [col.key]: true }\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tvalues = body.values && typeof body.values === 'object' ? body.values : {}\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.warn(`[CnDataTable] aggregate \"${col.key}\" endpoint failed`, e)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const row of this.rows) {\n\t\t\t\tconst k = keyOf(row)\n\t\t\t\tnext[String(row[this.rowKey])][col.key] = k !== '' && values[k] !== undefined ? values[k] : 0\n\t\t\t}\n\t\t},\n\n\t\tisSelected(row) {\n\t\t\treturn this.selectedIds.includes(row[this.rowKey])\n\t\t},\n\n\t\t/**\n\t\t * Row-body click: toggles selection when `selectable` (ignoring drags),\n\t\t * otherwise emits `row-click` for navigation.\n\t\t *\n\t\t * @param {object} row The clicked row object\n\t\t * @param {MouseEvent} [event] The originating click event.\n\t\t */\n\t\tonRowClick(row, event) {\n\t\t\tif (this.wasDrag(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.selectable && !this.rowClickToView) {\n\t\t\t\tthis.toggleSelect(row)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.emitRowClick(row, event)\n\t\t},\n\n\t\t/**\n\t\t * Row mousedown: record the press for the drag guard, and on a row a\n\t\t * middle click opens, keep the browser from starting autoscroll.\n\t\t *\n\t\t * @param {MouseEvent} event The mousedown event.\n\t\t */\n\t\tonRowMouseDown(event) {\n\t\t\tthis.onPointerDown(event)\n\t\t\tif (!this.selectable || this.rowClickToView) {\n\t\t\t\tpreventMiddleClickAutoscroll(event)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Row-body middle click: emits `row-aux-click`, not `row-click`, so an\n\t\t * existing `row-click` listener that navigates never moves the current\n\t\t * tab away; `rowClickRoute` still opens the row in a new tab. Ignored\n\t\t * for other buttons, nested controls, drags and select-on-click tables.\n\t\t *\n\t\t * @param {object} row The clicked row object\n\t\t * @param {MouseEvent} event The originating auxclick event.\n\t\t */\n\t\tonRowAuxClick(row, event) {\n\t\t\tif (!isRowMiddleClick(event) || this.wasDrag(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.selectable && !this.rowClickToView) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event row-aux-click Emitted on a row-body middle click, under the same conditions as `row-click`, so a host can open the row in a new tab (see `openRowTarget`). Payload: `(row, event)` — the clicked row object and the native auxclick event.\n\t\t\t * @type {object} The clicked row object.\n\t\t\t */\n\t\t\tthis.$emit('row-aux-click', row, event)\n\t\t\tthis.followRowClickRoute(row, event)\n\t\t},\n\n\t\t/**\n\t\t * Emit `row-click` and follow `rowClickRoute` when set.\n\t\t *\n\t\t * @param {object} row The clicked row object\n\t\t * @param {MouseEvent} [event] The originating click event.\n\t\t */\n\t\temitRowClick(row, event) {\n\t\t\t/**\n\t\t\t * @event row-click Emitted on a row-body click for navigation. Fires when `selectable` is false, OR when `rowClickToView` is set (selection then happens via the checkbox column). Payload: `(row, event)` — the clicked row object and the native click event, so a host can open the row in a new tab on a ctrl/cmd/shift click (see `openRowTarget`). A middle click emits `row-aux-click` instead.\n\t\t\t * @type {object} The clicked row object.\n\t\t\t */\n\t\t\tthis.$emit('row-click', row, event)\n\t\t\tthis.followRowClickRoute(row, event)\n\t\t},\n\n\t\t/**\n\t\t * Follow `rowClickRoute` for a row click: in place, or in a new tab on\n\t\t * a ctrl/cmd/shift or middle click.\n\t\t *\n\t\t * @param {object} row The clicked row object\n\t\t * @param {MouseEvent} [event] The originating click or auxclick event.\n\t\t */\n\t\tfollowRowClickRoute(row, event) {\n\t\t\t// A new-tab click opens the route in a new tab, unless a listener\n\t\t\t// already did.\n\t\t\tif (this.rowClickRoute && this.$router && !isNewTabHandled(event)) {\n\t\t\t\tconst route = this.rowClickRoute(row)\n\t\t\t\tif (route) {\n\t\t\t\t\tmarkNewTabHandled(event, openRowTarget(event, typeof route === 'string' ? { path: route } : route, this.$router))\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * A plain or alt click on a row link routes in place; a new-tab click\n\t\t * is left to the browser, which opens the href itself.\n\t\t *\n\t\t * @param {object} row The row the link belongs to.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonRowLinkClick(row, event) {\n\t\t\tconst link = this.rowLinks[String(row[this.rowKey])]\n\t\t\tif (!link) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// Alt-click on a link downloads it; a row opens like a plain click.\n\t\t\tif (event.altKey && !isNewTabClick(event) && !event.defaultPrevented) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tthis.$router.push(link.target).catch(() => {})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowLinkClick(event, link.target, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * The row link's accessible name: the row's first cell when it holds\n\t\t * plain text, else a generic name.\n\t\t *\n\t\t * @param {object} row The row.\n\t\t * @param {object} col The first data column.\n\t\t * @return {string}\n\t\t */\n\t\trowLinkLabel(row, col) {\n\t\t\tconst value = this.cellValue(row, col)\n\t\t\tif (['string', 'number'].includes(typeof value) && String(value).trim() !== '') {\n\t\t\t\treturn String(value)\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Open row')\n\t\t},\n\n\t\t/**\n\t\t * Row right-click: forward the row + originating event so a host can\n\t\t * open a context menu. The browser menu is prevented, except on a row\n\t\t * link when no host listens, so its link actions stay available.\n\t\t *\n\t\t * @param {object} row The right-clicked row object.\n\t\t * @param {MouseEvent} event The originating contextmenu event.\n\t\t */\n\t\tonRowContextMenu(row, event) {\n\t\t\tconst fromRowLink = event.target?.closest?.('.cn-table-row__link')\n\t\t\t// `$.vnode.props`, not `$attrs`: a declared emit is stripped from `$attrs`.\n\t\t\tif (!fromRowLink || this.$.vnode.props?.onRowContextMenu) {\n\t\t\t\tevent.preventDefault()\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event row-context-menu Emitted on a row right-click (contextmenu) for hosts that render a context menu.\n\t\t\t * @type {{ row: object, event: MouseEvent }}\n\t\t\t */\n\t\t\tthis.$emit('row-context-menu', { row, event })\n\t\t},\n\n\t\t/**\n\t\t * Index of `key` within `effectiveSortKeys`, or -1 when not active.\n\t\t * Used by the template for the arrow.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @return {number}\n\t\t */\n\t\tsortKeyIndex(key) {\n\t\t\treturn this.effectiveSortKeys.findIndex((k) => k && k.key === key)\n\t\t},\n\n\t\t/**\n\t\t * The 1-based priority badge for `key` among the rendered sort keys, or null when fewer than two rendered columns are sorted or `key` is not one of them.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @return {number|null}\n\t\t */\n\t\tsortBadgeFor(key) {\n\t\t\tif (this.renderedSortKeys.length < 2) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst index = this.renderedSortKeys.findIndex((k) => k.key === key)\n\t\t\treturn index === -1 ? null : index + 1\n\t\t},\n\n\t\t/**\n\t\t * `aria-sort` value for a column header: `'ascending'`/`'descending'` for the first rendered sort key only, per WCAG guidance that `aria-sort` describes single-column sort state.\n\t\t * `null` omits the attribute entirely (unsorted, not sortable, or not the first rendered sort key).\n\t\t *\n\t\t * @param {object} col Column definition.\n\t\t * @return {string|null}\n\t\t */\n\t\tariaSortFor(col) {\n\t\t\tif (!col.sortable) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst primary = this.renderedSortKeys[0]\n\t\t\tif (!primary || primary.key !== col.key) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn primary.order === 'asc' ? 'ascending' : 'descending'\n\t\t},\n\n\t\t/**\n\t\t * Header click: plain click = single-sort (existing behavior,\n\t\t * unchanged); shift+click appends/cycles the column as a secondary or\n\t\t * tertiary sort key. See `src/utils/multiColumnSort.js`.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @param {MouseEvent} [event] The originating click event.\n\t\t */\n\t\t/**\n\t\t * The filter definition for a column, or null when it does not filter\n\t\t * (header filters off, `filterable: false`, or nothing to filter on).\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @return {object|null}\n\t\t */\n\t\tfilterDefFor(col) {\n\t\t\tif (!this.filterable || !col) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn columnFilterDef(col, this.filterSchema || this.schema)\n\t\t},\n\n\t\tcolumnFilterStateFor(col) {\n\t\t\treturn columnFilterState(this.filterDefFor(col), this.activeFilters)\n\t\t},\n\n\t\tisColumnFiltered(col) {\n\t\t\tconst def = this.filterDefFor(col)\n\t\t\treturn !!def && isColumnFilterActive(def, this.activeFilters)\n\t\t},\n\n\t\tfilterButtonLabel(col) {\n\t\t\tconst column = this.translateLabel(col.label)\n\t\t\treturn this.isColumnFiltered(col)\n\t\t\t\t? t('nextcloud-vue', 'Filter by {column}, active', { column })\n\t\t\t\t: t('nextcloud-vue', 'Filter by {column}', { column })\n\t\t},\n\n\t\t/**\n\t\t * Short text for an active filter: the picked labels, or the range.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @return {string}\n\t\t */\n\t\tcolumnFilterSummary(col) {\n\t\t\tconst def = this.filterDefFor(col)\n\t\t\tconst state = this.columnFilterStateFor(col)\n\t\t\tif (!def) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tif (def.kind === 'enum') {\n\t\t\t\tconst labels = Object.fromEntries((def.options || []).map((o) => [o.value, o.label]))\n\t\t\t\treturn state.values.map((v) => this.translateLabel(labels[v] || v)).join(', ')\n\t\t\t}\n\t\t\tif (def.kind === 'reference') {\n\t\t\t\treturn n('nextcloud-vue', '{count} selected', '{count} selected', state.values.length, { count: state.values.length })\n\t\t\t}\n\t\t\tif (def.kind === 'number' || def.kind === 'date') {\n\t\t\t\tif (state.from && state.to) {\n\t\t\t\t\treturn t('nextcloud-vue', '{from} to {to}', { from: state.from, to: state.to })\n\t\t\t\t}\n\t\t\t\treturn state.from\n\t\t\t\t\t? t('nextcloud-vue', 'from {value}', { value: state.from })\n\t\t\t\t\t: t('nextcloud-vue', 'up to {value}', { value: state.to })\n\t\t\t}\n\t\t\tif (def.kind === 'boolean') {\n\t\t\t\treturn state.value === 'true' ? t('nextcloud-vue', 'Yes') : t('nextcloud-vue', 'No')\n\t\t\t}\n\t\t\treturn state.value\n\t\t},\n\n\t\t/**\n\t\t * Open or close a column's filter panel under its button.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @param {Event} event The click.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleColumnFilter(col, event) {\n\t\t\tif (this.openFilterKey === col.key) {\n\t\t\t\tthis.closeColumnFilter()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst target = event && event.currentTarget\n\t\t\tthis.filterAnchorRect = target && typeof target.getBoundingClientRect === 'function'\n\t\t\t\t? target.getBoundingClientRect()\n\t\t\t\t: null\n\t\t\tthis.openFilterKey = col.key\n\t\t},\n\n\t\t/**\n\t\t * Close the open panel and give focus back to its button.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tcloseColumnFilter() {\n\t\t\tconst key = this.openFilterKey\n\t\t\tthis.openFilterKey = ''\n\t\t\tif (!key) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst ref = this.$refs['filterButton-' + key]\n\t\t\t\tconst button = Array.isArray(ref) ? ref[0] : ref\n\t\t\t\tif (button && typeof button.focus === 'function') {\n\t\t\t\t\tbutton.focus()\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Apply a panel's state: emit the query parameters it stands for.\n\t\t *\n\t\t * @param {object} col The column.\n\t\t * @param {object} state The panel state.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/table-header-sort-and-filter/specs/cn-data-table/spec.md#requirement-a-header-filter-speaks-the-sidebars-query-language\n\t\t */\n\t\tapplyColumnFilter(col, state) {\n\t\t\tconst def = this.filterDefFor(col)\n\t\t\tif (def) {\n\t\t\t\t/**\n\t\t\t\t * @event column-filter A header filter was applied or cleared.\n\t\t\t\t * @type {{ key: string, params: object }} `params` maps each query parameter the column owns to its values; an empty list clears it.\n\t\t\t\t */\n\t\t\t\tthis.$emit('column-filter', { key: col.key, params: columnFilterParams(def, state) })\n\t\t\t}\n\t\t\tthis.closeColumnFilter()\n\t\t},\n\n\t\tclearColumnFilter(col) {\n\t\t\tconst def = this.filterDefFor(col)\n\t\t\tif (def) {\n\t\t\t\tthis.$emit('column-filter', { key: col.key, params: clearedColumnFilterParams(def) })\n\t\t\t}\n\t\t},\n\n\t\tonHeaderClick(key, event) {\n\t\t\tthis.applySort(key, !!(event && event.shiftKey))\n\t\t},\n\n\t\t/**\n\t\t * Header keydown: `Enter` = plain click, `Shift+Enter` = shift+click.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @param {KeyboardEvent} event The originating keydown event.\n\t\t */\n\t\tonHeaderKeydown(key, event) {\n\t\t\tif (event.key !== 'Enter') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.applySort(key, !!event.shiftKey)\n\t\t},\n\n\t\t/**\n\t\t * Compute and emit the next sort state for a header interaction.\n\t\t *\n\t\t * @param {string} key Column key.\n\t\t * @param {boolean} append `true` for a shift+click/shift+Enter (append/cycle a secondary key).\n\t\t */\n\t\tapplySort(key, append) {\n\t\t\tconst keys = nextSortState(this.effectiveSortKeys, key, { append })\n\t\t\tconst primary = keys[0] || null\n\t\t\t/**\n\t\t\t * @event sort Emitted when a sortable column header is clicked (plain click) or shift-clicked (multi-sort).\n\t\t\t * @type {{ key: string|null, order: 'asc'|'desc'|null, keys: Array<{key: string, order: 'asc'|'desc'}> }}\n\t\t\t * `key`/`order` mirror the PRIMARY (first) active sort key exactly as the pre-multi-sort single-key\n\t\t\t * contract did (`null`/`null` when cleared) — existing listeners destructuring `{ key, order }` are\n\t\t\t * unaffected. `keys` is new: the full ordered list (0 to 3 entries) for multi-sort-aware hosts.\n\t\t\t */\n\t\t\tthis.$emit('sort', {\n\t\t\t\tkey: primary ? primary.key : null,\n\t\t\t\torder: primary ? primary.order : null,\n\t\t\t\tkeys,\n\t\t\t})\n\t\t},\n\n\t\ttoggleSelect(row) {\n\t\t\tconst id = row[this.rowKey]\n\t\t\tconst newIds = this.isSelected(row)\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\n\t\t\t\t: [...this.selectedIds, id]\n\t\t\t/** @event select Emitted when row selection changes. Payload: array of selected IDs. */\n\t\t\tthis.$emit('select', newIds)\n\t\t},\n\n\t\ttoggleSelectAll() {\n\t\t\tif (this.allSelected) {\n\t\t\t\t// Remove only current page IDs, preserving cross-page selections\n\t\t\t\tconst currentPageIds = new Set(this.rows.map((row) => row[this.rowKey]))\n\t\t\t\tthis.$emit('select', this.selectedIds.filter((id) => !currentPageIds.has(id)))\n\t\t\t} else {\n\t\t\t\t// Add current page IDs to existing selections\n\t\t\t\tconst merged = new Set([...this.selectedIds, ...this.rows.map((row) => row[this.rowKey])])\n\t\t\t\tthis.$emit('select', [...merged])\n\t\t\t}\n\t\t\t/** @event select-all Emitted when select-all checkbox is toggled. */\n\t\t\tthis.$emit('select-all', !this.allSelected)\n\t\t},\n\t},\n}\n</script>\n"],"names":["CnCellRenderer","CnColumnFilterPopover","CnIcon","CnLockIndicator","CnStatusBadge","CnPagination","CnUnreadMarker","t","axios","n"],"mappings":"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"}