@conduction/nextcloud-vue 2.82.0 → 2.84.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 (178) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +2 -2
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
  4. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +24 -0
  5. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  6. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +9 -4
  7. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  8. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
  9. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +1 -1
  10. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
  11. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
  12. package/dist/esm/components/CnBodySections/CnBodySections.vue.js +1 -1
  13. package/dist/esm/components/CnBodySections/CnBodySections.vue2.js +22 -1
  14. package/dist/esm/components/CnBodySections/CnBodySections.vue2.js.map +1 -1
  15. package/dist/esm/components/CnBodySections/CnBodySections.vue3.js.map +1 -1
  16. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue.js +1 -1
  17. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js +47 -4
  18. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js.map +1 -1
  19. package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue3.js.map +1 -1
  20. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue.js +1 -1
  21. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +125 -3
  22. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
  23. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js +3 -3
  24. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
  25. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  26. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +14 -0
  27. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  28. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  29. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue.js +1 -1
  30. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js +1 -1
  31. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue2.js.map +1 -1
  32. package/dist/esm/components/CnDeltaWidget/CnDeltaWidget.vue3.js.map +1 -1
  33. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +203 -4
  34. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  35. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  36. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +1 -1
  37. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +38 -1
  38. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  39. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +45 -5
  40. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  41. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue.js +1 -1
  42. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js +1 -1
  43. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue2.js.map +1 -1
  44. package/dist/esm/components/CnGaugeWidget/CnGaugeWidget.vue3.js.map +1 -1
  45. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +96 -12
  46. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  47. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +95 -50
  48. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  49. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js +29 -6
  50. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  51. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  52. package/dist/esm/components/CnMassActionBar/CnMassActionBar.vue2.js +2 -2
  53. package/dist/esm/components/CnMassActionBar/CnMassActionBar.vue2.js.map +1 -1
  54. package/dist/esm/components/CnMassImportDialog/CnMassImportDialog.vue2.js +2 -2
  55. package/dist/esm/components/CnMassImportDialog/CnMassImportDialog.vue2.js.map +1 -1
  56. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
  57. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +31 -2
  58. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  59. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  60. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js +1 -1
  61. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js +16 -2
  62. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js +3 -3
  64. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js.map +1 -1
  65. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  66. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +37 -2
  67. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  68. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  69. package/dist/esm/components/CnReportsPage/CnReportsPage.vue.js +1 -1
  70. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js +176 -0
  71. package/dist/esm/components/CnReportsPage/CnReportsPage.vue2.js.map +1 -1
  72. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js +181 -52
  73. package/dist/esm/components/CnReportsPage/CnReportsPage.vue3.js.map +1 -1
  74. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js +1 -1
  75. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js +70 -5
  76. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js.map +1 -1
  77. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js +61 -35
  78. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js.map +1 -1
  79. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue.js +1 -1
  80. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +72 -5
  81. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  82. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +33 -8
  83. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  84. package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
  85. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +4 -2
  86. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  87. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  88. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue.js +1 -1
  89. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +72 -5
  90. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
  91. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +88 -71
  92. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
  93. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js +1 -1
  94. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js +18 -4
  95. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js.map +1 -1
  96. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js.map +1 -1
  97. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  98. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +33 -3
  99. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  100. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  101. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue.js +1 -1
  102. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js +16 -0
  103. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue2.js.map +1 -1
  104. package/dist/esm/components/CnWalkthrough/CnWalkthrough.vue3.js.map +1 -1
  105. package/dist/esm/dialogs/CnTransitionInputDialog.vue.js +1 -1
  106. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js +68 -6
  107. package/dist/esm/dialogs/CnTransitionInputDialog.vue2.js.map +1 -1
  108. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js +133 -105
  109. package/dist/esm/dialogs/CnTransitionInputDialog.vue3.js.map +1 -1
  110. package/dist/esm/l10n/en.json.js +16 -1
  111. package/dist/esm/l10n/en.json.js.map +1 -1
  112. package/dist/esm/l10n/nl.json.js +41 -4
  113. package/dist/esm/l10n/nl.json.js.map +1 -1
  114. package/dist/esm/library-style.js +1 -1
  115. package/dist/esm/nextcloud-vue.css +900 -537
  116. package/dist/esm/utils/buildManifest.js +37 -3
  117. package/dist/esm/utils/buildManifest.js.map +1 -1
  118. package/dist/esm/utils/detailWidgetVisibility.js +149 -0
  119. package/dist/esm/utils/detailWidgetVisibility.js.map +1 -0
  120. package/dist/esm/utils/fetchAggregate.js +25 -2
  121. package/dist/esm/utils/fetchAggregate.js.map +1 -1
  122. package/dist/esm/utils/formatMetric.js +39 -3
  123. package/dist/esm/utils/formatMetric.js.map +1 -1
  124. package/dist/esm/utils/resolveManifestTokens.js +1 -0
  125. package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
  126. package/dist/esm/utils/sentinelTokens.js +9 -0
  127. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  128. package/dist/esm/utils/switchValues.js +62 -0
  129. package/dist/esm/utils/switchValues.js.map +1 -0
  130. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  131. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  132. package/dist/nextcloud-vue.cjs.js +36711 -34909
  133. package/dist/nextcloud-vue.cjs.js.map +2 -2
  134. package/dist/nextcloud-vue.css +900 -537
  135. package/l10n/en.json +16 -1
  136. package/l10n/nl.json +41 -4
  137. package/package.json +1 -1
  138. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +31 -2
  139. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +1 -1
  140. package/src/components/CnBodySections/CnBodySections.vue +22 -1
  141. package/src/components/CnCountdownWidget/CnCountdownWidget.vue +47 -4
  142. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +128 -6
  143. package/src/components/CnDashboardPage/CnDashboardPage.vue +14 -0
  144. package/src/components/CnDeltaWidget/CnDeltaWidget.vue +1 -1
  145. package/src/components/CnDetailPage/CnDetailPage.md +2 -0
  146. package/src/components/CnDetailPage/CnDetailPage.vue +203 -4
  147. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +63 -1
  148. package/src/components/CnGaugeWidget/CnGaugeWidget.vue +1 -1
  149. package/src/components/CnIndexPage/CnIndexPage.vue +125 -15
  150. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +29 -6
  151. package/src/components/CnObjectDataWidget/CnObjectDataWidget.md +1 -1
  152. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +31 -2
  153. package/src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue +54 -3
  154. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +37 -2
  155. package/src/components/CnReportsPage/CnReportsPage.vue +263 -5
  156. package/src/components/CnSettingsFormWidget/CnSettingsFormWidget.vue +110 -18
  157. package/src/components/CnStagesWidget/CnStagesWidget.vue +103 -6
  158. package/src/components/CnStatWidget/CnStatWidget.vue +4 -2
  159. package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +125 -7
  160. package/src/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue +18 -4
  161. package/src/components/CnTabsWidget/CnTabsWidget.vue +33 -3
  162. package/src/components/CnWalkthrough/CnWalkthrough.vue +16 -0
  163. package/src/css/form-field.css +14 -0
  164. package/src/css/form-widget.css +11 -0
  165. package/src/css/index-page.css +11 -0
  166. package/src/css/index.css +1 -0
  167. package/src/css/look-board-reports.css +175 -0
  168. package/src/css/look-board.css +44 -1
  169. package/src/dialogs/CnTransitionInputDialog.vue +87 -7
  170. package/src/schemas/app-manifest-v2.schema.json +24 -3
  171. package/src/utils/buildManifest.js +36 -2
  172. package/src/utils/detailWidgetVisibility.js +145 -0
  173. package/src/utils/fetchAggregate.js +24 -1
  174. package/src/utils/formatMetric.js +38 -2
  175. package/src/utils/resolveManifestTokens.js +1 -0
  176. package/src/utils/sentinelTokens.js +9 -0
  177. package/src/utils/switchValues.js +59 -0
  178. package/src/utils/validateManifestV2.compiled.js +3 -3
@@ -1,6 +1,6 @@
1
1
  import { getCurrentUser } from '@nextcloud/auth';
2
2
  import { translate } from '@nextcloud/l10n';
3
- import { NcLoadingIcon, NcActions, NcActionLink, NcActionButton, NcActionCaption, NcActionCheckbox, NcButton, NcCheckboxRadioSwitch } from '@nextcloud/vue';
3
+ import { NcLoadingIcon, NcActions, NcActionLink, NcActionButton, NcActionCaption, NcActionSeparator, NcActionCheckbox, NcButton, NcCheckboxRadioSwitch } from '@nextcloud/vue';
4
4
  import { ref, getCurrentInstance, markRaw, inject } from 'vue';
5
5
  import AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue';
6
6
  import Close from 'vue-material-design-icons/Close.vue';
@@ -10,6 +10,8 @@ import DotsHorizontal from 'vue-material-design-icons/DotsHorizontal.vue';
10
10
  import Export from 'vue-material-design-icons/Export.vue';
11
11
  import Eye from 'vue-material-design-icons/Eye.vue';
12
12
  import FilterOutline from 'vue-material-design-icons/FilterOutline.vue';
13
+ import ImportIcon from 'vue-material-design-icons/Import.vue';
14
+ import TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue';
13
15
  import Tune from 'vue-material-design-icons/Tune.vue';
14
16
  import ViewColumnOutline from 'vue-material-design-icons/ViewColumnOutline.vue';
15
17
  import __sfc_main$w from '../../dialogs/CnConfirmDialog.vue.js';
@@ -24,13 +26,13 @@ import { createRefLabelResolver } from '../../composables/useRefLabels.js';
24
26
  import { useSavedViewsApi } from '../../composables/useSavedViewsApi.js';
25
27
  import { METADATA_COLUMNS } from '../../constants/metadata.js';
26
28
  import { useObjectStore } from '../../store/useObjectStore.js';
27
- import { routeHref } from '../../utils/actionLink.js';
29
+ import { routeHref, followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js';
28
30
  import { resolveRegisteredHandler, buildOnSuccessRoute } from '../../utils/actionsDispatcher.js';
29
31
  import { reportBindingProblems } from '../../utils/diagnostics.js';
30
32
  import { fetchFilterCounts } from '../../utils/fetchFilterCounts.js';
31
33
  import { buildExportUrl } from '../../utils/indexExportHelpers.js';
32
34
  import { lensUnavailableText } from '../../utils/lensAvailability.js';
33
- import { openRowTarget } from '../../utils/linkNavigation.js';
35
+ import { isModifiedClick, openRowTarget } from '../../utils/linkNavigation.js';
34
36
  import { resolveClaimedTeams, splitViewsIntoTabs, viewAsTab, resolveClaimTokens, viewIdOf } from '../../utils/listLenses.js';
35
37
  import { LIST_SHORTCUTS, listPaletteCommands, shortcutFor } from '../../utils/listShortcuts.js';
36
38
  import { multiKeySort } from '../../utils/multiKeySort.js';
@@ -327,6 +329,7 @@ var script = {
327
329
  NcActionLink,
328
330
  NcActionButton,
329
331
  NcActionCaption,
332
+ NcActionSeparator,
330
333
  NcActionCheckbox,
331
334
  NcButton,
332
335
  AlertCircleOutline,
@@ -606,9 +609,11 @@ var script = {
606
609
  * actions, or what its `items` name (`header-actions`, a header action
607
610
  * id, `import`, `export`, `refresh`, `copy-selected`, `delete-selected`,
608
611
  * `documentation`), so the entries the bar's menu loses have a place.
612
+ * `items` can group them: `{ heading }` draws a group heading (an i18n
613
+ * key) and `separator` a rule, each only when an entry follows.
609
614
  *
610
615
  * @spec openspec/changes/zuiddrecht-pixel-gaps-3/specs/zuiddrecht-pixel-gaps-3/spec.md#requirement-an-index-page-can-take-the-board-header
611
- * @type {Array<{label?: string, action: string, variant?: ('primary'|'secondary'), icon?: string, format?: ('csv'|'excel'), id?: string, items?: string[]}>}
616
+ * @type {Array<{label?: string, action: string, variant?: ('primary'|'secondary'), icon?: string, format?: ('csv'|'excel'), id?: string, items?: Array<(string|{heading: string})>}>}
612
617
  */
613
618
  headerButtons: {
614
619
  type: Array,
@@ -4535,7 +4540,10 @@ var script = {
4535
4540
  variant: button.variant === 'primary' ? 'primary' : 'secondary',
4536
4541
  icon,
4537
4542
  format: button.format === 'excel' ? 'excel' : 'csv',
4538
- items: Array.isArray(button.items) ? button.items.filter((item) => typeof item === 'string' && item !== '') : null,
4543
+ items: Array.isArray(button.items)
4544
+ ? button.items.filter((item) => (typeof item === 'string' && item !== '')
4545
+ || (item && typeof item === 'object' && typeof item.heading === 'string' && item.heading !== ''))
4546
+ : null,
4539
4547
  }
4540
4548
  })
4541
4549
  .filter((button) => button.label !== '')
@@ -5830,11 +5838,14 @@ var script = {
5830
5838
  * `import`, `export`, `refresh`, `copy-selected`, `delete-selected`
5831
5839
  * (disabled until a row is selected) and `documentation` (a link to
5832
5840
  * `documentationUrl`, left out when the page has none). An unknown name
5833
- * is left out.
5841
+ * is left out. `{ heading }` and `separator` group the entries: an
5842
+ * entry of `kind` `heading` or `separator`, drawn only when an entry
5843
+ * follows it.
5834
5844
  *
5835
5845
  * @spec openspec/changes/screens-index-header-actions-menu/specs/index-header/spec.md#requirement-the-header-actions-menu-lists-what-its-items-name
5836
- * @param {{items?: string[]|null, format?: string}} button The resolved header button.
5837
- * @return {Array<{key: string, label: string, icon: string, href?: string, disabled?: boolean, title?: string, run?: Function}>}
5846
+ * @spec openspec/changes/screens-index-header-menu-headings/specs/index-header/spec.md#requirement-the-header-actions-menu-can-draw-group-headings-and-separators
5847
+ * @param {{items?: Array<(string|{heading: string})>|null, format?: string}} button The resolved header button.
5848
+ * @return {Array<{key: string, label: string, kind?: ('heading'|'separator'), icon?: string, href?: string, disabled?: boolean, title?: string, iconComponent?: object, run?: Function}>}
5838
5849
  */
5839
5850
  headerMenuEntries(button) {
5840
5851
  const fromAction = (entry) => ({
@@ -5842,14 +5853,18 @@ var script = {
5842
5853
  label: entry.label ? this.cnTranslate(entry.label) : '',
5843
5854
  icon: entry.icon && typeof entry.icon === 'string' && !entry.icon.startsWith('icon-') ? entry.icon : '',
5844
5855
  href: typeof entry.href === 'string' && entry.href !== '' ? entry.href : '',
5856
+ // A `handler: "navigate"` entry whose route resolves carries `to`
5857
+ // (resolveHeaderHandler drops its handler): the menu draws it as
5858
+ // an in-app link, as the actions bar does, so it navigates.
5859
+ link: !entry.href && entry.to && !entry.disabled ? resolveItemActionLink({ to: entry.to }, null, this.$router) : null,
5845
5860
  disabled: Boolean(entry.disabled),
5846
5861
  run: () => this.onHeaderAction({ action: entry.id, id: entry.id }),
5847
5862
  });
5848
5863
  const names = button && Array.isArray(button.items) ? button.items : ['header-actions'];
5849
5864
  const noSelection = this.internalSelectedIds.length < 1;
5850
5865
  const builtIns = {
5851
- import: () => ({ key: 'import', label: translate('nextcloud-vue', 'Import'), icon: 'Import', run: () => { this.showImportDialog = true; } }),
5852
- export: () => ({ key: 'export', label: translate('nextcloud-vue', 'Export'), icon: 'Export', run: () => this.onHeaderButton({ action: 'export', format: button.format }) }),
5866
+ import: () => ({ key: 'import', label: translate('nextcloud-vue', 'Import'), icon: 'Import', iconComponent: ImportIcon, run: () => { this.showImportDialog = true; } }),
5867
+ export: () => ({ key: 'export', label: translate('nextcloud-vue', 'Export'), icon: 'Export', iconComponent: Export, run: () => this.onHeaderButton({ action: 'export', format: button.format }) }),
5853
5868
  refresh: () => ({ key: 'refresh', label: translate('nextcloud-vue', 'Refresh'), icon: 'Refresh', run: () => this.onRefreshEvent() }),
5854
5869
  'copy-selected': () => ({
5855
5870
  key: 'copy-selected',
@@ -5864,6 +5879,7 @@ var script = {
5864
5879
  key: 'delete-selected',
5865
5880
  label: translate('nextcloud-vue', 'Delete selected'),
5866
5881
  icon: 'TrashCanOutline',
5882
+ iconComponent: TrashCanOutline,
5867
5883
  disabled: noSelection,
5868
5884
  title: noSelection ? translate('nextcloud-vue', 'Select 1 or more items to delete') : '',
5869
5885
  run: () => { this.showMassDeleteDialog = true; },
@@ -5881,8 +5897,17 @@ var script = {
5881
5897
  entries.push(entry);
5882
5898
  }
5883
5899
  };
5900
+ // A group heading (`{ heading }`) or a `separator` is kept as a mark
5901
+ // and only drawn when an entry follows it (see groupMenuEntries).
5902
+ let mark = 0;
5884
5903
  for (const name of names) {
5885
- if (name === 'header-actions') {
5904
+ if (name && typeof name === 'object') {
5905
+ mark += 1;
5906
+ entries.push({ key: `__heading-${mark}`, kind: 'heading', label: this.cnTranslate(name.heading) });
5907
+ } else if (name === 'separator') {
5908
+ mark += 1;
5909
+ entries.push({ key: `__separator-${mark}`, kind: 'separator', label: '' });
5910
+ } else if (name === 'header-actions') {
5886
5911
  this.mergedHeaderActions.forEach((entry) => push(fromAction(entry)));
5887
5912
  } else if (Object.hasOwn(builtIns, name)) {
5888
5913
  push(builtIns[name]());
@@ -5893,7 +5918,66 @@ var script = {
5893
5918
  }
5894
5919
  }
5895
5920
  }
5896
- return entries
5921
+ return this.groupMenuEntries(entries)
5922
+ },
5923
+
5924
+ /**
5925
+ * Tidy the marks of the header's Actions menu: a heading or separator
5926
+ * with no entry after it (before the next mark or the end) is dropped,
5927
+ * a separator never opens the menu, two separators in a row are one,
5928
+ * and a heading followed by a separator before any entry is dropped. So a group whose entries are all left out (no documentation
5929
+ * URL, an unknown id) leaves no empty heading or double rule behind,
5930
+ * and a menu of marks only has no entries and is not drawn.
5931
+ *
5932
+ * @spec openspec/changes/screens-index-header-menu-headings/specs/index-header/spec.md#requirement-the-header-actions-menu-can-draw-group-headings-and-separators
5933
+ * @param {Array<{key: string, kind?: string}>} entries The entries with their marks, in order.
5934
+ * @return {Array<{key: string, kind?: string}>} The entries to draw.
5935
+ */
5936
+ groupMenuEntries(entries) {
5937
+ const out = [];
5938
+ let separator = null;
5939
+ let heading = null;
5940
+ for (const entry of entries) {
5941
+ if (entry.kind === 'separator') {
5942
+ // A rule ends the group before it: a heading not yet followed
5943
+ // by an entry is dropped with it.
5944
+ separator = entry;
5945
+ heading = null;
5946
+ continue
5947
+ }
5948
+ if (entry.kind === 'heading') {
5949
+ heading = entry;
5950
+ continue
5951
+ }
5952
+ if (separator && out.length > 0) {
5953
+ out.push(separator);
5954
+ }
5955
+ if (heading) {
5956
+ out.push(heading);
5957
+ }
5958
+ separator = null;
5959
+ heading = null;
5960
+ out.push(entry);
5961
+ }
5962
+ return out
5963
+ },
5964
+
5965
+ /**
5966
+ * An in-app link of the header's Actions menu was clicked: a plain click
5967
+ * goes through the router (a modified click is left to the browser),
5968
+ * and the entry is reported as a header action, as the actions bar does.
5969
+ *
5970
+ * @spec openspec/changes/screens-index-header-actions-menu/specs/index-header/spec.md#requirement-the-header-actions-menu-lists-what-its-items-name
5971
+ * @param {{key: string, link: object}} entry The menu entry.
5972
+ * @param {MouseEvent} event The click.
5973
+ * @return {void}
5974
+ */
5975
+ onHeaderMenuLinkClick(entry, event) {
5976
+ if (isModifiedClick(event)) {
5977
+ return
5978
+ }
5979
+ followItemActionLink(event, entry.link, this.$router);
5980
+ this.$emit('header-action', { action: entry.key, id: entry.key });
5897
5981
  },
5898
5982
 
5899
5983
  /**