@conduction/nextcloud-vue 2.56.0-beta.11 → 2.56.0-beta.13

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 (138) 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 +154 -4
  24. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  25. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +555 -480
  26. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  27. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js +9 -3
  28. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue2.js.map +1 -1
  29. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js +1 -1
  30. package/dist/esm/components/CnDataTable/CnColumnFilterPopover.vue3.js.map +1 -1
  31. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +37 -1
  32. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  33. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +12 -4
  34. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  35. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +187 -19
  36. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  37. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +215 -135
  38. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  39. package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js +3 -1
  40. package/dist/esm/components/CnFkResolveCell/CnFkResolveCell.vue2.js.map +1 -1
  41. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +144 -4
  42. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  43. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  44. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +157 -7
  45. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
  46. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +23 -5
  47. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
  48. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +30 -0
  49. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  50. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +2 -2
  51. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  52. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +5 -1
  53. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  54. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
  55. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  56. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +11 -0
  57. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
  58. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +2 -1
  59. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
  60. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +63 -2
  61. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  62. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js +96 -37
  63. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  64. package/dist/esm/components/CnStagesWidget/stagesModel.js +5 -2
  65. package/dist/esm/components/CnStagesWidget/stagesModel.js.map +1 -1
  66. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +74 -5
  67. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  68. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +15 -8
  69. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  70. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +14 -2
  71. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  72. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +2 -1
  73. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  74. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +73 -1
  75. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
  76. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +14 -2
  77. package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
  78. package/dist/esm/l10n/en.json.js +5 -1
  79. package/dist/esm/l10n/en.json.js.map +1 -1
  80. package/dist/esm/l10n/nl.json.js +5 -1
  81. package/dist/esm/l10n/nl.json.js.map +1 -1
  82. package/dist/esm/mixins/pageViews.js +400 -0
  83. package/dist/esm/mixins/pageViews.js.map +1 -0
  84. package/dist/esm/nextcloud-vue.css +513 -81
  85. package/dist/esm/store/useObjectStore.js +118 -33
  86. package/dist/esm/store/useObjectStore.js.map +1 -1
  87. package/dist/esm/utils/actionsDispatcher.js +25 -2
  88. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  89. package/dist/esm/utils/columnFilters.js +27 -3
  90. package/dist/esm/utils/columnFilters.js.map +1 -1
  91. package/dist/esm/utils/schema.js +40 -2
  92. package/dist/esm/utils/schema.js.map +1 -1
  93. package/dist/esm/utils/schemaRefSlug.js +19 -3
  94. package/dist/esm/utils/schemaRefSlug.js.map +1 -1
  95. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  96. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  97. package/dist/nextcloud-vue.cjs.js +8858 -6566
  98. package/dist/nextcloud-vue.cjs.js.map +2 -2
  99. package/dist/nextcloud-vue.css +513 -81
  100. package/l10n/en.json +5 -0
  101. package/l10n/nl.json +5 -0
  102. package/package.json +1 -1
  103. package/src/components/CnAppNav/CnAppNav.vue +441 -14
  104. package/src/components/CnAppRoot/CnAppRoot.md +4 -0
  105. package/src/components/CnAppRoot/CnAppRoot.vue +94 -1
  106. package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +61 -16
  107. package/src/components/CnAuditTrailWidget/CnAuditTrailWidget.vue +22 -1
  108. package/src/components/CnBreadcrumbs/CnBreadcrumbs.vue +14 -0
  109. package/src/components/CnCellRenderer/CnCellRenderer.vue +33 -2
  110. package/src/components/CnDashboardPage/CnDashboardPage.vue +237 -12
  111. package/src/components/CnDataTable/CnColumnFilterPopover.vue +11 -5
  112. package/src/components/CnDataTable/CnDataTable.vue +45 -1
  113. package/src/components/CnDetailPage/CnDetailPage.md +8 -0
  114. package/src/components/CnDetailPage/CnDetailPage.vue +263 -7
  115. package/src/components/CnFkResolveCell/CnFkResolveCell.vue +3 -1
  116. package/src/components/CnFormDialog/CnFormDialog.vue +144 -4
  117. package/src/components/CnHeaderWidget/CnHeaderWidget.vue +206 -9
  118. package/src/components/CnIndexPage/CnIndexPage.vue +32 -2
  119. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +7 -1
  120. package/src/components/CnSegmentedControl/CnSegmentedControl.md +1 -1
  121. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +12 -0
  122. package/src/components/CnStagesWidget/CnStagesWidget.vue +189 -2
  123. package/src/components/CnStagesWidget/stagesModel.js +5 -2
  124. package/src/components/CnStatWidget/CnStatWidget.vue +89 -7
  125. package/src/components/CnTabsWidget/CnTabsWidget.vue +15 -2
  126. package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +4 -0
  127. package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +107 -1
  128. package/src/css/detail-page.css +37 -4
  129. package/src/css/kpi-card.css +71 -1
  130. package/src/css/table.css +18 -6
  131. package/src/mixins/pageViews.js +396 -0
  132. package/src/schemas/app-manifest-v2.schema.json +162 -3
  133. package/src/store/useObjectStore.js +118 -33
  134. package/src/utils/actionsDispatcher.js +25 -2
  135. package/src/utils/columnFilters.js +29 -2
  136. package/src/utils/schema.js +40 -2
  137. package/src/utils/schemaRefSlug.js +19 -3
  138. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -1,63 +1,63 @@
1
- import { resolveComponent, openBlock, createElementBlock, normalizeClass, normalizeStyle, toDisplayString, createCommentVNode, renderSlot, createElementVNode, createBlock, Fragment, renderList, createVNode, withCtx, createTextVNode, createSlots } from 'vue';
1
+ import { resolveComponent, openBlock, createElementBlock, normalizeClass, normalizeStyle, toDisplayString, createCommentVNode, createBlock, renderSlot, createElementVNode, Fragment, renderList, createVNode, withCtx, createTextVNode, createSlots, mergeProps } from 'vue';
2
2
 
3
3
  const _hoisted_1 = ["href"];
4
- const _hoisted_2 = {
5
- key: 1,
6
- class: "cn-detail-page__header",
7
- "data-testid": "cn-detail-page-header"
8
- };
9
- const _hoisted_3 = { class: "cn-detail-page__header-left" };
10
- const _hoisted_4 = { class: "cn-detail-page__header-text" };
11
- const _hoisted_5 = {
4
+ const _hoisted_2 = { class: "cn-detail-page__header-left" };
5
+ const _hoisted_3 = { class: "cn-detail-page__header-text" };
6
+ const _hoisted_4 = {
12
7
  key: 0,
13
8
  class: "cn-detail-page__pills",
14
9
  "data-testid": "cn-detail-page-pills"
15
10
  };
16
- const _hoisted_6 = {
11
+ const _hoisted_5 = {
17
12
  key: 1,
18
13
  class: "cn-detail-page__type-eyebrow",
19
14
  "data-testid": "cn-detail-page-type-eyebrow"
20
15
  };
21
- const _hoisted_7 = ["title"];
22
- const _hoisted_8 = {
16
+ const _hoisted_6 = ["title"];
17
+ const _hoisted_7 = {
23
18
  key: 3,
24
19
  class: "cn-detail-page__description"
25
20
  };
26
- const _hoisted_9 = { class: "cn-detail-page__header-actions" };
27
- const _hoisted_10 = {
28
- key: 0,
21
+ const _hoisted_8 = { class: "cn-detail-page__header-actions" };
22
+ const _hoisted_9 = {
23
+ key: 1,
29
24
  class: "cn-detail-page__list-nav",
30
25
  "data-testid": "cn-detail-page-list-nav"
31
26
  };
32
- const _hoisted_11 = {
27
+ const _hoisted_10 = {
33
28
  class: "cn-detail-page__list-nav-position",
34
29
  "data-testid": "cn-detail-page-list-position"
35
30
  };
31
+ const _hoisted_11 = {
32
+ key: 0,
33
+ class: "cn-detail-page__header-widget",
34
+ "data-testid": "cn-detail-page-header-widget"
35
+ };
36
36
  const _hoisted_12 = {
37
- key: 3,
37
+ key: 4,
38
38
  class: "cn-detail-page__lock-refusal",
39
39
  role: "alert",
40
40
  "data-testid": "cn-detail-page-lock-refusal"
41
41
  };
42
42
  const _hoisted_13 = {
43
- key: 5,
43
+ key: 6,
44
44
  class: "cn-detail-page__not-found",
45
45
  "data-testid": "cn-detail-page-not-found"
46
46
  };
47
47
  const _hoisted_14 = {
48
- key: 6,
48
+ key: 7,
49
49
  class: "cn-detail-page__loading"
50
50
  };
51
51
  const _hoisted_15 = {
52
- key: 7,
52
+ key: 8,
53
53
  class: "cn-detail-page__error"
54
54
  };
55
55
  const _hoisted_16 = {
56
- key: 8,
56
+ key: 9,
57
57
  class: "cn-detail-page__empty"
58
58
  };
59
59
  const _hoisted_17 = {
60
- key: 9,
60
+ key: 10,
61
61
  class: "cn-detail-page__body"
62
62
  };
63
63
  const _hoisted_18 = {
@@ -70,48 +70,51 @@ const _hoisted_20 = {
70
70
  class: "cn-detail-page__widget-edit"
71
71
  };
72
72
  const _hoisted_21 = ["id"];
73
- const _hoisted_22 = {
73
+ const _hoisted_22 = ["id", "aria-label"];
74
+ const _hoisted_23 = {
74
75
  key: 3,
75
76
  class: "cn-detail-page__stats"
76
77
  };
77
- const _hoisted_23 = {
78
+ const _hoisted_24 = {
78
79
  key: 0,
79
80
  class: "cn-detail-page__section-title"
80
81
  };
81
- const _hoisted_24 = { class: "cn-detail-page__stats-table" };
82
- const _hoisted_25 = { key: 0 };
83
- const _hoisted_26 = {
82
+ const _hoisted_25 = { class: "cn-detail-page__stats-table" };
83
+ const _hoisted_26 = { key: 0 };
84
+ const _hoisted_27 = {
84
85
  key: 4,
85
86
  class: "cn-detail-page__content"
86
87
  };
87
- const _hoisted_27 = {
88
+ const _hoisted_28 = {
88
89
  key: 0,
89
90
  class: "cn-detail-page__content"
90
91
  };
91
- const _hoisted_28 = {
92
+ const _hoisted_29 = {
92
93
  key: 1,
93
94
  class: "cn-detail-page__sections"
94
95
  };
95
- const _hoisted_29 = {
96
+ const _hoisted_30 = {
96
97
  key: 6,
97
98
  class: "cn-detail-page__related-collections"
98
99
  };
99
- const _hoisted_30 = {
100
+ const _hoisted_31 = {
100
101
  key: 0,
101
102
  class: "cn-detail-page__relation-links"
102
103
  };
103
- const _hoisted_31 = {
104
+ const _hoisted_32 = {
104
105
  key: 9,
105
106
  class: "cn-detail-page__footer"
106
107
  };
107
- const _hoisted_32 = ["aria-label"];
108
- const _hoisted_33 = ["data-testid"];
108
+ const _hoisted_33 = ["aria-label"];
109
+ const _hoisted_34 = ["data-testid"];
109
110
 
110
111
  function render(_ctx, _cache, $props, $setup, $data, $options) {
112
+ const _component_CnBreadcrumbs = resolveComponent("CnBreadcrumbs");
111
113
  const _component_CnIcon = resolveComponent("CnIcon");
112
114
  const _component_CnStatusBadge = resolveComponent("CnStatusBadge");
113
115
  const _component_CnTranslatedBadge = resolveComponent("CnTranslatedBadge");
114
116
  const _component_CnSummaryAggregates = resolveComponent("CnSummaryAggregates");
117
+ const _component_CnSegmentedControl = resolveComponent("CnSegmentedControl");
115
118
  const _component_ChevronLeft = resolveComponent("ChevronLeft");
116
119
  const _component_NcButton = resolveComponent("NcButton");
117
120
  const _component_ChevronRight = resolveComponent("ChevronRight");
@@ -124,6 +127,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
124
127
  const _component_NcActionLink = resolveComponent("NcActionLink");
125
128
  const _component_NcActionButton = resolveComponent("NcActionButton");
126
129
  const _component_CnActionsMenu = resolveComponent("CnActionsMenu");
130
+ const _component_CnDetailWidgetHost = resolveComponent("CnDetailWidgetHost");
127
131
  const _component_CnLockedBanner = resolveComponent("CnLockedBanner");
128
132
  const _component_CnNextStepCard = resolveComponent("CnNextStepCard");
129
133
  const _component_FileQuestionOutline = resolveComponent("FileQuestionOutline");
@@ -135,8 +139,8 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
135
139
  const _component_InformationOutline = resolveComponent("InformationOutline");
136
140
  const _component_CnBodySections = resolveComponent("CnBodySections");
137
141
  const _component_Cog = resolveComponent("Cog");
138
- const _component_CnDetailWidgetHost = resolveComponent("CnDetailWidgetHost");
139
142
  const _component_CnDashboardGrid = resolveComponent("CnDashboardGrid");
143
+ const _component_ViewDashboardOutline = resolveComponent("ViewDashboardOutline");
140
144
  const _component_Plus = resolveComponent("Plus");
141
145
  const _component_CnRelatedCollections = resolveComponent("CnRelatedCollections");
142
146
  const _component_CnWidgetStyleEditorModal = resolveComponent("CnWidgetStyleEditorModal");
@@ -157,15 +161,28 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
157
161
  onClick: _cache[0] || (_cache[0] = (...args) => ($options.onSkipToPrimaryAction && $options.onSkipToPrimaryAction(...args)))
158
162
  }, toDisplayString($options.skipLinkLabel), 9 /* TEXT, PROPS */, _hoisted_1))
159
163
  : createCommentVNode("v-if", true),
164
+ ($options.breadcrumbCrumbs.length > 0 && !$data.objectNotFound)
165
+ ? (openBlock(), createBlock(_component_CnBreadcrumbs, {
166
+ key: 1,
167
+ class: "cn-detail-page__breadcrumbs",
168
+ crumbs: $options.breadcrumbCrumbs,
169
+ rootText: $options.breadcrumbCrumbs[0].icon === undefined,
170
+ "data-testid": "cn-detail-page-breadcrumbs"
171
+ }, null, 8 /* PROPS */, ["crumbs", "rootText"]))
172
+ : createCommentVNode("v-if", true),
160
173
  (!$data.objectNotFound)
161
- ? (openBlock(), createElementBlock("div", _hoisted_2, [
174
+ ? (openBlock(), createElementBlock("div", {
175
+ key: 2,
176
+ class: normalizeClass(["cn-detail-page__header", { 'cn-detail-page__header--card': $props.headerCard, 'cn-detail-page__header--with-widget': $options.headerWidgetDef !== null }]),
177
+ "data-testid": "cn-detail-page-header"
178
+ }, [
162
179
  renderSlot(_ctx.$slots, "header", {
163
180
  title: $props.title,
164
181
  description: $props.description,
165
182
  icon: $props.icon,
166
183
  iconSize: $props.iconSize
167
184
  }, () => [
168
- createElementVNode("div", _hoisted_3, [
185
+ createElementVNode("div", _hoisted_2, [
169
186
  renderSlot(_ctx.$slots, "icon", {}, () => [
170
187
  ($props.icon)
171
188
  ? (openBlock(), createBlock(_component_CnIcon, {
@@ -176,9 +193,9 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
176
193
  }, null, 8 /* PROPS */, ["name", "size"]))
177
194
  : createCommentVNode("v-if", true)
178
195
  ]),
179
- createElementVNode("div", _hoisted_4, [
196
+ createElementVNode("div", _hoisted_3, [
180
197
  ($options.headerPills.length > 0)
181
- ? (openBlock(), createElementBlock("div", _hoisted_5, [
198
+ ? (openBlock(), createElementBlock("div", _hoisted_4, [
182
199
  (openBlock(true), createElementBlock(Fragment, null, renderList($options.headerPills, (pill) => {
183
200
  return (openBlock(), createBlock(_component_CnStatusBadge, {
184
201
  key: pill.key,
@@ -191,15 +208,15 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
191
208
  }), 128 /* KEYED_FRAGMENT */))
192
209
  ]))
193
210
  : createCommentVNode("v-if", true),
194
- ($options.typeEyebrow)
195
- ? (openBlock(), createElementBlock("p", _hoisted_6, toDisplayString($options.typeEyebrow), 1 /* TEXT */))
211
+ ($options.typeEyebrow && $props.showTypeEyebrow)
212
+ ? (openBlock(), createElementBlock("p", _hoisted_5, toDisplayString($options.typeEyebrow), 1 /* TEXT */))
196
213
  : createCommentVNode("v-if", true),
197
214
  ($options.displayTitle)
198
215
  ? (openBlock(), createElementBlock("h2", {
199
216
  key: 2,
200
217
  class: "cn-detail-page__title",
201
218
  title: $options.displayTitle
202
- }, toDisplayString($options.displayTitle), 9 /* TEXT, PROPS */, _hoisted_7))
219
+ }, toDisplayString($options.displayTitle), 9 /* TEXT, PROPS */, _hoisted_6))
203
220
  : createCommentVNode("v-if", true),
204
221
  renderSlot(_ctx.$slots, "translation-badge", { object: $options.resolvedObject }, () => [
205
222
  ($options.resolvedObject)
@@ -210,7 +227,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
210
227
  : createCommentVNode("v-if", true)
211
228
  ]),
212
229
  ($props.description)
213
- ? (openBlock(), createElementBlock("p", _hoisted_8, toDisplayString($options.resolvedDescription), 1 /* TEXT */))
230
+ ? (openBlock(), createElementBlock("p", _hoisted_7, toDisplayString($options.resolvedDescription), 1 /* TEXT */))
214
231
  : createCommentVNode("v-if", true),
215
232
  ($props.summaryAggregates && $props.summaryAggregates.length > 0)
216
233
  ? (openBlock(), createBlock(_component_CnSummaryAggregates, {
@@ -221,9 +238,21 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
221
238
  ])
222
239
  ])
223
240
  ]),
224
- createElementVNode("div", _hoisted_9, [
241
+ createElementVNode("div", _hoisted_8, [
242
+ (_ctx.showsPageViewSwitch)
243
+ ? (openBlock(), createBlock(_component_CnSegmentedControl, {
244
+ key: 0,
245
+ class: "cn-page-view-switch",
246
+ options: _ctx.viewSwitchOptions,
247
+ modelValue: _ctx.activeViewId,
248
+ ariaLabel: _ctx.viewSwitchLabel,
249
+ controls: _ctx.viewRegionId,
250
+ "data-testid": "cn-detail-page-view-switch",
251
+ "onUpdate:modelValue": _ctx.selectView
252
+ }, null, 8 /* PROPS */, ["options", "modelValue", "ariaLabel", "controls", "onUpdate:modelValue"]))
253
+ : createCommentVNode("v-if", true),
225
254
  ($props.listNavigation && $props.listNavigation.available)
226
- ? (openBlock(), createElementBlock("div", _hoisted_10, [
255
+ ? (openBlock(), createElementBlock("div", _hoisted_9, [
227
256
  createVNode(_component_NcButton, {
228
257
  variant: "tertiary",
229
258
  disabled: $props.listNavigation.isFirst,
@@ -238,7 +267,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
238
267
  ]),
239
268
  _: 1 /* STABLE */
240
269
  }, 8 /* PROPS */, ["disabled", "to", "aria-label", "title"]),
241
- createElementVNode("span", _hoisted_11, toDisplayString($options.listPositionLabel), 1 /* TEXT */),
270
+ createElementVNode("span", _hoisted_10, toDisplayString($options.listPositionLabel), 1 /* TEXT */),
242
271
  createVNode(_component_NcButton, {
243
272
  variant: "tertiary",
244
273
  disabled: $props.listNavigation.isLast,
@@ -257,7 +286,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
257
286
  : createCommentVNode("v-if", true),
258
287
  ($options.effectivePrimaryLabel && !$options.showsNextStepCard)
259
288
  ? (openBlock(), createBlock(_component_NcButton, {
260
- key: 1,
289
+ key: 2,
261
290
  id: $options.primaryActionAnchorId,
262
291
  ref: "primaryActionButton",
263
292
  variant: "primary",
@@ -304,7 +333,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
304
333
  }), 128 /* KEYED_FRAGMENT */)),
305
334
  ($options.showsLifecycleActions)
306
335
  ? (openBlock(), createBlock(_component_CnLifecycleActions, {
307
- key: 2,
336
+ key: 3,
308
337
  objectId: $props.objectId,
309
338
  object: $options.currentObject,
310
339
  config: $props.lifecycleActions,
@@ -317,7 +346,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
317
346
  : createCommentVNode("v-if", true),
318
347
  ($options.effectiveHeaderActions.length > 0)
319
348
  ? (openBlock(), createBlock(_component_CnActionButtons, {
320
- key: 3,
349
+ key: 4,
321
350
  actions: $options.effectiveHeaderActions,
322
351
  display: "menu",
323
352
  "data-testid": "cn-detail-page-header-actions",
@@ -336,7 +365,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
336
365
  }),
337
366
  ($options.canEditRecord && !$options.foldsEditIntoActions)
338
367
  ? (openBlock(), createBlock(_component_NcButton, {
339
- key: 4,
368
+ key: 5,
340
369
  variant: "secondary",
341
370
  "data-testid": "cn-detail-page-edit",
342
371
  "aria-label": $options.editActionLabel,
@@ -466,12 +495,45 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
466
495
  }
467
496
  : undefined
468
497
  ]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["showRefresh", "refreshing", "showRequestFeature", "showReportBug", "showDocumentation", "actionsMenuLabel", "hasPrimaryItems", "documentationUrl", "docsAnchor", "documentationLabel", "widgetId", "title", "surface", "onRefresh", "onRequestFeature"])
469
- ])
470
- ]))
498
+ ]),
499
+ ($options.headerWidgetDef !== null)
500
+ ? (openBlock(), createElementBlock("div", _hoisted_11, [
501
+ renderSlot(_ctx.$slots, `widget-${$options.headerWidgetDef.id}`, {
502
+ item: { id: $options.headerWidgetDef.id, widgetId: $options.headerWidgetDef.id },
503
+ widget: $options.headerWidgetDef,
504
+ objectId: $props.objectId,
505
+ object: $options.resolvedObject,
506
+ objectData: $options.resolvedObject,
507
+ objectType: $options.resolvedObjectType,
508
+ register: $props.register,
509
+ schema: $props.schema
510
+ }, () => [
511
+ createVNode(_component_CnDetailWidgetHost, {
512
+ widget: $options.headerWidgetDef,
513
+ chrome: "bare",
514
+ objectId: $props.objectId,
515
+ object: $options.currentObject,
516
+ objectType: $options.resolvedObjectType,
517
+ schemaObject: $options.currentSchema,
518
+ register: $props.register,
519
+ schema: $props.schema,
520
+ store: $options.effectiveObjectStore,
521
+ surface: $props.surface,
522
+ integrationContext: $options.effectiveIntegrationContext,
523
+ hideEmpty: $props.hideEmpty,
524
+ cnRegistry: $options.cnRegistry,
525
+ availableWidgets: _ctx.widgets,
526
+ onGeoSaved: $options.onGeoSaved,
527
+ onOpenIntegration: $options.onAutoBodyOpenIntegration
528
+ }, null, 8 /* PROPS */, ["widget", "objectId", "object", "objectType", "schemaObject", "register", "schema", "store", "surface", "integrationContext", "hideEmpty", "cnRegistry", "availableWidgets", "onGeoSaved", "onOpenIntegration"])
529
+ ])
530
+ ]))
531
+ : createCommentVNode("v-if", true)
532
+ ], 2 /* CLASS */))
471
533
  : createCommentVNode("v-if", true),
472
534
  ($setup.lockState && $setup.lockState.locked.value)
473
535
  ? (openBlock(), createBlock(_component_CnLockedBanner, {
474
- key: 2,
536
+ key: 3,
475
537
  lockedBy: $setup.lockState.lockedBy.value,
476
538
  lockedByMe: $setup.lockState.lockedByMe.value,
477
539
  expiresAt: $setup.lockState.expiresAt.value,
@@ -484,7 +546,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
484
546
  : createCommentVNode("v-if", true),
485
547
  ($options.showsNextStepCard)
486
548
  ? (openBlock(), createBlock(_component_CnNextStepCard, {
487
- key: 4,
549
+ key: 5,
488
550
  class: "cn-detail-page__next-step",
489
551
  title: $options.nextStepCard.title,
490
552
  titleTag: "h3",
@@ -622,87 +684,105 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
622
684
  "data-testid": "cn-detail-body-sections-before-body"
623
685
  }, null, 8 /* PROPS */, ["sections", "context"]))
624
686
  : createCommentVNode("v-if", true),
625
- ($options.hasBodyGrid)
626
- ? (openBlock(), createBlock(_component_CnDashboardGrid, {
627
- key: `cn-detail-grid-${$options.editingBody ? 'editing' : 'live'}`,
628
- layout: $options.bodyGridLayout,
629
- editable: $options.editingBody,
630
- columns: 12,
631
- columnOpts: $props.columnOpts,
632
- class: "cn-detail-page__grid",
633
- onLayoutChange: $options.onBodyLayoutChange
634
- }, {
635
- widget: withCtx(({ item }) => [
636
- createElementVNode("div", {
637
- class: normalizeClass(["cn-detail-page__grid-item", { 'cn-detail-page__grid-item--fit': !!item.sizeToContent }]),
638
- "aria-labelledby": $options.showGridTitle(item) ? `widget-title-${item.id}` : undefined
639
- }, [
640
- ($options.showsCog(item))
641
- ? (openBlock(), createElementBlock("div", _hoisted_20, [
642
- createVNode(_component_NcButton, {
643
- variant: "tertiary",
644
- "aria-label": _ctx.t('nextcloud-vue', 'Configure widget'),
645
- onClick: $event => ($options.configureWidget(item))
646
- }, {
647
- icon: withCtx(() => [
648
- createVNode(_component_Cog, { size: 18 })
649
- ]),
650
- _: 1 /* STABLE */
651
- }, 8 /* PROPS */, ["aria-label", "onClick"])
652
- ]))
653
- : createCommentVNode("v-if", true),
654
- ($options.showGridTitle(item))
655
- ? (openBlock(), createElementBlock("h3", {
656
- key: 1,
657
- id: `widget-title-${item.id}`,
658
- class: "cn-detail-page__widget-title"
659
- }, toDisplayString($options.gridTitle(item)), 9 /* TEXT, PROPS */, _hoisted_21))
660
- : createCommentVNode("v-if", true),
661
- renderSlot(_ctx.$slots, `widget-${item.widgetId}`, {
662
- item: item,
687
+ (openBlock(true), createElementBlock(Fragment, null, renderList($options.bodyGridSections, (section) => {
688
+ return (openBlock(), createBlock(_component_CnDashboardGrid, mergeProps({
689
+ key: `cn-detail-grid-${section.key}-${$options.editingBody ? 'editing' : 'live'}`
690
+ }, { ref_for: true }, section.attrs, {
691
+ layout: section.layout,
692
+ editable: $options.editingBody,
693
+ columns: 12,
694
+ columnOpts: $props.columnOpts,
695
+ class: "cn-detail-page__grid",
696
+ onLayoutChange: $event => (section.view ? _ctx.onViewLayoutChange($event) : $options.onBodyLayoutChange($event))
697
+ }), {
698
+ widget: withCtx(({ item }) => [
699
+ createElementVNode("div", {
700
+ class: normalizeClass(["cn-detail-page__grid-item", { 'cn-detail-page__grid-item--fit': !!item.sizeToContent }]),
701
+ "aria-labelledby": $options.showGridTitle(item) ? `widget-title-${item.id}` : undefined
702
+ }, [
703
+ ($options.showsCog(item))
704
+ ? (openBlock(), createElementBlock("div", _hoisted_20, [
705
+ createVNode(_component_NcButton, {
706
+ variant: "tertiary",
707
+ "aria-label": _ctx.t('nextcloud-vue', 'Configure widget'),
708
+ onClick: $event => ($options.configureWidget(item))
709
+ }, {
710
+ icon: withCtx(() => [
711
+ createVNode(_component_Cog, { size: 18 })
712
+ ]),
713
+ _: 1 /* STABLE */
714
+ }, 8 /* PROPS */, ["aria-label", "onClick"])
715
+ ]))
716
+ : createCommentVNode("v-if", true),
717
+ ($options.showGridTitle(item))
718
+ ? (openBlock(), createElementBlock("h3", {
719
+ key: 1,
720
+ id: `widget-title-${item.id}`,
721
+ class: "cn-detail-page__widget-title"
722
+ }, toDisplayString($options.gridTitle(item)), 9 /* TEXT, PROPS */, _hoisted_21))
723
+ : createCommentVNode("v-if", true),
724
+ renderSlot(_ctx.$slots, `widget-${item.widgetId}`, {
725
+ item: item,
726
+ widget: $options.findWidget(item),
727
+ objectId: $props.objectId,
728
+ object: $options.resolvedObject,
729
+ objectData: $options.resolvedObject,
730
+ objectType: $options.resolvedObjectType,
731
+ register: $props.register,
732
+ schema: $props.schema
733
+ }, () => [
734
+ createVNode(_component_CnDetailWidgetHost, {
663
735
  widget: $options.findWidget(item),
736
+ chrome: "card",
737
+ showCardTitle: $options.showCardTitle(item),
664
738
  objectId: $props.objectId,
665
- object: $options.resolvedObject,
666
- objectData: $options.resolvedObject,
739
+ object: $options.currentObject,
667
740
  objectType: $options.resolvedObjectType,
741
+ schemaObject: $options.currentSchema,
668
742
  register: $props.register,
669
- schema: $props.schema
670
- }, () => [
671
- createVNode(_component_CnDetailWidgetHost, {
672
- widget: $options.findWidget(item),
673
- chrome: "card",
674
- showCardTitle: $options.showCardTitle(item),
675
- objectId: $props.objectId,
676
- object: $options.currentObject,
677
- objectType: $options.resolvedObjectType,
678
- schemaObject: $options.currentSchema,
679
- register: $props.register,
680
- schema: $props.schema,
681
- store: $options.effectiveObjectStore,
682
- surface: $props.surface,
683
- integrationContext: $options.effectiveIntegrationContext,
684
- hideEmpty: $props.hideEmpty,
685
- cnRegistry: $options.cnRegistry,
686
- availableWidgets: $options.bodyGridWidgets,
687
- onGeoSaved: $options.onGeoSaved,
688
- onOpenIntegration: $options.onAutoBodyOpenIntegration
689
- }, null, 8 /* PROPS */, ["widget", "showCardTitle", "objectId", "object", "objectType", "schemaObject", "register", "schema", "store", "surface", "integrationContext", "hideEmpty", "cnRegistry", "availableWidgets", "onGeoSaved", "onOpenIntegration"])
690
- ])
691
- ], 10 /* CLASS, PROPS */, _hoisted_19)
692
- ]),
693
- _: 3 /* FORWARDED */
694
- }, 8 /* PROPS */, ["layout", "editable", "columnOpts", "onLayoutChange"]))
743
+ schema: $props.schema,
744
+ store: $options.effectiveObjectStore,
745
+ surface: $props.surface,
746
+ integrationContext: $options.effectiveIntegrationContext,
747
+ hideEmpty: $props.hideEmpty,
748
+ cnRegistry: $options.cnRegistry,
749
+ availableWidgets: $options.bodyGridWidgets,
750
+ onGeoSaved: $options.onGeoSaved,
751
+ onOpenIntegration: $options.onAutoBodyOpenIntegration
752
+ }, null, 8 /* PROPS */, ["widget", "showCardTitle", "objectId", "object", "objectType", "schemaObject", "register", "schema", "store", "surface", "integrationContext", "hideEmpty", "cnRegistry", "availableWidgets", "onGeoSaved", "onOpenIntegration"])
753
+ ])
754
+ ], 10 /* CLASS, PROPS */, _hoisted_19)
755
+ ]),
756
+ _: 3 /* FORWARDED */
757
+ }, 16 /* FULL_PROPS */, ["layout", "editable", "columnOpts", "onLayoutChange"]))
758
+ }), 128 /* KEYED_FRAGMENT */)),
759
+ ($options.viewIsEmpty)
760
+ ? (openBlock(), createElementBlock("div", {
761
+ key: 2,
762
+ id: _ctx.viewRegionId,
763
+ role: "region",
764
+ "aria-label": _ctx.activeView ? _ctx.activeView.label : null,
765
+ class: "cn-page-view-region cn-page-view-region--empty",
766
+ "data-testid": "cn-detail-page-view-empty"
767
+ }, [
768
+ createVNode(_component_NcEmptyContent, { description: _ctx.viewEmptyText }, {
769
+ icon: withCtx(() => [
770
+ createVNode(_component_ViewDashboardOutline, { size: 48 })
771
+ ]),
772
+ _: 1 /* STABLE */
773
+ }, 8 /* PROPS */, ["description"])
774
+ ], 8 /* PROPS */, _hoisted_22))
695
775
  : createCommentVNode("v-if", true),
696
776
  ($options.hasStats)
697
- ? (openBlock(), createElementBlock("div", _hoisted_22, [
777
+ ? (openBlock(), createElementBlock("div", _hoisted_23, [
698
778
  renderSlot(_ctx.$slots, "stats-header", {}, () => [
699
779
  ($props.statsTitle)
700
- ? (openBlock(), createElementBlock("h3", _hoisted_23, toDisplayString($options.resolvedStatsTitle), 1 /* TEXT */))
780
+ ? (openBlock(), createElementBlock("h3", _hoisted_24, toDisplayString($options.resolvedStatsTitle), 1 /* TEXT */))
701
781
  : createCommentVNode("v-if", true)
702
782
  ]),
703
- createElementVNode("table", _hoisted_24, [
783
+ createElementVNode("table", _hoisted_25, [
704
784
  ($props.statsColumns.length > 0)
705
- ? (openBlock(), createElementBlock("thead", _hoisted_25, [
785
+ ? (openBlock(), createElementBlock("thead", _hoisted_26, [
706
786
  createElementVNode("tr", null, [
707
787
  (openBlock(true), createElementBlock(Fragment, null, renderList($props.statsColumns, (col) => {
708
788
  return (openBlock(), createElementBlock("th", {
@@ -733,14 +813,14 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
733
813
  ])
734
814
  ])
735
815
  ]))
736
- : (openBlock(), createElementBlock("div", _hoisted_26, [
816
+ : (openBlock(), createElementBlock("div", _hoisted_27, [
737
817
  (!$options.hasBodyGrid)
738
- ? (openBlock(), createElementBlock("div", _hoisted_27, [
818
+ ? (openBlock(), createElementBlock("div", _hoisted_28, [
739
819
  renderSlot(_ctx.$slots, "default")
740
820
  ]))
741
821
  : createCommentVNode("v-if", true),
742
822
  (_ctx.$slots.sections)
743
- ? (openBlock(), createElementBlock("div", _hoisted_28, [
823
+ ? (openBlock(), createElementBlock("div", _hoisted_29, [
744
824
  renderSlot(_ctx.$slots, "sections")
745
825
  ]))
746
826
  : createCommentVNode("v-if", true)
@@ -755,9 +835,9 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
755
835
  }, null, 8 /* PROPS */, ["sections", "context"]))
756
836
  : createCommentVNode("v-if", true),
757
837
  (($props.relatedCollections && $props.relatedCollections.length > 0) || ($props.relationLinks && $props.relationLinks.length > 0))
758
- ? (openBlock(), createElementBlock("div", _hoisted_29, [
838
+ ? (openBlock(), createElementBlock("div", _hoisted_30, [
759
839
  ($props.relationLinks && $props.relationLinks.length > 0)
760
- ? (openBlock(), createElementBlock("div", _hoisted_30, [
840
+ ? (openBlock(), createElementBlock("div", _hoisted_31, [
761
841
  (openBlock(true), createElementBlock(Fragment, null, renderList($props.relationLinks, (link, li) => {
762
842
  return (openBlock(), createBlock(_component_NcButton, {
763
843
  key: li,
@@ -804,14 +884,14 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
804
884
  }, null, 8 /* PROPS */, ["sections", "context"]))
805
885
  : createCommentVNode("v-if", true),
806
886
  (_ctx.$slots.footer)
807
- ? (openBlock(), createElementBlock("div", _hoisted_31, [
887
+ ? (openBlock(), createElementBlock("div", _hoisted_32, [
808
888
  renderSlot(_ctx.$slots, "footer")
809
889
  ]))
810
890
  : createCommentVNode("v-if", true)
811
891
  ])),
812
892
  ($options.showsSideColumn)
813
893
  ? (openBlock(), createElementBlock("aside", {
814
- key: 10,
894
+ key: 11,
815
895
  class: "cn-detail-page__side",
816
896
  "aria-label": $options.sideColumnLabel,
817
897
  "data-testid": "cn-detail-page-side"
@@ -852,13 +932,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
852
932
  onOpenIntegration: $options.onAutoBodyOpenIntegration
853
933
  }, null, 8 /* PROPS */, ["widget", "objectId", "object", "objectType", "schemaObject", "register", "schema", "store", "surface", "integrationContext", "hideEmpty", "cnRegistry", "availableWidgets", "onGeoSaved", "onOpenIntegration"])
854
934
  ])
855
- ], 8 /* PROPS */, _hoisted_33))
935
+ ], 8 /* PROPS */, _hoisted_34))
856
936
  }), 128 /* KEYED_FRAGMENT */))
857
- ], 8 /* PROPS */, _hoisted_32))
937
+ ], 8 /* PROPS */, _hoisted_33))
858
938
  : createCommentVNode("v-if", true),
859
939
  ($data.showWidgetConfig)
860
940
  ? (openBlock(), createBlock(_component_CnWidgetStyleEditorModal, {
861
- key: 11,
941
+ key: 12,
862
942
  show: $data.showWidgetConfig,
863
943
  widget: $options.configWidget,
864
944
  deletable: true,
@@ -911,7 +991,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
911
991
  ]),
912
992
  ($data.activeRelationLink)
913
993
  ? (openBlock(), createBlock(_component_CnRelationLinkModal, {
914
- key: 12,
994
+ key: 13,
915
995
  title: $data.activeRelationLink.title || undefined,
916
996
  selectLabel: $data.activeRelationLink.selectLabel || undefined,
917
997
  register: $data.activeRelationLink.register,