@conduction/nextcloud-vue 2.144.0 → 2.145.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 (85) hide show
  1. package/dist/esm/components/CnActionDialog/CnActionDialog.vue.js +1 -1
  2. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js +1 -0
  4. package/dist/esm/components/CnActionDialog/CnActionDialog.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  6. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +55 -2
  7. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  8. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  9. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue.js +1 -1
  10. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +16 -0
  11. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  12. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +3 -1
  13. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.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 +1 -1
  16. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue2.js.map +1 -1
  17. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js +3 -3
  18. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue3.js.map +1 -1
  19. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  20. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +2 -2
  21. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  22. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  23. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +6 -3
  24. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  26. package/dist/esm/components/CnMailTab/CnMailTab.vue.js +1 -1
  27. package/dist/esm/components/CnMailTab/CnMailTab.vue2.js.map +1 -1
  28. package/dist/esm/components/CnMailTab/CnMailTab.vue3.js +2 -2
  29. package/dist/esm/components/CnMailTab/CnMailTab.vue3.js.map +1 -1
  30. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue.js +1 -1
  31. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue2.js.map +1 -1
  32. package/dist/esm/components/CnNotificationMatrix/CnNotificationMatrix.vue3.js.map +1 -1
  33. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  34. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +73 -12
  35. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  36. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +165 -126
  37. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  38. package/dist/esm/components/CnSettingsField/CnSettingsField.vue.js +1 -1
  39. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js +14 -0
  40. package/dist/esm/components/CnSettingsField/CnSettingsField.vue2.js.map +1 -1
  41. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js +2 -1
  42. package/dist/esm/components/CnSettingsField/CnSettingsField.vue3.js.map +1 -1
  43. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
  44. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +13 -8
  45. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  46. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  47. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue.js +1 -1
  48. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +10 -2
  49. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  50. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  51. package/dist/esm/composables/indexSources.js +35 -9
  52. package/dist/esm/composables/indexSources.js.map +1 -1
  53. package/dist/esm/l10n/nl.json.js +2 -0
  54. package/dist/esm/l10n/nl.json.js.map +1 -1
  55. package/dist/esm/library-style.js +1 -1
  56. package/dist/esm/nextcloud-vue.css +742 -326
  57. package/dist/esm/utils/builtInFormatters.js +18 -1
  58. package/dist/esm/utils/builtInFormatters.js.map +1 -1
  59. package/dist/esm/utils/localHeaderRows.js +95 -0
  60. package/dist/esm/utils/localHeaderRows.js.map +1 -0
  61. package/dist/nextcloud-vue.cjs.js +514 -179
  62. package/dist/nextcloud-vue.cjs.js.map +2 -2
  63. package/dist/nextcloud-vue.css +742 -326
  64. package/l10n/nl.json +2 -0
  65. package/package.json +1 -1
  66. package/src/components/CnActionDialog/CnActionDialog.vue +8 -1
  67. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +55 -2
  68. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +18 -0
  69. package/src/components/CnDetailWidgetHost/CnDetailWidgetHeaderItems.vue +2 -1
  70. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +2 -2
  71. package/src/components/CnIndexPage/CnIndexPage.vue +6 -3
  72. package/src/components/CnMailTab/CnMailTab.vue +6 -4
  73. package/src/components/CnNotificationMatrix/CnNotificationMatrix.vue +4 -1
  74. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +131 -20
  75. package/src/components/CnSettingsField/CnSettingsField.vue +15 -0
  76. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +13 -8
  77. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +10 -2
  78. package/src/composables/indexSources.js +35 -9
  79. package/src/css/dialog.css +18 -9
  80. package/src/css/look-board-detail.css +219 -23
  81. package/src/css/look-board-index.css +38 -4
  82. package/src/css/look-board.css +138 -8
  83. package/src/css/table.css +8 -1
  84. package/src/utils/builtInFormatters.js +17 -0
  85. package/src/utils/localHeaderRows.js +91 -0
@@ -5949,6 +5949,8 @@ var translations$c = {
5949
5949
  "Absent today": "Vandaag afwezig",
5950
5950
  "{message} until {time}": "{message} tot {time}",
5951
5951
  Away: "Afwezig",
5952
+ Present: "Aanwezig",
5953
+ "Absent until {date}": "Afwezig tot {date}",
5952
5954
  Busy: "Bezet",
5953
5955
  "No one in the team": "Niemand in het team",
5954
5956
  "Also replace the criteria with the current filters": "Vervang ook de criteria door de huidige filters",
@@ -98788,6 +98790,17 @@ const analyticsIntegration = {
98788
98790
  defaultSize: { w: 4, h: 3 },
98789
98791
  };
98790
98792
 
98793
+ /**
98794
+ * A changed value as an entry records it: OpenRegister writes `{ old, new }`,
98795
+ * other sources the value itself.
98796
+ *
98797
+ * @param {unknown} value The recorded change.
98798
+ * @return {unknown} The value it changed to.
98799
+ */
98800
+ function newValueOf(value) {
98801
+ return value !== null && typeof value === 'object' && Object.hasOwn(value, 'new') ? value.new : value
98802
+ }
98803
+
98791
98804
  /**
98792
98805
  * @param {object} entry An audit entry.
98793
98806
  * @return {number} When it happened, in ms; 0 when unreadable.
@@ -98918,6 +98931,18 @@ var script$7D = {
98918
98931
  * @type {{[key: string]: {[value: string]: string}}|null}
98919
98932
  */
98920
98933
  valueLabels: { type: Object, default: null },
98934
+ /**
98935
+ * What happened, in words, by the field an entry changed: rules
98936
+ * `[{ action?, field, to?, label }]`, the first whose `field` the entry
98937
+ * changed (to `to`, when given) wins over `actionLabels`. A label fills
98938
+ * the same tokens, plus `{object.<path>}` from `object`
98939
+ * ("Version {object.version} published" for `isDraft` set to false).
98940
+ *
98941
+ * @type {Array<{action?: string, field: string, to?: unknown, label: string}>}
98942
+ */
98943
+ changeLabels: { type: Array, default: () => [] },
98944
+ /** The audited record, for `{object.<path>}` in a label; null without one. */
98945
+ object: { type: Object, default: null },
98921
98946
  /**
98922
98947
  * Records beside the object whose events belong in its history:
98923
98948
  * `[{ as, register, schema, filter, limit? }]`. The card lists the
@@ -99110,12 +99135,16 @@ var script$7D = {
99110
99135
  * @return {string} The line.
99111
99136
  */
99112
99137
  formatAction(entry) {
99113
- const label = this.labelFor(entry);
99138
+ const label = this.changeLabelFor(entry) ?? this.labelFor(entry);
99114
99139
  if (label !== null) {
99115
99140
  return label
99116
99141
  .replace('{actor}', this.actorName(entry))
99117
99142
  .replace('{state}', entry.stateAfter || '')
99118
99143
  .replace(/\{changed\.([\w-]+)\}/g, (match, key) => this.changedValue(entry, key))
99144
+ .replace(/\{object\.([\w.-]+)\}/g, (match, path) => {
99145
+ const value = this.object ? readPath$8(this.object, path) : undefined;
99146
+ return value === null || value === undefined || typeof value === 'object' ? '' : String(value)
99147
+ })
99119
99148
  }
99120
99149
  const action = entry.action || entry.event || this.actionLabel;
99121
99150
  return entry.stateAfter ? `${action} (${entry.stateAfter})` : action
@@ -99132,7 +99161,7 @@ var script$7D = {
99132
99161
  */
99133
99162
  changedValue(entry, key) {
99134
99163
  const changed = entry && typeof entry.changed === 'object' && entry.changed !== null ? entry.changed : {};
99135
- const value = changed[key];
99164
+ const value = newValueOf(changed[key]);
99136
99165
  if (value === null || value === undefined || typeof value === 'object') {
99137
99166
  return ''
99138
99167
  }
@@ -99140,6 +99169,31 @@ var script$7D = {
99140
99169
  return words && typeof words[value] === 'string' ? words[value] : String(value)
99141
99170
  },
99142
99171
 
99172
+ /**
99173
+ * The `changeLabels` rule an entry matches: the first whose field the
99174
+ * entry changed, for its action and to its value when the rule names them.
99175
+ *
99176
+ * @param {object} entry The entry.
99177
+ * @return {string|null} The label, or null when no rule matches.
99178
+ */
99179
+ changeLabelFor(entry) {
99180
+ const changed = entry && typeof entry.changed === 'object' && entry.changed !== null ? entry.changed : {};
99181
+ const action = entry.action || entry.event || '';
99182
+ for (const rule of Array.isArray(this.changeLabels) ? this.changeLabels : []) {
99183
+ if (!rule || typeof rule.label !== 'string' || rule.label === '' || typeof rule.field !== 'string' || !Object.hasOwn(changed, rule.field)) {
99184
+ continue
99185
+ }
99186
+ if (rule.action && rule.action !== action) {
99187
+ continue
99188
+ }
99189
+ if (Object.hasOwn(rule, 'to') && String(newValueOf(changed[rule.field])) !== String(rule.to)) {
99190
+ continue
99191
+ }
99192
+ return rule.label
99193
+ }
99194
+ return null
99195
+ },
99196
+
99143
99197
  /**
99144
99198
  * The `actionLabels` entry for an entry: by action and state first,
99145
99199
  * then by action.
@@ -99332,7 +99386,7 @@ function render$7C(_ctx, _cache, $props, $setup, $data, $options) {
99332
99386
  }
99333
99387
 
99334
99388
  script$7D.render = render$7C;
99335
- script$7D.__scopeId = "data-v-401394d1";
99389
+ script$7D.__scopeId = "data-v-7e58faa4";
99336
99390
  const __sfc_main$7x = script$7D;
99337
99391
 
99338
99392
  // SPDX-FileCopyrightText: 2026 Conduction B.V.
@@ -143215,7 +143269,9 @@ function fillRowTemplate(template, row) {
143215
143269
  * template, "{case.title}") or `linkedField` (a path) fills the "Linked"
143216
143270
  * column, drawn when a kind declares one; `sourceConfig.linkedLabel` names it.
143217
143271
  * `subtitleTemplate` ("Case {identifier}", translated) fills the line under a
143218
- * result, else `subtitleField`.
143272
+ * result, else `subtitleField`; `subtitleResolve` (`{ field, schema, labelField,
143273
+ * as }`) names a referenced object for it as `{as}`. `sourceConfig.titleWrap`
143274
+ * wraps a long result title instead of cutting it.
143219
143275
  * `linkedUser: true` reads that value as a user id and shows the user's
143220
143276
  * display name. `sourceConfig.columnWidths` sets a width per column key.
143221
143277
  * The page's title and count line can name the term as `{term}`, and the
@@ -143332,9 +143388,32 @@ function searchSource(config = {}, context = {}) {
143332
143388
  return ''
143333
143389
  };
143334
143390
 
143335
- const subtitleOf = (kind, object) => {
143391
+ // `subtitleResolve`: `{ field, schema, register?, labelField?, as }` names
143392
+ // the object a reference points at, for the subtitle template as `{as}`.
143393
+ const subtitleLabels = async (kind) => {
143394
+ const resolve = kind.subtitleResolve;
143395
+ if (!resolve || !resolve.schema || !resolve.field) {
143396
+ return null
143397
+ }
143398
+ const objects = await fetchReferenceObjects({ register: resolve.register || kind.register, schema: resolve.schema }).catch(() => []);
143399
+ const labels = new Map();
143400
+ for (const object of objects) {
143401
+ const id = object.id || object.uuid || (object['@self'] && object['@self'].id);
143402
+ const label = readPath$8(object, resolve.labelField || 'title') ?? object.name;
143403
+ if (id !== undefined && label !== undefined && label !== null) {
143404
+ labels.set(String(id), String(label));
143405
+ }
143406
+ }
143407
+ return labels
143408
+ };
143409
+
143410
+ const subtitleOf = (kind, object, labels = null) => {
143336
143411
  if (kind.subtitleTemplate) {
143337
- return fillTemplate(translate(kind.subtitleTemplate), object)
143412
+ const resolve = kind.subtitleResolve;
143413
+ const data = labels && resolve
143414
+ ? { ...object, [resolve.as || resolve.field]: labels.get(String(readPath$8(object, resolve.field) ?? '')) ?? '' }
143415
+ : object;
143416
+ return fillTemplate(translate(kind.subtitleTemplate), data)
143338
143417
  }
143339
143418
  return kind.subtitleField ? String(readPath$8(object, kind.subtitleField) ?? '') : ''
143340
143419
  };
@@ -143353,6 +143432,7 @@ function searchSource(config = {}, context = {}) {
143353
143432
  const results = Array.isArray(body.results) ? body.results : (Array.isArray(body) ? body : []);
143354
143433
  const labels = kind.statusResolve && kind.statusField ? await statusLabels(kind) : null;
143355
143434
  const userNames = kind.linkedUser === true ? await linkedUserNames(kind, results) : null;
143435
+ const subtitleNames = await subtitleLabels(kind);
143356
143436
  return {
143357
143437
  total: typeof body.total === 'number' ? body.total : results.length,
143358
143438
  rows: results.map((object) => {
@@ -143367,7 +143447,7 @@ function searchSource(config = {}, context = {}) {
143367
143447
  kindLabel: kind.label,
143368
143448
  kindText: kindTextOf(kind, object),
143369
143449
  title: String(readPath$8(object, kind.titleField || 'title') ?? object.name ?? id ?? ''),
143370
- subtitle: subtitleOf(kind, object),
143450
+ subtitle: subtitleOf(kind, object, subtitleNames),
143371
143451
  status,
143372
143452
  linked: userNames ? (userNames.get(linkedOf(kind, object)) || linkedOf(kind, object)) : linkedOf(kind, object),
143373
143453
  href: kind.href ? router.generateUrl(fillRowTemplate(kind.href, { ...object, id })) : '',
@@ -143478,7 +143558,7 @@ function searchSource(config = {}, context = {}) {
143478
143558
  loading: () => state.loading,
143479
143559
 
143480
143560
  columns: withColumnWidths([
143481
- { key: 'title', label: l10n.translate('nextcloud-vue', 'Result'), secondary: 'subtitle', sortable: true },
143561
+ { key: 'title', label: l10n.translate('nextcloud-vue', 'Result'), secondary: 'subtitle', sortable: true, ...(config && config.titleWrap === true ? { cellClass: 'cn-cell--wrap' } : {}) },
143482
143562
  // `kindAsText`: what one row is, as plain text ("Zaak", "Lantaarnpaal",
143483
143563
  // DqZoekresultaten), instead of the plural kind as a pill.
143484
143564
  config && config.kindAsText === true
@@ -143725,10 +143805,10 @@ function usersSource() {
143725
143805
  loading: () => state.loading,
143726
143806
 
143727
143807
  columns: [
143728
- { key: 'displayname', label: l10n.translate('nextcloud-vue', 'Employee'), secondary: 'function' },
143729
- { key: 'roles', label: l10n.translate('nextcloud-vue', 'Roles') },
143730
- { key: 'email', label: l10n.translate('nextcloud-vue', 'E-mail') },
143731
- { key: 'today', label: l10n.translate('nextcloud-vue', 'Today'), widget: 'badge', widgetProps: { colorMap: presenceColors, variant: 'warning' } },
143808
+ { key: 'displayname', label: l10n.translate('nextcloud-vue', 'Employee'), secondary: 'function', sortable: true, cellClass: 'cn-cell--lead' },
143809
+ { key: 'roles', label: l10n.translate('nextcloud-vue', 'Roles'), sortable: true },
143810
+ { key: 'email', label: l10n.translate('nextcloud-vue', 'E-mail'), sortable: true },
143811
+ { key: 'today', label: l10n.translate('nextcloud-vue', 'Today'), widget: 'badge', widgetProps: { colorMap: presenceColors, variant: 'warning' }, sortable: true },
143732
143812
  ],
143733
143813
 
143734
143814
  searchFields: {
@@ -184972,7 +185052,7 @@ var script$5G = {
184972
185052
  components: { CnIcon: __sfc_main$8o, CnStatusBadge: __sfc_main$8g, NcButton: vue.NcButton },
184973
185053
 
184974
185054
  props: {
184975
- /** The reported header: `{ pill, note, actions: [{ label, icon?, variant?, run }] }`. */
185055
+ /** The reported header: `{ pill, note, actions: [{ label, icon?, variant?, add?, run }] }`; `add: true` marks a list's Add. */
184976
185056
  header: {
184977
185057
  type: Object,
184978
185058
  required: true,
@@ -185038,7 +185118,7 @@ function render$5F(_ctx, _cache, $props, $setup, $data, $options) {
185038
185118
  : (vue$1.openBlock(), vue$1.createElementBlock("button", {
185039
185119
  key: 1,
185040
185120
  type: "button",
185041
- class: "cn-detail-page__catalog-action",
185121
+ class: vue$1.normalizeClass(["cn-detail-page__catalog-action", { 'cn-detail-page__catalog-action--add': action.add === true }]),
185042
185122
  "data-testid": "cn-detail-widget-header-action",
185043
185123
  onClick: $event => (action.run())
185044
185124
  }, [
@@ -185050,14 +185130,14 @@ function render$5F(_ctx, _cache, $props, $setup, $data, $options) {
185050
185130
  }, null, 8 /* PROPS */, ["name"]))
185051
185131
  : vue$1.createCommentVNode("v-if", true),
185052
185132
  vue$1.createTextVNode(" " + vue$1.toDisplayString(action.label), 1 /* TEXT */)
185053
- ], 8 /* PROPS */, _hoisted_3$4Q))
185133
+ ], 10 /* CLASS, PROPS */, _hoisted_3$4Q))
185054
185134
  ], 64 /* STABLE_FRAGMENT */))
185055
185135
  }), 128 /* KEYED_FRAGMENT */))
185056
185136
  ]))
185057
185137
  }
185058
185138
 
185059
185139
  script$5G.render = render$5F;
185060
- script$5G.__scopeId = "data-v-3a30dc4a";
185140
+ script$5G.__scopeId = "data-v-7186a696";
185061
185141
  const __sfc_main$5A = script$5G;
185062
185142
 
185063
185143
  // SPDX-FileCopyrightText: 2026 Conduction B.V.
@@ -185443,6 +185523,22 @@ var script$5F = {
185443
185523
  .map(([key, text]) => [key, translate(text)]))
185444
185524
  },
185445
185525
 
185526
+ /**
185527
+ * `content.changeLabels`, each rule's label through the app's translate.
185528
+ *
185529
+ * @return {Array<object>}
185530
+ */
185531
+ changeLabels() {
185532
+ const rules = this.content.changeLabels;
185533
+ if (!Array.isArray(rules)) {
185534
+ return []
185535
+ }
185536
+ const translate = typeof this.cnTranslate === 'function' ? this.cnTranslate : (text) => text;
185537
+ return rules
185538
+ .filter((rule) => rule && typeof rule.label === 'string' && rule.label !== '')
185539
+ .map((rule) => ({ ...rule, label: translate(rule.label) }))
185540
+ },
185541
+
185446
185542
  /**
185447
185543
  * `content.footnote`, a muted line under the trail with the record's
185448
185544
  * fields filled in ("Reference {identifier}"); '' when a field is empty.
@@ -185553,15 +185649,17 @@ function render$5E(_ctx, _cache, $props, $setup, $data, $options) {
185553
185649
  excludeActions: $options.resolvedExcludeActions,
185554
185650
  actionLabels: $options.actionLabels,
185555
185651
  valueLabels: $options.valueLabels,
185652
+ changeLabels: $options.changeLabels,
185653
+ object: $options.ctx.object || $options.ctx.objectData || null,
185556
185654
  relatedSources: $options.relatedSources,
185557
185655
  footnote: $options.footnote
185558
- }, $options.emptyText ? { noEntriesLabel: $options.emptyText } : {}), null, 16 /* FULL_PROPS */, ["source", "endpoint", "register", "schema", "objectId", "scope", "title", "maxDisplay", "layout", "excludeActions", "actionLabels", "valueLabels", "relatedSources", "footnote"])
185656
+ }, $options.emptyText ? { noEntriesLabel: $options.emptyText } : {}), null, 16 /* FULL_PROPS */, ["source", "endpoint", "register", "schema", "objectId", "scope", "title", "maxDisplay", "layout", "excludeActions", "actionLabels", "valueLabels", "changeLabels", "object", "relatedSources", "footnote"])
185559
185657
  ]))
185560
185658
  : vue$1.createCommentVNode("v-if", true)
185561
185659
  }
185562
185660
 
185563
185661
  script$5F.render = render$5E;
185564
- script$5F.__scopeId = "data-v-6387051e";
185662
+ script$5F.__scopeId = "data-v-87ba40b4";
185565
185663
  const __sfc_main$5z = script$5F;
185566
185664
 
185567
185665
  /** Variants understood by NcNoteCard. */
@@ -198362,6 +198460,97 @@ function render$5f(_ctx, _cache, $props, $setup, $data, $options) {
198362
198460
  script$5g.render = render$5f;
198363
198461
  const __sfc_main$5a = script$5g;
198364
198462
 
198463
+ /**
198464
+ * SPDX-FileCopyrightText: 2026 Conduction B.V.
198465
+ * SPDX-License-Identifier: EUPL-1.2
198466
+ *
198467
+ * Header sort and filter applied to rows the table already holds (an
198468
+ * `endpointSource` table): the same `{ field, dir }` sort and
198469
+ * `{ paramKey: values[] }` filter map a self-fetching table sends to the
198470
+ * server, read here in the browser.
198471
+ *
198472
+ * @module utils/localHeaderRows
198473
+ */
198474
+
198475
+
198476
+ /**
198477
+ * A row value as one comparable scalar: an array counts as its joined items.
198478
+ *
198479
+ * @param {unknown} value The raw value.
198480
+ * @return {string|number|null} The value to compare.
198481
+ */
198482
+ function scalar(value) {
198483
+ if (value === null || value === undefined) {
198484
+ return null
198485
+ }
198486
+ if (Array.isArray(value)) {
198487
+ return value.map((item) => (item && typeof item === 'object' ? (item.title || item.name || '') : String(item))).join(', ')
198488
+ }
198489
+ if (typeof value === 'number' || typeof value === 'boolean') {
198490
+ return typeof value === 'boolean' ? String(value) : value
198491
+ }
198492
+ return typeof value === 'object' ? (value.title || value.name || '') : String(value)
198493
+ }
198494
+
198495
+ /**
198496
+ * Whether a row holds a value the filter entry asks for.
198497
+ *
198498
+ * @param {object} row The row.
198499
+ * @param {string} param The filter key (`field`, `field[like]`, `field[gte]`, `field[lte]`).
198500
+ * @param {Array<string>} values The chosen values.
198501
+ * @return {boolean} True when the row passes.
198502
+ */
198503
+ function passes$1(row, param, values) {
198504
+ const match = /^(.+)\[(\w+)\]$/.exec(param);
198505
+ const field = match ? match[1] : param;
198506
+ const op = match ? match[2] : '';
198507
+ const value = scalar(row[field]);
198508
+ if (op === CONTAINS_OPERATOR) {
198509
+ const term = String(values[0]).toLowerCase();
198510
+ return value !== null && String(value).toLowerCase().includes(term)
198511
+ }
198512
+ if (op === 'gte' || op === 'lte') {
198513
+ if (value === null) {
198514
+ return false
198515
+ }
198516
+ const left = typeof value === 'number' ? value : String(value);
198517
+ const right = typeof value === 'number' ? Number(values[0]) : String(values[0]);
198518
+ return op === 'gte' ? left >= right : left <= right
198519
+ }
198520
+ return value !== null && values.map(String).includes(String(value))
198521
+ }
198522
+
198523
+ /**
198524
+ * The rows that pass every active header filter, in the header sort's order.
198525
+ *
198526
+ * @param {Array<object>} rows The rows.
198527
+ * @param {{field: string, dir: string}|null} sort The header sort.
198528
+ * @param {object} filters The header filters, `{ paramKey: values[] }`.
198529
+ * @return {Array<object>} The rows to show (the same array when nothing applies).
198530
+ */
198531
+ function localHeaderRows(rows, sort, filters) {
198532
+ if (!Array.isArray(rows)) {
198533
+ return []
198534
+ }
198535
+ const active = Object.entries(filters || {}).filter(([, values]) => Array.isArray(values) && values.length > 0);
198536
+ let out = active.length > 0 ? rows.filter((row) => row && active.every(([param, values]) => passes$1(row, param, values))) : rows;
198537
+ if (sort && sort.field) {
198538
+ const sign = sort.dir === 'desc' ? -1 : 1;
198539
+ out = [...out].sort((a, b) => {
198540
+ const left = scalar(a && a[sort.field]);
198541
+ const right = scalar(b && b[sort.field]);
198542
+ if (left === null || right === null) {
198543
+ return left === right ? 0 : (left === null ? 1 : -1)
198544
+ }
198545
+ if (typeof left === 'number' && typeof right === 'number') {
198546
+ return sign * (left - right)
198547
+ }
198548
+ return sign * String(left).localeCompare(String(right), undefined, { numeric: true, sensitivity: 'base' })
198549
+ });
198550
+ }
198551
+ return out
198552
+ }
198553
+
198365
198554
  /**
198366
198555
  * SPDX-FileCopyrightText: 2026 Conduction B.V.
198367
198556
  * SPDX-License-Identifier: EUPL-1.2
@@ -199342,9 +199531,9 @@ var script$5f = {
199342
199531
  if (this.endpointActive && this.columns.some((col) => col && typeof col === 'object' && col.labelPath)) {
199343
199532
  inner.columns = this.labelledColumns(inner.columns || this.columns);
199344
199533
  }
199345
- // Header sort and filter (`sortable`, `filterable`) only where the
199346
- // widget fetches its own rows: the server sorts and filters.
199347
- if (this.selfFetchActive && (this.sortable !== false || this.filterable)) {
199534
+ // Header sort and filter (`sortable`, `filterable`): the server sorts
199535
+ // and filters a self-fetch; endpoint rows are sorted and filtered here.
199536
+ if ((this.selfFetchActive || this.endpointActive) && (this.sortable !== false || this.filterable)) {
199348
199537
  inner.columns = withSortableColumns(inner.columns || this.columns, this.sortable);
199349
199538
  inner.filterable = this.filterable;
199350
199539
  inner.activeFilters = this.headerFilters;
@@ -199362,7 +199551,7 @@ var script$5f = {
199362
199551
  }
199363
199552
  }
199364
199553
  if (this.endpointActive) {
199365
- inner.rows = this.endpointRows;
199554
+ inner.rows = localHeaderRows(this.endpointRows, this.headerSort, this.headerFilters);
199366
199555
  inner.loading = this.epLoading || this.loading;
199367
199556
  }
199368
199557
  if (this.rowRoute) {
@@ -199632,9 +199821,13 @@ var script$5f = {
199632
199821
  return { ok: false, error: '' }
199633
199822
  }
199634
199823
  if (action.type !== 'object-op') {
199635
- const wrapped = (!action.type || action.type === 'handler')
199636
- ? { ...action, args: [...(action.args || []), row] }
199637
- : action;
199824
+ let wrapped = action;
199825
+ if (!action.type || action.type === 'handler') {
199826
+ wrapped = { ...action, args: [...(action.args || []), row] };
199827
+ } else if (action.type === 'navigate' && row) {
199828
+ // A row's navigate reads that row: `{objectId}` / `@objectId` is its id, `@object.<field>` its fields.
199829
+ wrapped = { ...action, target: interpolateActionTarget(action.target, { objectId: row.id, object: row }) };
199830
+ }
199638
199831
  if (typeof this.cnDispatchAction === 'function') {
199639
199832
  this.cnDispatchAction(wrapped);
199640
199833
  } else {
@@ -199923,7 +200116,7 @@ function render$5e(_ctx, _cache, $props, $setup, $data, $options) {
199923
200116
  }
199924
200117
 
199925
200118
  script$5f.render = render$5e;
199926
- script$5f.__scopeId = "data-v-22886682";
200119
+ script$5f.__scopeId = "data-v-7115cd32";
199927
200120
  const __sfc_main$59 = script$5f;
199928
200121
 
199929
200122
  /**
@@ -243931,7 +244124,7 @@ function render$40(_ctx, _cache, $props, $setup, $data, $options) {
243931
244124
  ? (vue$1.openBlock(), vue$1.createElementBlock("h3", _hoisted_4$37, vue$1.toDisplayString($options.heading), 1 /* TEXT */))
243932
244125
  : vue$1.createCommentVNode("v-if", true),
243933
244126
  ($options.description)
243934
- ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_5$2K, vue$1.toDisplayString($options.description), 1 /* TEXT */))
244127
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_5$2K, vue$1.toDisplayString($options.description), 1 /* TEXT */))
243935
244128
  : vue$1.createCommentVNode("v-if", true)
243936
244129
  ]),
243937
244130
  ($options.hasHeaderActions)
@@ -244021,7 +244214,7 @@ function render$40(_ctx, _cache, $props, $setup, $data, $options) {
244021
244214
  ]))
244022
244215
  : vue$1.createCommentVNode("v-if", true),
244023
244216
  ($options.hint)
244024
- ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_8$22, vue$1.toDisplayString($options.hint), 1 /* TEXT */))
244217
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_8$22, vue$1.toDisplayString($options.hint), 1 /* TEXT */))
244025
244218
  : vue$1.createCommentVNode("v-if", true),
244026
244219
  ($data.error)
244027
244220
  ? (vue$1.openBlock(), vue$1.createBlock(_component_NcNoteCard, {
@@ -244072,7 +244265,7 @@ function render$40(_ctx, _cache, $props, $setup, $data, $options) {
244072
244265
  }
244073
244266
 
244074
244267
  script$41.render = render$40;
244075
- script$41.__scopeId = "data-v-12407f1c";
244268
+ script$41.__scopeId = "data-v-0fa12b0e";
244076
244269
  const __sfc_main$41 = script$41;
244077
244270
 
244078
244271
  /**
@@ -245764,7 +245957,7 @@ var script$3_ = {
245764
245957
  /**
245765
245958
  * The card title row's actions: the add button with `add.placement: "title"`.
245766
245959
  *
245767
- * @return {Array<{label: string, icon: string, run: () => void}>} The actions.
245960
+ * @return {Array<{label: string, icon: string, add: boolean, run: () => void}>} The actions.
245768
245961
  */
245769
245962
  titleActions() {
245770
245963
  if (!(this.canAdd && this.addTrigger && this.addPlacement === 'title')) {
@@ -245773,7 +245966,7 @@ var script$3_ = {
245773
245966
  const run = () => {
245774
245967
  this.adding = !this.adding;
245775
245968
  };
245776
- return [{ label: this.addLabel, icon: 'Plus', run }]
245969
+ return [{ label: this.addLabel, icon: 'Plus', add: true, run }]
245777
245970
  },
245778
245971
 
245779
245972
  addLabel() {
@@ -247094,7 +247287,7 @@ function render$3Z(_ctx, _cache, $props, $setup, $data, $options) {
247094
247287
  }
247095
247288
 
247096
247289
  script$3_.render = render$3Z;
247097
- script$3_.__scopeId = "data-v-91c65ff8";
247290
+ script$3_.__scopeId = "data-v-785b1f94";
247098
247291
  const __sfc_main$3_ = script$3_;
247099
247292
 
247100
247293
  /**
@@ -252222,7 +252415,7 @@ function unwrap$1(value) {
252222
252415
  var script$3Q = {
252223
252416
  name: 'CnRecordListWidget',
252224
252417
 
252225
- components: { Check, ChevronRight, CnIcon: __sfc_main$8o, CnRecordNoteRows: __sfc_main$3R, CnStatusBadge: __sfc_main$8g, NcActionButton: vue.NcActionButton, NcActionLink: vue.NcActionLink, NcActions: vue.NcActions, NcButton: vue.NcButton, NcLoadingIcon: vue.NcLoadingIcon },
252418
+ components: { Check, ChevronRight, CnIcon: __sfc_main$8o, CnRecordNoteRows: __sfc_main$3R, CnStatusBadge: __sfc_main$8g, FilterOutline, NcActionButton: vue.NcActionButton, NcActionCheckbox: vue.NcActionCheckbox, NcActionLink: vue.NcActionLink, NcActions: vue.NcActions, NcButton: vue.NcButton, NcLoadingIcon: vue.NcLoadingIcon },
252226
252419
 
252227
252420
  inject: {
252228
252421
  /** Detail-page object context (`{ objectId, object, register, schema }`). */
@@ -252287,6 +252480,8 @@ var script$3Q = {
252287
252480
  * without a value.
252288
252481
  * `density: "compact"` draws the rows 10px above and below, at least
252289
252482
  * 56px tall, with the title at 500 (DqProcesanalyse).
252483
+ * On `cards` it draws the small framed card: 12px 14px in, the title
252484
+ * 15px/700 with the pill at its end (DqInspectie).
252290
252485
  * `density: "stacked"` stands the rows 10px apart with no rule and no
252291
252486
  * row padding (DqDagAfsluiten "Morgen eerst").
252292
252487
  * In `rows`, `text` is a line under the meta line ("12 dagen stil"),
@@ -252382,6 +252577,8 @@ var script$3Q = {
252382
252577
  return {
252383
252578
  /** The reader's sort of a `table`: the column key and `ascending` or `descending`. */
252384
252579
  tableSort: { key: '', dir: '' },
252580
+ /** The reader's head filters of a `table`: `{ [columnKey]: cellTexts[] }`. */
252581
+ tableFilters: {},
252385
252582
  rows: [],
252386
252583
  /** The `aggregates` figures per row id: `{ [rowId]: { [key]: value } }`. */
252387
252584
  aggregateValues: {},
@@ -252756,7 +252953,16 @@ var script$3Q = {
252756
252953
  const isTemplate = (value) => typeof value === 'string' || (Array.isArray(value) && value.length > 0 && value.every((entry) => typeof entry === 'string'));
252757
252954
  return columns
252758
252955
  .filter((col) => col && typeof col === 'object' && isTemplate(col.value))
252759
- .map((col, index) => ({ ...col, key: `col-${index}`, label: typeof col.label === 'string' ? this.translate(col.label) : '' }))
252956
+ .map((col, index) => ({ ...col, key: `col-${index}`, label: typeof col.label === 'string' ? this.translate(col.label) : '', sortable: col.sortable === true || this.content?.sortable === true }))
252957
+ },
252958
+
252959
+ /**
252960
+ * Whether the `table` heads filter (`content.filterable`).
252961
+ *
252962
+ * @return {boolean}
252963
+ */
252964
+ tableFilterable() {
252965
+ return this.content?.filterable === true
252760
252966
  },
252761
252967
 
252762
252968
  /**
@@ -252766,8 +252972,27 @@ var script$3Q = {
252766
252972
  * @spec openspec/changes/record-list-table/specs/record-list-table/spec.md#requirement-a-record-list-can-draw-its-rows-as-a-small-table
252767
252973
  */
252768
252974
  tableRows() {
252975
+ const rows = this.tableAllRows.filter((row) => Object.entries(this.tableFilters).every(([key, values]) => {
252976
+ const index = this.tableColumns.findIndex((col) => col.key === key);
252977
+ return values.length === 0 || index < 0 || values.includes(row.cells[index].text)
252978
+ }));
252979
+ const { key, dir } = this.tableSort;
252980
+ const index = this.tableColumns.findIndex((col) => col.key === key);
252981
+ if (index < 0 || !dir) {
252982
+ return rows
252983
+ }
252984
+ const sign = dir === 'descending' ? -1 : 1;
252985
+ return [...rows].sort((a, b) => sign * compareCells(a.cells[index].text, b.cells[index].text))
252986
+ },
252987
+
252988
+ /**
252989
+ * Every `table` row, before the reader's head filters and sort.
252990
+ *
252991
+ * @return {Array<object>} `{ key, cells: [{ key, text, align, alert }] }`.
252992
+ */
252993
+ tableAllRows() {
252769
252994
  const indentPath = this.content?.indentPath;
252770
- const rows = this.items.map((item) => ({
252995
+ return this.items.map((item) => ({
252771
252996
  key: item.key,
252772
252997
  row: item.row,
252773
252998
  rowActions: this.rowActions.length > 0 ? this.rowActionsOf(item.row) : [],
@@ -252787,14 +253012,7 @@ var script$3Q = {
252787
253012
  tone: text === '' ? '' : this.cellToneOf(col, item.row, text),
252788
253013
  }
252789
253014
  }),
252790
- }));
252791
- const { key, dir } = this.tableSort;
252792
- const index = this.tableColumns.findIndex((col) => col.key === key);
252793
- if (index < 0 || !dir) {
252794
- return rows
252795
- }
252796
- const sign = dir === 'descending' ? -1 : 1;
252797
- return [...rows].sort((a, b) => sign * compareCells(a.cells[index].text, b.cells[index].text))
253015
+ }))
252798
253016
  },
252799
253017
 
252800
253018
  /**
@@ -253819,6 +254037,41 @@ var script$3Q = {
253819
254037
  this.tableSort = { key, dir };
253820
254038
  },
253821
254039
 
254040
+ /**
254041
+ * The values a `table` column's head filter offers: each text the column holds, once.
254042
+ *
254043
+ * @param {string} key The column key.
254044
+ * @return {Array<string>} The texts, in row order.
254045
+ */
254046
+ tableFilterOptions(key) {
254047
+ const index = this.tableColumns.findIndex((col) => col.key === key);
254048
+ if (index < 0) {
254049
+ return []
254050
+ }
254051
+ return [...new Set(this.tableAllRows.map((row) => row.cells[index].text).filter((text) => text !== ''))]
254052
+ },
254053
+
254054
+ /**
254055
+ * Keep or drop one value of a `table` column's head filter.
254056
+ *
254057
+ * @param {string} key The column key.
254058
+ * @param {string} value The cell text.
254059
+ */
254060
+ toggleTableFilter(key, value) {
254061
+ const current = this.tableFilters[key] || [];
254062
+ this.tableFilters = { ...this.tableFilters, [key]: current.includes(value) ? current.filter((v) => v !== value) : [...current, value] };
254063
+ },
254064
+
254065
+ /**
254066
+ * The accessible name of a column's head filter.
254067
+ *
254068
+ * @param {string} label The column label.
254069
+ * @return {string}
254070
+ */
254071
+ filterLabelOf(label) {
254072
+ return l10n.translate('nextcloud-vue', 'Filter by {column}', { column: label })
254073
+ },
254074
+
253822
254075
  /**
253823
254076
  * The rows of a read with `flattenPath` set: each entry of the list at
253824
254077
  * that path on a record becomes a row, with the record at `@parent`.
@@ -254449,211 +254702,217 @@ const _hoisted_7$24 = {
254449
254702
  "data-testid": "cn-record-list-table"
254450
254703
  };
254451
254704
  const _hoisted_8$1T = ["aria-sort"];
254452
- const _hoisted_9$1I = ["data-testid", "onClick"];
254453
- const _hoisted_10$1x = {
254705
+ const _hoisted_9$1I = {
254706
+ key: 0,
254707
+ class: "cn-record-list__head"
254708
+ };
254709
+ const _hoisted_10$1x = ["data-testid", "onClick"];
254710
+ const _hoisted_11$1l = {
254454
254711
  class: "cn-record-list__sort-mark",
254455
254712
  "aria-hidden": "true"
254456
254713
  };
254457
- const _hoisted_11$1l = {
254714
+ const _hoisted_12$1a = {
254458
254715
  key: 0,
254459
254716
  scope: "col",
254460
254717
  class: "cn-record-list__cell--actions"
254461
254718
  };
254462
- const _hoisted_12$1a = {
254719
+ const _hoisted_13$$ = {
254463
254720
  key: 2,
254464
254721
  class: "cn-record-list__cell-text"
254465
254722
  };
254466
- const _hoisted_13$$ = {
254723
+ const _hoisted_14$Z = {
254467
254724
  key: 3,
254468
254725
  class: "cn-record-list__cell-sub"
254469
254726
  };
254470
- const _hoisted_14$Z = {
254727
+ const _hoisted_15$V = {
254471
254728
  key: 0,
254472
254729
  class: "cn-record-list__cell--actions"
254473
254730
  };
254474
- const _hoisted_15$V = {
254731
+ const _hoisted_16$Q = {
254475
254732
  key: 7,
254476
254733
  class: "cn-record-list__checklist-wrap"
254477
254734
  };
254478
- const _hoisted_16$Q = ["aria-valuenow", "aria-valuemax", "aria-label"];
254479
- const _hoisted_17$M = {
254735
+ const _hoisted_17$M = ["aria-valuenow", "aria-valuemax", "aria-label"];
254736
+ const _hoisted_18$F = {
254480
254737
  class: "cn-record-list__check-mark",
254481
254738
  "aria-hidden": "true"
254482
254739
  };
254483
- const _hoisted_18$F = { class: "cn-record-list__check-title" };
254484
- const _hoisted_19$D = { class: "hidden-visually" };
254485
- const _hoisted_20$y = {
254740
+ const _hoisted_19$D = { class: "cn-record-list__check-title" };
254741
+ const _hoisted_20$y = { class: "hidden-visually" };
254742
+ const _hoisted_21$x = {
254486
254743
  key: 0,
254487
254744
  class: "cn-record-list__group-head",
254488
254745
  "data-testid": "cn-record-list-group-head"
254489
254746
  };
254490
- const _hoisted_21$x = ["id"];
254491
254747
  const _hoisted_22$x = ["id"];
254492
- const _hoisted_23$u = ["aria-labelledby", "data-testid"];
254493
- const _hoisted_24$s = {
254748
+ const _hoisted_23$u = ["id"];
254749
+ const _hoisted_24$s = ["aria-labelledby", "data-testid"];
254750
+ const _hoisted_25$o = {
254494
254751
  key: 0,
254495
254752
  class: "cn-record-list__row cn-record-list__row--action"
254496
254753
  };
254497
- const _hoisted_25$o = {
254754
+ const _hoisted_26$m = {
254498
254755
  key: 0,
254499
254756
  class: "cn-record-list__leading",
254500
254757
  "data-testid": "cn-record-list-leading"
254501
254758
  };
254502
- const _hoisted_26$m = {
254759
+ const _hoisted_27$i = {
254503
254760
  key: 1,
254504
254761
  class: "cn-record-list__avatar",
254505
254762
  "aria-hidden": "true",
254506
254763
  "data-testid": "cn-record-list-avatar"
254507
254764
  };
254508
- const _hoisted_27$i = { class: "cn-record-list__main" };
254509
- const _hoisted_28$h = {
254765
+ const _hoisted_28$h = { class: "cn-record-list__main" };
254766
+ const _hoisted_29$g = {
254510
254767
  key: 1,
254511
254768
  class: "cn-record-list__meta"
254512
254769
  };
254513
- const _hoisted_29$g = {
254770
+ const _hoisted_30$g = {
254514
254771
  key: 3,
254515
254772
  class: "cn-record-list__flag",
254516
254773
  "data-testid": "cn-record-list-flag"
254517
254774
  };
254518
- const _hoisted_30$g = {
254775
+ const _hoisted_31$f = {
254519
254776
  key: 4,
254520
254777
  class: "cn-record-list__pills"
254521
254778
  };
254522
- const _hoisted_31$f = {
254779
+ const _hoisted_32$f = {
254523
254780
  key: 6,
254524
254781
  class: "cn-record-list__trailing"
254525
254782
  };
254526
- const _hoisted_32$f = {
254783
+ const _hoisted_33$d = {
254527
254784
  key: 0,
254528
254785
  class: "cn-record-list__leading",
254529
254786
  "data-testid": "cn-record-list-leading"
254530
254787
  };
254531
- const _hoisted_33$d = {
254788
+ const _hoisted_34$d = {
254532
254789
  key: 1,
254533
254790
  class: "cn-record-list__pill-start"
254534
254791
  };
254535
- const _hoisted_34$d = {
254792
+ const _hoisted_35$c = {
254536
254793
  key: 2,
254537
254794
  class: "cn-record-list__avatar",
254538
254795
  "aria-hidden": "true",
254539
254796
  "data-testid": "cn-record-list-avatar"
254540
254797
  };
254541
- const _hoisted_35$c = { class: "cn-record-list__main" };
254542
- const _hoisted_36$c = {
254798
+ const _hoisted_36$c = { class: "cn-record-list__main" };
254799
+ const _hoisted_37$b = {
254543
254800
  key: 0,
254544
254801
  class: "cn-record-list__title"
254545
254802
  };
254546
- const _hoisted_37$b = {
254803
+ const _hoisted_38$b = {
254547
254804
  key: 1,
254548
254805
  class: "cn-record-list__meta"
254549
254806
  };
254550
- const _hoisted_38$b = {
254807
+ const _hoisted_39$9 = {
254551
254808
  key: 2,
254552
254809
  class: "cn-record-list__meta",
254553
254810
  "data-testid": "cn-record-list-text"
254554
254811
  };
254555
- const _hoisted_39$9 = {
254812
+ const _hoisted_40$7 = {
254556
254813
  key: 4,
254557
254814
  class: "cn-record-list__meta",
254558
254815
  "data-testid": "cn-record-list-links"
254559
254816
  };
254560
- const _hoisted_40$7 = { key: 1 };
254561
- const _hoisted_41$5 = { key: 2 };
254562
- const _hoisted_42$5 = {
254817
+ const _hoisted_41$5 = { key: 1 };
254818
+ const _hoisted_42$5 = { key: 2 };
254819
+ const _hoisted_43$5 = {
254563
254820
  key: 4,
254564
254821
  class: "cn-record-list__aside"
254565
254822
  };
254566
- const _hoisted_43$5 = {
254823
+ const _hoisted_44$5 = {
254567
254824
  key: 0,
254568
254825
  class: "cn-record-list__flag",
254569
254826
  "data-testid": "cn-record-list-flag"
254570
254827
  };
254571
- const _hoisted_44$5 = {
254828
+ const _hoisted_45$4 = {
254572
254829
  key: 3,
254573
254830
  class: "cn-record-list__trailing"
254574
254831
  };
254575
- const _hoisted_45$4 = { class: "cn-record-list__card-head" };
254576
- const _hoisted_46$4 = { class: "cn-record-list__card-title" };
254577
- const _hoisted_47$4 = {
254832
+ const _hoisted_46$4 = { class: "cn-record-list__card-head" };
254833
+ const _hoisted_47$4 = { class: "cn-record-list__card-title" };
254834
+ const _hoisted_48$3 = {
254578
254835
  key: 1,
254579
254836
  class: "cn-record-list__title"
254580
254837
  };
254581
- const _hoisted_48$3 = {
254838
+ const _hoisted_49$3 = {
254582
254839
  key: 0,
254583
254840
  class: "cn-record-list__card-pills"
254584
254841
  };
254585
- const _hoisted_49$3 = {
254842
+ const _hoisted_50$3 = {
254586
254843
  key: 0,
254587
254844
  class: "cn-record-list__meta"
254588
254845
  };
254589
- const _hoisted_50$3 = {
254846
+ const _hoisted_51$2 = {
254590
254847
  key: 1,
254591
254848
  class: "cn-record-list__card-value",
254592
254849
  "data-testid": "cn-record-list-card-value"
254593
254850
  };
254594
- const _hoisted_51$2 = {
254851
+ const _hoisted_52$2 = {
254595
254852
  key: 3,
254596
254853
  class: "cn-record-list__feed-row"
254597
254854
  };
254598
- const _hoisted_52$2 = {
254855
+ const _hoisted_53$2 = {
254599
254856
  class: "cn-record-list__feed-icon",
254600
254857
  "aria-hidden": "true"
254601
254858
  };
254602
- const _hoisted_53$2 = {
254859
+ const _hoisted_54$2 = {
254603
254860
  key: 0,
254604
254861
  class: "cn-record-list__meta"
254605
254862
  };
254606
- const _hoisted_54$2 = {
254863
+ const _hoisted_55$2 = {
254607
254864
  key: 1,
254608
254865
  class: "cn-record-list__text"
254609
254866
  };
254610
- const _hoisted_55$2 = {
254867
+ const _hoisted_56$2 = {
254611
254868
  key: 4,
254612
254869
  class: "cn-record-list__inline-row"
254613
254870
  };
254614
- const _hoisted_56$2 = {
254871
+ const _hoisted_57$2 = {
254615
254872
  key: 0,
254616
254873
  class: "cn-record-list__label"
254617
254874
  };
254618
- const _hoisted_57$2 = ["aria-label", "aria-valuenow", "aria-valuemax"];
254619
- const _hoisted_58$2 = {
254875
+ const _hoisted_58$2 = ["aria-label", "aria-valuenow", "aria-valuemax"];
254876
+ const _hoisted_59$2 = {
254620
254877
  key: 10,
254621
254878
  class: "cn-record-list__error",
254622
254879
  role: "alert",
254623
254880
  "data-testid": "cn-record-list-action-error"
254624
254881
  };
254625
- const _hoisted_59$2 = { class: "cn-record-list__notice-text" };
254626
- const _hoisted_60$2 = {
254882
+ const _hoisted_60$2 = { class: "cn-record-list__notice-text" };
254883
+ const _hoisted_61$2 = {
254627
254884
  key: 12,
254628
254885
  class: "cn-record-list__footnote",
254629
254886
  "data-testid": "cn-record-list-footnote"
254630
254887
  };
254631
- const _hoisted_61$2 = ["href"];
254632
- const _hoisted_62$1 = {
254888
+ const _hoisted_62$1 = ["href"];
254889
+ const _hoisted_63$1 = {
254633
254890
  key: 15,
254634
254891
  class: "cn-record-list__group-head",
254635
254892
  "data-testid": "cn-record-list-group-head"
254636
254893
  };
254637
- const _hoisted_63$1 = {
254894
+ const _hoisted_64$1 = {
254638
254895
  class: "cn-record-list__group-heading",
254639
254896
  "data-testid": "cn-record-list-group-heading"
254640
254897
  };
254641
- const _hoisted_64$1 = ["id"];
254642
- const _hoisted_65$1 = {
254898
+ const _hoisted_65$1 = ["id"];
254899
+ const _hoisted_66$1 = {
254643
254900
  key: 0,
254644
254901
  class: "cn-record-list__footer-note",
254645
254902
  "data-testid": "cn-record-list-footer-note"
254646
254903
  };
254647
- const _hoisted_66$1 = ["id"];
254904
+ const _hoisted_67$1 = ["id"];
254648
254905
 
254649
254906
  function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254650
254907
  const _component_NcLoadingIcon = vue$1.resolveComponent("NcLoadingIcon");
254651
254908
  const _component_CnIcon = vue$1.resolveComponent("CnIcon");
254909
+ const _component_FilterOutline = vue$1.resolveComponent("FilterOutline");
254910
+ const _component_NcActionCheckbox = vue$1.resolveComponent("NcActionCheckbox");
254911
+ const _component_NcActions = vue$1.resolveComponent("NcActions");
254652
254912
  const _component_CnStatusBadge = vue$1.resolveComponent("CnStatusBadge");
254653
254913
  const _component_router_link = vue$1.resolveComponent("router-link");
254654
254914
  const _component_NcActionLink = vue$1.resolveComponent("NcActionLink");
254655
254915
  const _component_NcActionButton = vue$1.resolveComponent("NcActionButton");
254656
- const _component_NcActions = vue$1.resolveComponent("NcActions");
254657
254916
  const _component_Check = vue$1.resolveComponent("Check");
254658
254917
  const _component_CnRecordNoteRows = vue$1.resolveComponent("CnRecordNoteRows");
254659
254918
  const _component_NcButton = vue$1.resolveComponent("NcButton");
@@ -254709,24 +254968,57 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254709
254968
  "aria-sort": col.sortable ? $options.sortStateOf(col.key) : undefined,
254710
254969
  class: vue$1.normalizeClass({ 'cn-record-list__cell--end': col.align === 'end' })
254711
254970
  }, [
254712
- (col.sortable)
254713
- ? (vue$1.openBlock(), vue$1.createElementBlock("button", {
254714
- key: 0,
254715
- type: "button",
254716
- class: "cn-record-list__sort",
254717
- "data-testid": `cn-record-list-sort-${col.key}`,
254718
- onClick: $event => ($options.toggleTableSort(col.key))
254719
- }, [
254720
- vue$1.createTextVNode(vue$1.toDisplayString(col.label) + " ", 1 /* TEXT */),
254721
- vue$1.createElementVNode("span", _hoisted_10$1x, vue$1.toDisplayString($options.sortMarkOf(col.key)), 1 /* TEXT */)
254722
- ], 8 /* PROPS */, _hoisted_9$1I))
254971
+ (col.sortable || $options.tableFilterable)
254972
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_9$1I, [
254973
+ (col.sortable)
254974
+ ? (vue$1.openBlock(), vue$1.createElementBlock("button", {
254975
+ key: 0,
254976
+ type: "button",
254977
+ class: "cn-record-list__sort",
254978
+ "data-testid": `cn-record-list-sort-${col.key}`,
254979
+ onClick: $event => ($options.toggleTableSort(col.key))
254980
+ }, [
254981
+ vue$1.createTextVNode(vue$1.toDisplayString(col.label) + " ", 1 /* TEXT */),
254982
+ vue$1.createElementVNode("span", _hoisted_11$1l, vue$1.toDisplayString($options.sortMarkOf(col.key)), 1 /* TEXT */)
254983
+ ], 8 /* PROPS */, _hoisted_10$1x))
254984
+ : (vue$1.openBlock(), vue$1.createElementBlock(vue$1.Fragment, { key: 1 }, [
254985
+ vue$1.createTextVNode(vue$1.toDisplayString(col.label), 1 /* TEXT */)
254986
+ ], 64 /* STABLE_FRAGMENT */)),
254987
+ ($options.tableFilterable)
254988
+ ? (vue$1.openBlock(), vue$1.createBlock(_component_NcActions, {
254989
+ key: 2,
254990
+ class: "cn-record-list__head-filter",
254991
+ "aria-label": $options.filterLabelOf(col.label),
254992
+ "data-testid": `cn-record-list-filter-${col.key}`
254993
+ }, {
254994
+ icon: vue$1.withCtx(() => [
254995
+ vue$1.createVNode(_component_FilterOutline, { size: 14 })
254996
+ ]),
254997
+ default: vue$1.withCtx(() => [
254998
+ (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList($options.tableFilterOptions(col.key), (option) => {
254999
+ return (vue$1.openBlock(), vue$1.createBlock(_component_NcActionCheckbox, {
255000
+ key: option,
255001
+ modelValue: ($data.tableFilters[col.key] || []).includes(option),
255002
+ "onUpdate:modelValue": $event => ($options.toggleTableFilter(col.key, option))
255003
+ }, {
255004
+ default: vue$1.withCtx(() => [
255005
+ vue$1.createTextVNode(vue$1.toDisplayString(option), 1 /* TEXT */)
255006
+ ]),
255007
+ _: 2 /* DYNAMIC */
255008
+ }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["modelValue", "onUpdate:modelValue"]))
255009
+ }), 128 /* KEYED_FRAGMENT */))
255010
+ ]),
255011
+ _: 2 /* DYNAMIC */
255012
+ }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["aria-label", "data-testid"]))
255013
+ : vue$1.createCommentVNode("v-if", true)
255014
+ ]))
254723
255015
  : (vue$1.openBlock(), vue$1.createElementBlock(vue$1.Fragment, { key: 1 }, [
254724
255016
  vue$1.createTextVNode(vue$1.toDisplayString(col.label), 1 /* TEXT */)
254725
255017
  ], 64 /* STABLE_FRAGMENT */))
254726
255018
  ], 10 /* CLASS, PROPS */, _hoisted_8$1T))
254727
255019
  }), 128 /* KEYED_FRAGMENT */)),
254728
255020
  ($options.rowActions.length > 0)
254729
- ? (vue$1.openBlock(), vue$1.createElementBlock("th", _hoisted_11$1l, vue$1.toDisplayString($options.rowActionsHeader), 1 /* TEXT */))
255021
+ ? (vue$1.openBlock(), vue$1.createElementBlock("th", _hoisted_12$1a, vue$1.toDisplayString($options.rowActionsHeader), 1 /* TEXT */))
254730
255022
  : vue$1.createCommentVNode("v-if", true)
254731
255023
  ])
254732
255024
  ]),
@@ -254760,14 +255052,14 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254760
255052
  ]),
254761
255053
  _: 2 /* DYNAMIC */
254762
255054
  }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["to"]))
254763
- : (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_12$1a, vue$1.toDisplayString(cell.text), 1 /* TEXT */)),
255055
+ : (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_13$$, vue$1.toDisplayString(cell.text), 1 /* TEXT */)),
254764
255056
  (cell.sub)
254765
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_13$$, vue$1.toDisplayString(cell.sub), 1 /* TEXT */))
255057
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_14$Z, vue$1.toDisplayString(cell.sub), 1 /* TEXT */))
254766
255058
  : vue$1.createCommentVNode("v-if", true)
254767
255059
  ], 6 /* CLASS, STYLE */))
254768
255060
  }), 128 /* KEYED_FRAGMENT */)),
254769
255061
  ($options.rowActions.length > 0)
254770
- ? (vue$1.openBlock(), vue$1.createElementBlock("td", _hoisted_14$Z, [
255062
+ ? (vue$1.openBlock(), vue$1.createElementBlock("td", _hoisted_15$V, [
254771
255063
  (item.rowActions.length > 0)
254772
255064
  ? (vue$1.openBlock(), vue$1.createBlock(_component_NcActions, {
254773
255065
  key: 0,
@@ -254815,7 +255107,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254815
255107
  ])
254816
255108
  ]))
254817
255109
  : ($options.presentation === 'checklist')
254818
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_15$V, [
255110
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_16$Q, [
254819
255111
  ($props.content.progress)
254820
255112
  ? (vue$1.openBlock(), vue$1.createElementBlock("div", {
254821
255113
  key: 0,
@@ -254831,7 +255123,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254831
255123
  class: "cn-record-list__checklist-fill",
254832
255124
  style: vue$1.normalizeStyle({ width: `${$options.checklistPercent}%` })
254833
255125
  }, null, 4 /* STYLE */)
254834
- ], 8 /* PROPS */, _hoisted_16$Q))
255126
+ ], 8 /* PROPS */, _hoisted_17$M))
254835
255127
  : vue$1.createCommentVNode("v-if", true),
254836
255128
  vue$1.createElementVNode("ul", {
254837
255129
  class: "cn-record-list__checklist",
@@ -254844,7 +255136,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254844
255136
  class: vue$1.normalizeClass(["cn-record-list__check", { 'cn-record-list__check--done': $options.isChecked(item.row) }]),
254845
255137
  "data-testid": "cn-record-list-check"
254846
255138
  }, [
254847
- vue$1.createElementVNode("span", _hoisted_17$M, [
255139
+ vue$1.createElementVNode("span", _hoisted_18$F, [
254848
255140
  ($options.isChecked(item.row))
254849
255141
  ? (vue$1.openBlock(), vue$1.createBlock(_component_Check, {
254850
255142
  key: 0,
@@ -254852,8 +255144,8 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254852
255144
  }))
254853
255145
  : vue$1.createCommentVNode("v-if", true)
254854
255146
  ]),
254855
- vue$1.createElementVNode("span", _hoisted_18$F, vue$1.toDisplayString(item.title), 1 /* TEXT */),
254856
- vue$1.createElementVNode("span", _hoisted_19$D, vue$1.toDisplayString($options.isChecked(item.row) ? $options.doneLabel : $options.openLabel), 1 /* TEXT */)
255147
+ vue$1.createElementVNode("span", _hoisted_19$D, vue$1.toDisplayString(item.title), 1 /* TEXT */),
255148
+ vue$1.createElementVNode("span", _hoisted_20$y, vue$1.toDisplayString($options.isChecked(item.row) ? $options.doneLabel : $options.openLabel), 1 /* TEXT */)
254857
255149
  ], 2 /* CLASS */))
254858
255150
  }), 128 /* KEYED_FRAGMENT */))
254859
255151
  ], 4 /* STYLE */)
@@ -254871,12 +255163,12 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254871
255163
  key: group.key
254872
255164
  }, [
254873
255165
  (group.label && $options.footerGroup !== '' && group.value === $options.footerGroup)
254874
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_20$y, [
255166
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_21$x, [
254875
255167
  vue$1.createElementVNode("h3", {
254876
255168
  id: group.headingId,
254877
255169
  class: "cn-record-list__group-heading",
254878
255170
  "data-testid": "cn-record-list-group-heading"
254879
- }, vue$1.toDisplayString(group.label), 9 /* TEXT, PROPS */, _hoisted_21$x),
255171
+ }, vue$1.toDisplayString(group.label), 9 /* TEXT, PROPS */, _hoisted_22$x),
254880
255172
  vue$1.createVNode(_component_NcButton, {
254881
255173
  variant: "secondary",
254882
255174
  class: vue$1.normalizeClass({ 'cn-record-list__action--tonal': $options.footerTonal }),
@@ -254910,7 +255202,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254910
255202
  id: group.headingId,
254911
255203
  class: "cn-record-list__group-heading",
254912
255204
  "data-testid": "cn-record-list-group-heading"
254913
- }, vue$1.toDisplayString(group.label), 9 /* TEXT, PROPS */, _hoisted_22$x))
255205
+ }, vue$1.toDisplayString(group.label), 9 /* TEXT, PROPS */, _hoisted_23$u))
254914
255206
  : vue$1.createCommentVNode("v-if", true),
254915
255207
  (group.items.length > 0)
254916
255208
  ? (vue$1.openBlock(), vue$1.createElementBlock("ul", {
@@ -254926,12 +255218,12 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254926
255218
  "data-testid": "cn-record-list-item"
254927
255219
  }, [
254928
255220
  ($options.presentation === 'rows' && item.action)
254929
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_24$s, [
255221
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_25$o, [
254930
255222
  (item.leading)
254931
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_25$o, vue$1.toDisplayString(item.leading), 1 /* TEXT */))
255223
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_26$m, vue$1.toDisplayString(item.leading), 1 /* TEXT */))
254932
255224
  : vue$1.createCommentVNode("v-if", true),
254933
255225
  (item.initials)
254934
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_26$m, vue$1.toDisplayString(item.initials), 1 /* TEXT */))
255226
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_27$i, vue$1.toDisplayString(item.initials), 1 /* TEXT */))
254935
255227
  : vue$1.createCommentVNode("v-if", true),
254936
255228
  (item.dot)
254937
255229
  ? (vue$1.openBlock(), vue$1.createElementBlock("span", {
@@ -254942,7 +255234,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254942
255234
  "data-testid": "cn-record-list-dot"
254943
255235
  }, null, 4 /* STYLE */))
254944
255236
  : vue$1.createCommentVNode("v-if", true),
254945
- vue$1.createElementVNode("span", _hoisted_27$i, [
255237
+ vue$1.createElementVNode("span", _hoisted_28$h, [
254946
255238
  (item.title)
254947
255239
  ? (vue$1.openBlock(), vue$1.createBlock(vue$1.resolveDynamicComponent(item.tag), vue$1.mergeProps({
254948
255240
  key: 0,
@@ -254955,14 +255247,14 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254955
255247
  }, 1040 /* FULL_PROPS, DYNAMIC_SLOTS */, ["class"]))
254956
255248
  : vue$1.createCommentVNode("v-if", true),
254957
255249
  (item.meta)
254958
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_28$h, vue$1.toDisplayString(item.meta), 1 /* TEXT */))
255250
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_29$g, vue$1.toDisplayString(item.meta), 1 /* TEXT */))
254959
255251
  : vue$1.createCommentVNode("v-if", true)
254960
255252
  ]),
254961
255253
  (item.flag)
254962
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_29$g, vue$1.toDisplayString(item.flag), 1 /* TEXT */))
255254
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_30$g, vue$1.toDisplayString(item.flag), 1 /* TEXT */))
254963
255255
  : vue$1.createCommentVNode("v-if", true),
254964
255256
  (item.pill || item.badges.length > 0)
254965
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_30$g, [
255257
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_31$f, [
254966
255258
  (item.pill)
254967
255259
  ? (vue$1.openBlock(), vue$1.createBlock(_component_CnStatusBadge, {
254968
255260
  key: 0,
@@ -254990,7 +255282,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
254990
255282
  }, vue$1.toDisplayString(item.due.text), 3 /* TEXT, CLASS */))
254991
255283
  : vue$1.createCommentVNode("v-if", true),
254992
255284
  (item.trailing)
254993
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_31$f, vue$1.toDisplayString(item.trailing), 1 /* TEXT */))
255285
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_32$f, vue$1.toDisplayString(item.trailing), 1 /* TEXT */))
254994
255286
  : vue$1.createCommentVNode("v-if", true),
254995
255287
  (vue$1.openBlock(), vue$1.createBlock(vue$1.resolveDynamicComponent(item.action.tag), vue$1.mergeProps({
254996
255288
  class: ["cn-record-list__action", { 'cn-record-list__action--outlined': $options.rowActionOutlined }]
@@ -255008,10 +255300,10 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255008
255300
  }, { ref_for: true }, item.attrs), {
255009
255301
  default: vue$1.withCtx(() => [
255010
255302
  (item.leading)
255011
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_32$f, vue$1.toDisplayString(item.leading), 1 /* TEXT */))
255303
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_33$d, vue$1.toDisplayString(item.leading), 1 /* TEXT */))
255012
255304
  : vue$1.createCommentVNode("v-if", true),
255013
255305
  ($options.pillFirst && item.pill)
255014
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_33$d, [
255306
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_34$d, [
255015
255307
  vue$1.createVNode(_component_CnStatusBadge, {
255016
255308
  label: item.pill.label,
255017
255309
  variant: item.pill.variant,
@@ -255020,7 +255312,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255020
255312
  ]))
255021
255313
  : vue$1.createCommentVNode("v-if", true),
255022
255314
  (item.initials)
255023
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_34$d, vue$1.toDisplayString(item.initials), 1 /* TEXT */))
255315
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_35$c, vue$1.toDisplayString(item.initials), 1 /* TEXT */))
255024
255316
  : vue$1.createCommentVNode("v-if", true),
255025
255317
  (item.dot)
255026
255318
  ? (vue$1.openBlock(), vue$1.createElementBlock("span", {
@@ -255031,15 +255323,15 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255031
255323
  "data-testid": "cn-record-list-dot"
255032
255324
  }, null, 4 /* STYLE */))
255033
255325
  : vue$1.createCommentVNode("v-if", true),
255034
- vue$1.createElementVNode("span", _hoisted_35$c, [
255326
+ vue$1.createElementVNode("span", _hoisted_36$c, [
255035
255327
  (item.title)
255036
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_36$c, vue$1.toDisplayString(item.title), 1 /* TEXT */))
255328
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_37$b, vue$1.toDisplayString(item.title), 1 /* TEXT */))
255037
255329
  : vue$1.createCommentVNode("v-if", true),
255038
255330
  (item.meta)
255039
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_37$b, vue$1.toDisplayString(item.meta), 1 /* TEXT */))
255331
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_38$b, vue$1.toDisplayString(item.meta), 1 /* TEXT */))
255040
255332
  : vue$1.createCommentVNode("v-if", true),
255041
255333
  (item.text)
255042
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_38$b, vue$1.toDisplayString(item.text), 1 /* TEXT */))
255334
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_39$9, vue$1.toDisplayString(item.text), 1 /* TEXT */))
255043
255335
  : vue$1.createCommentVNode("v-if", true),
255044
255336
  (item.due && $options.dueBelow)
255045
255337
  ? (vue$1.openBlock(), vue$1.createElementBlock("span", {
@@ -255049,7 +255341,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255049
255341
  }, vue$1.toDisplayString(item.due.text), 3 /* TEXT, CLASS */))
255050
255342
  : vue$1.createCommentVNode("v-if", true),
255051
255343
  (item.links.length > 0)
255052
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_39$9, [
255344
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_40$7, [
255053
255345
  vue$1.createTextVNode(vue$1.toDisplayString($options.linksLabel) + " ", 1 /* TEXT */),
255054
255346
  (vue$1.openBlock(true), vue$1.createElementBlock(vue$1.Fragment, null, vue$1.renderList(item.links, (link, linkIndex) => {
255055
255347
  return (vue$1.openBlock(), vue$1.createElementBlock(vue$1.Fragment, {
@@ -255065,9 +255357,9 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255065
255357
  ]),
255066
255358
  _: 2 /* DYNAMIC */
255067
255359
  }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["to"]))
255068
- : (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_40$7, vue$1.toDisplayString(link.label), 1 /* TEXT */)),
255360
+ : (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_41$5, vue$1.toDisplayString(link.label), 1 /* TEXT */)),
255069
255361
  (linkIndex < item.links.length - 1)
255070
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_41$5, ", "))
255362
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_42$5, ", "))
255071
255363
  : vue$1.createCommentVNode("v-if", true)
255072
255364
  ], 64 /* STABLE_FRAGMENT */))
255073
255365
  }), 128 /* KEYED_FRAGMENT */))
@@ -255075,9 +255367,9 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255075
255367
  : vue$1.createCommentVNode("v-if", true)
255076
255368
  ]),
255077
255369
  ((item.pill && !$options.pillFirst) || item.badges.length > 0 || (item.due && !$options.dueBelow) || item.trailing || item.flag)
255078
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_42$5, [
255370
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_43$5, [
255079
255371
  (item.flag)
255080
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_43$5, vue$1.toDisplayString(item.flag), 1 /* TEXT */))
255372
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_44$5, vue$1.toDisplayString(item.flag), 1 /* TEXT */))
255081
255373
  : vue$1.createCommentVNode("v-if", true),
255082
255374
  (item.pill && !$options.pillFirst)
255083
255375
  ? (vue$1.openBlock(), vue$1.createBlock(_component_CnStatusBadge, {
@@ -255104,7 +255396,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255104
255396
  }, vue$1.toDisplayString(item.due.text), 3 /* TEXT, CLASS */))
255105
255397
  : vue$1.createCommentVNode("v-if", true),
255106
255398
  (item.trailing)
255107
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_44$5, vue$1.toDisplayString(item.trailing), 1 /* TEXT */))
255399
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_45$4, vue$1.toDisplayString(item.trailing), 1 /* TEXT */))
255108
255400
  : vue$1.createCommentVNode("v-if", true)
255109
255401
  ]))
255110
255402
  : vue$1.createCommentVNode("v-if", true),
@@ -255195,8 +255487,8 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255195
255487
  class: ["cn-record-list__card", { 'cn-record-list__card--link': item.tag !== 'div' }]
255196
255488
  }, { ref_for: true }, item.attrs, { "data-testid": "cn-record-list-card" }), {
255197
255489
  default: vue$1.withCtx(() => [
255198
- vue$1.createElementVNode("span", _hoisted_45$4, [
255199
- vue$1.createElementVNode("span", _hoisted_46$4, [
255490
+ vue$1.createElementVNode("span", _hoisted_46$4, [
255491
+ vue$1.createElementVNode("span", _hoisted_47$4, [
255200
255492
  ($options.cardIcons)
255201
255493
  ? (vue$1.openBlock(), vue$1.createBlock(_component_CnIcon, {
255202
255494
  key: 0,
@@ -255206,11 +255498,11 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255206
255498
  }, null, 8 /* PROPS */, ["name"]))
255207
255499
  : vue$1.createCommentVNode("v-if", true),
255208
255500
  (item.title)
255209
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_47$4, vue$1.toDisplayString(item.title), 1 /* TEXT */))
255501
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_48$3, vue$1.toDisplayString(item.title), 1 /* TEXT */))
255210
255502
  : vue$1.createCommentVNode("v-if", true)
255211
255503
  ]),
255212
255504
  (item.pill || item.badges.length > 0)
255213
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_48$3, [
255505
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_49$3, [
255214
255506
  (item.pill)
255215
255507
  ? (vue$1.openBlock(), vue$1.createBlock(_component_CnStatusBadge, {
255216
255508
  key: 0,
@@ -255232,17 +255524,17 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255232
255524
  : vue$1.createCommentVNode("v-if", true)
255233
255525
  ]),
255234
255526
  (item.meta)
255235
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_49$3, vue$1.toDisplayString(item.meta), 1 /* TEXT */))
255527
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_50$3, vue$1.toDisplayString(item.meta), 1 /* TEXT */))
255236
255528
  : vue$1.createCommentVNode("v-if", true),
255237
255529
  (item.trailing)
255238
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_50$3, vue$1.toDisplayString(item.trailing), 1 /* TEXT */))
255530
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_51$2, vue$1.toDisplayString(item.trailing), 1 /* TEXT */))
255239
255531
  : vue$1.createCommentVNode("v-if", true)
255240
255532
  ]),
255241
255533
  _: 2 /* DYNAMIC */
255242
255534
  }, 1040 /* FULL_PROPS, DYNAMIC_SLOTS */, ["class"]))
255243
255535
  : ($options.presentation === 'feed')
255244
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_51$2, [
255245
- vue$1.createElementVNode("span", _hoisted_52$2, [
255536
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_52$2, [
255537
+ vue$1.createElementVNode("span", _hoisted_53$2, [
255246
255538
  vue$1.createVNode(_component_CnIcon, {
255247
255539
  name: item.icon,
255248
255540
  size: 18
@@ -255251,18 +255543,18 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255251
255543
  (vue$1.openBlock(), vue$1.createBlock(vue$1.resolveDynamicComponent(item.tag), vue$1.mergeProps({ class: "cn-record-list__main" }, { ref_for: true }, item.attrs), {
255252
255544
  default: vue$1.withCtx(() => [
255253
255545
  (item.meta)
255254
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_53$2, vue$1.toDisplayString(item.meta), 1 /* TEXT */))
255546
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_54$2, vue$1.toDisplayString(item.meta), 1 /* TEXT */))
255255
255547
  : vue$1.createCommentVNode("v-if", true),
255256
255548
  (item.text)
255257
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_54$2, vue$1.toDisplayString(item.text), 1 /* TEXT */))
255549
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_55$2, vue$1.toDisplayString(item.text), 1 /* TEXT */))
255258
255550
  : vue$1.createCommentVNode("v-if", true)
255259
255551
  ]),
255260
255552
  _: 2 /* DYNAMIC */
255261
255553
  }, 1040 /* FULL_PROPS, DYNAMIC_SLOTS */))
255262
255554
  ]))
255263
- : (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_55$2, [
255555
+ : (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_56$2, [
255264
255556
  (item.label)
255265
- ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_56$2, vue$1.toDisplayString(item.label), 1 /* TEXT */))
255557
+ ? (vue$1.openBlock(), vue$1.createElementBlock("span", _hoisted_57$2, vue$1.toDisplayString(item.label), 1 /* TEXT */))
255266
255558
  : vue$1.createCommentVNode("v-if", true),
255267
255559
  (vue$1.openBlock(), vue$1.createBlock(vue$1.resolveDynamicComponent(item.tag), vue$1.mergeProps({ class: "cn-record-list__inline-title" }, { ref_for: true }, item.attrs), {
255268
255560
  default: vue$1.withCtx(() => [
@@ -255286,16 +255578,16 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255286
255578
  class: "cn-record-list__bar-fill",
255287
255579
  style: vue$1.normalizeStyle({ width: `${item.bar.share}%` })
255288
255580
  }, null, 4 /* STYLE */)
255289
- ], 10 /* CLASS, PROPS */, _hoisted_57$2))
255581
+ ], 10 /* CLASS, PROPS */, _hoisted_58$2))
255290
255582
  : vue$1.createCommentVNode("v-if", true)
255291
255583
  ]))
255292
255584
  }), 128 /* KEYED_FRAGMENT */))
255293
- ], 10 /* CLASS, PROPS */, _hoisted_23$u))
255585
+ ], 10 /* CLASS, PROPS */, _hoisted_24$s))
255294
255586
  : vue$1.createCommentVNode("v-if", true)
255295
255587
  ], 64 /* STABLE_FRAGMENT */))
255296
255588
  }), 128 /* KEYED_FRAGMENT */)),
255297
255589
  ($data.actionError)
255298
- ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_58$2, vue$1.toDisplayString($data.actionError), 1 /* TEXT */))
255590
+ ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_59$2, vue$1.toDisplayString($data.actionError), 1 /* TEXT */))
255299
255591
  : vue$1.createCommentVNode("v-if", true),
255300
255592
  ($options.footnoteTone && $options.footnote && !$data.error && !$options.absent && ($data.rows.length > 0 || $options.footnoteFromAnswer))
255301
255593
  ? (vue$1.openBlock(), vue$1.createElementBlock("div", {
@@ -255309,10 +255601,10 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255309
255601
  class: "cn-record-list__notice-icon",
255310
255602
  "aria-hidden": "true"
255311
255603
  }, null, 8 /* PROPS */, ["name"]),
255312
- vue$1.createElementVNode("p", _hoisted_59$2, vue$1.toDisplayString($options.footnote), 1 /* TEXT */)
255604
+ vue$1.createElementVNode("p", _hoisted_60$2, vue$1.toDisplayString($options.footnote), 1 /* TEXT */)
255313
255605
  ], 2 /* CLASS */))
255314
255606
  : ($options.footnote && !$data.error && !$options.absent && ($data.rows.length > 0 || $options.footnoteFromAnswer))
255315
- ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_60$2, vue$1.toDisplayString($options.footnote), 1 /* TEXT */))
255607
+ ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_61$2, vue$1.toDisplayString($options.footnote), 1 /* TEXT */))
255316
255608
  : vue$1.createCommentVNode("v-if", true),
255317
255609
  ($options.footerLink && $options.footerLink.to)
255318
255610
  ? (vue$1.openBlock(), vue$1.createBlock(_component_router_link, {
@@ -255332,11 +255624,11 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255332
255624
  class: "cn-record-list__footer-link",
255333
255625
  href: $options.footerLink.href,
255334
255626
  "data-testid": "cn-record-list-footer-link"
255335
- }, vue$1.toDisplayString($options.footerLink.label), 9 /* TEXT, PROPS */, _hoisted_61$2))
255627
+ }, vue$1.toDisplayString($options.footerLink.label), 9 /* TEXT, PROPS */, _hoisted_62$1))
255336
255628
  : vue$1.createCommentVNode("v-if", true),
255337
255629
  ($options.footerGroupHead && $data.rows.length === 0 && !$data.error && !$data.loading)
255338
- ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_62$1, [
255339
- vue$1.createElementVNode("h3", _hoisted_63$1, vue$1.toDisplayString($options.footerGroupHead), 1 /* TEXT */),
255630
+ ? (vue$1.openBlock(), vue$1.createElementBlock("div", _hoisted_63$1, [
255631
+ vue$1.createElementVNode("h3", _hoisted_64$1, vue$1.toDisplayString($options.footerGroupHead), 1 /* TEXT */),
255340
255632
  vue$1.createVNode(_component_NcButton, {
255341
255633
  variant: "secondary",
255342
255634
  class: vue$1.normalizeClass({ 'cn-record-list__action--tonal': $options.footerTonal }),
@@ -255371,7 +255663,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255371
255663
  id: $data.footerReasonId,
255372
255664
  class: "cn-record-list__footer-reason",
255373
255665
  "data-testid": "cn-record-list-footer-reason"
255374
- }, vue$1.toDisplayString($options.footerAction.reason), 9 /* TEXT, PROPS */, _hoisted_64$1))
255666
+ }, vue$1.toDisplayString($options.footerAction.reason), 9 /* TEXT, PROPS */, _hoisted_65$1))
255375
255667
  : vue$1.createCommentVNode("v-if", true),
255376
255668
  ($options.footerAction && $options.footerGroup === '' && !$data.error)
255377
255669
  ? (vue$1.openBlock(), vue$1.createElementBlock("div", {
@@ -255380,7 +255672,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255380
255672
  "data-testid": "cn-record-list-footer"
255381
255673
  }, [
255382
255674
  ($options.footerAction.note)
255383
- ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_65$1, vue$1.toDisplayString($options.footerAction.note), 1 /* TEXT */))
255675
+ ? (vue$1.openBlock(), vue$1.createElementBlock("p", _hoisted_66$1, vue$1.toDisplayString($options.footerAction.note), 1 /* TEXT */))
255384
255676
  : vue$1.createCommentVNode("v-if", true),
255385
255677
  vue$1.createVNode(_component_NcButton, {
255386
255678
  variant: "secondary",
@@ -255415,7 +255707,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255415
255707
  id: $data.footerReasonId,
255416
255708
  class: "cn-record-list__footer-reason",
255417
255709
  "data-testid": "cn-record-list-footer-reason"
255418
- }, vue$1.toDisplayString($options.footerAction.reason), 9 /* TEXT, PROPS */, _hoisted_66$1))
255710
+ }, vue$1.toDisplayString($options.footerAction.reason), 9 /* TEXT, PROPS */, _hoisted_67$1))
255419
255711
  : vue$1.createCommentVNode("v-if", true)
255420
255712
  ], 2 /* CLASS */))
255421
255713
  : vue$1.createCommentVNode("v-if", true)
@@ -255423,7 +255715,7 @@ function render$3P(_ctx, _cache, $props, $setup, $data, $options) {
255423
255715
  }
255424
255716
 
255425
255717
  script$3Q.render = render$3P;
255426
- script$3Q.__scopeId = "data-v-544b79cd";
255718
+ script$3Q.__scopeId = "data-v-8b7be6f2";
255427
255719
  const __sfc_main$3Q = script$3Q;
255428
255720
 
255429
255721
  /**
@@ -263404,15 +263696,23 @@ var script$3A = {
263404
263696
  */
263405
263697
  /**
263406
263698
  * The value an input starts with: `content.default`, else the current
263407
- * quarter or year for those types, else empty.
263699
+ * quarter or year for those types, else empty. For a quarter or year
263700
+ * input, `default: "previous"` is the last complete one (DqTermijnen
263701
+ * opens on the last complete quarter).
263408
263702
  *
263409
263703
  * @return {string}
263410
263704
  */
263411
263705
  inputDefault() {
263706
+ const today = new Date();
263707
+ if (this.content.default === 'previous' && this.inputType === 'quarter') {
263708
+ return quarterKey(new Date(today.getFullYear(), today.getMonth() - 3, 1))
263709
+ }
263710
+ if (this.content.default === 'previous' && this.inputType === 'year') {
263711
+ return String(today.getFullYear() - 1)
263712
+ }
263412
263713
  if (this.content.default !== undefined && this.content.default !== null) {
263413
263714
  return String(this.content.default)
263414
263715
  }
263415
- const today = new Date();
263416
263716
  if (this.inputType === 'quarter') {
263417
263717
  return quarterKey(today)
263418
263718
  }
@@ -263748,7 +264048,7 @@ function render$3z(_ctx, _cache, $props, $setup, $data, $options) {
263748
264048
  }
263749
264049
 
263750
264050
  script$3A.render = render$3z;
263751
- script$3A.__scopeId = "data-v-59cf3a24";
264051
+ script$3A.__scopeId = "data-v-476982f2";
263752
264052
  const __sfc_main$3A = script$3A;
263753
264053
 
263754
264054
  /**
@@ -268569,6 +268869,20 @@ var script$3p = {
268569
268869
  return INPUT_TYPES.includes(this.kind) ? this.kind : 'text'
268570
268870
  },
268571
268871
 
268872
+ /**
268873
+ * The number input's step: the field's own, 1 for a whole number, else
268874
+ * any, so a decimal value (0.8) is not invalid to the browser.
268875
+ *
268876
+ * @return {string}
268877
+ * @spec openspec/changes/settings-number-decimal-step/specs/settings-fields/spec.md#requirement-a-number-setting-steps-as-it-is-declared
268878
+ */
268879
+ numberStep() {
268880
+ if (typeof this.field.step === 'number' || (typeof this.field.step === 'string' && this.field.step !== '')) {
268881
+ return String(this.field.step)
268882
+ }
268883
+ return this.field.integer ? '1' : 'any'
268884
+ },
268885
+
268572
268886
  /** @return {string} The label. */
268573
268887
  label() {
268574
268888
  return String(this.field.label || this.field.key || '')
@@ -269413,12 +269727,13 @@ function render$3o(_ctx, _cache, $props, $setup, $data, $options) {
269413
269727
  type: "number",
269414
269728
  min: $props.field.min,
269415
269729
  max: $props.field.max,
269730
+ step: $options.numberStep,
269416
269731
  modelValue: $options.stringValue,
269417
269732
  readonly: $props.field.readOnly,
269418
269733
  error: !!$props.error,
269419
269734
  "aria-describedby": $options.describedBy,
269420
269735
  "onUpdate:modelValue": _cache[6] || (_cache[6] = $event => ($options.emitValue($event === '' ? null : Number($event))))
269421
- }, null, 8 /* PROPS */, ["id", "label", "min", "max", "modelValue", "readonly", "error", "aria-describedby"]))
269736
+ }, null, 8 /* PROPS */, ["id", "label", "min", "max", "step", "modelValue", "readonly", "error", "aria-describedby"]))
269422
269737
  : (vue$1.openBlock(), vue$1.createBlock(_component_NcTextField, {
269423
269738
  key: 14,
269424
269739
  id: $options.inputId,
@@ -269449,7 +269764,7 @@ function render$3o(_ctx, _cache, $props, $setup, $data, $options) {
269449
269764
  }
269450
269765
 
269451
269766
  script$3p.render = render$3o;
269452
- script$3p.__scopeId = "data-v-2f16c603";
269767
+ script$3p.__scopeId = "data-v-d11dd994";
269453
269768
  const __sfc_main$3p = script$3p;
269454
269769
 
269455
269770
  /**
@@ -322371,6 +322686,21 @@ function formatIsoDuration(value) {
322371
322686
  return words[period.unit] ? words[period.unit]() : String(value)
322372
322687
  }
322373
322688
 
322689
+ /**
322690
+ * A Nextcloud user id as its display name (`userName` registry key): the id
322691
+ * while the name is looked up, and for a user nobody answers for.
322692
+ *
322693
+ * @spec openspec/changes/user-name-formatter/specs/user-name-formatter/spec.md#requirement-a-user-id-can-read-as-its-display-name
322694
+ * @param {unknown} value The user id.
322695
+ * @return {string} The display name, the id, or ''.
322696
+ */
322697
+ function formatUserName(value) {
322698
+ if (value === null || value === undefined || value === '' || typeof value === 'object') {
322699
+ return ''
322700
+ }
322701
+ return userDisplayName(value) || String(value)
322702
+ }
322703
+
322374
322704
  const BUILT_IN_FORMATTERS = {
322375
322705
  date: formatDate,
322376
322706
  datetime: formatDateTime,
@@ -322386,6 +322716,7 @@ const BUILT_IN_FORMATTERS = {
322386
322716
  masked: formatMasked,
322387
322717
  isoDuration: formatIsoDuration,
322388
322718
  valueMap: formatValueMap,
322719
+ userName: formatUserName,
322389
322720
  };
322390
322721
 
322391
322722
  /**
@@ -360510,7 +360841,7 @@ var script$20 = {
360510
360841
  // through the app's label lookup.
360511
360842
  const countText = this.presentedCountText;
360512
360843
  // The note after the breadcrumb already says how many there are.
360513
- if (!countText && !this.countSubtitle && this.headerMetaCarriesCount) {
360844
+ if (!countText && !this.countSubtitle && (this.headerMetaCarriesCount || this.showCount === false)) {
360514
360845
  return this.description
360515
360846
  }
360516
360847
  if (!countText && !this.countSubtitle) {
@@ -361447,9 +361778,12 @@ var script$20 = {
361447
361778
  }
361448
361779
  const sorted = [...groups].sort((a, b) => b.count - a.count);
361449
361780
  const total = sorted.reduce((sum, g) => sum + g.count, 0);
361781
+ // Each tab asks to be counted as the list counts it (within the
361782
+ // active filters, through the list endpoint); the grouped number,
361783
+ // over the page filter only, stands until that count arrives.
361450
361784
  this.generatedQuickFilters = [
361451
- { label: from.allLabel || l10n.translate('nextcloud-vue', 'All'), filter: {}, default: true, count: total },
361452
- ...sorted.map((g) => ({ label: (labels && labels[g.key]) || g.key, filter: { [from.field]: g.key }, count: g.count })),
361785
+ { label: from.allLabel || l10n.translate('nextcloud-vue', 'All'), filter: {}, default: true, count: total, showCount: true },
361786
+ ...sorted.map((g) => ({ label: (labels && labels[g.key]) || g.key, filter: { [from.field]: g.key }, count: g.count, showCount: true })),
361453
361787
  ];
361454
361788
  },
361455
361789
 
@@ -378385,6 +378719,7 @@ function render$1L(_ctx, _cache, $props, $setup, $data, $options) {
378385
378719
  name: "icon",
378386
378720
  fn: vue$1.withCtx(() => [
378387
378721
  vue$1.createVNode(_component_CnIcon, {
378722
+ class: "cn-action-dialog__note-icon",
378388
378723
  name: $props.config.note.icon,
378389
378724
  size: 20
378390
378725
  }, null, 8 /* PROPS */, ["name"])
@@ -378405,7 +378740,7 @@ function render$1L(_ctx, _cache, $props, $setup, $data, $options) {
378405
378740
  }
378406
378741
 
378407
378742
  script$1M.render = render$1L;
378408
- script$1M.__scopeId = "data-v-60a1dc8f";
378743
+ script$1M.__scopeId = "data-v-105a37b4";
378409
378744
  const __sfc_main$1M = script$1M;
378410
378745
 
378411
378746
  var CnActionDialog = /*#__PURE__*/Object.freeze({
@@ -443772,7 +444107,7 @@ function render$d(_ctx, _cache, $props, $setup, $data, $options) {
443772
444107
  }
443773
444108
 
443774
444109
  script$d.render = render$d;
443775
- script$d.__scopeId = "data-v-ebb6783e";
444110
+ script$d.__scopeId = "data-v-93dc585a";
443776
444111
  const __sfc_main$d = script$d;
443777
444112
 
443778
444113
  let titleIdCounter = 0;