@conduction/nextcloud-vue 2.115.0 → 2.116.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 (117) hide show
  1. package/dist/esm/components/CnActionButtons/CnActionButtons.vue.js +1 -1
  2. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js +92 -0
  3. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
  4. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +2 -2
  5. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
  6. package/dist/esm/components/CnChecklistWidget/CnChecklistWidget.vue.js +9 -0
  7. package/dist/esm/components/CnChecklistWidget/CnChecklistWidget.vue.js.map +1 -0
  8. package/dist/esm/components/CnChecklistWidget/CnChecklistWidget.vue2.js +145 -0
  9. package/dist/esm/components/CnChecklistWidget/CnChecklistWidget.vue2.js.map +1 -0
  10. package/dist/esm/components/CnChecklistWidget/CnChecklistWidget.vue3.js +58 -0
  11. package/dist/esm/components/CnChecklistWidget/CnChecklistWidget.vue3.js.map +1 -0
  12. package/dist/esm/components/CnChecklistWidget/index.js +28 -0
  13. package/dist/esm/components/CnChecklistWidget/index.js.map +1 -0
  14. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
  15. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +25 -0
  16. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  17. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +1 -1
  18. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  19. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +376 -51
  20. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  21. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +364 -285
  22. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  23. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
  24. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +11 -0
  25. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  26. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +6 -4
  27. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  28. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue.js +1 -1
  29. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue2.js +48 -1
  30. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue2.js.map +1 -1
  31. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue3.js +11 -2
  32. package/dist/esm/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue3.js.map +1 -1
  33. package/dist/esm/components/CnMacrosWidget/CnMacrosWidget.vue.js +1 -1
  34. package/dist/esm/components/CnMacrosWidget/CnMacrosWidget.vue2.js +11 -3
  35. package/dist/esm/components/CnMacrosWidget/CnMacrosWidget.vue2.js.map +1 -1
  36. package/dist/esm/components/CnMacrosWidget/CnMacrosWidget.vue3.js +8 -3
  37. package/dist/esm/components/CnMacrosWidget/CnMacrosWidget.vue3.js.map +1 -1
  38. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue.js +1 -1
  39. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +55 -2
  40. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  41. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  42. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
  43. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +94 -4
  44. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  45. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +248 -239
  46. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  47. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue.js +9 -0
  48. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue.js.map +1 -0
  49. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js +282 -0
  50. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue2.js.map +1 -0
  51. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue3.js +202 -0
  52. package/dist/esm/components/CnRecordListWidget/CnRecordNoteRows.vue3.js.map +1 -0
  53. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
  54. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +10 -5
  55. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  56. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  57. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  58. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  59. package/dist/esm/composables/indexSources.js +64 -0
  60. package/dist/esm/composables/indexSources.js.map +1 -1
  61. package/dist/esm/composables/useTaskInboxStore.js +85 -0
  62. package/dist/esm/composables/useTaskInboxStore.js.map +1 -1
  63. package/dist/esm/dialogs/CnAccessPurposeDialog.vue.js +9 -0
  64. package/dist/esm/dialogs/CnAccessPurposeDialog.vue.js.map +1 -0
  65. package/dist/esm/dialogs/CnAccessPurposeDialog.vue2.js +107 -0
  66. package/dist/esm/dialogs/CnAccessPurposeDialog.vue2.js.map +1 -0
  67. package/dist/esm/dialogs/CnAccessPurposeDialog.vue3.js +110 -0
  68. package/dist/esm/dialogs/CnAccessPurposeDialog.vue3.js.map +1 -0
  69. package/dist/esm/index.js +1 -0
  70. package/dist/esm/index.js.map +1 -1
  71. package/dist/esm/l10n/en.json.js +19 -1
  72. package/dist/esm/l10n/en.json.js.map +1 -1
  73. package/dist/esm/l10n/nl.json.js +23 -1
  74. package/dist/esm/l10n/nl.json.js.map +1 -1
  75. package/dist/esm/library-style.js +1 -1
  76. package/dist/esm/nextcloud-vue.css +1054 -911
  77. package/dist/esm/utils/actionsDispatcher.js +10 -5
  78. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  79. package/dist/esm/utils/detailActionModel.js +6 -2
  80. package/dist/esm/utils/detailActionModel.js.map +1 -1
  81. package/dist/esm/utils/libraryWidgetKeys.js +1 -0
  82. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  83. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  84. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  85. package/dist/esm/utils/widgetDispatch.js +1 -1
  86. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  87. package/dist/nextcloud-vue.cjs.js +17078 -15224
  88. package/dist/nextcloud-vue.cjs.js.map +2 -2
  89. package/dist/nextcloud-vue.css +1054 -911
  90. package/l10n/en.json +19 -1
  91. package/l10n/nl.json +23 -1
  92. package/package.json +1 -1
  93. package/src/components/CnActionButtons/CnActionButtons.vue +93 -1
  94. package/src/components/CnChecklistWidget/CnChecklistWidget.vue +206 -0
  95. package/src/components/CnChecklistWidget/index.js +27 -0
  96. package/src/components/CnDashboardPage/CnDashboardPage.vue +26 -1
  97. package/src/components/CnDetailPage/CnDetailPage.md +2 -0
  98. package/src/components/CnDetailPage/CnDetailPage.vue +377 -10
  99. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +15 -2
  100. package/src/components/CnGroupedCardsWidget/CnGroupedCardsWidget.vue +59 -1
  101. package/src/components/CnMacrosWidget/CnMacrosWidget.vue +16 -6
  102. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +55 -2
  103. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +101 -3
  104. package/src/components/CnRecordListWidget/CnRecordNoteRows.vue +508 -0
  105. package/src/components/CnTabsWidget/CnTabsWidget.vue +10 -5
  106. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +1 -0
  107. package/src/components/index.js +1 -0
  108. package/src/composables/indexSources.js +64 -0
  109. package/src/composables/useTaskInboxStore.js +85 -0
  110. package/src/dialogs/CnAccessPurposeDialog.vue +183 -0
  111. package/src/index.js +1 -0
  112. package/src/schemas/app-manifest-v2.schema.json +49 -3
  113. package/src/utils/actionsDispatcher.js +10 -5
  114. package/src/utils/detailActionModel.js +6 -2
  115. package/src/utils/libraryWidgetKeys.js +1 -0
  116. package/src/utils/validateManifestV2.compiled.js +3 -3
  117. package/src/utils/widgetDispatch.js +1 -1
@@ -84,68 +84,73 @@ const _hoisted_20 = {
84
84
  };
85
85
  const _hoisted_21 = {
86
86
  key: 7,
87
- class: "cn-detail-page__loading"
87
+ class: "cn-detail-page__access-purpose",
88
+ "data-testid": "cn-detail-page-access-purpose"
88
89
  };
89
90
  const _hoisted_22 = {
90
91
  key: 8,
91
- class: "cn-detail-page__error"
92
+ class: "cn-detail-page__loading"
92
93
  };
93
94
  const _hoisted_23 = {
94
95
  key: 9,
95
- class: "cn-detail-page__empty"
96
+ class: "cn-detail-page__error"
96
97
  };
97
98
  const _hoisted_24 = {
98
99
  key: 10,
99
- class: "cn-detail-page__body"
100
+ class: "cn-detail-page__empty"
100
101
  };
101
102
  const _hoisted_25 = {
103
+ key: 11,
104
+ class: "cn-detail-page__body"
105
+ };
106
+ const _hoisted_26 = {
102
107
  key: 0,
103
108
  class: "cn-detail-page__before-body"
104
109
  };
105
- const _hoisted_26 = ["aria-labelledby"];
106
- const _hoisted_27 = {
110
+ const _hoisted_27 = ["aria-labelledby"];
111
+ const _hoisted_28 = {
107
112
  key: 0,
108
113
  class: "cn-detail-page__widget-edit"
109
114
  };
110
- const _hoisted_28 = ["id"];
111
- const _hoisted_29 = ["id", "aria-label"];
112
- const _hoisted_30 = {
115
+ const _hoisted_29 = ["id"];
116
+ const _hoisted_30 = ["id", "aria-label"];
117
+ const _hoisted_31 = {
113
118
  key: 3,
114
119
  class: "cn-detail-page__stats"
115
120
  };
116
- const _hoisted_31 = {
121
+ const _hoisted_32 = {
117
122
  key: 0,
118
123
  class: "cn-detail-page__section-title"
119
124
  };
120
- const _hoisted_32 = { class: "cn-detail-page__stats-table" };
121
- const _hoisted_33 = { key: 0 };
122
- const _hoisted_34 = {
125
+ const _hoisted_33 = { class: "cn-detail-page__stats-table" };
126
+ const _hoisted_34 = { key: 0 };
127
+ const _hoisted_35 = {
123
128
  key: 4,
124
129
  class: "cn-detail-page__content"
125
130
  };
126
- const _hoisted_35 = {
131
+ const _hoisted_36 = {
127
132
  key: 0,
128
133
  class: "cn-detail-page__content"
129
134
  };
130
- const _hoisted_36 = {
135
+ const _hoisted_37 = {
131
136
  key: 1,
132
137
  class: "cn-detail-page__sections"
133
138
  };
134
- const _hoisted_37 = {
139
+ const _hoisted_38 = {
135
140
  key: 6,
136
141
  class: "cn-detail-page__related-collections"
137
142
  };
138
- const _hoisted_38 = {
143
+ const _hoisted_39 = {
139
144
  key: 0,
140
145
  class: "cn-detail-page__relation-links"
141
146
  };
142
- const _hoisted_39 = {
147
+ const _hoisted_40 = {
143
148
  key: 9,
144
149
  class: "cn-detail-page__footer"
145
150
  };
146
- const _hoisted_40 = ["aria-label"];
147
- const _hoisted_41 = ["data-testid"];
148
- const _hoisted_42 = {
151
+ const _hoisted_41 = ["aria-label"];
152
+ const _hoisted_42 = ["data-testid"];
153
+ const _hoisted_43 = {
149
154
  key: 0,
150
155
  class: "cn-detail-page__side-identifier",
151
156
  "data-testid": "cn-detail-page-side-identifier"
@@ -182,6 +187,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
182
187
  const _component_FileQuestionOutline = resolveComponent("FileQuestionOutline");
183
188
  const _component_ArrowLeft = resolveComponent("ArrowLeft");
184
189
  const _component_NcEmptyContent = resolveComponent("NcEmptyContent");
190
+ const _component_CnAccessPurposeDialog = resolveComponent("CnAccessPurposeDialog");
185
191
  const _component_NcLoadingIcon = resolveComponent("NcLoadingIcon");
186
192
  const _component_AlertCircleOutline = resolveComponent("AlertCircleOutline");
187
193
  const _component_Refresh = resolveComponent("Refresh");
@@ -210,7 +216,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
210
216
  onClick: _cache[0] || (_cache[0] = (...args) => ($options.onSkipToPrimaryAction && $options.onSkipToPrimaryAction(...args)))
211
217
  }, toDisplayString($options.skipLinkLabel), 9 /* TEXT, PROPS */, _hoisted_1))
212
218
  : createCommentVNode("v-if", true),
213
- ($options.breadcrumbCrumbs.length > 0 && !$data.objectNotFound && !$options.isBoard)
219
+ ($options.breadcrumbCrumbs.length > 0 && !$data.objectNotFound && !$options.contentWithheld && !$options.isBoard)
214
220
  ? (openBlock(), createBlock(_component_CnBreadcrumbs, {
215
221
  key: 1,
216
222
  class: "cn-detail-page__breadcrumbs",
@@ -220,7 +226,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
220
226
  "data-testid": "cn-detail-page-breadcrumbs"
221
227
  }, null, 8 /* PROPS */, ["crumbs", "rootText", "separator"]))
222
228
  : createCommentVNode("v-if", true),
223
- (!$data.objectNotFound)
229
+ (!$data.objectNotFound && !$options.contentWithheld)
224
230
  ? (openBlock(), createElementBlock("div", {
225
231
  key: 2,
226
232
  class: normalizeClass(["cn-detail-page__header", { 'cn-detail-page__header--card': $props.headerCard && !$options.isBoard, 'cn-detail-page__header--with-widget': $options.headerWidgetDef !== null, 'cn-detail-page__header--board': $options.isBoard }]),
@@ -429,6 +435,39 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
429
435
  _: 1 /* STABLE */
430
436
  }, 8 /* PROPS */, ["id", "href", "target", "disabled", "onClick"]))
431
437
  : createCommentVNode("v-if", true),
438
+ (openBlock(true), createElementBlock(Fragment, null, renderList($options.sourceVerbButtons, (verb) => {
439
+ return (openBlock(), createBlock(_component_NcButton, {
440
+ key: `verb-${verb.id}`,
441
+ variant: "secondary",
442
+ disabled: $data.sourceVerbBusy,
443
+ "data-testid": `cn-detail-page-verb-${verb.id}`,
444
+ onClick: $event => ($options.runSourceVerb(verb))
445
+ }, createSlots({
446
+ default: withCtx(() => [
447
+ createTextVNode(" " + toDisplayString(verb.label), 1 /* TEXT */)
448
+ ]),
449
+ _: 2 /* DYNAMIC */
450
+ }, [
451
+ (verb.icon)
452
+ ? {
453
+ name: "icon",
454
+ fn: withCtx(() => [
455
+ (typeof verb.icon === 'string')
456
+ ? (openBlock(), createBlock(_component_CnIcon, {
457
+ key: 0,
458
+ name: verb.icon,
459
+ size: 20
460
+ }, null, 8 /* PROPS */, ["name"]))
461
+ : (openBlock(), createBlock(resolveDynamicComponent(verb.icon), {
462
+ key: 1,
463
+ size: 20
464
+ }))
465
+ ]),
466
+ key: "0"
467
+ }
468
+ : undefined
469
+ ]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["disabled", "data-testid", "onClick"]))
470
+ }), 128 /* KEYED_FRAGMENT */)),
432
471
  (openBlock(true), createElementBlock(Fragment, null, renderList($options.quickActionEntries, (entry) => {
433
472
  return (openBlock(), createBlock(_component_NcButton, {
434
473
  key: `quick-${entry.id}`,
@@ -845,286 +884,326 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
845
884
  ]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["name", "description"])
846
885
  ])
847
886
  ]))
848
- : ($options.showLoadingState)
887
+ : ($options.contentWithheld)
849
888
  ? (openBlock(), createElementBlock("div", _hoisted_21, [
850
- createVNode(_component_NcLoadingIcon, { size: 32 }),
851
- createElementVNode("span", null, toDisplayString($props.loadingLabel), 1 /* TEXT */)
889
+ ($data.accessPurposeAsking)
890
+ ? (openBlock(), createBlock(_component_CnAccessPurposeDialog, {
891
+ key: 0,
892
+ title: $options.accessPurposeText('title'),
893
+ description: $options.accessPurposeText('description'),
894
+ options: $options.accessPurposeOptions,
895
+ loading: $data.accessPurposeBusy,
896
+ error: $data.accessPurposeError,
897
+ onSubmit: $options.recordAccessPurpose,
898
+ onCancel: _cache[6] || (_cache[6] = $event => ($data.accessPurposeAsking = false))
899
+ }, null, 8 /* PROPS */, ["title", "description", "options", "loading", "error", "onSubmit"]))
900
+ : ($options.accessPurposeRequired)
901
+ ? (openBlock(), createBlock(_component_NcEmptyContent, {
902
+ key: 1,
903
+ name: _ctx.t('nextcloud-vue', 'State a purpose to open this'),
904
+ description: _ctx.t('nextcloud-vue', 'This record holds special categories of personal data. It opens once your purpose is recorded.'),
905
+ "data-testid": "cn-detail-page-access-purpose-refused"
906
+ }, {
907
+ action: withCtx(() => [
908
+ createVNode(_component_NcButton, {
909
+ variant: "primary",
910
+ "data-testid": "cn-detail-page-access-purpose-ask",
911
+ onClick: _cache[7] || (_cache[7] = $event => ($data.accessPurposeAsking = true))
912
+ }, {
913
+ default: withCtx(() => [
914
+ createTextVNode(toDisplayString(_ctx.t('nextcloud-vue', 'State a purpose')), 1 /* TEXT */)
915
+ ]),
916
+ _: 1 /* STABLE */
917
+ })
918
+ ]),
919
+ _: 1 /* STABLE */
920
+ }, 8 /* PROPS */, ["name", "description"]))
921
+ : (openBlock(), createBlock(_component_NcLoadingIcon, {
922
+ key: 2,
923
+ size: 32,
924
+ name: $props.loadingLabel
925
+ }, null, 8 /* PROPS */, ["name"]))
852
926
  ]))
853
- : ($props.error)
927
+ : ($options.showLoadingState)
854
928
  ? (openBlock(), createElementBlock("div", _hoisted_22, [
855
- renderSlot(_ctx.$slots, "error", {}, () => [
856
- createVNode(_component_NcEmptyContent, { name: $props.errorMessage }, {
857
- icon: withCtx(() => [
858
- createVNode(_component_AlertCircleOutline, { size: 48 })
859
- ]),
860
- action: withCtx(() => [
861
- ($props.onRetry)
862
- ? (openBlock(), createBlock(_component_NcButton, {
863
- key: 0,
864
- variant: "primary",
865
- onClick: $props.onRetry
866
- }, {
867
- icon: withCtx(() => [
868
- createVNode(_component_Refresh, { size: 20 })
869
- ]),
870
- default: withCtx(() => [
871
- createTextVNode(" " + toDisplayString($props.retryLabel), 1 /* TEXT */)
872
- ]),
873
- _: 1 /* STABLE */
874
- }, 8 /* PROPS */, ["onClick"]))
875
- : createCommentVNode("v-if", true),
876
- renderSlot(_ctx.$slots, "error-actions")
877
- ]),
878
- _: 3 /* FORWARDED */
879
- }, 8 /* PROPS */, ["name"])
880
- ])
929
+ createVNode(_component_NcLoadingIcon, { size: 32 }),
930
+ createElementVNode("span", null, toDisplayString($props.loadingLabel), 1 /* TEXT */)
881
931
  ]))
882
- : ($props.empty)
932
+ : ($props.error)
883
933
  ? (openBlock(), createElementBlock("div", _hoisted_23, [
884
- renderSlot(_ctx.$slots, "empty", {}, () => [
885
- createVNode(_component_NcEmptyContent, { name: $props.emptyLabel }, {
934
+ renderSlot(_ctx.$slots, "error", {}, () => [
935
+ createVNode(_component_NcEmptyContent, { name: $props.errorMessage }, {
886
936
  icon: withCtx(() => [
887
- createVNode(_component_InformationOutline, { size: 48 })
937
+ createVNode(_component_AlertCircleOutline, { size: 48 })
888
938
  ]),
889
939
  action: withCtx(() => [
890
- renderSlot(_ctx.$slots, "empty-actions")
940
+ ($props.onRetry)
941
+ ? (openBlock(), createBlock(_component_NcButton, {
942
+ key: 0,
943
+ variant: "primary",
944
+ onClick: $props.onRetry
945
+ }, {
946
+ icon: withCtx(() => [
947
+ createVNode(_component_Refresh, { size: 20 })
948
+ ]),
949
+ default: withCtx(() => [
950
+ createTextVNode(" " + toDisplayString($props.retryLabel), 1 /* TEXT */)
951
+ ]),
952
+ _: 1 /* STABLE */
953
+ }, 8 /* PROPS */, ["onClick"]))
954
+ : createCommentVNode("v-if", true),
955
+ renderSlot(_ctx.$slots, "error-actions")
891
956
  ]),
892
957
  _: 3 /* FORWARDED */
893
958
  }, 8 /* PROPS */, ["name"])
894
959
  ])
895
960
  ]))
896
- : (openBlock(), createElementBlock("div", _hoisted_24, [
897
- (_ctx.$slots['before-body'] || _ctx.$slots['before-body'])
898
- ? (openBlock(), createElementBlock("div", _hoisted_25, [
899
- renderSlot(_ctx.$slots, "before-body", {
900
- object: $options.resolvedObject,
901
- schema: $options.currentSchema,
902
- objectType: $options.resolvedObjectType,
903
- objectId: $props.objectId,
904
- store: $options.effectiveObjectStore
905
- })
906
- ]))
907
- : createCommentVNode("v-if", true),
908
- ($options.hasBodyWidgets)
909
- ? (openBlock(), createBlock(_component_CnBodySections, {
910
- key: 1,
911
- sections: $props.bodyWidgets,
912
- context: $options.sectionContext,
913
- placement: "before-body",
914
- "data-testid": "cn-detail-body-sections-before-body"
915
- }, null, 8 /* PROPS */, ["sections", "context"]))
916
- : createCommentVNode("v-if", true),
917
- (openBlock(true), createElementBlock(Fragment, null, renderList($options.bodyGridSections, (section) => {
918
- return (openBlock(), createBlock(_component_CnDashboardGrid, mergeProps({
919
- key: `cn-detail-grid-${section.key}-${section.editable ? 'editing' : 'live'}`
920
- }, { ref_for: true }, section.attrs, {
921
- layout: section.layout,
922
- editable: section.editable,
923
- columns: 12,
924
- columnOpts: $options.bodyColumnOpts,
925
- class: "cn-detail-page__grid",
926
- onLayoutChange: $event => (section.view ? _ctx.onViewLayoutChange($event) : $options.onBodyLayoutChange($event))
927
- }), {
928
- widget: withCtx(({ item }) => [
929
- createElementVNode("div", {
930
- class: normalizeClass(["cn-detail-page__grid-item", { 'cn-detail-page__grid-item--fit': !!item.sizeToContent }]),
931
- "aria-labelledby": $options.showGridTitle(item) ? `widget-title-${item.id}` : undefined
932
- }, [
933
- ($options.showsCog(item))
934
- ? (openBlock(), createElementBlock("div", _hoisted_27, [
935
- createVNode(_component_NcButton, {
936
- variant: "tertiary",
937
- "aria-label": _ctx.t('nextcloud-vue', 'Configure widget'),
938
- onClick: $event => ($options.configureWidget(item))
939
- }, {
940
- icon: withCtx(() => [
941
- createVNode(_component_Cog, { size: 18 })
942
- ]),
943
- _: 1 /* STABLE */
944
- }, 8 /* PROPS */, ["aria-label", "onClick"])
945
- ]))
946
- : createCommentVNode("v-if", true),
947
- ($options.showGridTitle(item))
948
- ? (openBlock(), createElementBlock("h3", {
949
- key: 1,
950
- id: `widget-title-${item.id}`,
951
- class: "cn-detail-page__widget-title"
952
- }, toDisplayString($options.gridTitle(item)), 9 /* TEXT, PROPS */, _hoisted_28))
953
- : createCommentVNode("v-if", true),
954
- renderSlot(_ctx.$slots, `widget-${item.widgetId}`, {
955
- item: item,
956
- widget: $options.findWidget(item),
957
- objectId: $props.objectId,
961
+ : ($props.empty)
962
+ ? (openBlock(), createElementBlock("div", _hoisted_24, [
963
+ renderSlot(_ctx.$slots, "empty", {}, () => [
964
+ createVNode(_component_NcEmptyContent, { name: $props.emptyLabel }, {
965
+ icon: withCtx(() => [
966
+ createVNode(_component_InformationOutline, { size: 48 })
967
+ ]),
968
+ action: withCtx(() => [
969
+ renderSlot(_ctx.$slots, "empty-actions")
970
+ ]),
971
+ _: 3 /* FORWARDED */
972
+ }, 8 /* PROPS */, ["name"])
973
+ ])
974
+ ]))
975
+ : (openBlock(), createElementBlock("div", _hoisted_25, [
976
+ (_ctx.$slots['before-body'] || _ctx.$slots['before-body'])
977
+ ? (openBlock(), createElementBlock("div", _hoisted_26, [
978
+ renderSlot(_ctx.$slots, "before-body", {
958
979
  object: $options.resolvedObject,
959
- objectData: $options.resolvedObject,
980
+ schema: $options.currentSchema,
960
981
  objectType: $options.resolvedObjectType,
961
- register: $props.register,
962
- schema: $props.schema
963
- }, () => [
964
- createVNode(_component_CnDetailWidgetHost, {
982
+ objectId: $props.objectId,
983
+ store: $options.effectiveObjectStore
984
+ })
985
+ ]))
986
+ : createCommentVNode("v-if", true),
987
+ ($options.hasBodyWidgets)
988
+ ? (openBlock(), createBlock(_component_CnBodySections, {
989
+ key: 1,
990
+ sections: $props.bodyWidgets,
991
+ context: $options.sectionContext,
992
+ placement: "before-body",
993
+ "data-testid": "cn-detail-body-sections-before-body"
994
+ }, null, 8 /* PROPS */, ["sections", "context"]))
995
+ : createCommentVNode("v-if", true),
996
+ (openBlock(true), createElementBlock(Fragment, null, renderList($options.bodyGridSections, (section) => {
997
+ return (openBlock(), createBlock(_component_CnDashboardGrid, mergeProps({
998
+ key: `cn-detail-grid-${section.key}-${section.editable ? 'editing' : 'live'}`
999
+ }, { ref_for: true }, section.attrs, {
1000
+ layout: section.layout,
1001
+ editable: section.editable,
1002
+ columns: 12,
1003
+ columnOpts: $options.bodyColumnOpts,
1004
+ class: "cn-detail-page__grid",
1005
+ onLayoutChange: $event => (section.view ? _ctx.onViewLayoutChange($event) : $options.onBodyLayoutChange($event))
1006
+ }), {
1007
+ widget: withCtx(({ item }) => [
1008
+ createElementVNode("div", {
1009
+ class: normalizeClass(["cn-detail-page__grid-item", { 'cn-detail-page__grid-item--fit': !!item.sizeToContent }]),
1010
+ "aria-labelledby": $options.showGridTitle(item) ? `widget-title-${item.id}` : undefined
1011
+ }, [
1012
+ ($options.showsCog(item))
1013
+ ? (openBlock(), createElementBlock("div", _hoisted_28, [
1014
+ createVNode(_component_NcButton, {
1015
+ variant: "tertiary",
1016
+ "aria-label": _ctx.t('nextcloud-vue', 'Configure widget'),
1017
+ onClick: $event => ($options.configureWidget(item))
1018
+ }, {
1019
+ icon: withCtx(() => [
1020
+ createVNode(_component_Cog, { size: 18 })
1021
+ ]),
1022
+ _: 1 /* STABLE */
1023
+ }, 8 /* PROPS */, ["aria-label", "onClick"])
1024
+ ]))
1025
+ : createCommentVNode("v-if", true),
1026
+ ($options.showGridTitle(item))
1027
+ ? (openBlock(), createElementBlock("h3", {
1028
+ key: 1,
1029
+ id: `widget-title-${item.id}`,
1030
+ class: "cn-detail-page__widget-title"
1031
+ }, toDisplayString($options.gridTitle(item)), 9 /* TEXT, PROPS */, _hoisted_29))
1032
+ : createCommentVNode("v-if", true),
1033
+ renderSlot(_ctx.$slots, `widget-${item.widgetId}`, {
1034
+ item: item,
965
1035
  widget: $options.findWidget(item),
966
- chrome: "card",
967
- inGridCell: "",
968
- showCardTitle: $options.showCardTitle(item),
969
- showActions: $options.effectiveShowWidgetActions,
970
1036
  objectId: $props.objectId,
971
- object: $options.currentObject,
1037
+ object: $options.resolvedObject,
1038
+ objectData: $options.resolvedObject,
972
1039
  objectType: $options.resolvedObjectType,
973
- schemaObject: $options.currentSchema,
974
1040
  register: $props.register,
975
- schema: $props.schema,
976
- store: $options.effectiveObjectStore,
977
- surface: $props.surface,
978
- integrationContext: $options.effectiveIntegrationContext,
979
- hideEmpty: $props.hideEmpty,
980
- cnRegistry: $options.cnRegistry,
981
- availableWidgets: $options.bodyGridWidgets,
982
- onGeoSaved: $options.onGeoSaved,
983
- onOpenIntegration: $options.onAutoBodyOpenIntegration,
984
- onSelectObject: $options.onRelatedObjectSelect
985
- }, null, 8 /* PROPS */, ["widget", "showCardTitle", "showActions", "objectId", "object", "objectType", "schemaObject", "register", "schema", "store", "surface", "integrationContext", "hideEmpty", "cnRegistry", "availableWidgets", "onGeoSaved", "onOpenIntegration", "onSelectObject"])
986
- ])
987
- ], 10 /* CLASS, PROPS */, _hoisted_26)
988
- ]),
989
- _: 3 /* FORWARDED */
990
- }, 16 /* FULL_PROPS */, ["layout", "editable", "columnOpts", "onLayoutChange"]))
991
- }), 128 /* KEYED_FRAGMENT */)),
992
- ($options.viewIsEmpty)
993
- ? (openBlock(), createElementBlock("div", {
994
- key: 2,
995
- id: _ctx.viewRegionId,
996
- role: "region",
997
- "aria-label": _ctx.activeView ? _ctx.activeView.label : null,
998
- class: "cn-page-view-region cn-page-view-region--empty",
999
- "data-testid": "cn-detail-page-view-empty"
1000
- }, [
1001
- createVNode(_component_NcEmptyContent, { description: _ctx.viewEmptyText }, {
1002
- icon: withCtx(() => [
1003
- createVNode(_component_ViewDashboardOutline, { size: 48 })
1041
+ schema: $props.schema
1042
+ }, () => [
1043
+ createVNode(_component_CnDetailWidgetHost, {
1044
+ widget: $options.findWidget(item),
1045
+ chrome: "card",
1046
+ inGridCell: "",
1047
+ showCardTitle: $options.showCardTitle(item),
1048
+ showActions: $options.effectiveShowWidgetActions,
1049
+ objectId: $props.objectId,
1050
+ object: $options.currentObject,
1051
+ objectType: $options.resolvedObjectType,
1052
+ schemaObject: $options.currentSchema,
1053
+ register: $props.register,
1054
+ schema: $props.schema,
1055
+ store: $options.effectiveObjectStore,
1056
+ surface: $props.surface,
1057
+ integrationContext: $options.effectiveIntegrationContext,
1058
+ hideEmpty: $props.hideEmpty,
1059
+ cnRegistry: $options.cnRegistry,
1060
+ availableWidgets: $options.bodyGridWidgets,
1061
+ onGeoSaved: $options.onGeoSaved,
1062
+ onOpenIntegration: $options.onAutoBodyOpenIntegration,
1063
+ onSelectObject: $options.onRelatedObjectSelect
1064
+ }, null, 8 /* PROPS */, ["widget", "showCardTitle", "showActions", "objectId", "object", "objectType", "schemaObject", "register", "schema", "store", "surface", "integrationContext", "hideEmpty", "cnRegistry", "availableWidgets", "onGeoSaved", "onOpenIntegration", "onSelectObject"])
1065
+ ])
1066
+ ], 10 /* CLASS, PROPS */, _hoisted_27)
1067
+ ]),
1068
+ _: 3 /* FORWARDED */
1069
+ }, 16 /* FULL_PROPS */, ["layout", "editable", "columnOpts", "onLayoutChange"]))
1070
+ }), 128 /* KEYED_FRAGMENT */)),
1071
+ ($options.viewIsEmpty)
1072
+ ? (openBlock(), createElementBlock("div", {
1073
+ key: 2,
1074
+ id: _ctx.viewRegionId,
1075
+ role: "region",
1076
+ "aria-label": _ctx.activeView ? _ctx.activeView.label : null,
1077
+ class: "cn-page-view-region cn-page-view-region--empty",
1078
+ "data-testid": "cn-detail-page-view-empty"
1079
+ }, [
1080
+ createVNode(_component_NcEmptyContent, { description: _ctx.viewEmptyText }, {
1081
+ icon: withCtx(() => [
1082
+ createVNode(_component_ViewDashboardOutline, { size: 48 })
1083
+ ]),
1084
+ _: 1 /* STABLE */
1085
+ }, 8 /* PROPS */, ["description"])
1086
+ ], 8 /* PROPS */, _hoisted_30))
1087
+ : createCommentVNode("v-if", true),
1088
+ ($options.hasStats)
1089
+ ? (openBlock(), createElementBlock("div", _hoisted_31, [
1090
+ renderSlot(_ctx.$slots, "stats-header", {}, () => [
1091
+ ($props.statsTitle)
1092
+ ? (openBlock(), createElementBlock("h3", _hoisted_32, toDisplayString($options.resolvedStatsTitle), 1 /* TEXT */))
1093
+ : createCommentVNode("v-if", true)
1004
1094
  ]),
1005
- _: 1 /* STABLE */
1006
- }, 8 /* PROPS */, ["description"])
1007
- ], 8 /* PROPS */, _hoisted_29))
1008
- : createCommentVNode("v-if", true),
1009
- ($options.hasStats)
1010
- ? (openBlock(), createElementBlock("div", _hoisted_30, [
1011
- renderSlot(_ctx.$slots, "stats-header", {}, () => [
1012
- ($props.statsTitle)
1013
- ? (openBlock(), createElementBlock("h3", _hoisted_31, toDisplayString($options.resolvedStatsTitle), 1 /* TEXT */))
1095
+ createElementVNode("table", _hoisted_33, [
1096
+ ($props.statsColumns.length > 0)
1097
+ ? (openBlock(), createElementBlock("thead", _hoisted_34, [
1098
+ createElementVNode("tr", null, [
1099
+ (openBlock(true), createElementBlock(Fragment, null, renderList($props.statsColumns, (col) => {
1100
+ return (openBlock(), createElementBlock("th", {
1101
+ key: col.key,
1102
+ scope: "col",
1103
+ class: normalizeClass(col.align ? 'cn-detail-page__stats-cell--' + col.align : '')
1104
+ }, toDisplayString(col.label), 3 /* TEXT, CLASS */))
1105
+ }), 128 /* KEYED_FRAGMENT */))
1106
+ ])
1107
+ ]))
1108
+ : createCommentVNode("v-if", true),
1109
+ createElementVNode("tbody", null, [
1110
+ renderSlot(_ctx.$slots, "stats-rows", {}, () => [
1111
+ (openBlock(true), createElementBlock(Fragment, null, renderList($props.statsRows, (row, index) => {
1112
+ return (openBlock(), createElementBlock("tr", {
1113
+ key: index,
1114
+ class: normalizeClass({ 'cn-detail-page__stats-row--sub': row.indent })
1115
+ }, [
1116
+ (openBlock(true), createElementBlock(Fragment, null, renderList($props.statsColumns, (col) => {
1117
+ return (openBlock(), createElementBlock("td", {
1118
+ key: col.key,
1119
+ class: normalizeClass([row.indent ? 'cn-detail-page__stats-cell--indented' : '', col.align ? 'cn-detail-page__stats-cell--' + col.align : ''])
1120
+ }, toDisplayString(row[col.key] !== undefined ? row[col.key] : '-'), 3 /* TEXT, CLASS */))
1121
+ }), 128 /* KEYED_FRAGMENT */))
1122
+ ], 2 /* CLASS */))
1123
+ }), 128 /* KEYED_FRAGMENT */))
1124
+ ])
1125
+ ])
1126
+ ])
1127
+ ]))
1128
+ : (openBlock(), createElementBlock("div", _hoisted_35, [
1129
+ (!$options.hasBodyGrid)
1130
+ ? (openBlock(), createElementBlock("div", _hoisted_36, [
1131
+ renderSlot(_ctx.$slots, "default")
1132
+ ]))
1133
+ : createCommentVNode("v-if", true),
1134
+ (_ctx.$slots.sections)
1135
+ ? (openBlock(), createElementBlock("div", _hoisted_37, [
1136
+ renderSlot(_ctx.$slots, "sections")
1137
+ ]))
1014
1138
  : createCommentVNode("v-if", true)
1015
- ]),
1016
- createElementVNode("table", _hoisted_32, [
1017
- ($props.statsColumns.length > 0)
1018
- ? (openBlock(), createElementBlock("thead", _hoisted_33, [
1019
- createElementVNode("tr", null, [
1020
- (openBlock(true), createElementBlock(Fragment, null, renderList($props.statsColumns, (col) => {
1021
- return (openBlock(), createElementBlock("th", {
1022
- key: col.key,
1023
- scope: "col",
1024
- class: normalizeClass(col.align ? 'cn-detail-page__stats-cell--' + col.align : '')
1025
- }, toDisplayString(col.label), 3 /* TEXT, CLASS */))
1026
- }), 128 /* KEYED_FRAGMENT */))
1027
- ])
1139
+ ])),
1140
+ ($options.hasBodyWidgets)
1141
+ ? (openBlock(), createBlock(_component_CnBodySections, {
1142
+ key: 5,
1143
+ sections: $props.bodyWidgets,
1144
+ context: $options.sectionContext,
1145
+ placement: "after-data",
1146
+ "data-testid": "cn-detail-body-sections-after-data"
1147
+ }, null, 8 /* PROPS */, ["sections", "context"]))
1148
+ : createCommentVNode("v-if", true),
1149
+ (($props.relatedCollections && $props.relatedCollections.length > 0) || ($props.relationLinks && $props.relationLinks.length > 0))
1150
+ ? (openBlock(), createElementBlock("div", _hoisted_38, [
1151
+ ($props.relationLinks && $props.relationLinks.length > 0)
1152
+ ? (openBlock(), createElementBlock("div", _hoisted_39, [
1153
+ (openBlock(true), createElementBlock(Fragment, null, renderList($props.relationLinks, (link, li) => {
1154
+ return (openBlock(), createBlock(_component_NcButton, {
1155
+ key: li,
1156
+ class: "cn-detail-page__relation-link-button",
1157
+ "data-testid": `cn-detail-relation-link-${li}`,
1158
+ onClick: $event => ($options.openRelationLink(link))
1159
+ }, {
1160
+ icon: withCtx(() => [
1161
+ createVNode(_component_Plus, { size: 18 })
1162
+ ]),
1163
+ default: withCtx(() => [
1164
+ createTextVNode(" " + toDisplayString(link.label || _ctx.t('nextcloud-vue', 'Link related object')), 1 /* TEXT */)
1165
+ ]),
1166
+ _: 2 /* DYNAMIC */
1167
+ }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["data-testid", "onClick"]))
1168
+ }), 128 /* KEYED_FRAGMENT */))
1028
1169
  ]))
1029
1170
  : createCommentVNode("v-if", true),
1030
- createElementVNode("tbody", null, [
1031
- renderSlot(_ctx.$slots, "stats-rows", {}, () => [
1032
- (openBlock(true), createElementBlock(Fragment, null, renderList($props.statsRows, (row, index) => {
1033
- return (openBlock(), createElementBlock("tr", {
1034
- key: index,
1035
- class: normalizeClass({ 'cn-detail-page__stats-row--sub': row.indent })
1036
- }, [
1037
- (openBlock(true), createElementBlock(Fragment, null, renderList($props.statsColumns, (col) => {
1038
- return (openBlock(), createElementBlock("td", {
1039
- key: col.key,
1040
- class: normalizeClass([row.indent ? 'cn-detail-page__stats-cell--indented' : '', col.align ? 'cn-detail-page__stats-cell--' + col.align : ''])
1041
- }, toDisplayString(row[col.key] !== undefined ? row[col.key] : '-'), 3 /* TEXT, CLASS */))
1042
- }), 128 /* KEYED_FRAGMENT */))
1043
- ], 2 /* CLASS */))
1044
- }), 128 /* KEYED_FRAGMENT */))
1045
- ])
1046
- ])
1047
- ])
1048
- ]))
1049
- : (openBlock(), createElementBlock("div", _hoisted_34, [
1050
- (!$options.hasBodyGrid)
1051
- ? (openBlock(), createElementBlock("div", _hoisted_35, [
1052
- renderSlot(_ctx.$slots, "default")
1053
- ]))
1054
- : createCommentVNode("v-if", true),
1055
- (_ctx.$slots.sections)
1056
- ? (openBlock(), createElementBlock("div", _hoisted_36, [
1057
- renderSlot(_ctx.$slots, "sections")
1058
- ]))
1059
- : createCommentVNode("v-if", true)
1060
- ])),
1061
- ($options.hasBodyWidgets)
1062
- ? (openBlock(), createBlock(_component_CnBodySections, {
1063
- key: 5,
1064
- sections: $props.bodyWidgets,
1065
- context: $options.sectionContext,
1066
- placement: "after-data",
1067
- "data-testid": "cn-detail-body-sections-after-data"
1068
- }, null, 8 /* PROPS */, ["sections", "context"]))
1069
- : createCommentVNode("v-if", true),
1070
- (($props.relatedCollections && $props.relatedCollections.length > 0) || ($props.relationLinks && $props.relationLinks.length > 0))
1071
- ? (openBlock(), createElementBlock("div", _hoisted_37, [
1072
- ($props.relationLinks && $props.relationLinks.length > 0)
1073
- ? (openBlock(), createElementBlock("div", _hoisted_38, [
1074
- (openBlock(true), createElementBlock(Fragment, null, renderList($props.relationLinks, (link, li) => {
1075
- return (openBlock(), createBlock(_component_NcButton, {
1076
- key: li,
1077
- class: "cn-detail-page__relation-link-button",
1078
- "data-testid": `cn-detail-relation-link-${li}`,
1079
- onClick: $event => ($options.openRelationLink(link))
1080
- }, {
1081
- icon: withCtx(() => [
1082
- createVNode(_component_Plus, { size: 18 })
1083
- ]),
1084
- default: withCtx(() => [
1085
- createTextVNode(" " + toDisplayString(link.label || _ctx.t('nextcloud-vue', 'Link related object')), 1 /* TEXT */)
1086
- ]),
1087
- _: 2 /* DYNAMIC */
1088
- }, 1032 /* PROPS, DYNAMIC_SLOTS */, ["data-testid", "onClick"]))
1089
- }), 128 /* KEYED_FRAGMENT */))
1090
- ]))
1091
- : createCommentVNode("v-if", true),
1092
- ($props.relatedCollections && $props.relatedCollections.length > 0)
1093
- ? (openBlock(), createBlock(_component_CnRelatedCollections, {
1094
- key: 1,
1095
- collections: $props.relatedCollections,
1096
- onRowClick: $options.onRelatedRowClick
1097
- }, null, 8 /* PROPS */, ["collections", "onRowClick"]))
1098
- : createCommentVNode("v-if", true)
1099
- ]))
1100
- : createCommentVNode("v-if", true),
1101
- ($options.hasBodyWidgets)
1102
- ? (openBlock(), createBlock(_component_CnBodySections, {
1103
- key: 7,
1104
- sections: $props.bodyWidgets,
1105
- context: $options.sectionContext,
1106
- placement: "after-related",
1107
- "data-testid": "cn-detail-body-sections-after-related"
1108
- }, null, 8 /* PROPS */, ["sections", "context"]))
1109
- : createCommentVNode("v-if", true),
1110
- ($options.hasBodyWidgets)
1111
- ? (openBlock(), createBlock(_component_CnBodySections, {
1112
- key: 8,
1113
- sections: $options.endPlacementSections,
1114
- context: $options.sectionContext,
1115
- placement: null,
1116
- "data-testid": "cn-detail-body-sections-end"
1117
- }, null, 8 /* PROPS */, ["sections", "context"]))
1118
- : createCommentVNode("v-if", true),
1119
- (_ctx.$slots.footer)
1120
- ? (openBlock(), createElementBlock("div", _hoisted_39, [
1121
- renderSlot(_ctx.$slots, "footer")
1122
- ]))
1123
- : createCommentVNode("v-if", true)
1124
- ])),
1171
+ ($props.relatedCollections && $props.relatedCollections.length > 0)
1172
+ ? (openBlock(), createBlock(_component_CnRelatedCollections, {
1173
+ key: 1,
1174
+ collections: $props.relatedCollections,
1175
+ onRowClick: $options.onRelatedRowClick
1176
+ }, null, 8 /* PROPS */, ["collections", "onRowClick"]))
1177
+ : createCommentVNode("v-if", true)
1178
+ ]))
1179
+ : createCommentVNode("v-if", true),
1180
+ ($options.hasBodyWidgets)
1181
+ ? (openBlock(), createBlock(_component_CnBodySections, {
1182
+ key: 7,
1183
+ sections: $props.bodyWidgets,
1184
+ context: $options.sectionContext,
1185
+ placement: "after-related",
1186
+ "data-testid": "cn-detail-body-sections-after-related"
1187
+ }, null, 8 /* PROPS */, ["sections", "context"]))
1188
+ : createCommentVNode("v-if", true),
1189
+ ($options.hasBodyWidgets)
1190
+ ? (openBlock(), createBlock(_component_CnBodySections, {
1191
+ key: 8,
1192
+ sections: $options.endPlacementSections,
1193
+ context: $options.sectionContext,
1194
+ placement: null,
1195
+ "data-testid": "cn-detail-body-sections-end"
1196
+ }, null, 8 /* PROPS */, ["sections", "context"]))
1197
+ : createCommentVNode("v-if", true),
1198
+ (_ctx.$slots.footer)
1199
+ ? (openBlock(), createElementBlock("div", _hoisted_40, [
1200
+ renderSlot(_ctx.$slots, "footer")
1201
+ ]))
1202
+ : createCommentVNode("v-if", true)
1203
+ ])),
1125
1204
  ($options.showsSideColumn)
1126
1205
  ? (openBlock(), createElementBlock("aside", {
1127
- key: 11,
1206
+ key: 12,
1128
1207
  class: "cn-detail-page__side",
1129
1208
  "aria-label": $options.sideColumnLabel,
1130
1209
  "data-testid": "cn-detail-page-side"
@@ -1168,21 +1247,21 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1168
1247
  }, null, 8 /* PROPS */, ["widget", "showActions", "objectId", "object", "objectType", "schemaObject", "register", "schema", "store", "surface", "integrationContext", "hideEmpty", "cnRegistry", "availableWidgets", "onGeoSaved", "onOpenIntegration", "onSelectObject"])
1169
1248
  ]),
1170
1249
  ($options.isBoard && widget.id === $options.sideHistoryId && $options.identifierLine !== '')
1171
- ? (openBlock(), createElementBlock("p", _hoisted_42, toDisplayString($options.identifierLine), 1 /* TEXT */))
1250
+ ? (openBlock(), createElementBlock("p", _hoisted_43, toDisplayString($options.identifierLine), 1 /* TEXT */))
1172
1251
  : createCommentVNode("v-if", true)
1173
- ], 10 /* CLASS, PROPS */, _hoisted_41))
1252
+ ], 10 /* CLASS, PROPS */, _hoisted_42))
1174
1253
  }), 128 /* KEYED_FRAGMENT */))
1175
- ], 8 /* PROPS */, _hoisted_40))
1254
+ ], 8 /* PROPS */, _hoisted_41))
1176
1255
  : createCommentVNode("v-if", true),
1177
1256
  ($data.showWidgetConfig)
1178
1257
  ? (openBlock(), createBlock(_component_CnWidgetStyleEditorModal, {
1179
- key: 12,
1258
+ key: 13,
1180
1259
  show: $data.showWidgetConfig,
1181
1260
  widget: $options.configWidget,
1182
1261
  deletable: true,
1183
1262
  onSave: $options.onWidgetConfigSave,
1184
1263
  onDelete: $options.onWidgetConfigDelete,
1185
- onClose: _cache[6] || (_cache[6] = $event => ($data.showWidgetConfig = false))
1264
+ onClose: _cache[8] || (_cache[8] = $event => ($data.showWidgetConfig = false))
1186
1265
  }, null, 8 /* PROPS */, ["show", "widget", "onSave", "onDelete"]))
1187
1266
  : createCommentVNode("v-if", true),
1188
1267
  renderSlot(_ctx.$slots, "form-dialog", {
@@ -1229,7 +1308,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1229
1308
  ]),
1230
1309
  ($data.activeRelationLink)
1231
1310
  ? (openBlock(), createBlock(_component_CnRelationLinkModal, {
1232
- key: 13,
1311
+ key: 14,
1233
1312
  title: $data.activeRelationLink.title || undefined,
1234
1313
  selectLabel: $data.activeRelationLink.selectLabel || undefined,
1235
1314
  register: $data.activeRelationLink.register,
@@ -1240,7 +1319,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
1240
1319
  currentObject: $options.currentObject || {},
1241
1320
  fkField: $data.activeRelationLink.fkField,
1242
1321
  onLinked: $options.onRelationLinked,
1243
- onClose: _cache[7] || (_cache[7] = $event => ($data.activeRelationLink = null))
1322
+ onClose: _cache[9] || (_cache[9] = $event => ($data.activeRelationLink = null))
1244
1323
  }, null, 8 /* PROPS */, ["title", "selectLabel", "register", "schema", "labelField", "allowCreate", "currentType", "currentObject", "fkField", "onLinked"]))
1245
1324
  : createCommentVNode("v-if", true)
1246
1325
  ], 6 /* CLASS, STYLE */))