@conduction/nextcloud-vue 2.117.0 → 2.118.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 (97) hide show
  1. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js +2 -1
  2. package/dist/esm/components/CnActionDialog/CnActionDialog.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +6 -6
  5. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  6. package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js +2 -1
  7. package/dist/esm/components/CnAssignDialog/CnAssignDialog.vue2.js.map +1 -1
  8. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  9. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +18 -0
  10. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  11. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +14 -8
  12. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  13. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  14. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +11 -1
  15. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  16. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  17. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +9 -4
  18. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  19. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  20. package/dist/esm/components/CnMailTab/CnMailTab.vue2.js +2 -1
  21. package/dist/esm/components/CnMailTab/CnMailTab.vue2.js.map +1 -1
  22. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
  23. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +71 -0
  24. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  25. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +25 -9
  26. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  27. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  28. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +11 -2
  29. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  30. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  31. package/dist/esm/components/CnSearchPage/CnSearchPage.vue.js +1 -1
  32. package/dist/esm/components/CnSearchPage/CnSearchPage.vue2.js +161 -5
  33. package/dist/esm/components/CnSearchPage/CnSearchPage.vue2.js.map +1 -1
  34. package/dist/esm/components/CnSearchPage/CnSearchPage.vue3.js +9 -9
  35. package/dist/esm/components/CnSearchPage/CnSearchPage.vue3.js.map +1 -1
  36. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  37. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +35 -5
  38. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  39. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  40. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue.js +9 -0
  41. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue.js.map +1 -0
  42. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue2.js +435 -0
  43. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue2.js.map +1 -0
  44. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue3.js +300 -0
  45. package/dist/esm/components/CnTransitionInputFields/CnTransitionInputFields.vue3.js.map +1 -0
  46. package/dist/esm/composables/useEndpointSource.js +1 -36
  47. package/dist/esm/composables/useEndpointSource.js.map +1 -1
  48. package/dist/esm/dialogs/CnTransitionInputDialog.vue.js +1 -1
  49. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js +57 -336
  50. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js.map +1 -1
  51. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js +18 -155
  52. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js.map +1 -1
  53. package/dist/esm/index.js +2 -0
  54. package/dist/esm/index.js.map +1 -1
  55. package/dist/esm/l10n/en.json.js +2 -1
  56. package/dist/esm/l10n/en.json.js.map +1 -1
  57. package/dist/esm/l10n/nl.json.js +2 -1
  58. package/dist/esm/l10n/nl.json.js.map +1 -1
  59. package/dist/esm/library-style.js +1 -1
  60. package/dist/esm/nextcloud-vue.css +308 -229
  61. package/dist/esm/utils/actionsDispatcher.js +3 -2
  62. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  63. package/dist/esm/utils/interpolateUrlTokens.js +43 -0
  64. package/dist/esm/utils/interpolateUrlTokens.js.map +1 -0
  65. package/dist/esm/utils/labelsByField.js +72 -0
  66. package/dist/esm/utils/labelsByField.js.map +1 -0
  67. package/dist/esm/utils/listCreateAction.js +91 -0
  68. package/dist/esm/utils/listCreateAction.js.map +1 -0
  69. package/dist/esm/utils/transitionInputs.js +493 -0
  70. package/dist/esm/utils/transitionInputs.js.map +1 -0
  71. package/dist/esm/utils/visibleWhen.js +9 -2
  72. package/dist/esm/utils/visibleWhen.js.map +1 -1
  73. package/dist/nextcloud-vue.cjs.js +6690 -5404
  74. package/dist/nextcloud-vue.cjs.js.map +2 -2
  75. package/dist/nextcloud-vue.css +308 -229
  76. package/l10n/en.json +2 -1
  77. package/l10n/nl.json +2 -1
  78. package/package.json +1 -1
  79. package/src/components/CnActionsBar/CnActionsBar.vue +6 -6
  80. package/src/components/CnDashboardPage/CnDashboardPage.vue +27 -5
  81. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +11 -1
  82. package/src/components/CnIndexPage/CnIndexPage.vue +9 -4
  83. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +86 -0
  84. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +11 -2
  85. package/src/components/CnSearchPage/CnSearchPage.vue +170 -14
  86. package/src/components/CnTabsWidget/CnTabsWidget.vue +35 -5
  87. package/src/components/CnTransitionInputFields/CnTransitionInputFields.vue +750 -0
  88. package/src/components/CnTransitionInputFields/index.js +11 -0
  89. package/src/components/index.js +1 -0
  90. package/src/composables/useEndpointSource.js +3 -36
  91. package/src/dialogs/CnTransitionInputDialog.vue +73 -465
  92. package/src/index.js +2 -0
  93. package/src/utils/interpolateUrlTokens.js +40 -0
  94. package/src/utils/labelsByField.js +69 -0
  95. package/src/utils/listCreateAction.js +87 -0
  96. package/src/utils/transitionInputs.js +489 -0
  97. package/src/utils/visibleWhen.js +9 -2
@@ -6,11 +6,12 @@ import { NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcl
6
6
  import CheckCircle from 'vue-material-design-icons/CheckCircle.vue';
7
7
  import CircleOutline from 'vue-material-design-icons/CircleOutline.vue';
8
8
  import HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue';
9
- import { fetchEndpointSource, interpolateUrlTokens } from '../../composables/useEndpointSource.js';
9
+ import { fetchEndpointSource } from '../../composables/useEndpointSource.js';
10
10
  import { fillTemplate } from '../../utils/fillTemplate.js';
11
11
  import { readPath } from '../../utils/readPath.js';
12
12
  import __sfc_main from '../CnDialog/CnDialog.vue.js';
13
13
  import __sfc_main$1 from '../CnIcon/CnIcon.vue.js';
14
+ import { interpolateUrlTokens } from '../../utils/interpolateUrlTokens.js';
14
15
 
15
16
  /** The page refresh channel the built-in widgets listen on. */
16
17
  const PAGE_REFRESH = 'cn:page:refresh';
@@ -1 +1 @@
1
- {"version":3,"file":"CnActionDialog.vue2.js","sources":["../../../../src/components/CnActionDialog/CnActionDialog.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<CnDialog\n\t\t:name=\"text(config.title) || t('nextcloud-vue', 'Confirm')\"\n\t\t:eyebrow=\"eyebrowText\"\n\t\t:subtitle=\"text(config.subtitle)\"\n\t\twidth=\"form\"\n\t\t:noClose=\"busy\"\n\t\tdata-testid=\"cn-action-dialog\"\n\t\t@closing=\"close\">\n\t\t<div v-if=\"!done\" class=\"cn-action-dialog\">\n\t\t\t<!-- The record the action is about: its title, a meta line, a badge. -->\n\t\t\t<div v-if=\"summary\" class=\"cn-action-dialog__summary\" data-testid=\"cn-action-dialog-summary\">\n\t\t\t\t<CnIcon :name=\"config.summary.icon || 'FolderOutline'\" :size=\"20\" class=\"cn-action-dialog__summary-icon\" />\n\t\t\t\t<span class=\"cn-action-dialog__summary-text\">\n\t\t\t\t\t<strong>{{ summary.title }}</strong>\n\t\t\t\t\t<span v-if=\"summary.meta\" class=\"cn-action-dialog__muted\">{{ summary.meta }}</span>\n\t\t\t\t</span>\n\t\t\t\t<span v-if=\"summary.badge\" class=\"cn-action-dialog__badge\">{{ summary.badge }}</span>\n\t\t\t</div>\n\n\t\t\t<!-- Facts about the record, in titled groups (\"Retention under the case type\"). -->\n\t\t\t<section v-for=\"(section, index) in factSections\"\n\t\t\t\t:key=\"`facts-${index}`\"\n\t\t\t\tclass=\"cn-action-dialog__section\"\n\t\t\t\tdata-testid=\"cn-action-dialog-facts\">\n\t\t\t\t<h3 v-if=\"section.title\" class=\"cn-action-dialog__title\">\n\t\t\t\t\t{{ section.title }}\n\t\t\t\t</h3>\n\t\t\t\t<dl class=\"cn-action-dialog__facts\">\n\t\t\t\t\t<div v-for=\"fact in section.facts\" :key=\"fact.label\" class=\"cn-action-dialog__fact\">\n\t\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t\t<dd>{{ fact.value }}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t</section>\n\n\t\t\t<!-- The checklist, read from an endpoint: each item met, not met or\n\t\t\t unknown. Items named in `required` decide whether the action may\n\t\t\t run; the others inform. -->\n\t\t\t<section v-if=\"config.checklist\" class=\"cn-action-dialog__section\" data-testid=\"cn-action-dialog-checklist\">\n\t\t\t\t<h3 v-if=\"config.checklist.title\" class=\"cn-action-dialog__title\">\n\t\t\t\t\t{{ text(config.checklist.title) }}\n\t\t\t\t</h3>\n\t\t\t\t<p v-if=\"checklistError\" class=\"cn-action-dialog__muted\" role=\"status\">\n\t\t\t\t\t{{ checklistError }}\n\t\t\t\t</p>\n\t\t\t\t<ul class=\"cn-action-dialog__checks\">\n\t\t\t\t\t<li v-for=\"item in checklist\"\n\t\t\t\t\t\t:key=\"item.id\"\n\t\t\t\t\t\tclass=\"cn-action-dialog__check\"\n\t\t\t\t\t\t:data-testid=\"`cn-action-dialog-check-${item.id}`\"\n\t\t\t\t\t\t:data-met=\"String(item.met)\">\n\t\t\t\t\t\t<CheckCircle v-if=\"item.met === true\" :size=\"20\" class=\"cn-action-dialog__check-icon cn-action-dialog__check-icon--met\" />\n\t\t\t\t\t\t<HelpCircleOutline v-else-if=\"item.met === null\" :size=\"20\" class=\"cn-action-dialog__check-icon\" />\n\t\t\t\t\t\t<CircleOutline v-else :size=\"20\" class=\"cn-action-dialog__check-icon\" />\n\t\t\t\t\t\t<strong class=\"cn-action-dialog__check-label\">{{ item.label }}</strong>\n\t\t\t\t\t\t<span v-if=\"item.detail\" class=\"cn-action-dialog__muted\">{{ item.detail }}</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<!-- Fields the action asks for, sent beside the reason. -->\n\t\t\t<div v-for=\"field in fields\"\n\t\t\t\t:key=\"field.field\"\n\t\t\t\tclass=\"cn-action-dialog__field\"\n\t\t\t\t:data-testid=\"`cn-action-dialog-field-${field.field}`\">\n\t\t\t\t<NcSelect v-if=\"field.type === 'select'\"\n\t\t\t\t\t:modelValue=\"selectedOption(field)\"\n\t\t\t\t\t:options=\"optionsOf(field)\"\n\t\t\t\t\t:inputLabel=\"text(field.label) || field.field\"\n\t\t\t\t\t:clearable=\"field.required === false\"\n\t\t\t\t\t@update:modelValue=\"(option) => pick(field, option)\" />\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:modelValue=\"values[field.field] || ''\"\n\t\t\t\t\t:type=\"field.type === 'datetime' ? 'datetime-local' : (field.type === 'date' ? 'date' : 'text')\"\n\t\t\t\t\t:label=\"text(field.label) || field.field\"\n\t\t\t\t\t@update:modelValue=\"(value) => setValue(field.field, value)\" />\n\t\t\t</div>\n\n\t\t\t<div v-if=\"config.reason\" class=\"cn-action-dialog__field\">\n\t\t\t\t<NcTextArea\n\t\t\t\t\t:id=\"reasonId\"\n\t\t\t\t\tv-model=\"reason\"\n\t\t\t\t\t:label=\"reasonLabel\"\n\t\t\t\t\t:labelOutside=\"false\"\n\t\t\t\t\t:rows=\"config.reason.rows || 2\"\n\t\t\t\t\tresize=\"vertical\"\n\t\t\t\t\tdata-testid=\"cn-action-dialog-reason\" />\n\t\t\t\t<span v-if=\"config.reason.hint\" class=\"cn-action-dialog__muted\">{{ text(config.reason.hint) }}</span>\n\t\t\t</div>\n\n\t\t\t<NcNoteCard v-if=\"config.note\"\n\t\t\t\t:type=\"noteType\"\n\t\t\t\t:heading=\"text(config.note.title)\"\n\t\t\t\tdata-testid=\"cn-action-dialog-note\">\n\t\t\t\t{{ text(config.note.text) }}\n\t\t\t</NcNoteCard>\n\n\t\t\t<p v-if=\"refusal\"\n\t\t\t\tclass=\"cn-action-dialog__error\"\n\t\t\t\trole=\"alert\"\n\t\t\t\tdata-testid=\"cn-action-dialog-refusal\">\n\t\t\t\t{{ refusal }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<p v-else role=\"status\" data-testid=\"cn-action-dialog-done\">\n\t\t\t{{ text(config.doneText) || t('nextcloud-vue', 'Done') }}\n\t\t</p>\n\n\t\t<template #actions>\n\t\t\t<NcButton :disabled=\"busy\" data-testid=\"cn-action-dialog-cancel\" @click=\"close\">\n\t\t\t\t{{ done ? t('nextcloud-vue', 'Close') : t('nextcloud-vue', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"!done\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"!canConfirm\"\n\t\t\t\tdata-testid=\"cn-action-dialog-confirm\"\n\t\t\t\t@click=\"confirm\">\n\t\t\t\t<template v-if=\"confirmConfig.icon\" #icon>\n\t\t\t\t\t<CnIcon :name=\"confirmConfig.icon\" :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ text(confirmConfig.label) || t('nextcloud-vue', 'Confirm') }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</CnDialog>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { emit } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport CircleOutline from 'vue-material-design-icons/CircleOutline.vue'\nimport HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue'\nimport { fetchEndpointSource, interpolateUrlTokens } from '../../composables/useEndpointSource.js'\nimport { fillTemplate } from '../../utils/fillTemplate.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { CnDialog } from '../CnDialog/index.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/** The page refresh channel the built-in widgets listen on. */\nconst PAGE_REFRESH = 'cn:page:refresh'\n\n/** Gives each dialog's reason field its own id. */\nlet reasonSeq = 0\n\n/**\n * CnActionDialog — the generic \"summary, checklist, reason, confirm\" dialog\n * for an act on a record, configured from the manifest (an `open-modal`\n * action's props), so an app does not hand-build each one. dossiq's archive\n * dialog (board DqArchiveren) is the first: the case, what its case type\n * keeps, a readiness checklist read from an endpoint, a reason, a read-only\n * note and Archive it.\n *\n * `config`:\n * - `title`, `subtitle`, `doneText`: texts, through the host translate;\n * `eyebrow` a template filled from the record (\"Close off · {identifier}\").\n * - `summary`: `{ source?, title, meta?, badge?, icon? }`: templates filled from\n * the record (`source` an endpointSource to read it from, else `object`).\n * - `facts`: `[{ title?, items: [{ label, value }] }]`, `value` a template.\n * - `checklist`: `{ title?, source, itemsPath?, labels?, required? }`: items\n * `{ id, met, label?, detail? }` read from `source`; `labels[id]` gives an\n * item's `{ label, detail?, unmetDetail? }`; the ids in `required` must be\n * met before the action can run. `met: null` reads as unknown.\n * - `permission`: `{ source, listPath?, match?, allowedPath, reasonPath? }`:\n * the action runs only while `allowedPath` reads true; `reasonPath` says\n * why not. With `listPath` the paths read the entry of that list whose\n * fields equal `match` (`{ act: \"archive\" }`).\n * - `fields`: `[{ field, type?: \"text\"|\"date\"|\"datetime\"|\"select\", label?,\n * required?, options?: [{ value, label, fills? }] }]`: inputs sent beside\n * the reason, required by default; a select option's `fills` sets other\n * fields that are still empty.\n * - `reason`: `{ label?, hint?, required?, field?, rows? }`: a text area; required by\n * default; sent as `field` (default `reason`). `rows` is its height in lines\n * (default 2; board DqBesluit draws 4).\n * - `note`: `{ variant?, title?, text }`: a read-only note.\n * - `confirm`: `{ label, icon?, request?: { method?, url, body? }, action? }`.\n * `request` posts itself (`body` templates filled with the record and\n * `{reason}`); `action` dispatches a manifest action through the page.\n *\n * Tokens (`@objectId`, `@object.<field>`) resolve in every url.\n */\nexport default {\n\tname: 'CnActionDialog',\n\n\tcomponents: { CheckCircle, CircleOutline, CnDialog, CnIcon, HelpCircleOutline, NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField },\n\n\tinject: {\n\t\t/** The host app's translate (CnAppRoot `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The page's pre-bound action dispatcher (CnPageRenderer), for `confirm.action`. */\n\t\tcnDispatchAction: { default: null },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The dialog's configuration (see the component docs).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The record's id, for the `@objectId` token. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The record, when the host has it: the summary and facts read it.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tobject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['close', 'done'],\n\n\tdata() {\n\t\treturn {\n\t\t\trecord: this.object,\n\t\t\titems: [],\n\t\t\tchecklistError: '',\n\t\t\tallowed: true,\n\t\t\treason: '',\n\t\t\tvalues: {},\n\t\t\tbusy: false,\n\t\t\trefusal: '',\n\t\t\tdone: false,\n\t\t\treasonId: `cn-action-dialog-reason-${++reasonSeq}`,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {object} The token context. */\n\t\ttokenCtx() {\n\t\t\treturn { objectId: this.recordId, object: this.record || {} }\n\t\t},\n\n\t\t/**\n\t\t * The record's id: `objectId`, or the route's `id` when the prop is\n\t\t * empty or a token the opener could not resolve.\n\t\t *\n\t\t * @return {string|number}\n\t\t */\n\t\trecordId() {\n\t\t\tconst given = this.objectId\n\t\t\tif (given !== '' && given !== null && given !== undefined && !String(given).startsWith('@')) {\n\t\t\t\treturn given\n\t\t\t}\n\t\t\treturn (this.$route && this.$route.params && this.$route.params.id) || ''\n\t\t},\n\n\t\t/** @return {object} The confirm config. */\n\t\tconfirmConfig() {\n\t\t\treturn this.config.confirm && typeof this.config.confirm === 'object' ? this.config.confirm : {}\n\t\t},\n\n\t\t/**\n\t\t * The summary row, or null without one or before the record is known.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {{title: string, meta: string, badge: string}|null}\n\t\t */\n\t\tsummary() {\n\t\t\tconst def = this.config.summary\n\t\t\tif (!def || !this.record) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst title = this.fill(def.title)\n\t\t\treturn title ? { title, meta: this.fill(def.meta), badge: this.fill(def.badge) } : null\n\t\t},\n\n\t\t/** @return {Array<{title: string, facts: Array<{label: string, value: string}>}>} The fact groups. */\n\t\tfactSections() {\n\t\t\tif (!Array.isArray(this.config.facts) || !this.record) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst empty = t('nextcloud-vue', 'Not set')\n\t\t\treturn this.config.facts.map((section) => ({\n\t\t\t\ttitle: this.text(section.title),\n\t\t\t\tfacts: (Array.isArray(section.items) ? section.items : []).map((fact) => ({ label: this.text(fact.label), value: this.fill(fact.value) || empty })),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * The checklist rows: label and detail from `labels` by id, else the item's own.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {Array<{id: string, met: (boolean|null), label: string, detail: string}>}\n\t\t */\n\t\tchecklist() {\n\t\t\tconst labels = (this.config.checklist && this.config.checklist.labels) || {}\n\t\t\treturn this.items.map((item) => {\n\t\t\t\tconst met = item.met === null || item.met === undefined ? null : item.met === true\n\t\t\t\tconst own = labels[item.id] || {}\n\t\t\t\tconst detail = met === false && own.unmetDetail ? own.unmetDetail : (own.detail || item.detail || '')\n\t\t\t\treturn {\n\t\t\t\t\tid: String(item.id),\n\t\t\t\t\tmet,\n\t\t\t\t\tlabel: this.fill(own.label || item.label || String(item.id), item),\n\t\t\t\t\tdetail: met === null && !item.detail ? t('nextcloud-vue', 'Could not be read') : this.fill(detail, item),\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/** @return {boolean} Whether every required item is met. */\n\t\trequiredMet() {\n\t\t\tconst required = (this.config.checklist && Array.isArray(this.config.checklist.required)) ? this.config.checklist.required.map(String) : []\n\t\t\treturn required.every((id) => this.items.some((item) => String(item.id) === id && item.met === true))\n\t\t},\n\n\t\t/** @return {boolean} Whether a reason is asked and needed. */\n\t\treasonNeeded() {\n\t\t\treturn Boolean(this.config.reason) && this.config.reason.required !== false\n\t\t},\n\n\t\t/** @return {string} The reason field's label. */\n\t\treasonLabel() {\n\t\t\treturn this.text(this.config.reason && this.config.reason.label) || t('nextcloud-vue', 'Reason')\n\t\t},\n\n\t\t/** @return {string} The note's NcNoteCard type. */\n\t\tnoteType() {\n\t\t\tconst variant = this.config.note && this.config.note.variant\n\t\t\treturn ['info', 'warning', 'error', 'success'].includes(variant) ? variant : 'info'\n\t\t},\n\n\t\t/**\n\t\t * Whether the action may run: allowed, required items met, a reason\n\t\t * when one is needed, and nothing in flight.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {boolean}\n\t\t */\n\t\tcanConfirm() {\n\t\t\treturn !this.busy && this.allowed && this.requiredMet && this.fieldsFilled && (!this.reasonNeeded || this.reason.trim() !== '')\n\t\t},\n\n\t\t/** @return {string} The eyebrow, filled from the record once it is known. */\n\t\teyebrowText() {\n\t\t\treturn this.record ? this.fill(this.config.eyebrow) || this.text(this.config.eyebrow) : this.text(this.config.eyebrow)\n\t\t},\n\n\t\t/** @return {Array<object>} The fields with a name. */\n\t\tfields() {\n\t\t\treturn (Array.isArray(this.config.fields) ? this.config.fields : []).filter((f) => f && f.field)\n\t\t},\n\n\t\t/**\n\t\t * Whether every required field has a value.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog-fields-and-acts/specs/action-dialog/spec.md#requirement-an-action-dialog-asks-for-fields-and-reads-a-permission-from-a-list\n\t\t * @return {boolean}\n\t\t */\n\t\tfieldsFilled() {\n\t\t\treturn this.fields.every((f) => f.required === false || String(this.values[f.field] ?? '').trim() !== '')\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait Promise.all([this.loadRecord(), this.loadChecklist(), this.loadPermission()])\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A config text through the host translate, '' for anything else.\n\t\t *\n\t\t * @param {unknown} value The text.\n\t\t * @return {string}\n\t\t */\n\t\ttext(value) {\n\t\t\treturn typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''\n\t\t},\n\n\t\t/**\n\t\t * A template filled from a row (the record by default), translated first.\n\t\t *\n\t\t * @param {unknown} template The template.\n\t\t * @param {object} [row] The row.\n\t\t * @return {string}\n\t\t */\n\t\tfill(template, row) {\n\t\t\tif (typeof template !== 'string' || template === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn fillTemplate(this.cnTranslate(template), row || this.record || {}).trim()\n\t\t},\n\n\t\t/**\n\t\t * Read an endpoint, fresh.\n\t\t *\n\t\t * @param {object} source An endpointSource block.\n\t\t * @return {Promise<unknown>}\n\t\t */\n\t\tread(source) {\n\t\t\treturn fetchEndpointSource(source, this.tokenCtx, { fresh: true })\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadRecord() {\n\t\t\tconst source = this.config.summary && this.config.summary.source\n\t\t\tif (!source || !source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(source)\n\t\t\t\tthis.record = data && typeof data === 'object' ? data : this.record\n\t\t\t} catch {\n\t\t\t\t// The summary stays empty; the checklist and the action still work.\n\t\t\t}\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadChecklist() {\n\t\t\tconst def = this.config.checklist\n\t\t\tif (!def || !def.source || !def.source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(def.source)\n\t\t\t\tconst list = def.itemsPath ? readPath(data, def.itemsPath) : data\n\t\t\t\tthis.items = Array.isArray(list) ? list.filter((item) => item && item.id !== undefined) : []\n\t\t\t} catch {\n\t\t\t\tthis.items = []\n\t\t\t\tthis.checklistError = t('nextcloud-vue', 'Whether this is ready could not be read.')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The entry of a list whose fields equal `match`, or null.\n\t\t *\n\t\t * @param {unknown} list The list.\n\t\t * @param {object} [match] The fields to match.\n\t\t * @return {object|null}\n\t\t */\n\t\tmatchIn(list, match) {\n\t\t\tconst wanted = Object.entries(match || {})\n\t\t\treturn (Array.isArray(list) ? list : []).find((entry) => entry && wanted.every(([key, value]) => String(entry[key]) === String(value))) || null\n\t\t},\n\n\t\t/**\n\t\t * A select field's options, labels translated.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {Array<{id: string, label: string, fills?: object}>}\n\t\t */\n\t\toptionsOf(field) {\n\t\t\treturn (Array.isArray(field.options) ? field.options : []).map((o) => ({ id: String(o.value), label: this.text(o.label) || String(o.value), fills: o.fills }))\n\t\t},\n\n\t\t/**\n\t\t * A select field's chosen option.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {object|null}\n\t\t */\n\t\tselectedOption(field) {\n\t\t\treturn this.optionsOf(field).find((o) => o.id === String(this.values[field.field] ?? '')) || null\n\t\t},\n\n\t\t/**\n\t\t * Set a field's value.\n\t\t *\n\t\t * @param {string} name The field.\n\t\t * @param {unknown} value The value.\n\t\t */\n\t\tsetValue(name, value) {\n\t\t\tthis.values = { ...this.values, [name]: value === null || value === undefined ? '' : String(value) }\n\t\t},\n\n\t\t/**\n\t\t * Choose a select option; its `fills` set the fields still empty.\n\t\t *\n\t\t * @param {object} field The select field.\n\t\t * @param {{id: string, fills?: object}|null} option The option.\n\t\t */\n\t\tpick(field, option) {\n\t\t\tthis.setValue(field.field, option ? option.id : '')\n\t\t\tfor (const [name, value] of Object.entries((option && option.fills) || {})) {\n\t\t\t\tif (String(this.values[name] ?? '').trim() === '') {\n\t\t\t\t\tthis.setValue(name, this.text(value) || value)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadPermission() {\n\t\t\tconst def = this.config.permission\n\t\t\tif (!def || !def.source || !def.source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(def.source)\n\t\t\t\tconst entry = def.listPath ? this.matchIn(readPath(data, def.listPath), def.match) : data\n\t\t\t\tthis.allowed = readPath(entry, def.allowedPath || 'allowed') === true\n\t\t\t\tthis.refusal = this.allowed || !def.reasonPath ? '' : String(readPath(entry, def.reasonPath) || '')\n\t\t\t} catch {\n\t\t\t\tthis.allowed = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run the action once: post `confirm.request`, or dispatch\n\t\t * `confirm.action`, then show the done text and refresh the page.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync confirm() {\n\t\t\tif (!this.canConfirm) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\tthis.refusal = ''\n\t\t\tconst reason = this.reason.trim()\n\t\t\ttry {\n\t\t\t\tconst request = this.confirmConfig.request\n\t\t\t\tif (request && request.url) {\n\t\t\t\t\tconst url = interpolateUrlTokens(request.url, this.tokenCtx)\n\t\t\t\t\tconst body = {}\n\t\t\t\t\tfor (const [key, value] of Object.entries(request.body || {})) {\n\t\t\t\t\t\tbody[key] = typeof value === 'string' ? fillTemplate(value, { ...(this.record || {}), reason }) : value\n\t\t\t\t\t}\n\t\t\t\t\tif (this.config.reason) {\n\t\t\t\t\t\tbody[this.config.reason.field || 'reason'] = reason\n\t\t\t\t\t}\n\t\t\t\t\tfor (const field of this.fields) {\n\t\t\t\t\t\tbody[field.field] = this.values[field.field] ?? ''\n\t\t\t\t\t}\n\t\t\t\t\tconst method = String(request.method || 'POST').toLowerCase()\n\t\t\t\t\tawait axios[['post', 'put', 'patch', 'delete'].includes(method) ? method : 'post'](/^https?:\\/\\//i.test(url) ? url : generateUrl(url), body)\n\t\t\t\t} else if (this.confirmConfig.action && typeof this.cnDispatchAction === 'function') {\n\t\t\t\t\tawait this.cnDispatchAction({ ...this.confirmConfig.action, args: [...(this.confirmConfig.action.args || []), { ...this.values, reason }] })\n\t\t\t\t}\n\t\t\t\tthis.done = true\n\t\t\t\temit(PAGE_REFRESH, {})\n\t\t\t\t/** @event done The action ran. Payload: the field values and `reason`. */\n\t\t\t\tthis.$emit('done', { ...this.values, reason })\n\t\t\t} catch (failure) {\n\t\t\t\tconst data = failure && failure.response && failure.response.data\n\t\t\t\tthis.refusal = String((data && (data.message || data.error)) || t('nextcloud-vue', 'The action could not be completed.'))\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\n\t\t/** Close the dialog, unless the action is running. */\n\t\tclose() {\n\t\t\tif (this.busy) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/** @event close The dialog was closed. */\n\t\t\tthis.$emit('close')\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-action-dialog {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n\n.cn-action-dialog__summary {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 12px 14px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large, 8px);\n}\n\n.cn-action-dialog__summary-text {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tmin-width: 0;\n}\n\n.cn-action-dialog__badge {\n\tpadding: 3px 10px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 13px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n\n.cn-action-dialog__title {\n\tmargin: 0 0 8px;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n/* Facts in columns of at least 200px, each a label over its value above a\n hairline (DqArchiveren \"Bewaring volgens het zaaktype\"). */\n.cn-action-dialog__facts {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n\tgap: 12px 24px;\n\tmargin: 0;\n}\n\n.cn-action-dialog__fact {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 3px;\n\tpadding-bottom: 10px;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-action-dialog__facts dt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-action-dialog__facts dd {\n\tmargin: 0;\n\tfont-size: 15px;\n\tfont-weight: 500;\n}\n\n/* Checklist rows divided by hairlines, the detail at the row's end\n (DqArchiveren \"Klaar om te archiveren\"). */\n.cn-action-dialog__checks {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-action-dialog__check {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 2px 12px;\n\tpadding: 10px 0;\n\tborder-top: 1px solid var(--color-border);\n\tfont-size: 15px;\n}\n\n.cn-action-dialog__check-label {\n\tflex: 1 1 auto;\n\tfont-weight: 600;\n}\n\n.cn-action-dialog__check-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-action-dialog__check-icon--met {\n\tcolor: var(--color-success-text, var(--color-success));\n}\n\n.cn-action-dialog__muted {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 14px;\n}\n\n.cn-action-dialog__field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-action-dialog__error {\n\tmargin: 0;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n</style>\n"],"names":["CnDialog","CnIcon","t","axios"],"mappings":"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"}
1
+ {"version":3,"file":"CnActionDialog.vue2.js","sources":["../../../../src/components/CnActionDialog/CnActionDialog.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<CnDialog\n\t\t:name=\"text(config.title) || t('nextcloud-vue', 'Confirm')\"\n\t\t:eyebrow=\"eyebrowText\"\n\t\t:subtitle=\"text(config.subtitle)\"\n\t\twidth=\"form\"\n\t\t:noClose=\"busy\"\n\t\tdata-testid=\"cn-action-dialog\"\n\t\t@closing=\"close\">\n\t\t<div v-if=\"!done\" class=\"cn-action-dialog\">\n\t\t\t<!-- The record the action is about: its title, a meta line, a badge. -->\n\t\t\t<div v-if=\"summary\" class=\"cn-action-dialog__summary\" data-testid=\"cn-action-dialog-summary\">\n\t\t\t\t<CnIcon :name=\"config.summary.icon || 'FolderOutline'\" :size=\"20\" class=\"cn-action-dialog__summary-icon\" />\n\t\t\t\t<span class=\"cn-action-dialog__summary-text\">\n\t\t\t\t\t<strong>{{ summary.title }}</strong>\n\t\t\t\t\t<span v-if=\"summary.meta\" class=\"cn-action-dialog__muted\">{{ summary.meta }}</span>\n\t\t\t\t</span>\n\t\t\t\t<span v-if=\"summary.badge\" class=\"cn-action-dialog__badge\">{{ summary.badge }}</span>\n\t\t\t</div>\n\n\t\t\t<!-- Facts about the record, in titled groups (\"Retention under the case type\"). -->\n\t\t\t<section v-for=\"(section, index) in factSections\"\n\t\t\t\t:key=\"`facts-${index}`\"\n\t\t\t\tclass=\"cn-action-dialog__section\"\n\t\t\t\tdata-testid=\"cn-action-dialog-facts\">\n\t\t\t\t<h3 v-if=\"section.title\" class=\"cn-action-dialog__title\">\n\t\t\t\t\t{{ section.title }}\n\t\t\t\t</h3>\n\t\t\t\t<dl class=\"cn-action-dialog__facts\">\n\t\t\t\t\t<div v-for=\"fact in section.facts\" :key=\"fact.label\" class=\"cn-action-dialog__fact\">\n\t\t\t\t\t\t<dt>{{ fact.label }}</dt>\n\t\t\t\t\t\t<dd>{{ fact.value }}</dd>\n\t\t\t\t\t</div>\n\t\t\t\t</dl>\n\t\t\t</section>\n\n\t\t\t<!-- The checklist, read from an endpoint: each item met, not met or\n\t\t\t unknown. Items named in `required` decide whether the action may\n\t\t\t run; the others inform. -->\n\t\t\t<section v-if=\"config.checklist\" class=\"cn-action-dialog__section\" data-testid=\"cn-action-dialog-checklist\">\n\t\t\t\t<h3 v-if=\"config.checklist.title\" class=\"cn-action-dialog__title\">\n\t\t\t\t\t{{ text(config.checklist.title) }}\n\t\t\t\t</h3>\n\t\t\t\t<p v-if=\"checklistError\" class=\"cn-action-dialog__muted\" role=\"status\">\n\t\t\t\t\t{{ checklistError }}\n\t\t\t\t</p>\n\t\t\t\t<ul class=\"cn-action-dialog__checks\">\n\t\t\t\t\t<li v-for=\"item in checklist\"\n\t\t\t\t\t\t:key=\"item.id\"\n\t\t\t\t\t\tclass=\"cn-action-dialog__check\"\n\t\t\t\t\t\t:data-testid=\"`cn-action-dialog-check-${item.id}`\"\n\t\t\t\t\t\t:data-met=\"String(item.met)\">\n\t\t\t\t\t\t<CheckCircle v-if=\"item.met === true\" :size=\"20\" class=\"cn-action-dialog__check-icon cn-action-dialog__check-icon--met\" />\n\t\t\t\t\t\t<HelpCircleOutline v-else-if=\"item.met === null\" :size=\"20\" class=\"cn-action-dialog__check-icon\" />\n\t\t\t\t\t\t<CircleOutline v-else :size=\"20\" class=\"cn-action-dialog__check-icon\" />\n\t\t\t\t\t\t<strong class=\"cn-action-dialog__check-label\">{{ item.label }}</strong>\n\t\t\t\t\t\t<span v-if=\"item.detail\" class=\"cn-action-dialog__muted\">{{ item.detail }}</span>\n\t\t\t\t\t</li>\n\t\t\t\t</ul>\n\t\t\t</section>\n\n\t\t\t<!-- Fields the action asks for, sent beside the reason. -->\n\t\t\t<div v-for=\"field in fields\"\n\t\t\t\t:key=\"field.field\"\n\t\t\t\tclass=\"cn-action-dialog__field\"\n\t\t\t\t:data-testid=\"`cn-action-dialog-field-${field.field}`\">\n\t\t\t\t<NcSelect v-if=\"field.type === 'select'\"\n\t\t\t\t\t:modelValue=\"selectedOption(field)\"\n\t\t\t\t\t:options=\"optionsOf(field)\"\n\t\t\t\t\t:inputLabel=\"text(field.label) || field.field\"\n\t\t\t\t\t:clearable=\"field.required === false\"\n\t\t\t\t\t@update:modelValue=\"(option) => pick(field, option)\" />\n\t\t\t\t<NcTextField v-else\n\t\t\t\t\t:modelValue=\"values[field.field] || ''\"\n\t\t\t\t\t:type=\"field.type === 'datetime' ? 'datetime-local' : (field.type === 'date' ? 'date' : 'text')\"\n\t\t\t\t\t:label=\"text(field.label) || field.field\"\n\t\t\t\t\t@update:modelValue=\"(value) => setValue(field.field, value)\" />\n\t\t\t</div>\n\n\t\t\t<div v-if=\"config.reason\" class=\"cn-action-dialog__field\">\n\t\t\t\t<NcTextArea\n\t\t\t\t\t:id=\"reasonId\"\n\t\t\t\t\tv-model=\"reason\"\n\t\t\t\t\t:label=\"reasonLabel\"\n\t\t\t\t\t:labelOutside=\"false\"\n\t\t\t\t\t:rows=\"config.reason.rows || 2\"\n\t\t\t\t\tresize=\"vertical\"\n\t\t\t\t\tdata-testid=\"cn-action-dialog-reason\" />\n\t\t\t\t<span v-if=\"config.reason.hint\" class=\"cn-action-dialog__muted\">{{ text(config.reason.hint) }}</span>\n\t\t\t</div>\n\n\t\t\t<NcNoteCard v-if=\"config.note\"\n\t\t\t\t:type=\"noteType\"\n\t\t\t\t:heading=\"text(config.note.title)\"\n\t\t\t\tdata-testid=\"cn-action-dialog-note\">\n\t\t\t\t{{ text(config.note.text) }}\n\t\t\t</NcNoteCard>\n\n\t\t\t<p v-if=\"refusal\"\n\t\t\t\tclass=\"cn-action-dialog__error\"\n\t\t\t\trole=\"alert\"\n\t\t\t\tdata-testid=\"cn-action-dialog-refusal\">\n\t\t\t\t{{ refusal }}\n\t\t\t</p>\n\t\t</div>\n\n\t\t<p v-else role=\"status\" data-testid=\"cn-action-dialog-done\">\n\t\t\t{{ text(config.doneText) || t('nextcloud-vue', 'Done') }}\n\t\t</p>\n\n\t\t<template #actions>\n\t\t\t<NcButton :disabled=\"busy\" data-testid=\"cn-action-dialog-cancel\" @click=\"close\">\n\t\t\t\t{{ done ? t('nextcloud-vue', 'Close') : t('nextcloud-vue', 'Cancel') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton v-if=\"!done\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"!canConfirm\"\n\t\t\t\tdata-testid=\"cn-action-dialog-confirm\"\n\t\t\t\t@click=\"confirm\">\n\t\t\t\t<template v-if=\"confirmConfig.icon\" #icon>\n\t\t\t\t\t<CnIcon :name=\"confirmConfig.icon\" :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ text(confirmConfig.label) || t('nextcloud-vue', 'Confirm') }}\n\t\t\t</NcButton>\n\t\t</template>\n\t</CnDialog>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { emit } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField } from '@nextcloud/vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport CircleOutline from 'vue-material-design-icons/CircleOutline.vue'\nimport HelpCircleOutline from 'vue-material-design-icons/HelpCircleOutline.vue'\nimport { fetchEndpointSource, interpolateUrlTokens } from '../../composables/useEndpointSource.js'\nimport { fillTemplate } from '../../utils/fillTemplate.js'\nimport { readPath } from '../../utils/readPath.js'\nimport { CnDialog } from '../CnDialog/index.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/** The page refresh channel the built-in widgets listen on. */\nconst PAGE_REFRESH = 'cn:page:refresh'\n\n/** Gives each dialog's reason field its own id. */\nlet reasonSeq = 0\n\n/**\n * CnActionDialog — the generic \"summary, checklist, reason, confirm\" dialog\n * for an act on a record, configured from the manifest (an `open-modal`\n * action's props), so an app does not hand-build each one. dossiq's archive\n * dialog (board DqArchiveren) is the first: the case, what its case type\n * keeps, a readiness checklist read from an endpoint, a reason, a read-only\n * note and Archive it.\n *\n * `config`:\n * - `title`, `subtitle`, `doneText`: texts, through the host translate;\n * `eyebrow` a template filled from the record (\"Close off · {identifier}\").\n * - `summary`: `{ source?, title, meta?, badge?, icon? }`: templates filled from\n * the record (`source` an endpointSource to read it from, else `object`).\n * - `facts`: `[{ title?, items: [{ label, value }] }]`, `value` a template.\n * - `checklist`: `{ title?, source, itemsPath?, labels?, required? }`: items\n * `{ id, met, label?, detail? }` read from `source`; `labels[id]` gives an\n * item's `{ label, detail?, unmetDetail? }`; the ids in `required` must be\n * met before the action can run. `met: null` reads as unknown.\n * - `permission`: `{ source, listPath?, match?, allowedPath, reasonPath? }`:\n * the action runs only while `allowedPath` reads true; `reasonPath` says\n * why not. With `listPath` the paths read the entry of that list whose\n * fields equal `match` (`{ act: \"archive\" }`).\n * - `fields`: `[{ field, type?: \"text\"|\"date\"|\"datetime\"|\"select\", label?,\n * required?, options?: [{ value, label, fills? }] }]`: inputs sent beside\n * the reason, required by default; a select option's `fills` sets other\n * fields that are still empty.\n * - `reason`: `{ label?, hint?, required?, field?, rows? }`: a text area; required by\n * default; sent as `field` (default `reason`). `rows` is its height in lines\n * (default 2; board DqBesluit draws 4).\n * - `note`: `{ variant?, title?, text }`: a read-only note.\n * - `confirm`: `{ label, icon?, request?: { method?, url, body? }, action? }`.\n * `request` posts itself (`body` templates filled with the record and\n * `{reason}`); `action` dispatches a manifest action through the page.\n *\n * Tokens (`@objectId`, `@object.<field>`) resolve in every url.\n */\nexport default {\n\tname: 'CnActionDialog',\n\n\tcomponents: { CheckCircle, CircleOutline, CnDialog, CnIcon, HelpCircleOutline, NcButton, NcNoteCard, NcSelect, NcTextArea, NcTextField },\n\n\tinject: {\n\t\t/** The host app's translate (CnAppRoot `cnTranslate`). */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/** The page's pre-bound action dispatcher (CnPageRenderer), for `confirm.action`. */\n\t\tcnDispatchAction: { default: null },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The dialog's configuration (see the component docs).\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The record's id, for the `@objectId` token. */\n\t\tobjectId: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The record, when the host has it: the summary and facts read it.\n\t\t *\n\t\t * @type {object|null}\n\t\t */\n\t\tobject: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\temits: ['close', 'done'],\n\n\tdata() {\n\t\treturn {\n\t\t\trecord: this.object,\n\t\t\titems: [],\n\t\t\tchecklistError: '',\n\t\t\tallowed: true,\n\t\t\treason: '',\n\t\t\tvalues: {},\n\t\t\tbusy: false,\n\t\t\trefusal: '',\n\t\t\tdone: false,\n\t\t\treasonId: `cn-action-dialog-reason-${++reasonSeq}`,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/** @return {object} The token context. */\n\t\ttokenCtx() {\n\t\t\treturn { objectId: this.recordId, object: this.record || {} }\n\t\t},\n\n\t\t/**\n\t\t * The record's id: `objectId`, or the route's `id` when the prop is\n\t\t * empty or a token the opener could not resolve.\n\t\t *\n\t\t * @return {string|number}\n\t\t */\n\t\trecordId() {\n\t\t\tconst given = this.objectId\n\t\t\tif (given !== '' && given !== null && given !== undefined && !String(given).startsWith('@')) {\n\t\t\t\treturn given\n\t\t\t}\n\t\t\treturn (this.$route && this.$route.params && this.$route.params.id) || ''\n\t\t},\n\n\t\t/** @return {object} The confirm config. */\n\t\tconfirmConfig() {\n\t\t\treturn this.config.confirm && typeof this.config.confirm === 'object' ? this.config.confirm : {}\n\t\t},\n\n\t\t/**\n\t\t * The summary row, or null without one or before the record is known.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {{title: string, meta: string, badge: string}|null}\n\t\t */\n\t\tsummary() {\n\t\t\tconst def = this.config.summary\n\t\t\tif (!def || !this.record) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst title = this.fill(def.title)\n\t\t\treturn title ? { title, meta: this.fill(def.meta), badge: this.fill(def.badge) } : null\n\t\t},\n\n\t\t/** @return {Array<{title: string, facts: Array<{label: string, value: string}>}>} The fact groups. */\n\t\tfactSections() {\n\t\t\tif (!Array.isArray(this.config.facts) || !this.record) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst empty = t('nextcloud-vue', 'Not set')\n\t\t\treturn this.config.facts.map((section) => ({\n\t\t\t\ttitle: this.text(section.title),\n\t\t\t\tfacts: (Array.isArray(section.items) ? section.items : []).map((fact) => ({ label: this.text(fact.label), value: this.fill(fact.value) || empty })),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * The checklist rows: label and detail from `labels` by id, else the item's own.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {Array<{id: string, met: (boolean|null), label: string, detail: string}>}\n\t\t */\n\t\tchecklist() {\n\t\t\tconst labels = (this.config.checklist && this.config.checklist.labels) || {}\n\t\t\treturn this.items.map((item) => {\n\t\t\t\tconst met = item.met === null || item.met === undefined ? null : item.met === true\n\t\t\t\tconst own = labels[item.id] || {}\n\t\t\t\tconst detail = met === false && own.unmetDetail ? own.unmetDetail : (own.detail || item.detail || '')\n\t\t\t\treturn {\n\t\t\t\t\tid: String(item.id),\n\t\t\t\t\tmet,\n\t\t\t\t\tlabel: this.fill(own.label || item.label || String(item.id), item),\n\t\t\t\t\tdetail: met === null && !item.detail ? t('nextcloud-vue', 'Could not be read') : this.fill(detail, item),\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\t/** @return {boolean} Whether every required item is met. */\n\t\trequiredMet() {\n\t\t\tconst required = (this.config.checklist && Array.isArray(this.config.checklist.required)) ? this.config.checklist.required.map(String) : []\n\t\t\treturn required.every((id) => this.items.some((item) => String(item.id) === id && item.met === true))\n\t\t},\n\n\t\t/** @return {boolean} Whether a reason is asked and needed. */\n\t\treasonNeeded() {\n\t\t\treturn Boolean(this.config.reason) && this.config.reason.required !== false\n\t\t},\n\n\t\t/** @return {string} The reason field's label. */\n\t\treasonLabel() {\n\t\t\treturn this.text(this.config.reason && this.config.reason.label) || t('nextcloud-vue', 'Reason')\n\t\t},\n\n\t\t/** @return {string} The note's NcNoteCard type. */\n\t\tnoteType() {\n\t\t\tconst variant = this.config.note && this.config.note.variant\n\t\t\treturn ['info', 'warning', 'error', 'success'].includes(variant) ? variant : 'info'\n\t\t},\n\n\t\t/**\n\t\t * Whether the action may run: allowed, required items met, a reason\n\t\t * when one is needed, and nothing in flight.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {boolean}\n\t\t */\n\t\tcanConfirm() {\n\t\t\treturn !this.busy && this.allowed && this.requiredMet && this.fieldsFilled && (!this.reasonNeeded || this.reason.trim() !== '')\n\t\t},\n\n\t\t/** @return {string} The eyebrow, filled from the record once it is known. */\n\t\teyebrowText() {\n\t\t\treturn this.record ? this.fill(this.config.eyebrow) || this.text(this.config.eyebrow) : this.text(this.config.eyebrow)\n\t\t},\n\n\t\t/** @return {Array<object>} The fields with a name. */\n\t\tfields() {\n\t\t\treturn (Array.isArray(this.config.fields) ? this.config.fields : []).filter((f) => f && f.field)\n\t\t},\n\n\t\t/**\n\t\t * Whether every required field has a value.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog-fields-and-acts/specs/action-dialog/spec.md#requirement-an-action-dialog-asks-for-fields-and-reads-a-permission-from-a-list\n\t\t * @return {boolean}\n\t\t */\n\t\tfieldsFilled() {\n\t\t\treturn this.fields.every((f) => f.required === false || String(this.values[f.field] ?? '').trim() !== '')\n\t\t},\n\t},\n\n\tasync mounted() {\n\t\tawait Promise.all([this.loadRecord(), this.loadChecklist(), this.loadPermission()])\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * A config text through the host translate, '' for anything else.\n\t\t *\n\t\t * @param {unknown} value The text.\n\t\t * @return {string}\n\t\t */\n\t\ttext(value) {\n\t\t\treturn typeof value === 'string' && value !== '' ? this.cnTranslate(value) : ''\n\t\t},\n\n\t\t/**\n\t\t * A template filled from a row (the record by default), translated first.\n\t\t *\n\t\t * @param {unknown} template The template.\n\t\t * @param {object} [row] The row.\n\t\t * @return {string}\n\t\t */\n\t\tfill(template, row) {\n\t\t\tif (typeof template !== 'string' || template === '') {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn fillTemplate(this.cnTranslate(template), row || this.record || {}).trim()\n\t\t},\n\n\t\t/**\n\t\t * Read an endpoint, fresh.\n\t\t *\n\t\t * @param {object} source An endpointSource block.\n\t\t * @return {Promise<unknown>}\n\t\t */\n\t\tread(source) {\n\t\t\treturn fetchEndpointSource(source, this.tokenCtx, { fresh: true })\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadRecord() {\n\t\t\tconst source = this.config.summary && this.config.summary.source\n\t\t\tif (!source || !source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(source)\n\t\t\t\tthis.record = data && typeof data === 'object' ? data : this.record\n\t\t\t} catch {\n\t\t\t\t// The summary stays empty; the checklist and the action still work.\n\t\t\t}\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadChecklist() {\n\t\t\tconst def = this.config.checklist\n\t\t\tif (!def || !def.source || !def.source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(def.source)\n\t\t\t\tconst list = def.itemsPath ? readPath(data, def.itemsPath) : data\n\t\t\t\tthis.items = Array.isArray(list) ? list.filter((item) => item && item.id !== undefined) : []\n\t\t\t} catch {\n\t\t\t\tthis.items = []\n\t\t\t\tthis.checklistError = t('nextcloud-vue', 'Whether this is ready could not be read.')\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * The entry of a list whose fields equal `match`, or null.\n\t\t *\n\t\t * @param {unknown} list The list.\n\t\t * @param {object} [match] The fields to match.\n\t\t * @return {object|null}\n\t\t */\n\t\tmatchIn(list, match) {\n\t\t\tconst wanted = Object.entries(match || {})\n\t\t\treturn (Array.isArray(list) ? list : []).find((entry) => entry && wanted.every(([key, value]) => String(entry[key]) === String(value))) || null\n\t\t},\n\n\t\t/**\n\t\t * A select field's options, labels translated.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {Array<{id: string, label: string, fills?: object}>}\n\t\t */\n\t\toptionsOf(field) {\n\t\t\treturn (Array.isArray(field.options) ? field.options : []).map((o) => ({ id: String(o.value), label: this.text(o.label) || String(o.value), fills: o.fills }))\n\t\t},\n\n\t\t/**\n\t\t * A select field's chosen option.\n\t\t *\n\t\t * @param {object} field The field.\n\t\t * @return {object|null}\n\t\t */\n\t\tselectedOption(field) {\n\t\t\treturn this.optionsOf(field).find((o) => o.id === String(this.values[field.field] ?? '')) || null\n\t\t},\n\n\t\t/**\n\t\t * Set a field's value.\n\t\t *\n\t\t * @param {string} name The field.\n\t\t * @param {unknown} value The value.\n\t\t */\n\t\tsetValue(name, value) {\n\t\t\tthis.values = { ...this.values, [name]: value === null || value === undefined ? '' : String(value) }\n\t\t},\n\n\t\t/**\n\t\t * Choose a select option; its `fills` set the fields still empty.\n\t\t *\n\t\t * @param {object} field The select field.\n\t\t * @param {{id: string, fills?: object}|null} option The option.\n\t\t */\n\t\tpick(field, option) {\n\t\t\tthis.setValue(field.field, option ? option.id : '')\n\t\t\tfor (const [name, value] of Object.entries((option && option.fills) || {})) {\n\t\t\t\tif (String(this.values[name] ?? '').trim() === '') {\n\t\t\t\t\tthis.setValue(name, this.text(value) || value)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/** @return {Promise<void>} */\n\t\tasync loadPermission() {\n\t\t\tconst def = this.config.permission\n\t\t\tif (!def || !def.source || !def.source.url) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst data = await this.read(def.source)\n\t\t\t\tconst entry = def.listPath ? this.matchIn(readPath(data, def.listPath), def.match) : data\n\t\t\t\tthis.allowed = readPath(entry, def.allowedPath || 'allowed') === true\n\t\t\t\tthis.refusal = this.allowed || !def.reasonPath ? '' : String(readPath(entry, def.reasonPath) || '')\n\t\t\t} catch {\n\t\t\t\tthis.allowed = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Run the action once: post `confirm.request`, or dispatch\n\t\t * `confirm.action`, then show the done text and refresh the page.\n\t\t *\n\t\t * @spec openspec/changes/action-dialog/specs/action-dialog/spec.md#requirement-a-manifest-configures-an-action-dialog\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync confirm() {\n\t\t\tif (!this.canConfirm) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.busy = true\n\t\t\tthis.refusal = ''\n\t\t\tconst reason = this.reason.trim()\n\t\t\ttry {\n\t\t\t\tconst request = this.confirmConfig.request\n\t\t\t\tif (request && request.url) {\n\t\t\t\t\tconst url = interpolateUrlTokens(request.url, this.tokenCtx)\n\t\t\t\t\tconst body = {}\n\t\t\t\t\tfor (const [key, value] of Object.entries(request.body || {})) {\n\t\t\t\t\t\tbody[key] = typeof value === 'string' ? fillTemplate(value, { ...(this.record || {}), reason }) : value\n\t\t\t\t\t}\n\t\t\t\t\tif (this.config.reason) {\n\t\t\t\t\t\tbody[this.config.reason.field || 'reason'] = reason\n\t\t\t\t\t}\n\t\t\t\t\tfor (const field of this.fields) {\n\t\t\t\t\t\tbody[field.field] = this.values[field.field] ?? ''\n\t\t\t\t\t}\n\t\t\t\t\tconst method = String(request.method || 'POST').toLowerCase()\n\t\t\t\t\tawait axios[['post', 'put', 'patch', 'delete'].includes(method) ? method : 'post'](/^https?:\\/\\//i.test(url) ? url : generateUrl(url), body)\n\t\t\t\t} else if (this.confirmConfig.action && typeof this.cnDispatchAction === 'function') {\n\t\t\t\t\tawait this.cnDispatchAction({ ...this.confirmConfig.action, args: [...(this.confirmConfig.action.args || []), { ...this.values, reason }] })\n\t\t\t\t}\n\t\t\t\tthis.done = true\n\t\t\t\temit(PAGE_REFRESH, {})\n\t\t\t\t/** @event done The action ran. Payload: the field values and `reason`. */\n\t\t\t\tthis.$emit('done', { ...this.values, reason })\n\t\t\t} catch (failure) {\n\t\t\t\tconst data = failure && failure.response && failure.response.data\n\t\t\t\tthis.refusal = String((data && (data.message || data.error)) || t('nextcloud-vue', 'The action could not be completed.'))\n\t\t\t} finally {\n\t\t\t\tthis.busy = false\n\t\t\t}\n\t\t},\n\n\t\t/** Close the dialog, unless the action is running. */\n\t\tclose() {\n\t\t\tif (this.busy) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/** @event close The dialog was closed. */\n\t\t\tthis.$emit('close')\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-action-dialog {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n}\n\n.cn-action-dialog__summary {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 10px;\n\tpadding: 12px 14px;\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large, 8px);\n}\n\n.cn-action-dialog__summary-text {\n\tdisplay: flex;\n\tflex: 1 1 auto;\n\tflex-direction: column;\n\tmin-width: 0;\n}\n\n.cn-action-dialog__badge {\n\tpadding: 3px 10px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-dark);\n\tfont-size: 13px;\n\tfont-weight: 600;\n\twhite-space: nowrap;\n}\n\n.cn-action-dialog__title {\n\tmargin: 0 0 8px;\n\tfont-size: 14px;\n\tfont-weight: 600;\n}\n\n/* Facts in columns of at least 200px, each a label over its value above a\n hairline (DqArchiveren \"Bewaring volgens het zaaktype\"). */\n.cn-action-dialog__facts {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n\tgap: 12px 24px;\n\tmargin: 0;\n}\n\n.cn-action-dialog__fact {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 3px;\n\tpadding-bottom: 10px;\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-action-dialog__facts dt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 13px;\n}\n\n.cn-action-dialog__facts dd {\n\tmargin: 0;\n\tfont-size: 15px;\n\tfont-weight: 500;\n}\n\n/* Checklist rows divided by hairlines, the detail at the row's end\n (DqArchiveren \"Klaar om te archiveren\"). */\n.cn-action-dialog__checks {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.cn-action-dialog__check {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: 2px 12px;\n\tpadding: 10px 0;\n\tborder-top: 1px solid var(--color-border);\n\tfont-size: 15px;\n}\n\n.cn-action-dialog__check-label {\n\tflex: 1 1 auto;\n\tfont-weight: 600;\n}\n\n.cn-action-dialog__check-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-action-dialog__check-icon--met {\n\tcolor: var(--color-success-text, var(--color-success));\n}\n\n.cn-action-dialog__muted {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 14px;\n}\n\n.cn-action-dialog__field {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-action-dialog__error {\n\tmargin: 0;\n\tcolor: var(--color-error-text, var(--color-error));\n}\n</style>\n"],"names":["CnDialog","CnIcon","t","axios"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CnActionsBar.vue2.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue"],"sourcesContent":["<template>\n\t<div\n\t\tclass=\"cn-actions-bar\"\n\t\t:class=\"{ 'cn-actions-bar--board': isBoardLayout }\"\n\t\tdata-testid=\"cn-actions-bar\"\n\t\tv-bind=\"$attrs\">\n\t\t<!--\n\t\t\tBoard look, row 1, in the order it is read and drawn: the quick-filter\n\t\t\tchips, the saved-view chips and Save view, the Filter button and the\n\t\t\tview switch. The act controls (sort, add, menus) follow in the\n\t\t\tcluster below; row 2 (search and the active filters) comes last.\n\t\t-->\n\t\t<div v-if=\"isBoardLayout\" class=\"cn-actions-bar__row cn-actions-bar__row--views\" data-testid=\"cn-actions-bar-row-views\">\n\t\t\t<!-- @slot filters Inline filter controls (chips) at the start of the board look's row 1. -->\n\t\t\t<slot name=\"filters\" />\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Under the board look: saved views as chips and the Save view button, in row 1 after the quick-filter chips.\n\t\t\t-->\n\t\t\t<slot name=\"actions-end\" />\n\t\t\t<!-- `searchPlacement: \"toolbar\"`: the search field on row 1, before\n\t\t\t Filter and the view switch, instead of opening row 2. -->\n\t\t\t<div v-if=\"showSearch && searchInToolbar\"\n\t\t\t\tclass=\"cn-actions-bar__search cn-actions-bar__search--toolbar\"\n\t\t\t\tdata-testid=\"cn-actions-bar-search-toolbar\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<!--\n\t\t\t\tFilter and the view switch are one unit: when row 1 is full they\n\t\t\t\twrap together to the start of the next line (the DqZaken board),\n\t\t\t\tnever the switch alone.\n\t\t\t-->\n\t\t\t<div v-if=\"showSidebarToggle || $slots['filter-menu'] || (showViewToggle && viewSegments.length > 1)\"\n\t\t\t\tclass=\"cn-actions-bar__view-controls\"\n\t\t\t\tdata-testid=\"cn-actions-bar-view-controls\">\n\t\t\t\t<NcButton v-if=\"showSidebarToggle\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tclass=\"cn-actions-bar__filter-button\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-button\"\n\t\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Tune :size=\"16\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Filter') }}\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"filterCount > 0\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__filter-badge\"\n\t\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-badge\"\n\t\t\t\t\t\t:aria-label=\"filterCountLabel\">{{ filterCount }}</span>\n\t\t\t\t</NcButton>\n\t\t\t\t<!--\n\t\t\t\t\t@slot filter-menu\n\t\t\t\t\t@description Board look, row 1: the Filter button drawn as a menu, for a page with no filter sidebar (`filterMenu`). Ignored while the sidebar toggle is shown.\n\t\t\t\t-->\n\t\t\t\t<slot v-else name=\"filter-menu\" />\n\t\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'View mode')\">\n\t\t\t\t\t<!-- A segment the page cannot open (`disabledViewModes`) is drawn, as the board does, but disabled and named so.\n\t\t\t\t\t A segment that opens another PAGE (`viewModeLinks`) is a link, never pressed. -->\n\t\t\t\t\t<template v-for=\"seg in viewSegments\" :key=\"seg.mode\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tv-if=\"seg.link\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn cn-actions-bar__view-toggle-btn--link\"\n\t\t\t\t\t\t\t:href=\"seg.link.href\"\n\t\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t\t:title=\"seg.label\"\n\t\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t\tdata-testid=\"cn-actions-bar-view-link\"\n\t\t\t\t\t\t\t@click=\"onViewLinkClick($event, seg)\">\n\t\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode, 'cn-actions-bar__view-toggle-btn--disabled': seg.disabled }\"\n\t\t\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t\t:title=\"seg.disabled ? unavailableViewLabel(seg.label) : seg.label\"\n\t\t\t\t\t\t\t:disabled=\"seg.disabled\"\n\t\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t\t@click=\"seg.disabled || $emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"!isBoardLayout\" class=\"cn-actions-bar__info\">\n\t\t\t<!-- Inline search field (opt-in) -->\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->\n\t\t\t<slot name=\"after-search\" />\n\t\t\t<!-- Counter beside the search (`showCountWithSearch`): after the search and its #after-search controls. The live region stays mounted while there is no total, so results coming back after none are announced too. -->\n\t\t\t<span v-if=\"showCount && showSearch && showCountWithSearch\"\n\t\t\t\tclass=\"cn-actions-bar__count cn-actions-bar__count--beside-search\"\n\t\t\t\t:class=\"{ 'cn-actions-bar__count--empty': !hasTotal }\"\n\t\t\t\taria-live=\"polite\">{{ hasTotal ? countText : '' }}</span>\n\n\t\t\t<!-- View mode toggle (Cards / Table / List) — segmented control with\n\t\t\t a sliding thumb that animates between the N segments. Lives in\n\t\t\t the LEFT info group: switching view is a visual control like\n\t\t\t search and filters, it adds nothing — so it groups with them at\n\t\t\t every width instead of riding with the act buttons. -->\n\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\trole=\"group\"\n\t\t\t\t:aria-label=\"isBoardLayout ? t('nextcloud-vue', 'View') : t('nextcloud-vue', 'View mode')\">\n\t\t\t\t<!-- Sliding pill that sits behind the active segment. Width and\n\t\t\t\t offset are driven by the segment count so the same markup\n\t\t\t\t works for 2–4 segments (cards / table / list / map). -->\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"!isBoardLayout\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-thumb\"\n\t\t\t\t\t:style=\"thumbStyle\"\n\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t<!--\n\t\t\t\t\t@event view-mode-change\n\t\t\t\t\t@description User clicked one of the view-mode toggle buttons (Cards / Table / List / Map). Payload is the selected mode string.\n\t\t\t\t\t@type {'cards' | 'table' | 'list' | 'map'}\n\t\t\t\t-->\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t:aria-label=\"isBoardLayout ? seg.label : null\"\n\t\t\t\t\t:title=\"isBoardLayout ? seg.label : null\"\n\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<span v-if=\"!isBoardLayout\" class=\"cn-actions-bar__view-toggle-label\">{{ seg.label }}</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cn-actions-bar__actions\">\n\t\t\t<!-- Sort select (opt-in). A standalone sort control for card/list\n\t\t\t views, which — unlike the table — have no sortable column\n\t\t\t headers. A leading sort icon replaces a visible \"Sort by\"\n\t\t\t label so the control stays on one line; the label is kept as\n\t\t\t the combobox's accessible name. -->\n\t\t\t<div v-if=\"showSortSelect && sortOptions.length\" class=\"cn-actions-bar__sort\">\n\t\t\t\t<SortVariant :size=\"20\" class=\"cn-actions-bar__sort-icon\" :aria-label=\"sortLabel\" />\n\t\t\t\t<NcSelect\n\t\t\t\t\tclass=\"cn-actions-bar__sort-select\"\n\t\t\t\t\t:modelValue=\"selectedSortOption\"\n\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t:reduce=\"opt => opt.value\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t:aria-label-combobox=\"sortLabel\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"onSortChange\" />\n\t\t\t</div>\n\n\t\t\t<!-- @slot filters Inline filter controls rendered inside the action bar, between the view toggle and the add/actions (e.g. a CnQuickFilterBar segmented toggle). -->\n\t\t\t<slot v-if=\"!isBoardLayout\" name=\"filters\" />\n\n\t\t\t<!-- Search / Columns sidebar toggle (opt-in). Icon-only; reflects the\n\t\t\t open state via aria-pressed so the index sidebar can default\n\t\t\t closed and be opened on demand. -->\n\t\t\t<!--\n\t\t\t\t@event toggle-sidebar\n\t\t\t\t@description User clicked the Search/Columns sidebar toggle. No payload — the host flips the sidebar open state.\n\t\t\t-->\n\t\t\t<NcButton v-if=\"showSidebarToggle && !isBoardLayout\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:title=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Tune :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions\n\t\t\t\t@description Custom buttons rendered between the sidebar toggle and the primary Add button.\n\t\t\t-->\n\t\t\t<slot name=\"actions\" />\n\n\t\t\t<!--\n\t\t\t\t@event add\n\t\t\t\t@description User clicked the primary Add button. No payload.\n\t\t\t-->\n\t\t\t<!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`, except on a modified click, which opens a new tab. -->\n\t\t\t<NcButton v-if=\"showAdd\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"addDisabled\"\n\t\t\t\t:href=\"addLink ? addLink.href : undefined\"\n\t\t\t\tdata-testid=\"cn-cta-primary\"\n\t\t\t\tdata-walkthrough-id=\"index-add\"\n\t\t\t\t@click=\"onAddClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Custom buttons (e.g. CnIndexPage's saved-views control) rendered AFTER the primary Add button, immediately before the overflow menu — for content that belongs grouped with \"browse/manage\" controls rather than with the app-specific buttons in `#actions`.\n\t\t\t-->\n\t\t\t<slot v-if=\"!isBoardLayout\" name=\"actions-end\" />\n\n\t\t\t<!-- In-app edit button (ADR-041): icon-only, self-wires from CnAppRoot.\n\t\t\t The board look draws it in the page header instead. -->\n\t\t\t<CnBuildiqEditButton v-if=\"showBuildiqButton\" />\n\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\n\t\t\t<NcActions\n\t\t\t\tv-if=\"showActionsMenu\"\n\t\t\t\t:forceName=\"true\"\n\t\t\t\t:inline=\"inlineActionCount\"\n\t\t\t\t:menuName=\"actionsMenuName\"\n\t\t\t\tdata-testid=\"cn-actions\">\n\t\t\t\t<!--\n\t\t\t\t\t@event refresh\n\t\t\t\t\t@description User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton :disabled=\"refreshing || refreshDisabled\" @click=\"$emit('refresh')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"refreshing\" :size=\"20\" />\n\t\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ refreshing ? t('nextcloud-vue', 'Refreshing…') : t('nextcloud-vue', 'Refresh') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<NcActionLink v-if=\"documentationUrl\"\n\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<BookOpenVariantOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ documentationLabel }}\n\t\t\t\t</NcActionLink>\n\n\t\t\t\t<!-- Manifest-declared page-level header actions (overflow); an entry with `href` / `to` is a real link. -->\n\t\t\t\t<template v-for=\"{ entry, link } in renderedHeaderActions\" :key=\"entry.id\">\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"link\"\n\t\t\t\t\t\t:href=\"link.href\"\n\t\t\t\t\t\t:target=\"link.target\"\n\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t@click=\"onHeaderLinkClick(entry, link, $event)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:disabled=\"Boolean(entry.disabled)\"\n\t\t\t\t\t\t@click=\"$emit('header-action', { action: entry.id, id: entry.id })\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot action-items\n\t\t\t\t\t@description Additional NcActionButton-family items rendered inside the overflow menu, between the built-in Refresh entry and the mass-actions separator. Use for app-level page actions.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"action-items\" />\n\n\t\t\t\t<!-- Separator between primary and mass actions. Hidden when the\n\t\t\t\t inline-action-count hoists every pre-separator item out of the\n\t\t\t\t overflow, which would otherwise leave the separator orphaned. -->\n\t\t\t\t<NcActionSeparator v-if=\"showActionsSeparator\" />\n\n\t\t\t\t<!-- Mass actions (overflow) -->\n\t\t\t\t<!--\n\t\t\t\t\t@event show-import\n\t\t\t\t\t@description User clicked the Import mass action. Host should open the import modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassImport\"\n\t\t\t\t\t@click=\"$emit('show-import')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Import :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Import') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-export\n\t\t\t\t\t@description User clicked the Export mass action. Host should open the export modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassExport\"\n\t\t\t\t\t@click=\"$emit('show-export')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Export :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Export') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-copy\n\t\t\t\t\t@description User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to copy') : ''\"\n\t\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-delete\n\t\t\t\t\t@description User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to delete') : ''\"\n\t\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot mass-actions\n\t\t\t\t\t@description Additional mass-action NcActionButtons rendered at the bottom of the overflow menu. Scope receives the current selection count and ids so the host can disable / label per selection.\n\t\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selectedIds=\"selectedIds\" />\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- Board look, row 2: the search field, then the active filters. -->\n\t\t<div v-if=\"isBoardLayout\" class=\"cn-actions-bar__row cn-actions-bar__row--search\" data-testid=\"cn-actions-bar-row-search\">\n\t\t\t<div v-if=\"showSearch && !searchInToolbar\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal && !searchInToolbar\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<slot name=\"after-search\" />\n\t\t\t<!-- Board look, row 2: the active filters as removable chips and a\n\t\t\t \"Clear all\" link, after the search field. -->\n\t\t\t<template v-if=\"activeFilterChips.length > 0\">\n\t\t\t\t<span class=\"cn-actions-bar__active-label\" data-testid=\"cn-actions-bar-active-label\">{{ t('nextcloud-vue', 'Active:') }}</span>\n\t\t\t\t<span\n\t\t\t\t\tv-for=\"chip in activeFilterChips\"\n\t\t\t\t\t:key=\"chip.key\"\n\t\t\t\t\tclass=\"cn-actions-bar__filter-chip\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-chip\">\n\t\t\t\t\t<span class=\"cn-actions-bar__filter-chip-label\">{{ chip.label }}</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__filter-chip-remove\"\n\t\t\t\t\t\t:aria-label=\"removeFilterLabel(chip)\"\n\t\t\t\t\t\t@click=\"$emit('remove-filter', chip)\">\n\t\t\t\t\t\t<Close :size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__clear-all\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-clear-all\"\n\t\t\t\t\t@click=\"$emit('clear-filters')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear all') }}\n\t\t\t\t</button>\n\t\t\t</template>\n\t\t\t<span v-if=\"showCount && showSearch && showCountWithSearch\"\n\t\t\t\tclass=\"cn-actions-bar__count cn-actions-bar__count--beside-search\"\n\t\t\t\t:class=\"{ 'cn-actions-bar__count--empty': !hasTotal }\"\n\t\t\t\taria-live=\"polite\">{{ hasTotal ? countText : '' }}</span>\n\t\t</div>\n\n\t\t<!-- Always-present live region for the selection count (WCAG 2.1\n\t\t SC 4.1.3 Status Messages): a `role=\"status\"` element must exist\n\t\t BEFORE its content changes for assistive tech to announce it, so\n\t\t it cannot live inside the v-if'd strip below. -->\n\t\t<span class=\"cn-actions-bar__sr-status\" role=\"status\">\n\t\t\t{{ selectable && selectedIds.length > 0 ? selectionCountText : '' }}\n\t\t</span>\n\n\t\t<!-- Contextual selection strip (the Proton Pass / Gmail / Files\n\t\t pattern): appears while a selection is active, carrying the\n\t\t visible count, the built-in selection-scoped mass actions, the\n\t\t host's own bulk buttons (#selection-actions) and a Clear control.\n\t\t This strip is the discoverable surface for bulk actions; the\n\t\t BUILT-IN Copy/Delete-selected also stay listed in the overflow\n\t\t menu above, while a host decides for its own actions (strip-only\n\t\t is fine — keepiq does exactly that). -->\n\t\t<div\n\t\t\tv-if=\"!isBoardLayout && selectable && selectedIds.length > 0\"\n\t\t\tclass=\"cn-actions-bar__selection\"\n\t\t\tdata-testid=\"cn-selection-strip\">\n\t\t\t<span class=\"cn-actions-bar__selection-count\" aria-hidden=\"true\">\n\t\t\t\t{{ selectionCountText }}\n\t\t\t</span>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\tDeclarative bulk actions, from `bulkActions`. They render in the\n\t\t\t\tSAME strip as a host's slot buttons and before them, so a page\n\t\t\t\tthat declares some in its manifest and hand-writes others gets\n\t\t\t\tone row of buttons rather than two groups in different places.\n\t\t\t\t@event bulk-action\n\t\t\t\t@description User clicked a declarative bulk action. Payload carries the action id AND the selection, because a bulk action without its selection is not a bulk action.\n\t\t\t-->\n\t\t\t<NcButton\n\t\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\t@slot selection-actions The host app's bulk-action buttons (NcButton family), rendered inside the contextual selection strip that appears while a selection is active. This strip is the primary bulk-actions surface; #mass-actions remains available for hosts that ALSO want the actions listed in the overflow menu (optional — strip-only is fine).\n\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t-->\n\t\t\t<slot\n\t\t\t\tname=\"selection-actions\"\n\t\t\t\t:count=\"selectedIds.length\"\n\t\t\t\t:selectedIds=\"selectedIds\" />\n\t\t\t<!--\n\t\t\t\t@event clear-selection\n\t\t\t\t@description User clicked the selection strip's Clear control. The host should empty its selection (CnIndexPage does this for you and re-emits `select` with an empty array).\n\t\t\t-->\n\t\t\t<!-- No aria-label: the visible \"Clear selection\" text IS the\n\t\t\t accessible name (review: an override here is redundant). -->\n\t\t\t<NcButton\n\t\t\t\tclass=\"cn-actions-bar__selection-clear\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n\n\t<!--\n\t\tBoard look: the bulk band is its own row between the toolbar and the\n\t\ttable card, outside the toolbar element, while rows are selected; with\n\t\t`bulkBandAlways` also before, its buttons disabled until there is a\n\t\tselection (DqZaken, DqWerkbord). The count stays announced by the live\n\t\tregion above.\n\t-->\n\t<div\n\t\tv-if=\"isBoardLayout && selectable && (selectedIds.length > 0 || (bulkBandAlways && bulkBandHasActions))\"\n\t\tclass=\"cn-actions-bar__band\"\n\t\t:class=\"{ 'cn-actions-bar__band--idle': selectedIds.length === 0 }\"\n\t\trole=\"region\"\n\t\t:aria-label=\"t('nextcloud-vue', 'Actions for the selection')\"\n\t\tdata-testid=\"cn-bulk-band\">\n\t\t<strong class=\"cn-actions-bar__band-lead\">{{ bulkBandLead }}</strong>\n\t\t<NcButton\n\t\t\tv-if=\"showMassCopy\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"selectedIds.length === 0\"\n\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\tv-if=\"showMassDelete\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"selectedIds.length === 0\"\n\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t:key=\"entry.id\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"entry.disabled === true || selectedIds.length === 0\"\n\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t</NcButton>\n\t\t<slot\n\t\t\tname=\"selection-actions\"\n\t\t\t:count=\"selectedIds.length\"\n\t\t\t:selectedIds=\"selectedIds\" />\n\t\t<span v-if=\"bulkHint\" class=\"cn-actions-bar__band-hint\" data-testid=\"cn-bulk-band-hint\">{{ bulkHint }}</span>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcActionSeparator, NcButton, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport CalendarMonthOutline from 'vue-material-design-icons/CalendarMonthOutline.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Export from 'vue-material-design-icons/Export.vue'\nimport FormatListBulleted from 'vue-material-design-icons/FormatListBulleted.vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport Import from 'vue-material-design-icons/Import.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport SortVariant from 'vue-material-design-icons/SortVariant.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Tune from 'vue-material-design-icons/Tune.vue'\nimport ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue'\nimport ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'\nimport ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'\nimport { isModifiedClick } from '../../utils/linkNavigation.js'\nimport { labelLang } from '../../utils/manifestTranslate.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\n *\n * ```vue\n * <CnActionsBar\n * :pagination=\"pagination\"\n * :object-count=\"items.length\"\n * add-label=\"Add Client\"\n * add-icon=\"AccountGroup\"\n * @add=\"createNew\"\n * @refresh=\"reload\" />\n * ```\n */\nexport default {\n\tname: 'CnActionsBar',\n\n\tcomponents: {\n\t\tCnBuildiqEditButton,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tCnIcon,\n\t\tSortVariant,\n\t\tBookOpenVariantOutline,\n\t\tClose,\n\t\tPlus,\n\t\tRefresh,\n\t\tContentCopy,\n\t\tTrashCanOutline,\n\t\tImport,\n\t\tExport,\n\t\tMagnify,\n\t\tTune,\n\t\tViewColumnOutline,\n\t\tViewGridOutline,\n\t\tFormatListBulleted,\n\t\tFormatListBulletedSquare,\n\t\tCalendarMonthOutline,\n\t\tMapMarkerOutline,\n\t},\n\n\tinject: {\n\t\t/** The look CnAppRoot provides; `board` draws the two-row toolbar. */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored `headerActions[].label` is run through it — the\n\t\t * entry is keyed and emitted by `id`, so only the visible text\n\t\t * changes. Defaults to an identity function so an untranslated key\n\t\t * renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\t// Attributes go on the toolbar element, not on the fragment (the toolbar\n\t// plus, under the board look, the bulk band).\n\tinheritAttrs: false,\n\n\tprops: {\n\t\t/**\n\t\t * `board` draws the toolbar of the board look: no band, two rows (saved\n\t\t * views, Filter and the view switch; then the search field and the\n\t\t * active filters). Empty follows the `cnLook` the app provides.\n\t\t *\n\t\t * @type {('' | 'board' | 'nextcloud')}\n\t\t * @spec openspec/changes/screens-index-list-parity/specs/index-list-board-look/spec.md#requirement-the-toolbar-sits-on-the-ground-in-two-rows\n\t\t */\n\t\tlayout: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The active filters as chips for row 2 of the board toolbar:\n\t\t * `{ key, label }`, the label reading \"Team: Woo\". Removing one emits\n\t\t * `remove-filter` with the chip; \"Clear all\" emits `clear-filters`.\n\t\t *\n\t\t * @type {Array<{key: string, label: string}>}\n\t\t */\n\t\tactiveFilterChips: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Board look: view modes the switch draws although the page cannot\n\t\t * open them, as disabled segments (the boards always draw table, cards,\n\t\t * board and map). Ignored without the board look.\n\t\t *\n\t\t * @type {Array<string>}\n\t\t * @spec openspec/changes/screens-view-switch-parity/specs/view-switch-board-look/spec.md#requirement-the-manifest-can-draw-segments-the-page-cannot-open\n\t\t */\n\t\tdisabledViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Board look: view modes that open another PAGE instead of switching in\n\t\t * place, by mode: `{ board: { href, to? } }`. Such a segment is drawn as\n\t\t * a link in its place in the switch; `to` (a router location) is pushed\n\t\t * on a plain click, `href` serves a new tab. A mode the page offers in\n\t\t * place stays a button. Ignored without the board look.\n\t\t *\n\t\t * @type {{[mode: string]: {href: string, to?: (object|string)}}}\n\t\t * @spec openspec/changes/screens-view-switch-links/specs/view-switch/spec.md#requirement-a-view-switch-segment-can-open-another-page\n\t\t */\n\t\tviewModeLinks: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The number on the Filter button's badge. Empty (`null`) counts the\n\t\t * `activeFilterChips`.\n\t\t *\n\t\t * @type {(number|null)}\n\t\t */\n\t\tactiveFilterCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether the bar draws the in-app buildiq edit button. A page that\n\t\t * draws it in its own header (the board look) passes false so there\n\t\t * is one square, not two.\n\t\t */\n\t\tshowBuildiqButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** The plural the board bulk band names (\"With the selected cases\"). */\n\t\tbulkNoun: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Board look: draw the bulk band also before anything is selected, its\n\t\t * buttons disabled until there is a selection, as DqZaken and DqWerkbord\n\t\t * draw it. Only when the band has an action to offer.\n\t\t */\n\t\tbulkBandAlways: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** The 13px hint after the board bulk band's buttons (`config.bulkHint`). */\n\t\tbulkHint: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Pagination state: { total, page, pages, limit } */\n\t\tpagination: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\n\t\tobjectCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether rows/cards can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Currently selected IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Label for the Add button */\n\t\taddLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Add'),\n\t\t},\n\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\n\t\taddIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * URL the Add button links to. Makes the button a real link (middle-click,\n\t\t * open in new tab) that still emits `add` on click. `addTo` is ignored when set.\n\t\t *\n\t\t * @type {string|null}\n\t\t */\n\t\taddHref: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * vue-router location (path or `{ name, params }`) the Add button links to.\n\t\t * The button becomes a real link whose plain click routes in place and still\n\t\t * emits `add`; the host must then not navigate on `add` itself. Ignored when\n\t\t * the router cannot resolve it.\n\t\t *\n\t\t * @type {string|object|null}\n\t\t */\n\t\taddTo: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\n\t\tinlineActionCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Import action */\n\t\tshowMassImport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Export action */\n\t\tshowMassExport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Copy action */\n\t\tshowMassCopy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Delete action */\n\t\tshowMassDelete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current view mode: 'table', 'cards', 'list', or 'map' */\n\t\tviewMode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (v) => ['table', 'cards', 'list', 'map', 'calendar'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Which view-mode segments to render, in order. Defaults to the\n\t\t * historical two-segment control; add `'list'` to expose the list view.\n\t\t *\n\t\t * @type {Array<'cards' | 'table' | 'list' | 'calendar'>}\n\t\t */\n\t\tavailableViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ['cards', 'table'],\n\t\t\tvalidator: (modes) => modes.every((m) => ['cards', 'table', 'list', 'calendar'].includes(m)),\n\t\t},\n\n\t\t/** Whether to show the view-mode toggle */\n\t\tshowViewToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Label for the cards/grid view-toggle option (defaults to \"Cards\") */\n\t\tcardsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the table/list view-toggle option (defaults to \"Table\") */\n\t\ttableLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the cards option (defaults to the built-in grid icon). Resolved via CnIcon. */\n\t\tcardsIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the table option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\ttableIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether to render the \"Map\" segment in the view toggle (back-compat bridge; equivalent to adding 'map' to `availableViewModes`). */\n\t\tshowMap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Label for the map view-toggle option (defaults to \"Map\"). */\n\t\tmapLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via CnIcon. */\n\t\tmapIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the list view-toggle option (defaults to \"List\") */\n\t\tlistLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the list option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\tlistIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show a standalone sort dropdown (useful in card/list views). */\n\t\tshowSortSelect: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Options for the sort dropdown.\n\t\t *\n\t\t * @type {Array<{ value: string, label: string }>}\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The currently selected sort option value (controlled). */\n\t\tsortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Accessible label for the sort dropdown. */\n\t\tsortLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Sort by'),\n\t\t},\n\n\t\t/** Whether to show the inline search field on the left of the bar */\n\t\tshowSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Where the board look draws the search field: `''` (the default) at\n\t\t * the start of row 2, `'toolbar'` on row 1 before Filter and the view\n\t\t * switch (DqTeamwachtrij). No effect outside the board look.\n\t\t *\n\t\t * @type {''|'toolbar'}\n\t\t */\n\t\tsearchPlacement: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t\tvalidator: (v) => ['', 'toolbar'].includes(v),\n\t\t},\n\n\t\t/** Current value of the inline search field (controlled) */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder / accessible label for the inline search field */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Keep the \"Showing X of Y\" counter visible beside the inline search field,\n\t\t * after any `#after-search` controls. By default the search field takes the\n\t\t * counter's place. No effect without `showSearch`.\n\t\t */\n\t\tshowCountWithSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is currently in progress */\n\t\trefreshing: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is disabled (e.g. when required selections are missing) */\n\t\trefreshDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the Add button is disabled (e.g. when required selections are missing) */\n\t\taddDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether to show the Add button */\n\t\tshowAdd: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether the \"Showing 20 of 258\" line renders where the search field\n\t\t * is not. `false` drops it, for a page whose title line already says\n\t\t * how many there are. True by default.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header\n\t\t */\n\t\tshowCount: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether the overflow Actions menu (Refresh, Import, Export, mass\n\t\t * actions, header actions) renders. `false` drops it, for a page that\n\t\t * offers its actions as buttons elsewhere (CnIndexPage\n\t\t * `headerButtons`). True by default.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header\n\t\t */\n\t\tshowActionsMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the Search/Columns sidebar toggle button. Lets the\n\t\t * index sidebar default to closed and be opened on demand.\n\t\t */\n\t\tshowSidebarToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current open state of the sidebar (controls the toggle's pressed state). */\n\t\tsidebarOpen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Manifest-declared page-level actions rendered in the overflow\n\t\t * dropdown between Refresh and the `#action-items` slot. Each\n\t\t * entry is `{ id, label, icon?, disabled? }`. The bar emits\n\t\t * `@header-action({ action: id, id })` on click; handler\n\t\t * resolution happens upstream (CnIndexPage). An entry with `href`\n\t\t * (URL) or `to` (vue-router location) renders as a real link, with\n\t\t * `linkTarget` as its `target`; it still emits `header-action`, so the\n\t\t * host must not navigate for it again.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, href?: string, to?: string|object, linkTarget?: string }>}\n\t\t */\n\t\theaderActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Declarative bulk actions, rendered in the contextual selection strip\n\t\t * that appears while a selection is active.\n\t\t *\n\t\t * The strip already had a `#selection-actions` slot, which only a\n\t\t * hand-written host component can fill — so a page declared in an app\n\t\t * manifest could carry row actions and header actions but never a bulk\n\t\t * one. This prop is that missing vocabulary; the slot stays, and both\n\t\t * render side by side in one row.\n\t\t *\n\t\t * Clicking emits `bulk-action` with the id AND the current selection.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean }>}\n\t\t */\n\t\tbulkActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * When set, adds a Documentation entry to the overflow menu (after\n\t\t * Refresh, before headerActions). Opens the URL in a new tab.\n\t\t * Empty string hides the entry.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Documentation overflow entry. */\n\t\tdocumentationLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Documentation'),\n\t\t},\n\t},\n\n\temits: [\n\t\t'add',\n\t\t'bulk-action',\n\t\t'clear-filters',\n\t\t'clear-selection',\n\t\t'header-action',\n\t\t'refresh',\n\t\t'remove-filter',\n\t\t'search',\n\t\t'show-copy',\n\t\t'show-delete',\n\t\t'show-export',\n\t\t'show-import',\n\t\t'sort-change',\n\t\t'toggle-sidebar',\n\t\t'view-mode-change',\n\t],\n\n\tcomputed: {\n\t\t/**\n\t\t * Whether the search field sits on the board's row 1.\n\t\t *\n\t\t * @spec openspec/changes/index-search-on-toolbar/specs/index-page/spec.md#requirement-the-search-field-can-sit-on-the-toolbar-row\n\t\t * @return {boolean}\n\t\t */\n\t\tsearchInToolbar() {\n\t\t\treturn this.isBoardLayout && this.searchPlacement === 'toolbar'\n\t\t},\n\n\t\t/**\n\t\t * Whether the board toolbar is drawn: the `layout` prop, else the look\n\t\t * the app provides.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisBoardLayout() {\n\t\t\tif (this.layout) {\n\t\t\t\treturn this.layout === 'board'\n\t\t\t}\n\t\t\treturn normalizeLook(this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * The number on the Filter button.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\tfilterCount() {\n\t\t\treturn typeof this.activeFilterCount === 'number' ? this.activeFilterCount : this.activeFilterChips.length\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of the Filter badge.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tfilterCountLabel() {\n\t\t\treturn t('nextcloud-vue', '{count} active', { count: this.filterCount })\n\t\t},\n\n\t\t/**\n\t\t * Whether the bulk band has an action to offer: copy, delete, a\n\t\t * declared bulk action or the host's own buttons.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tbulkBandHasActions() {\n\t\t\treturn this.showMassCopy || this.showMassDelete\n\t\t\t\t|| (Array.isArray(this.bulkActions) && this.bulkActions.length > 0)\n\t\t\t\t|| Boolean(this.$slots['selection-actions'])\n\t\t},\n\n\t\t/**\n\t\t * The bold lead of the board bulk band.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tbulkBandLead() {\n\t\t\treturn t('nextcloud-vue', 'With the selected {plural}', { plural: this.bulkNoun || t('nextcloud-vue', 'items') })\n\t\t},\n\n\t\t/**\n\t\t * Name of the overflow Actions menu. Library chrome, so it resolves\n\t\t * against the LIBRARY catalogue — it was a bare `menu-name=\"Actions\"`\n\t\t * literal, which rendered \"Actions\" in a Dutch session next to an\n\t\t * otherwise fully translated toolbar even though the catalogue has\n\t\t * carried \"Acties\" all along.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsMenuName() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * The selection strip's count text — also fed to the always-present\n\t\t * `role=\"status\"` live region (WCAG 2.1 SC 4.1.3), so assistive tech\n\t\t * announces selection changes without focus moving.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselectionCountText() {\n\t\t\treturn t('nextcloud-vue', '{count} selected', { count: this.selectedIds.length })\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the injected `cnTranslate` (the host\n\t\t * app's bound `t()`), identity by default.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\teffectiveTranslate() {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate : (key) => key\n\t\t},\n\n\t\t/**\n\t\t * The link the Add button renders as, or null for a plain button.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\taddLink() {\n\t\t\tif (this.addDisabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn resolveItemActionLink({ href: this.addHref, to: this.addTo }, null, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * Header actions paired with the link each renders as (null for a button).\n\t\t *\n\t\t * @return {Array<{entry: object, link: object|null}>}\n\t\t */\n\t\trenderedHeaderActions() {\n\t\t\treturn (this.headerActions || []).map((entry) => ({\n\t\t\t\tentry,\n\t\t\t\tlink: entry.disabled ? null : resolveItemActionLink(entry, null, this.$router),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether there is a non-empty total for the \"Showing X of Y\" counter.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\thasTotal() {\n\t\t\treturn Boolean(this.pagination && this.pagination.total > 0)\n\t\t},\n\n\t\tcountText() {\n\t\t\tif (!this.pagination) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Showing {count} of {total}', { count: this.objectCount, total: this.pagination.total })\n\t\t},\n\n\t\t/**\n\t\t * The view-toggle segments (label + icon) derived from `availableViewModes`,\n\t\t * with a back-compat bridge that appends the map segment when the beta-era\n\t\t * `showMap` prop is set. `icon` is a CnIcon name (empty → the built-in\n\t\t * `fallback` component).\n\t\t */\n\t\tviewSegments() {\n\t\t\tconst defs = {\n\t\t\t\tcards: { label: this.cardsLabel || t('nextcloud-vue', 'Cards'), icon: this.cardsIcon, fallback: ViewGridOutline },\n\t\t\t\ttable: { label: this.tableLabel || t('nextcloud-vue', 'Table'), icon: this.tableIcon, fallback: FormatListBulletedSquare },\n\t\t\t\tlist: { label: this.listLabel || t('nextcloud-vue', 'List'), icon: this.listIcon, fallback: ViewListOutline },\n\t\t\t\tmap: { label: this.mapLabel || t('nextcloud-vue', 'Map'), icon: this.mapIcon, fallback: MapMarkerOutline },\n\t\t\t\tcalendar: { label: t('nextcloud-vue', 'Calendar'), icon: '', fallback: CalendarMonthOutline },\n\t\t\t}\n\t\t\tconst modes = [...this.availableViewModes]\n\t\t\tif (this.showMap && !modes.includes('map')) {\n\t\t\t\tmodes.push('map')\n\t\t\t}\n\t\t\tif (this.isBoardLayout) {\n\t\t\t\t// The board look's fixed order: table, cards, board, map, each\n\t\t\t\t// only when the page offers it. A mode the board switch does not\n\t\t\t\t// name (list, calendar) follows, so it is never lost.\n\t\t\t\tdefs.board = { label: t('nextcloud-vue', 'Board'), icon: '', fallback: ViewColumnOutline }\n\t\t\t\t// The board's list icon: plain bullets, not the boxed ones.\n\t\t\t\tdefs.table.boardFallback = FormatListBulleted\n\t\t\t\t// A mode that opens another page: a link, unless the page offers it in place.\n\t\t\t\tconst links = this.viewModeLinks && typeof this.viewModeLinks === 'object' ? this.viewModeLinks : {}\n\t\t\t\tconst linked = Object.keys(links).filter((mode) => !modes.includes(mode) && links[mode] && typeof links[mode].href === 'string' && links[mode].href !== '')\n\t\t\t\tconst disabled = (this.disabledViewModes || []).filter((mode) => !modes.includes(mode) && !linked.includes(mode))\n\t\t\t\tconst all = [...modes, ...linked, ...disabled]\n\t\t\t\tconst fixed = ['table', 'cards', 'board', 'map']\n\t\t\t\tconst rest = all.filter((mode) => !fixed.includes(mode))\n\t\t\t\treturn [...fixed.filter((mode) => all.includes(mode)), ...rest]\n\t\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t\t.map((mode) => ({ mode, ...defs[mode], disabled: disabled.includes(mode), link: linked.includes(mode) ? links[mode] : null }))\n\t\t\t}\n\t\t\treturn modes\n\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t},\n\n\t\t/** The full sort option object matching `sortValue` (for NcSelect). */\n\t\tselectedSortOption() {\n\t\t\treturn this.sortOptions.find((o) => o.value === this.sortValue) || null\n\t\t},\n\n\t\t/** Sliding-thumb width + offset, driven by the active segment index. */\n\t\tthumbStyle() {\n\t\t\tconst count = this.viewSegments.length || 1\n\t\t\tconst activeIndex = Math.max(0, this.viewSegments.findIndex((s) => s.mode === this.viewMode))\n\t\t\treturn {\n\t\t\t\twidth: `calc((100% - 8px) / ${count})`,\n\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t}\n\t\t},\n\n\t\thasMassActions() {\n\t\t\treturn this.showMassImport || this.showMassExport || this.showMassCopy || this.showMassDelete\n\t\t},\n\n\t\t/**\n\t\t * Count meaningful VNodes in the `#action-items` slot (excludes whitespace\n\t\t * text nodes and comments). Used to decide whether the mass-actions\n\t\t * separator would be orphaned by `inlineActionCount`.\n\t\t */\n\t\tactionItemsCount() {\n\t\t\tconst slot = this.$slots['action-items']\n\t\t\tif (!slot) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst vnodes = slot() || []\n\t\t\treturn vnodes.filter((n) => n && (n.tag !== undefined || n.componentOptions !== undefined)).length\n\t\t},\n\n\t\t/**\n\t\t * The separator is meaningful only when at least one pre-separator action\n\t\t * button (Refresh + #action-items) still ends up inside the overflow\n\t\t * dropdown after NcActions hoists the first `inlineActionCount` buttons\n\t\t * inline. Pre-separator items: 1 (Refresh) + actionItemsCount.\n\t\t */\n\t\tshowActionsSeparator() {\n\t\t\tif (!this.hasMassActions) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!this.$slots['action-items']) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst preSeparatorOverflow = 1 + this.actionItemsCount - this.inlineActionCount\n\t\t\treturn preSeparatorOverflow > 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * A click on a segment that opens another page: a plain click goes\n\t\t * through the router when the link names a route; a modified click\n\t\t * (new tab) and a link without a route are left to the browser.\n\t\t *\n\t\t * @param {MouseEvent} event The click.\n\t\t * @param {{link: {href: string, to?: (object|string)}}} seg The segment.\n\t\t */\n\t\tonViewLinkClick(event, seg) {\n\t\t\tconst to = seg.link && seg.link.to\n\t\t\tif (!to || !this.$router || typeof this.$router.push !== 'function' || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button > 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.$router.push(to)\n\t\t},\n\n\t\t/**\n\t\t * The tooltip of a segment the page cannot open.\n\t\t *\n\t\t * @param {string} label The segment's name.\n\t\t * @return {string} \"Map: not available on this list\".\n\t\t */\n\t\tunavailableViewLabel(label) {\n\t\t\treturn t('nextcloud-vue', '{view}: not available on this list', { view: label })\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of a filter chip's remove button.\n\t\t *\n\t\t * @param {{label: string}} chip The chip.\n\t\t * @return {string}\n\t\t */\n\t\tremoveFilterLabel(chip) {\n\t\t\treturn t('nextcloud-vue', 'Remove filter: {label}', { label: chip.label })\n\t\t},\n\n\t\t/**\n\t\t * The `lang` of a bulk action label that fell back to its written text in another language.\n\t\t *\n\t\t * @param {object} entry The bulk action.\n\t\t * @return {string|undefined} The source language, or undefined.\n\t\t */\n\t\tbulkLang(entry) {\n\t\t\treturn labelLang(this.cnTranslate, entry.label) || undefined\n\t\t},\n\n\t\tt,\n\t\t/**\n\t\t * Forward the inline search field's input to the host.\n\t\t *\n\t\t * @param {Event} event The native input event.\n\t\t * @return {void}\n\t\t */\n\t\tonSearchInput(event) {\n\t\t\t/**\n\t\t\t * @event search Emitted when the user types in the inline search field.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('search', event.target.value)\n\t\t},\n\n\t\t/**\n\t\t * Forward the standalone sort dropdown's selection to the host.\n\t\t *\n\t\t * @param {string} value The chosen option's `value`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortChange(value) {\n\t\t\t/**\n\t\t\t * @event sort-change Emitted when the user picks an option from the standalone sort dropdown.\n\t\t\t * @type {string} The chosen option's `value`.\n\t\t\t */\n\t\t\tthis.$emit('sort-change', value)\n\t\t},\n\n\t\t/**\n\t\t * Add button click: a plain click on an in-app link routes in place,\n\t\t * anything else on a link is the browser's. Emits `add`, except for a\n\t\t * modified click on a link, which opens in a new tab: a host `@add`\n\t\t * would otherwise run in the tab the user is leaving.\n\t\t *\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonAddClick(event) {\n\t\t\tif (this.addLink) {\n\t\t\t\tif (isModifiedClick(event)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfollowItemActionLink(event, this.addLink, this.$router)\n\t\t\t}\n\t\t\tthis.$emit('add')\n\t\t},\n\n\t\t/**\n\t\t * A header link entry was clicked: route a plain in-app click and emit\n\t\t * `header-action` as the button would. A modified click is the\n\t\t * browser's alone (a new tab), so nothing is emitted for it.\n\t\t *\n\t\t * @param {object} entry The header action.\n\t\t * @param {object} link The resolved link.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonHeaderLinkClick(entry, link, event) {\n\t\t\tif (isModifiedClick(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowItemActionLink(event, link, this.$router)\n\t\t\tthis.$emit('header-action', { action: entry.id, id: entry.id })\n\t\t},\n\n\t\t/**\n\t\t * Heuristic: a \"plain\" name like `History` is an MDI Vue\n\t\t * component name (rendered via `CnIcon`). A name like\n\t\t * `icon-history` or any string starting with `icon-` is a\n\t\t * Nextcloud core CSS icon class (rendered as a `<span>`).\n\t\t *\n\t\t * @param {string} name Icon string from a headerActions entry.\n\t\t * @return {boolean} `true` when `name` should be passed to\n\t\t * `CnIcon` as `:name`; `false` for CSS-class icons or empty.\n\t\t */\n\t\tisMdiIconName(name) {\n\t\t\tif (!name || typeof name !== 'string') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (name.startsWith('icon-')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\n\t\t/**\n\t\t * Emit declarations — invoked via the template `$emit(...)` sites.\n\t\t * Listed here so vue-docgen-api picks up the events for the\n\t\t * generated docs.\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_emitDocs() {\n\t\t\t/**\n\t\t\t * @event view-mode-change User clicked one of the view-mode toggle buttons (Cards / Table). Payload is the selected mode string.\n\t\t\t * @type {'cards' | 'table'}\n\t\t\t */\n\t\t\tthis.$emit('view-mode-change')\n\t\t\t/**\n\t\t\t * @event add User clicked the primary Add button. No payload.\n\t\t\t */\n\t\t\tthis.$emit('add')\n\t\t\t/**\n\t\t\t * @event refresh User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t */\n\t\t\tthis.$emit('refresh')\n\t\t\t/**\n\t\t\t * @event show-import User clicked the Import mass action. Host should open the import modal.\n\t\t\t */\n\t\t\tthis.$emit('show-import')\n\t\t\t/**\n\t\t\t * @event show-export User clicked the Export mass action. Host should open the export modal.\n\t\t\t */\n\t\t\tthis.$emit('show-export')\n\t\t\t/**\n\t\t\t * @event show-copy User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-copy')\n\t\t\t/**\n\t\t\t * @event show-delete User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-delete')\n\t\t\t/**\n\t\t\t * @event header-action User clicked a manifest-declared page-level header action. Payload: `{ action: id, id }`.\n\t\t\t */\n\t\t\tthis.$emit('header-action')\n\t\t\t/**\n\t\t\t * @event toggle-sidebar User clicked the Search/Columns sidebar toggle. No payload.\n\t\t\t */\n\t\t\tthis.$emit('toggle-sidebar')\n\t\t\t/**\n\t\t\t * @event clear-selection User clicked the selection strip's Clear control. No payload — the host should empty its selection (CnIndexPage does this and re-emits `select` with an empty array).\n\t\t\t */\n\t\t\tthis.$emit('clear-selection')\n\t\t\t/**\n\t\t\t * @event remove-filter User removed an active filter chip (board look). Payload: the chip `{ key, label }`.\n\t\t\t */\n\t\t\tthis.$emit('remove-filter')\n\t\t\t/**\n\t\t\t * @event clear-filters User clicked \"Clear all\" beside the active filter chips (board look). No payload.\n\t\t\t */\n\t\t\tthis.$emit('clear-filters')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/actions-bar.css -->\n"],"names":["CnBuildiqEditButton","CnIcon","BookOpenVariantOutline","Import","t"],"mappings":"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"}
1
+ {"version":3,"file":"CnActionsBar.vue2.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue"],"sourcesContent":["<template>\n\t<div\n\t\tclass=\"cn-actions-bar\"\n\t\t:class=\"{ 'cn-actions-bar--board': isBoardLayout }\"\n\t\tdata-testid=\"cn-actions-bar\"\n\t\tv-bind=\"$attrs\">\n\t\t<!--\n\t\t\tBoard look, row 1, in the order it is read and drawn: the quick-filter\n\t\t\tchips, the saved-view chips and Save view, the Filter button and the\n\t\t\tview switch. The act controls (sort, add, menus) follow in the\n\t\t\tcluster below; row 2 (search and the active filters) comes last.\n\t\t-->\n\t\t<div v-if=\"isBoardLayout\" class=\"cn-actions-bar__row cn-actions-bar__row--views\" data-testid=\"cn-actions-bar-row-views\">\n\t\t\t<!-- @slot filters Inline filter controls (chips) at the start of the board look's row 1. -->\n\t\t\t<slot name=\"filters\" />\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Under the board look: saved views as chips and the Save view button, in row 1 after the quick-filter chips.\n\t\t\t-->\n\t\t\t<slot name=\"actions-end\" />\n\t\t\t<!-- `searchPlacement: \"toolbar\"`: the search field on row 1, before\n\t\t\t Filter and the view switch, instead of opening row 2. -->\n\t\t\t<div v-if=\"showSearch && searchInToolbar\"\n\t\t\t\tclass=\"cn-actions-bar__search cn-actions-bar__search--toolbar\"\n\t\t\t\tdata-testid=\"cn-actions-bar-search-toolbar\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<!--\n\t\t\t\tFilter and the view switch are one unit: when row 1 is full they\n\t\t\t\twrap together to the start of the next line (the DqZaken board),\n\t\t\t\tnever the switch alone.\n\t\t\t-->\n\t\t\t<div v-if=\"showSidebarToggle || $slots['filter-menu'] || (showViewToggle && viewSegments.length > 1)\"\n\t\t\t\tclass=\"cn-actions-bar__view-controls\"\n\t\t\t\tdata-testid=\"cn-actions-bar-view-controls\">\n\t\t\t\t<NcButton v-if=\"showSidebarToggle\"\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tclass=\"cn-actions-bar__filter-button\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-button\"\n\t\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Tune :size=\"16\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Filter') }}\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"filterCount > 0\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__filter-badge\"\n\t\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-badge\"\n\t\t\t\t\t\t:aria-label=\"filterCountLabel\">{{ filterCount }}</span>\n\t\t\t\t</NcButton>\n\t\t\t\t<!--\n\t\t\t\t\t@slot filter-menu\n\t\t\t\t\t@description Board look, row 1: the Filter button drawn as a menu, for a page with no filter sidebar (`filterMenu`). Ignored while the sidebar toggle is shown.\n\t\t\t\t-->\n\t\t\t\t<slot v-else name=\"filter-menu\" />\n\t\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\t\trole=\"group\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'View mode')\">\n\t\t\t\t\t<!-- A segment the page cannot open (`disabledViewModes`) is drawn, as the board does, but disabled and named so.\n\t\t\t\t\t A segment that opens another PAGE (`viewModeLinks`) is a link, never pressed. -->\n\t\t\t\t\t<template v-for=\"seg in viewSegments\" :key=\"seg.mode\">\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\tv-if=\"seg.link\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn cn-actions-bar__view-toggle-btn--link\"\n\t\t\t\t\t\t\t:href=\"seg.link.href\"\n\t\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t\t:title=\"seg.label\"\n\t\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t\tdata-testid=\"cn-actions-bar-view-link\"\n\t\t\t\t\t\t\t@click=\"onViewLinkClick($event, seg)\">\n\t\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode, 'cn-actions-bar__view-toggle-btn--disabled': seg.disabled }\"\n\t\t\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t\t\t:aria-label=\"seg.label\"\n\t\t\t\t\t\t\t:title=\"seg.disabled ? unavailableViewLabel(seg.label) : seg.label\"\n\t\t\t\t\t\t\t:disabled=\"seg.disabled\"\n\t\t\t\t\t\t\t:data-mode=\"seg.mode\"\n\t\t\t\t\t\t\t@click=\"seg.disabled || $emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t\t<component :is=\"seg.boardFallback || seg.fallback\"\n\t\t\t\t\t\t\t\tv-else\n\t\t\t\t\t\t\t\t:size=\"18\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</template>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div v-if=\"!isBoardLayout\" class=\"cn-actions-bar__info\">\n\t\t\t<!-- Inline search field (opt-in) -->\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->\n\t\t\t<slot name=\"after-search\" />\n\t\t\t<!-- Counter beside the search (`showCountWithSearch`): after the search and its #after-search controls. The live region stays mounted while there is no total, so results coming back after none are announced too. -->\n\t\t\t<span v-if=\"showCount && showSearch && showCountWithSearch\"\n\t\t\t\tclass=\"cn-actions-bar__count cn-actions-bar__count--beside-search\"\n\t\t\t\t:class=\"{ 'cn-actions-bar__count--empty': !hasTotal }\"\n\t\t\t\taria-live=\"polite\">{{ hasTotal ? countText : '' }}</span>\n\n\t\t\t<!-- View mode toggle (Cards / Table / List) — segmented control with\n\t\t\t a sliding thumb that animates between the N segments. Lives in\n\t\t\t the LEFT info group: switching view is a visual control like\n\t\t\t search and filters, it adds nothing — so it groups with them at\n\t\t\t every width instead of riding with the act buttons. -->\n\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\trole=\"group\"\n\t\t\t\t:aria-label=\"isBoardLayout ? t('nextcloud-vue', 'View') : t('nextcloud-vue', 'View mode')\">\n\t\t\t\t<!-- Sliding pill that sits behind the active segment. Width and\n\t\t\t\t offset are driven by the segment count so the same markup\n\t\t\t\t works for 2–4 segments (cards / table / list / map). -->\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"!isBoardLayout\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-thumb\"\n\t\t\t\t\t:style=\"thumbStyle\"\n\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t<!--\n\t\t\t\t\t@event view-mode-change\n\t\t\t\t\t@description User clicked one of the view-mode toggle buttons (Cards / Table / List / Map). Payload is the selected mode string.\n\t\t\t\t\t@type {'cards' | 'table' | 'list' | 'map'}\n\t\t\t\t-->\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t:aria-label=\"isBoardLayout ? seg.label : null\"\n\t\t\t\t\t:title=\"isBoardLayout ? seg.label : null\"\n\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<span v-if=\"!isBoardLayout\" class=\"cn-actions-bar__view-toggle-label\">{{ seg.label }}</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cn-actions-bar__actions\">\n\t\t\t<!-- Sort select (opt-in). A standalone sort control for card/list\n\t\t\t views, which — unlike the table — have no sortable column\n\t\t\t headers. A leading sort icon replaces a visible \"Sort by\"\n\t\t\t label so the control stays on one line; the label is kept as\n\t\t\t the combobox's accessible name. -->\n\t\t\t<div v-if=\"showSortSelect && sortOptions.length\" class=\"cn-actions-bar__sort\">\n\t\t\t\t<SortVariant :size=\"20\" class=\"cn-actions-bar__sort-icon\" :aria-label=\"sortLabel\" />\n\t\t\t\t<NcSelect\n\t\t\t\t\tclass=\"cn-actions-bar__sort-select\"\n\t\t\t\t\t:modelValue=\"selectedSortOption\"\n\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t:reduce=\"opt => opt.value\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t:aria-label-combobox=\"sortLabel\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"onSortChange\" />\n\t\t\t</div>\n\n\t\t\t<!-- @slot filters Inline filter controls rendered inside the action bar, between the view toggle and the add/actions (e.g. a CnQuickFilterBar segmented toggle). -->\n\t\t\t<slot v-if=\"!isBoardLayout\" name=\"filters\" />\n\n\t\t\t<!-- Search / Columns sidebar toggle (opt-in). Icon-only; reflects the\n\t\t\t open state via aria-pressed so the index sidebar can default\n\t\t\t closed and be opened on demand. -->\n\t\t\t<!--\n\t\t\t\t@event toggle-sidebar\n\t\t\t\t@description User clicked the Search/Columns sidebar toggle. No payload — the host flips the sidebar open state.\n\t\t\t-->\n\t\t\t<NcButton v-if=\"showSidebarToggle && !isBoardLayout\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:title=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Tune :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions\n\t\t\t\t@description Custom buttons rendered between the sidebar toggle and the primary Add button.\n\t\t\t-->\n\t\t\t<slot name=\"actions\" />\n\n\t\t\t<!--\n\t\t\t\t@event add\n\t\t\t\t@description User clicked the primary Add button. No payload.\n\t\t\t-->\n\t\t\t<!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`, except on a modified click, which opens a new tab. -->\n\t\t\t<NcButton v-if=\"showAdd\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"addDisabled\"\n\t\t\t\t:href=\"addLink ? addLink.href : undefined\"\n\t\t\t\tdata-testid=\"cn-cta-primary\"\n\t\t\t\tdata-walkthrough-id=\"index-add\"\n\t\t\t\t@click=\"onAddClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Custom buttons (e.g. CnIndexPage's saved-views control) rendered AFTER the primary Add button, immediately before the overflow menu — for content that belongs grouped with \"browse/manage\" controls rather than with the app-specific buttons in `#actions`.\n\t\t\t-->\n\t\t\t<slot v-if=\"!isBoardLayout\" name=\"actions-end\" />\n\n\t\t\t<!-- In-app edit button (ADR-041): icon-only, self-wires from CnAppRoot.\n\t\t\t The board look draws it in the page header instead. -->\n\t\t\t<CnBuildiqEditButton v-if=\"showBuildiqButton\" />\n\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\n\t\t\t<NcActions\n\t\t\t\tv-if=\"showActionsMenu\"\n\t\t\t\t:forceName=\"true\"\n\t\t\t\t:inline=\"inlineActionCount\"\n\t\t\t\t:menuName=\"actionsMenuName\"\n\t\t\t\tdata-testid=\"cn-actions\">\n\t\t\t\t<!--\n\t\t\t\t\t@event refresh\n\t\t\t\t\t@description User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton :disabled=\"refreshing || refreshDisabled\" @click=\"$emit('refresh')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"refreshing\" :size=\"20\" />\n\t\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ refreshing ? t('nextcloud-vue', 'Refreshing…') : t('nextcloud-vue', 'Refresh') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<NcActionLink v-if=\"documentationUrl\"\n\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<BookOpenVariantOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ documentationLabel }}\n\t\t\t\t</NcActionLink>\n\n\t\t\t\t<!-- Manifest-declared page-level header actions (overflow); an entry with `href` / `to` is a real link. -->\n\t\t\t\t<template v-for=\"{ entry, link } in renderedHeaderActions\" :key=\"entry.id\">\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"link\"\n\t\t\t\t\t\t:href=\"link.href\"\n\t\t\t\t\t\t:target=\"link.target\"\n\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t@click=\"onHeaderLinkClick(entry, link, $event)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:disabled=\"Boolean(entry.disabled)\"\n\t\t\t\t\t\t@click=\"$emit('header-action', { action: entry.id, id: entry.id })\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot action-items\n\t\t\t\t\t@description Additional NcActionButton-family items rendered inside the overflow menu, between the built-in Refresh entry and the mass-actions separator. Use for app-level page actions.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"action-items\" />\n\n\t\t\t\t<!-- Separator between primary and mass actions. Hidden when the\n\t\t\t\t inline-action-count hoists every pre-separator item out of the\n\t\t\t\t overflow, which would otherwise leave the separator orphaned. -->\n\t\t\t\t<NcActionSeparator v-if=\"showActionsSeparator\" />\n\n\t\t\t\t<!-- Mass actions (overflow) -->\n\t\t\t\t<!--\n\t\t\t\t\t@event show-import\n\t\t\t\t\t@description User clicked the Import mass action. Host should open the import modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassImport\"\n\t\t\t\t\t@click=\"$emit('show-import')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Import :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Import') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-export\n\t\t\t\t\t@description User clicked the Export mass action. Host should open the export modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassExport\"\n\t\t\t\t\t@click=\"$emit('show-export')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Export :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Export') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-copy\n\t\t\t\t\t@description User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to copy') : ''\"\n\t\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-delete\n\t\t\t\t\t@description User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to delete') : ''\"\n\t\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot mass-actions\n\t\t\t\t\t@description Additional mass-action NcActionButtons rendered at the bottom of the overflow menu. Scope receives the current selection count and ids so the host can disable / label per selection.\n\t\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selectedIds=\"selectedIds\" />\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- Board look, row 2: the search field, then the active filters. -->\n\t\t<div v-if=\"isBoardLayout\" class=\"cn-actions-bar__row cn-actions-bar__row--search\" data-testid=\"cn-actions-bar-row-search\">\n\t\t\t<div v-if=\"showSearch && !searchInToolbar\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search in this list')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"showCount && hasTotal && !searchInToolbar\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<slot name=\"after-search\" />\n\t\t\t<!-- Board look, row 2: the active filters as removable chips and a\n\t\t\t \"Clear all\" link, after the search field. -->\n\t\t\t<template v-if=\"activeFilterChips.length > 0\">\n\t\t\t\t<span class=\"cn-actions-bar__active-label\" data-testid=\"cn-actions-bar-active-label\">{{ t('nextcloud-vue', 'Active:') }}</span>\n\t\t\t\t<span\n\t\t\t\t\tv-for=\"chip in activeFilterChips\"\n\t\t\t\t\t:key=\"chip.key\"\n\t\t\t\t\tclass=\"cn-actions-bar__filter-chip\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-filter-chip\">\n\t\t\t\t\t<span class=\"cn-actions-bar__filter-chip-label\">{{ chip.label }}</span>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__filter-chip-remove\"\n\t\t\t\t\t\t:aria-label=\"removeFilterLabel(chip)\"\n\t\t\t\t\t\t@click=\"$emit('remove-filter', chip)\">\n\t\t\t\t\t\t<Close :size=\"14\" aria-hidden=\"true\" />\n\t\t\t\t\t</button>\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__clear-all\"\n\t\t\t\t\tdata-testid=\"cn-actions-bar-clear-all\"\n\t\t\t\t\t@click=\"$emit('clear-filters')\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear all') }}\n\t\t\t\t</button>\n\t\t\t</template>\n\t\t\t<span v-if=\"showCount && showSearch && showCountWithSearch\"\n\t\t\t\tclass=\"cn-actions-bar__count cn-actions-bar__count--beside-search\"\n\t\t\t\t:class=\"{ 'cn-actions-bar__count--empty': !hasTotal }\"\n\t\t\t\taria-live=\"polite\">{{ hasTotal ? countText : '' }}</span>\n\t\t</div>\n\n\t\t<!-- Always-present live region for the selection count (WCAG 2.1\n\t\t SC 4.1.3 Status Messages): a `role=\"status\"` element must exist\n\t\t BEFORE its content changes for assistive tech to announce it, so\n\t\t it cannot live inside the v-if'd strip below. -->\n\t\t<span class=\"cn-actions-bar__sr-status\" role=\"status\">\n\t\t\t{{ selectable && selectedIds.length > 0 ? selectionCountText : '' }}\n\t\t</span>\n\n\t\t<!-- Contextual selection strip (the Proton Pass / Gmail / Files\n\t\t pattern): appears while a selection is active, carrying the\n\t\t visible count, the built-in selection-scoped mass actions, the\n\t\t host's own bulk buttons (#selection-actions) and a Clear control.\n\t\t This strip is the discoverable surface for bulk actions; the\n\t\t BUILT-IN Copy/Delete-selected also stay listed in the overflow\n\t\t menu above, while a host decides for its own actions (strip-only\n\t\t is fine — keepiq does exactly that). -->\n\t\t<div\n\t\t\tv-if=\"!isBoardLayout && selectable && selectedIds.length > 0\"\n\t\t\tclass=\"cn-actions-bar__selection\"\n\t\t\tdata-testid=\"cn-selection-strip\">\n\t\t\t<span class=\"cn-actions-bar__selection-count\" aria-hidden=\"true\">\n\t\t\t\t{{ selectionCountText }}\n\t\t\t</span>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\tDeclarative bulk actions, from `bulkActions`. They render in the\n\t\t\t\tSAME strip as a host's slot buttons and before them, so a page\n\t\t\t\tthat declares some in its manifest and hand-writes others gets\n\t\t\t\tone row of buttons rather than two groups in different places.\n\t\t\t\t@event bulk-action\n\t\t\t\t@description User clicked a declarative bulk action. Payload carries the action id AND the selection, because a bulk action without its selection is not a bulk action.\n\t\t\t-->\n\t\t\t<NcButton\n\t\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\t@slot selection-actions The host app's bulk-action buttons (NcButton family), rendered inside the contextual selection strip that appears while a selection is active. This strip is the primary bulk-actions surface; #mass-actions remains available for hosts that ALSO want the actions listed in the overflow menu (optional — strip-only is fine).\n\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t-->\n\t\t\t<slot\n\t\t\t\tname=\"selection-actions\"\n\t\t\t\t:count=\"selectedIds.length\"\n\t\t\t\t:selectedIds=\"selectedIds\" />\n\t\t\t<!--\n\t\t\t\t@event clear-selection\n\t\t\t\t@description User clicked the selection strip's Clear control. The host should empty its selection (CnIndexPage does this for you and re-emits `select` with an empty array).\n\t\t\t-->\n\t\t\t<!-- No aria-label: the visible \"Clear selection\" text IS the\n\t\t\t accessible name (review: an override here is redundant). -->\n\t\t\t<NcButton\n\t\t\t\tclass=\"cn-actions-bar__selection-clear\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n\n\t<!--\n\t\tBoard look: the bulk band is its own row between the toolbar and the\n\t\ttable card, outside the toolbar element, while rows are selected; with\n\t\t`bulkBandAlways` also before, its buttons disabled until there is a\n\t\tselection (DqZaken, DqWerkbord). The count stays announced by the live\n\t\tregion above.\n\t-->\n\t<div\n\t\tv-if=\"isBoardLayout && selectable && (selectedIds.length > 0 || (bulkBandAlways && bulkBandHasActions))\"\n\t\tclass=\"cn-actions-bar__band\"\n\t\t:class=\"{ 'cn-actions-bar__band--idle': selectedIds.length === 0 }\"\n\t\trole=\"region\"\n\t\t:aria-label=\"t('nextcloud-vue', 'Actions for the selection')\"\n\t\tdata-testid=\"cn-bulk-band\">\n\t\t<strong class=\"cn-actions-bar__band-lead\">{{ bulkBandLead }}</strong>\n\t\t<NcButton\n\t\t\tv-if=\"showMassCopy\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"selectedIds.length === 0\"\n\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\tv-if=\"showMassDelete\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"selectedIds.length === 0\"\n\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t</NcButton>\n\t\t<NcButton\n\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t:key=\"entry.id\"\n\t\t\tvariant=\"secondary\"\n\t\t\t:disabled=\"entry.disabled === true || selectedIds.length === 0\"\n\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t:lang=\"bulkLang(entry)\"\n\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t</NcButton>\n\t\t<slot\n\t\t\tname=\"selection-actions\"\n\t\t\t:count=\"selectedIds.length\"\n\t\t\t:selectedIds=\"selectedIds\" />\n\t\t<span v-if=\"bulkHint\" class=\"cn-actions-bar__band-hint\" data-testid=\"cn-bulk-band-hint\">{{ bulkHint }}</span>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcActionSeparator, NcButton, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport CalendarMonthOutline from 'vue-material-design-icons/CalendarMonthOutline.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Export from 'vue-material-design-icons/Export.vue'\nimport FormatListBulleted from 'vue-material-design-icons/FormatListBulleted.vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport Import from 'vue-material-design-icons/Import.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport SortVariant from 'vue-material-design-icons/SortVariant.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Tune from 'vue-material-design-icons/Tune.vue'\nimport ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue'\nimport ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'\nimport ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport { normalizeLook } from '../../composables/useLook.js'\nimport { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'\nimport { isModifiedClick } from '../../utils/linkNavigation.js'\nimport { labelLang } from '../../utils/manifestTranslate.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\n *\n * ```vue\n * <CnActionsBar\n * :pagination=\"pagination\"\n * :object-count=\"items.length\"\n * add-label=\"Add Client\"\n * add-icon=\"AccountGroup\"\n * @add=\"createNew\"\n * @refresh=\"reload\" />\n * ```\n */\nexport default {\n\tname: 'CnActionsBar',\n\n\tcomponents: {\n\t\tCnBuildiqEditButton,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tCnIcon,\n\t\tSortVariant,\n\t\tBookOpenVariantOutline,\n\t\tClose,\n\t\tPlus,\n\t\tRefresh,\n\t\tContentCopy,\n\t\tTrashCanOutline,\n\t\tImport,\n\t\tExport,\n\t\tMagnify,\n\t\tTune,\n\t\tViewColumnOutline,\n\t\tViewGridOutline,\n\t\tFormatListBulleted,\n\t\tFormatListBulletedSquare,\n\t\tCalendarMonthOutline,\n\t\tMapMarkerOutline,\n\t},\n\n\tinject: {\n\t\t/** The look CnAppRoot provides; `board` draws the two-row toolbar. */\n\t\tcnLook: { default: 'nextcloud' },\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored `headerActions[].label` is run through it — the\n\t\t * entry is keyed and emitted by `id`, so only the visible text\n\t\t * changes. Defaults to an identity function so an untranslated key\n\t\t * renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\t// Attributes go on the toolbar element, not on the fragment (the toolbar\n\t// plus, under the board look, the bulk band).\n\tinheritAttrs: false,\n\n\tprops: {\n\t\t/**\n\t\t * `board` draws the toolbar of the board look: no band, two rows (saved\n\t\t * views, Filter and the view switch; then the search field and the\n\t\t * active filters). Empty follows the `cnLook` the app provides.\n\t\t *\n\t\t * @type {('' | 'board' | 'nextcloud')}\n\t\t * @spec openspec/changes/screens-index-list-parity/specs/index-list-board-look/spec.md#requirement-the-toolbar-sits-on-the-ground-in-two-rows\n\t\t */\n\t\tlayout: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * The active filters as chips for row 2 of the board toolbar:\n\t\t * `{ key, label }`, the label reading \"Team: Woo\". Removing one emits\n\t\t * `remove-filter` with the chip; \"Clear all\" emits `clear-filters`.\n\t\t *\n\t\t * @type {Array<{key: string, label: string}>}\n\t\t */\n\t\tactiveFilterChips: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Board look: view modes the switch draws although the page cannot\n\t\t * open them, as disabled segments (the boards always draw table, cards,\n\t\t * board and map). Ignored without the board look.\n\t\t *\n\t\t * @type {Array<string>}\n\t\t * @spec openspec/changes/screens-view-switch-parity/specs/view-switch-board-look/spec.md#requirement-the-manifest-can-draw-segments-the-page-cannot-open\n\t\t */\n\t\tdisabledViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Board look: view modes that open another PAGE instead of switching in\n\t\t * place, by mode: `{ board: { href, to? } }`. Such a segment is drawn as\n\t\t * a link in its place in the switch; `to` (a router location) is pushed\n\t\t * on a plain click, `href` serves a new tab. A mode the page offers in\n\t\t * place stays a button. Ignored without the board look.\n\t\t *\n\t\t * @type {{[mode: string]: {href: string, to?: (object|string)}}}\n\t\t * @spec openspec/changes/screens-view-switch-links/specs/view-switch/spec.md#requirement-a-view-switch-segment-can-open-another-page\n\t\t */\n\t\tviewModeLinks: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/**\n\t\t * The number on the Filter button's badge. Empty (`null`) counts the\n\t\t * `activeFilterChips`.\n\t\t *\n\t\t * @type {(number|null)}\n\t\t */\n\t\tactiveFilterCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Whether the bar draws the in-app buildiq edit button. A page that\n\t\t * draws it in its own header (the board look) passes false so there\n\t\t * is one square, not two.\n\t\t */\n\t\tshowBuildiqButton: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** The plural the board bulk band names (\"With the selected cases\"). */\n\t\tbulkNoun: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Board look: draw the bulk band also before anything is selected, its\n\t\t * buttons disabled until there is a selection, as DqZaken and DqWerkbord\n\t\t * draw it. Only when the band has an action to offer.\n\t\t */\n\t\tbulkBandAlways: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** The 13px hint after the board bulk band's buttons (`config.bulkHint`). */\n\t\tbulkHint: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Pagination state: { total, page, pages, limit } */\n\t\tpagination: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\n\t\tobjectCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether rows/cards can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Currently selected IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Label for the Add button */\n\t\taddLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Add'),\n\t\t},\n\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\n\t\taddIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * URL the Add button links to. Makes the button a real link (middle-click,\n\t\t * open in new tab) that still emits `add` on click. `addTo` is ignored when set.\n\t\t *\n\t\t * @type {string|null}\n\t\t */\n\t\taddHref: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * vue-router location (path or `{ name, params }`) the Add button links to.\n\t\t * The button becomes a real link whose plain click routes in place and still\n\t\t * emits `add`; the host must then not navigate on `add` itself. Ignored when\n\t\t * the router cannot resolve it.\n\t\t *\n\t\t * @type {string|object|null}\n\t\t */\n\t\taddTo: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\n\t\tinlineActionCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Import action */\n\t\tshowMassImport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Export action */\n\t\tshowMassExport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Copy action */\n\t\tshowMassCopy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Delete action */\n\t\tshowMassDelete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current view mode: 'table', 'cards', 'list', or 'map' */\n\t\tviewMode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (v) => ['table', 'cards', 'list', 'map', 'calendar'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Which view-mode segments to render, in order. Defaults to the\n\t\t * historical two-segment control; add `'list'` to expose the list view.\n\t\t *\n\t\t * @type {Array<'cards' | 'table' | 'list' | 'calendar'>}\n\t\t */\n\t\tavailableViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ['cards', 'table'],\n\t\t\tvalidator: (modes) => modes.every((m) => ['cards', 'table', 'list', 'calendar'].includes(m)),\n\t\t},\n\n\t\t/** Whether to show the view-mode toggle */\n\t\tshowViewToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Label for the cards/grid view-toggle option (defaults to \"Cards\") */\n\t\tcardsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the table/list view-toggle option (defaults to \"Table\") */\n\t\ttableLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the cards option (defaults to the built-in grid icon). Resolved via CnIcon. */\n\t\tcardsIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the table option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\ttableIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether to render the \"Map\" segment in the view toggle (back-compat bridge; equivalent to adding 'map' to `availableViewModes`). */\n\t\tshowMap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Label for the map view-toggle option (defaults to \"Map\"). */\n\t\tmapLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via CnIcon. */\n\t\tmapIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the list view-toggle option (defaults to \"List\") */\n\t\tlistLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the list option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\tlistIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show a standalone sort dropdown (useful in card/list views). */\n\t\tshowSortSelect: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Options for the sort dropdown.\n\t\t *\n\t\t * @type {Array<{ value: string, label: string }>}\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The currently selected sort option value (controlled). */\n\t\tsortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Accessible label for the sort dropdown. */\n\t\tsortLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Sort by'),\n\t\t},\n\n\t\t/** Whether to show the inline search field on the left of the bar */\n\t\tshowSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Where the board look draws the search field: `''` (the default) at\n\t\t * the start of row 2, `'toolbar'` on row 1 before Filter and the view\n\t\t * switch (DqTeamwachtrij). No effect outside the board look.\n\t\t *\n\t\t * @type {''|'toolbar'}\n\t\t */\n\t\tsearchPlacement: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t\tvalidator: (v) => ['', 'toolbar'].includes(v),\n\t\t},\n\n\t\t/** Current value of the inline search field (controlled) */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder / accessible label for the inline search field */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * Keep the \"Showing X of Y\" counter visible beside the inline search field,\n\t\t * after any `#after-search` controls. By default the search field takes the\n\t\t * counter's place. No effect without `showSearch`.\n\t\t */\n\t\tshowCountWithSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is currently in progress */\n\t\trefreshing: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is disabled (e.g. when required selections are missing) */\n\t\trefreshDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the Add button is disabled (e.g. when required selections are missing) */\n\t\taddDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether to show the Add button */\n\t\tshowAdd: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether the \"Showing 20 of 258\" line renders where the search field\n\t\t * is not. `false` drops it, for a page whose title line already says\n\t\t * how many there are. True by default.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header\n\t\t */\n\t\tshowCount: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether the overflow Actions menu (Refresh, Import, Export, mass\n\t\t * actions, header actions) renders. `false` drops it, for a page that\n\t\t * offers its actions as buttons elsewhere (CnIndexPage\n\t\t * `headerButtons`). True by default.\n\t\t *\n\t\t * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header\n\t\t */\n\t\tshowActionsMenu: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the Search/Columns sidebar toggle button. Lets the\n\t\t * index sidebar default to closed and be opened on demand.\n\t\t */\n\t\tshowSidebarToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current open state of the sidebar (controls the toggle's pressed state). */\n\t\tsidebarOpen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Manifest-declared page-level actions rendered in the overflow\n\t\t * dropdown between Refresh and the `#action-items` slot. Each\n\t\t * entry is `{ id, label, icon?, disabled? }`. The bar emits\n\t\t * `@header-action({ action: id, id })` on click; handler\n\t\t * resolution happens upstream (CnIndexPage). An entry with `href`\n\t\t * (URL) or `to` (vue-router location) renders as a real link, with\n\t\t * `linkTarget` as its `target`; it still emits `header-action`, so the\n\t\t * host must not navigate for it again.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, href?: string, to?: string|object, linkTarget?: string }>}\n\t\t */\n\t\theaderActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Declarative bulk actions, rendered in the contextual selection strip\n\t\t * that appears while a selection is active.\n\t\t *\n\t\t * The strip already had a `#selection-actions` slot, which only a\n\t\t * hand-written host component can fill — so a page declared in an app\n\t\t * manifest could carry row actions and header actions but never a bulk\n\t\t * one. This prop is that missing vocabulary; the slot stays, and both\n\t\t * render side by side in one row.\n\t\t *\n\t\t * Clicking emits `bulk-action` with the id AND the current selection.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean }>}\n\t\t */\n\t\tbulkActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * When set, adds a Documentation entry to the overflow menu (after\n\t\t * Refresh, before headerActions). Opens the URL in a new tab.\n\t\t * Empty string hides the entry.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Documentation overflow entry. */\n\t\tdocumentationLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Documentation'),\n\t\t},\n\t},\n\n\temits: [\n\t\t'add',\n\t\t'bulk-action',\n\t\t'clear-filters',\n\t\t'clear-selection',\n\t\t'header-action',\n\t\t'refresh',\n\t\t'remove-filter',\n\t\t'search',\n\t\t'show-copy',\n\t\t'show-delete',\n\t\t'show-export',\n\t\t'show-import',\n\t\t'sort-change',\n\t\t'toggle-sidebar',\n\t\t'view-mode-change',\n\t],\n\n\tcomputed: {\n\t\t/**\n\t\t * Whether the search field sits on the board's row 1.\n\t\t *\n\t\t * @spec openspec/changes/index-search-on-toolbar/specs/index-page/spec.md#requirement-the-search-field-can-sit-on-the-toolbar-row\n\t\t * @return {boolean}\n\t\t */\n\t\tsearchInToolbar() {\n\t\t\treturn this.isBoardLayout && this.searchPlacement === 'toolbar'\n\t\t},\n\n\t\t/**\n\t\t * Whether the board toolbar is drawn: the `layout` prop, else the look\n\t\t * the app provides.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisBoardLayout() {\n\t\t\tif (this.layout) {\n\t\t\t\treturn this.layout === 'board'\n\t\t\t}\n\t\t\treturn normalizeLook(this.cnLook) === 'board'\n\t\t},\n\n\t\t/**\n\t\t * The number on the Filter button.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\tfilterCount() {\n\t\t\treturn typeof this.activeFilterCount === 'number' ? this.activeFilterCount : this.activeFilterChips.length\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of the Filter badge.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tfilterCountLabel() {\n\t\t\treturn t('nextcloud-vue', '{count} active', { count: this.filterCount })\n\t\t},\n\n\t\t/**\n\t\t * Whether the bulk band has an action to offer: copy, delete, a\n\t\t * declared bulk action or the host's own buttons.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tbulkBandHasActions() {\n\t\t\treturn this.showMassCopy || this.showMassDelete\n\t\t\t\t|| (Array.isArray(this.bulkActions) && this.bulkActions.length > 0)\n\t\t\t\t|| Boolean(this.$slots['selection-actions'])\n\t\t},\n\n\t\t/**\n\t\t * The bold lead of the board bulk band.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tbulkBandLead() {\n\t\t\treturn t('nextcloud-vue', 'With the selected {plural}', { plural: this.bulkNoun || t('nextcloud-vue', 'items') })\n\t\t},\n\n\t\t/**\n\t\t * Name of the overflow Actions menu. Library chrome, so it resolves\n\t\t * against the LIBRARY catalogue — it was a bare `menu-name=\"Actions\"`\n\t\t * literal, which rendered \"Actions\" in a Dutch session next to an\n\t\t * otherwise fully translated toolbar even though the catalogue has\n\t\t * carried \"Acties\" all along.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsMenuName() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * The selection strip's count text — also fed to the always-present\n\t\t * `role=\"status\"` live region (WCAG 2.1 SC 4.1.3), so assistive tech\n\t\t * announces selection changes without focus moving.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselectionCountText() {\n\t\t\treturn t('nextcloud-vue', '{count} selected', { count: this.selectedIds.length })\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the injected `cnTranslate` (the host\n\t\t * app's bound `t()`), identity by default.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\teffectiveTranslate() {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate : (key) => key\n\t\t},\n\n\t\t/**\n\t\t * The link the Add button renders as, or null for a plain button.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\taddLink() {\n\t\t\tif (this.addDisabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn resolveItemActionLink({ href: this.addHref, to: this.addTo }, null, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * Header actions paired with the link each renders as (null for a button).\n\t\t *\n\t\t * @return {Array<{entry: object, link: object|null}>}\n\t\t */\n\t\trenderedHeaderActions() {\n\t\t\treturn (this.headerActions || []).map((entry) => ({\n\t\t\t\tentry,\n\t\t\t\tlink: entry.disabled ? null : resolveItemActionLink(entry, null, this.$router),\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Whether there is a non-empty total for the \"Showing X of Y\" counter.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\thasTotal() {\n\t\t\treturn Boolean(this.pagination && this.pagination.total > 0)\n\t\t},\n\n\t\tcountText() {\n\t\t\tif (!this.pagination) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Showing {count} of {total}', { count: this.objectCount, total: this.pagination.total })\n\t\t},\n\n\t\t/**\n\t\t * The view-toggle segments (label + icon) derived from `availableViewModes`,\n\t\t * with a back-compat bridge that appends the map segment when the beta-era\n\t\t * `showMap` prop is set. `icon` is a CnIcon name (empty → the built-in\n\t\t * `fallback` component).\n\t\t */\n\t\tviewSegments() {\n\t\t\tconst defs = {\n\t\t\t\tcards: { label: this.cardsLabel || t('nextcloud-vue', 'Cards'), icon: this.cardsIcon, fallback: ViewGridOutline },\n\t\t\t\ttable: { label: this.tableLabel || t('nextcloud-vue', 'Table'), icon: this.tableIcon, fallback: FormatListBulletedSquare },\n\t\t\t\tlist: { label: this.listLabel || t('nextcloud-vue', 'List'), icon: this.listIcon, fallback: ViewListOutline },\n\t\t\t\tmap: { label: this.mapLabel || t('nextcloud-vue', 'Map'), icon: this.mapIcon, fallback: MapMarkerOutline },\n\t\t\t\tcalendar: { label: t('nextcloud-vue', 'Calendar'), icon: '', fallback: CalendarMonthOutline },\n\t\t\t}\n\t\t\tconst modes = [...this.availableViewModes]\n\t\t\tif (this.showMap && !modes.includes('map')) {\n\t\t\t\tmodes.push('map')\n\t\t\t}\n\t\t\tif (this.isBoardLayout) {\n\t\t\t\t// The board look's fixed order: table, cards, board, map, each\n\t\t\t\t// only when the page offers it. A mode the board switch does not\n\t\t\t\t// name (list, calendar) follows, so it is never lost.\n\t\t\t\tdefs.board = { label: t('nextcloud-vue', 'Board'), icon: '', fallback: ViewColumnOutline }\n\t\t\t\t// The board's list icon: plain bullets, not the boxed ones.\n\t\t\t\tdefs.table.boardFallback = FormatListBulleted\n\t\t\t\t// A mode that opens another page: a link, unless the page offers it in place.\n\t\t\t\tconst links = this.viewModeLinks && typeof this.viewModeLinks === 'object' ? this.viewModeLinks : {}\n\t\t\t\tconst linked = Object.keys(links).filter((mode) => !modes.includes(mode) && links[mode] && typeof links[mode].href === 'string' && links[mode].href !== '')\n\t\t\t\tconst disabled = (this.disabledViewModes || []).filter((mode) => !modes.includes(mode) && !linked.includes(mode))\n\t\t\t\tconst all = [...modes, ...linked, ...disabled]\n\t\t\t\tconst fixed = ['table', 'cards', 'board', 'map']\n\t\t\t\tconst rest = all.filter((mode) => !fixed.includes(mode))\n\t\t\t\treturn [...fixed.filter((mode) => all.includes(mode)), ...rest]\n\t\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t\t.map((mode) => ({ mode, ...defs[mode], disabled: disabled.includes(mode), link: linked.includes(mode) ? links[mode] : null }))\n\t\t\t}\n\t\t\treturn modes\n\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t},\n\n\t\t/** The full sort option object matching `sortValue` (for NcSelect). */\n\t\tselectedSortOption() {\n\t\t\treturn this.sortOptions.find((o) => o.value === this.sortValue) || null\n\t\t},\n\n\t\t/** Sliding-thumb width + offset, driven by the active segment index. */\n\t\tthumbStyle() {\n\t\t\tconst count = this.viewSegments.length || 1\n\t\t\tconst activeIndex = Math.max(0, this.viewSegments.findIndex((s) => s.mode === this.viewMode))\n\t\t\treturn {\n\t\t\t\twidth: `calc((100% - 8px) / ${count})`,\n\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t}\n\t\t},\n\n\t\thasMassActions() {\n\t\t\treturn this.showMassImport || this.showMassExport || this.showMassCopy || this.showMassDelete\n\t\t},\n\n\t\t/**\n\t\t * Count meaningful VNodes in the `#action-items` slot (excludes whitespace\n\t\t * text nodes and comments). Used to decide whether the mass-actions\n\t\t * separator would be orphaned by `inlineActionCount`.\n\t\t */\n\t\tactionItemsCount() {\n\t\t\tconst slot = this.$slots['action-items']\n\t\t\tif (!slot) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst vnodes = slot() || []\n\t\t\treturn vnodes.filter((n) => n && (n.tag !== undefined || n.componentOptions !== undefined)).length\n\t\t},\n\n\t\t/**\n\t\t * The separator is meaningful only when at least one pre-separator action\n\t\t * button (Refresh + #action-items) still ends up inside the overflow\n\t\t * dropdown after NcActions hoists the first `inlineActionCount` buttons\n\t\t * inline. Pre-separator items: 1 (Refresh) + actionItemsCount.\n\t\t */\n\t\tshowActionsSeparator() {\n\t\t\tif (!this.hasMassActions) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!this.$slots['action-items']) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst preSeparatorOverflow = 1 + this.actionItemsCount - this.inlineActionCount\n\t\t\treturn preSeparatorOverflow > 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * A click on a segment that opens another page: a plain click goes\n\t\t * through the router when the link names a route; a modified click\n\t\t * (new tab) and a link without a route are left to the browser.\n\t\t *\n\t\t * @param {MouseEvent} event The click.\n\t\t * @param {{link: {href: string, to?: (object|string)}}} seg The segment.\n\t\t */\n\t\tonViewLinkClick(event, seg) {\n\t\t\tconst to = seg.link && seg.link.to\n\t\t\tif (!to || !this.$router || typeof this.$router.push !== 'function' || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button > 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.$router.push(to)\n\t\t},\n\n\t\t/**\n\t\t * The tooltip of a segment the page cannot open.\n\t\t *\n\t\t * @param {string} label The segment's name.\n\t\t * @return {string} \"Map: not available on this list\".\n\t\t */\n\t\tunavailableViewLabel(label) {\n\t\t\treturn t('nextcloud-vue', '{view}: not available on this list', { view: label })\n\t\t},\n\n\t\t/**\n\t\t * The accessible name of a filter chip's remove button.\n\t\t *\n\t\t * @param {{label: string}} chip The chip.\n\t\t * @return {string}\n\t\t */\n\t\tremoveFilterLabel(chip) {\n\t\t\treturn t('nextcloud-vue', 'Remove filter: {label}', { label: chip.label })\n\t\t},\n\n\t\t/**\n\t\t * The `lang` of a bulk action label that fell back to its written text in another language.\n\t\t *\n\t\t * @param {object} entry The bulk action.\n\t\t * @return {string|undefined} The source language, or undefined.\n\t\t */\n\t\tbulkLang(entry) {\n\t\t\treturn labelLang(this.cnTranslate, entry.label) || undefined\n\t\t},\n\n\t\tt,\n\t\t/**\n\t\t * Forward the inline search field's input to the host.\n\t\t *\n\t\t * @param {Event} event The native input event.\n\t\t * @return {void}\n\t\t */\n\t\tonSearchInput(event) {\n\t\t\t/**\n\t\t\t * @event search Emitted when the user types in the inline search field.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('search', event.target.value)\n\t\t},\n\n\t\t/**\n\t\t * Forward the standalone sort dropdown's selection to the host.\n\t\t *\n\t\t * @param {string} value The chosen option's `value`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortChange(value) {\n\t\t\t/**\n\t\t\t * @event sort-change Emitted when the user picks an option from the standalone sort dropdown.\n\t\t\t * @type {string} The chosen option's `value`.\n\t\t\t */\n\t\t\tthis.$emit('sort-change', value)\n\t\t},\n\n\t\t/**\n\t\t * Add button click: a plain click on an in-app link routes in place,\n\t\t * anything else on a link is the browser's. Emits `add`, except for a\n\t\t * modified click on a link, which opens in a new tab: a host `@add`\n\t\t * would otherwise run in the tab the user is leaving.\n\t\t *\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonAddClick(event) {\n\t\t\tif (this.addLink) {\n\t\t\t\tif (isModifiedClick(event)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfollowItemActionLink(event, this.addLink, this.$router)\n\t\t\t}\n\t\t\tthis.$emit('add')\n\t\t},\n\n\t\t/**\n\t\t * A header link entry was clicked: route a plain in-app click and emit\n\t\t * `header-action` as the button would. A modified click is the\n\t\t * browser's alone (a new tab), so nothing is emitted for it.\n\t\t *\n\t\t * @param {object} entry The header action.\n\t\t * @param {object} link The resolved link.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonHeaderLinkClick(entry, link, event) {\n\t\t\tif (isModifiedClick(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowItemActionLink(event, link, this.$router)\n\t\t\tthis.$emit('header-action', { action: entry.id, id: entry.id })\n\t\t},\n\n\t\t/**\n\t\t * Heuristic: a \"plain\" name like `History` is an MDI Vue\n\t\t * component name (rendered via `CnIcon`). A name like\n\t\t * `icon-history` or any string starting with `icon-` is a\n\t\t * Nextcloud core CSS icon class (rendered as a `<span>`).\n\t\t *\n\t\t * @param {string} name Icon string from a headerActions entry.\n\t\t * @return {boolean} `true` when `name` should be passed to\n\t\t * `CnIcon` as `:name`; `false` for CSS-class icons or empty.\n\t\t */\n\t\tisMdiIconName(name) {\n\t\t\tif (!name || typeof name !== 'string') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (name.startsWith('icon-')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\n\t\t/**\n\t\t * Emit declarations — invoked via the template `$emit(...)` sites.\n\t\t * Listed here so vue-docgen-api picks up the events for the\n\t\t * generated docs.\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_emitDocs() {\n\t\t\t/**\n\t\t\t * @event view-mode-change User clicked one of the view-mode toggle buttons (Cards / Table). Payload is the selected mode string.\n\t\t\t * @type {'cards' | 'table'}\n\t\t\t */\n\t\t\tthis.$emit('view-mode-change')\n\t\t\t/**\n\t\t\t * @event add User clicked the primary Add button. No payload.\n\t\t\t */\n\t\t\tthis.$emit('add')\n\t\t\t/**\n\t\t\t * @event refresh User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t */\n\t\t\tthis.$emit('refresh')\n\t\t\t/**\n\t\t\t * @event show-import User clicked the Import mass action. Host should open the import modal.\n\t\t\t */\n\t\t\tthis.$emit('show-import')\n\t\t\t/**\n\t\t\t * @event show-export User clicked the Export mass action. Host should open the export modal.\n\t\t\t */\n\t\t\tthis.$emit('show-export')\n\t\t\t/**\n\t\t\t * @event show-copy User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-copy')\n\t\t\t/**\n\t\t\t * @event show-delete User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-delete')\n\t\t\t/**\n\t\t\t * @event header-action User clicked a manifest-declared page-level header action. Payload: `{ action: id, id }`.\n\t\t\t */\n\t\t\tthis.$emit('header-action')\n\t\t\t/**\n\t\t\t * @event toggle-sidebar User clicked the Search/Columns sidebar toggle. No payload.\n\t\t\t */\n\t\t\tthis.$emit('toggle-sidebar')\n\t\t\t/**\n\t\t\t * @event clear-selection User clicked the selection strip's Clear control. No payload — the host should empty its selection (CnIndexPage does this and re-emits `select` with an empty array).\n\t\t\t */\n\t\t\tthis.$emit('clear-selection')\n\t\t\t/**\n\t\t\t * @event remove-filter User removed an active filter chip (board look). Payload: the chip `{ key, label }`.\n\t\t\t */\n\t\t\tthis.$emit('remove-filter')\n\t\t\t/**\n\t\t\t * @event clear-filters User clicked \"Clear all\" beside the active filter chips (board look). No payload.\n\t\t\t */\n\t\t\tthis.$emit('clear-filters')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/actions-bar.css -->\n"],"names":["CnBuildiqEditButton","CnIcon","BookOpenVariantOutline","Import","t"],"mappings":"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"}