@conduction/nextcloud-vue 2.63.0 → 2.65.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 (111) hide show
  1. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +253 -10
  2. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  3. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +139 -46
  4. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  5. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +87 -0
  6. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  7. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +26 -24
  8. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  9. package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +61 -16
  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/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js +20 -0
  13. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue2.js.map +1 -1
  14. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js +3 -2
  15. package/dist/esm/components/CnAuditTrailWidget/CnAuditTrailWidget.vue3.js.map +1 -1
  16. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js +13 -0
  17. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js +2 -1
  19. package/dist/esm/components/CnBreadcrumbs/CnBreadcrumbs.vue3.js.map +1 -1
  20. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +33 -2
  21. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  22. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  23. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +55 -2
  24. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +153 -133
  26. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +37 -1
  28. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  29. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +12 -4
  30. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  31. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +125 -14
  32. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  33. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +87 -40
  34. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  35. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +101 -7
  36. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
  37. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +22 -5
  38. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
  39. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +30 -0
  40. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  41. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -2
  42. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  43. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +5 -1
  44. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  45. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
  46. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  47. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +63 -2
  48. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  49. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +96 -37
  50. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  51. package/dist/esm/components/CnStagesWidget/stagesModel.js +5 -2
  52. package/dist/esm/components/CnStagesWidget/stagesModel.js.map +1 -1
  53. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +74 -5
  54. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  55. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +15 -8
  56. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  57. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +14 -2
  58. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  59. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +2 -1
  60. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  61. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +73 -1
  62. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
  63. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +14 -2
  64. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
  65. package/dist/esm/l10n/en.json.js +2 -1
  66. package/dist/esm/l10n/en.json.js.map +1 -1
  67. package/dist/esm/l10n/nl.json.js +2 -1
  68. package/dist/esm/l10n/nl.json.js.map +1 -1
  69. package/dist/esm/nextcloud-vue.css +495 -81
  70. package/dist/esm/store/useObjectStore.js +118 -33
  71. package/dist/esm/store/useObjectStore.js.map +1 -1
  72. package/dist/esm/utils/actionsDispatcher.js +14 -0
  73. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  74. package/dist/esm/utils/schemaRefSlug.js +19 -3
  75. package/dist/esm/utils/schemaRefSlug.js.map +1 -1
  76. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  77. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  78. package/dist/nextcloud-vue.cjs.js +7388 -6021
  79. package/dist/nextcloud-vue.cjs.js.map +2 -2
  80. package/dist/nextcloud-vue.css +495 -81
  81. package/l10n/en.json +2 -0
  82. package/l10n/nl.json +2 -0
  83. package/package.json +1 -1
  84. package/src/components/CnAppNav/CnAppNav.vue +441 -14
  85. package/src/components/CnAppRoot/CnAppRoot.md +4 -0
  86. package/src/components/CnAppRoot/CnAppRoot.vue +94 -1
  87. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +61 -16
  88. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +22 -1
  89. package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +14 -0
  90. package/src/components/CnCellRenderer/CnCellRenderer.vue +33 -2
  91. package/src/components/CnDashboardPage/CnDashboardPage.vue +72 -4
  92. package/src/components/CnDataTable/CnDataTable.vue +45 -1
  93. package/src/components/CnDetailPage/CnDetailPage.md +8 -0
  94. package/src/components/CnDetailPage/CnDetailPage.vue +169 -2
  95. package/src/components/CnHeaderWidget/CnHeaderWidget.vue +147 -9
  96. package/src/components/CnIndexPage/CnIndexPage.vue +32 -2
  97. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +7 -1
  98. package/src/components/CnStagesWidget/CnStagesWidget.vue +189 -2
  99. package/src/components/CnStagesWidget/stagesModel.js +5 -2
  100. package/src/components/CnStatWidget/CnStatWidget.vue +89 -7
  101. package/src/components/CnTabsWidget/CnTabsWidget.vue +15 -2
  102. package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +4 -0
  103. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +107 -1
  104. package/src/css/detail-page.css +32 -4
  105. package/src/css/kpi-card.css +71 -1
  106. package/src/css/table.css +18 -6
  107. package/src/schemas/app-manifest-v2.schema.json +134 -3
  108. package/src/store/useObjectStore.js +118 -33
  109. package/src/utils/actionsDispatcher.js +14 -0
  110. package/src/utils/schemaRefSlug.js +19 -3
  111. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -13,10 +13,10 @@ import InformationOutline from 'vue-material-design-icons/InformationOutline.vue
13
13
  import Pencil from 'vue-material-design-icons/Pencil.vue';
14
14
  import Plus from 'vue-material-design-icons/Plus.vue';
15
15
  import Refresh from 'vue-material-design-icons/Refresh.vue';
16
- import __sfc_main$g from '../../dialogs/CnRelationLinkModal.vue.js';
17
- import __sfc_main$f from '../../dialogs/CnWidgetStyleEditorModal.vue.js';
16
+ import __sfc_main$h from '../../dialogs/CnRelationLinkModal.vue.js';
17
+ import __sfc_main$g from '../../dialogs/CnWidgetStyleEditorModal.vue.js';
18
18
  import __sfc_main$1 from '../CnActionsMenu/CnActionsMenu.vue.js';
19
- import __sfc_main$d from '../CnBodySections/CnBodySections.vue.js';
19
+ import __sfc_main$e from '../CnBodySections/CnBodySections.vue.js';
20
20
  import __sfc_main$2 from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
21
21
  import __sfc_main$7 from '../CnDashboardGrid/CnDashboardGrid.vue.js';
22
22
  import __sfc_main$5 from '../CnDetailWidgetHost/CnDetailWidgetHost.vue.js';
@@ -24,9 +24,9 @@ import __sfc_main$6 from '../CnFormDialog/CnFormDialog.vue.js';
24
24
  import __sfc_main$8 from '../CnLifecycleActions/CnLifecycleActions.vue.js';
25
25
  import __sfc_main$3 from '../CnLockedBanner/CnLockedBanner.vue.js';
26
26
  import __sfc_main$4 from '../CnNextStepCard/CnNextStepCard.vue.js';
27
- import __sfc_main$c from '../CnRelatedCollections/CnRelatedCollections.vue.js';
28
- import __sfc_main$b from '../CnSummaryAggregates/CnSummaryAggregates.vue.js';
29
- import __sfc_main$e from '../CnTranslatedBadge/CnTranslatedBadge.vue.js';
27
+ import __sfc_main$d from '../CnRelatedCollections/CnRelatedCollections.vue.js';
28
+ import __sfc_main$c from '../CnSummaryAggregates/CnSummaryAggregates.vue.js';
29
+ import __sfc_main$f from '../CnTranslatedBadge/CnTranslatedBadge.vue.js';
30
30
  import { useIntegrationRegistry } from '../../composables/useIntegrationRegistry.js';
31
31
  import { useObjectLock } from '../../composables/useObjectLock.js';
32
32
  import { useObjectPresence } from '../../composables/useObjectPresence.js';
@@ -40,8 +40,9 @@ import { cnGridCellStyle, hasGridRow } from '../../utils/grid.js';
40
40
  import { slotRenders } from '../../utils/slotContent.js';
41
41
  import { isDataWidgetDef, isRelatedWidgetDef, isGeoWidgetDef, isContentOnlyWidgetDef, isCardWidgetDef, widgetContentOf, resolveRegistryRenderer, widgetTitleOf } from '../../utils/widgetDispatch.js';
42
42
  import __sfc_main$9 from '../CnActionButtons/CnActionButtons.vue.js';
43
+ import __sfc_main$a from '../CnBreadcrumbs/CnBreadcrumbs.vue.js';
43
44
  import __sfc_main from '../CnIcon/CnIcon.vue.js';
44
- import __sfc_main$a from '../CnStatusBadge/CnStatusBadge.vue.js';
45
+ import __sfc_main$b from '../CnStatusBadge/CnStatusBadge.vue.js';
45
46
  import { getWidgetTypeEntry } from '../CnWidgetGrid/dashboardWidgetRegistry.js';
46
47
  import '../CnWidgetGrid/registerDashboardWidgets.js';
47
48
  import { useObjectStore } from '../../store/useObjectStore.js';
@@ -187,13 +188,14 @@ var script = {
187
188
  CnDashboardGrid: __sfc_main$7,
188
189
  CnLifecycleActions: __sfc_main$8,
189
190
  CnActionButtons: __sfc_main$9,
190
- CnStatusBadge: __sfc_main$a,
191
- CnSummaryAggregates: __sfc_main$b,
192
- CnRelatedCollections: __sfc_main$c,
193
- CnBodySections: __sfc_main$d,
194
- CnTranslatedBadge: __sfc_main$e,
195
- CnWidgetStyleEditorModal: __sfc_main$f,
196
- CnRelationLinkModal: __sfc_main$g,
191
+ CnBreadcrumbs: __sfc_main$a,
192
+ CnStatusBadge: __sfc_main$b,
193
+ CnSummaryAggregates: __sfc_main$c,
194
+ CnRelatedCollections: __sfc_main$d,
195
+ CnBodySections: __sfc_main$e,
196
+ CnTranslatedBadge: __sfc_main$f,
197
+ CnWidgetStyleEditorModal: __sfc_main$g,
198
+ CnRelationLinkModal: __sfc_main$h,
197
199
  Cog,
198
200
  Plus,
199
201
  Pencil,
@@ -1093,6 +1095,37 @@ var script = {
1093
1095
  default: null,
1094
1096
  },
1095
1097
 
1098
+ /**
1099
+ * Whether the type eyebrow (the type label above the record name)
1100
+ * renders once the record resolves. `false` (manifest
1101
+ * `config.showTypeEyebrow: false`) drops it for a header that says
1102
+ * the type in a pill instead.
1103
+ *
1104
+ * @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-a-detail-page-drops-its-eyebrow-and-shows-a-breadcrumb
1105
+ */
1106
+ showTypeEyebrow: {
1107
+ type: Boolean,
1108
+ default: true,
1109
+ },
1110
+
1111
+ /**
1112
+ * A breadcrumb line above the header (manifest `config.breadcrumb`):
1113
+ * `{ label, route?, params?, href? }` names the list the record
1114
+ * belongs to; the record's display name follows as the current
1115
+ * crumb. `label` goes through the host translate function and shows
1116
+ * as text; `icon` (an MDI name, e.g. `Home`) draws that icon instead,
1117
+ * with the label as its accessible name. Null (the default) draws no
1118
+ * trail.
1119
+ *
1120
+ * @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-a-detail-page-drops-its-eyebrow-and-shows-a-breadcrumb
1121
+ * @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-declared-breadcrumb-label-shows-as-text
1122
+ * @type {{label: string, route?: string, params?: object, href?: string, icon?: string}|null}
1123
+ */
1124
+ breadcrumb: {
1125
+ type: Object,
1126
+ default: null,
1127
+ },
1128
+
1096
1129
  /**
1097
1130
  * A column of cards beside the body (manifest `config.sideColumn`),
1098
1131
  * for the record's facts: deadline, requester, handler, links. Each
@@ -1108,6 +1141,33 @@ var script = {
1108
1141
  default: () => [],
1109
1142
  },
1110
1143
 
1144
+ /**
1145
+ * Draw the header as a card (manifest `config.headerCard: true`): the
1146
+ * pills, the title and the actions on the page's surface colour inside
1147
+ * a bordered, rounded box, as the board's case header. Off by default,
1148
+ * which keeps the header on the page ground.
1149
+ *
1150
+ * @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-detail-header-can-be-a-card-that-holds-a-widget
1151
+ */
1152
+ headerCard: {
1153
+ type: Boolean,
1154
+ default: false,
1155
+ },
1156
+
1157
+ /**
1158
+ * The id of a widget declared in `widgets` to render inside the header,
1159
+ * on its own row under the title and the actions (manifest
1160
+ * `config.headerWidget`), e.g. the stages bars. It renders without a
1161
+ * card of its own and leaves the body grid. Empty (the default), or an
1162
+ * id that names no widget, renders nothing extra.
1163
+ *
1164
+ * @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-detail-header-can-be-a-card-that-holds-a-widget
1165
+ */
1166
+ headerWidget: {
1167
+ type: String,
1168
+ default: '',
1169
+ },
1170
+
1111
1171
  /**
1112
1172
  * Whether the current user administers this instance. Shows the
1113
1173
  * `adminOnly` header actions. `null` (the default) reads it from
@@ -1647,6 +1707,21 @@ var script = {
1647
1707
  .filter(Boolean)
1648
1708
  },
1649
1709
 
1710
+ /**
1711
+ * The widget the header holds (`headerWidget`): the definition in
1712
+ * `widgets` with that id, or null without the key or a match.
1713
+ *
1714
+ * @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-detail-header-can-be-a-card-that-holds-a-widget
1715
+ * @return {object|null} The widget definition, or null.
1716
+ */
1717
+ headerWidgetDef() {
1718
+ if (!this.headerWidget) {
1719
+ return null
1720
+ }
1721
+ const declared = Array.isArray(this.widgets) ? this.widgets : [];
1722
+ return declared.find((widget) => widget && widget.id === this.headerWidget) || null
1723
+ },
1724
+
1650
1725
  /**
1651
1726
  * The side column's widget definitions. A string names a widget
1652
1727
  * declared in `widgets`; an object is a definition of its own.
@@ -2216,6 +2291,33 @@ var script = {
2216
2291
  return this.objectDisplayName || this.resolvedTitle
2217
2292
  },
2218
2293
 
2294
+ /**
2295
+ * The breadcrumb trail: the declared crumb (a router target from
2296
+ * `route` + `params`, or an `href`), then the record's display name
2297
+ * as the current crumb. Empty without a `breadcrumb` label. The first
2298
+ * crumb carries `icon` only when the manifest declares one.
2299
+ *
2300
+ * @spec openspec/changes/zuiddrecht-pixel-gaps/specs/zuiddrecht-pixel-gaps/spec.md#requirement-a-detail-page-drops-its-eyebrow-and-shows-a-breadcrumb
2301
+ * @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-declared-breadcrumb-label-shows-as-text
2302
+ * @return {Array<{label: string, to?: object, href?: string, icon?: string}>}
2303
+ */
2304
+ breadcrumbCrumbs() {
2305
+ const crumb = this.breadcrumb;
2306
+ if (!crumb || typeof crumb.label !== 'string' || crumb.label === '') {
2307
+ return []
2308
+ }
2309
+ const first = { label: this.effectiveTranslate(crumb.label) };
2310
+ if (typeof crumb.icon === 'string' && crumb.icon !== '') {
2311
+ first.icon = crumb.icon;
2312
+ }
2313
+ if (crumb.route) {
2314
+ first.to = { name: crumb.route, ...(crumb.params ? { params: crumb.params } : {}) };
2315
+ } else if (crumb.href) {
2316
+ first.href = crumb.href;
2317
+ }
2318
+ return [first, { label: this.displayTitle }]
2319
+ },
2320
+
2219
2321
  /**
2220
2322
  * Effective translate function: the injected `cnTranslate` (the host
2221
2323
  * app's bound `t()`), identity by default.
@@ -3667,6 +3769,10 @@ var script = {
3667
3769
  * it — CnPageRenderer's split pane forwards no slots, which is exactly
3668
3770
  * that fault and wants fixing, not concealing.
3669
3771
  *
3772
+ * The widget the header holds (`headerWidget`) draws nothing here
3773
+ * either: it is already drawn in the header.
3774
+ *
3775
+ * @spec openspec/changes/zuiddrecht-pixel-gaps-2/specs/zuiddrecht-pixel-gaps-2/spec.md#requirement-a-detail-header-can-be-a-card-that-holds-a-widget
3670
3776
  * @param {object} item A layout item.
3671
3777
  * @return {boolean} False only when the item provably draws nothing.
3672
3778
  */
@@ -3677,6 +3783,11 @@ var script = {
3677
3783
  if (this.editingBody) {
3678
3784
  return true
3679
3785
  }
3786
+ // The widget the header holds (`headerWidget`) is drawn there, so
3787
+ // its grid cell would be the same widget twice.
3788
+ if (this.headerWidgetDef !== null && item.widgetId === this.headerWidgetDef.id) {
3789
+ return false
3790
+ }
3680
3791
  const widget = this.findWidget(item);
3681
3792
  if (!widget) {
3682
3793
  return true