@conduction/nextcloud-vue 2.79.0 → 2.81.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 (390) hide show
  1. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
  2. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +3 -1
  3. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +32 -3
  5. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  6. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +13 -11
  7. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  8. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +80 -4
  9. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  10. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +95 -91
  11. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  12. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +179 -13
  13. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  14. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +52 -16
  15. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  16. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +96 -4
  17. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  18. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +158 -110
  19. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  20. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js +10 -0
  21. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js.map +1 -0
  22. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js +252 -0
  23. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js.map +1 -0
  24. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js +140 -0
  25. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js.map +1 -0
  26. package/dist/esm/components/CnChipsFieldWidget/index.js +26 -0
  27. package/dist/esm/components/CnChipsFieldWidget/index.js.map +1 -0
  28. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js +10 -0
  29. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js.map +1 -0
  30. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js +354 -0
  31. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js.map +1 -0
  32. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js +172 -0
  33. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js.map +1 -0
  34. package/dist/esm/components/CnChoicePickerWidget/index.js +27 -0
  35. package/dist/esm/components/CnChoicePickerWidget/index.js.map +1 -0
  36. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +1 -1
  37. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
  38. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
  39. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +2 -2
  40. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
  41. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
  42. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +65 -5
  43. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  44. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -1
  45. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  46. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +19 -11
  47. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  48. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +4 -2
  49. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  50. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +134 -4
  51. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  52. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +21 -4
  53. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  54. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +24 -0
  55. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  56. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +43 -4
  57. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  58. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +1 -1
  59. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -1
  60. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -1
  61. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js +7 -7
  62. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js.map +1 -1
  63. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue3.js.map +1 -1
  64. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +11 -0
  65. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js.map +1 -0
  66. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +867 -0
  67. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -0
  68. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +238 -0
  69. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -0
  70. package/dist/esm/components/CnFactsWidget/index.js +30 -0
  71. package/dist/esm/components/CnFactsWidget/index.js.map +1 -0
  72. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +10 -0
  73. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js.map +1 -0
  74. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +626 -0
  75. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -0
  76. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +396 -0
  77. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -0
  78. package/dist/esm/components/CnFieldListWidget/index.js +29 -0
  79. package/dist/esm/components/CnFieldListWidget/index.js.map +1 -0
  80. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +302 -4
  81. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  82. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +417 -244
  83. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  84. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +101 -1
  85. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  86. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +141 -1
  87. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
  88. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +65 -17
  89. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  90. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +4 -4
  91. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  92. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +78 -3
  93. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  94. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js +74 -49
  95. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  96. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +333 -73
  97. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  98. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +79 -17
  99. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  100. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +10 -0
  101. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js.map +1 -0
  102. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +99 -0
  103. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -0
  104. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +48 -0
  105. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -0
  106. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +7 -7
  107. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  108. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  109. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +1 -1
  110. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -1
  111. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +65 -2
  112. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  113. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +6 -2
  114. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  115. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +63 -1
  116. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  117. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +8 -1
  118. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  119. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +14 -0
  120. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
  121. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js +5 -1
  122. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
  123. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +29 -1
  124. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  125. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  126. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js +10 -0
  127. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js.map +1 -0
  128. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js +174 -0
  129. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js.map +1 -0
  130. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js +75 -0
  131. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js.map +1 -0
  132. package/dist/esm/components/CnRadioCardsWidget/index.js +28 -0
  133. package/dist/esm/components/CnRadioCardsWidget/index.js.map +1 -0
  134. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +10 -0
  135. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js.map +1 -0
  136. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +411 -0
  137. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -0
  138. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +178 -0
  139. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -0
  140. package/dist/esm/components/CnRecordListWidget/index.js +31 -0
  141. package/dist/esm/components/CnRecordListWidget/index.js.map +1 -0
  142. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js +10 -0
  143. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js.map +1 -0
  144. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js +222 -0
  145. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js.map +1 -0
  146. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js +64 -0
  147. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js.map +1 -0
  148. package/dist/esm/components/CnSavedViewsWidget/index.js +30 -0
  149. package/dist/esm/components/CnSavedViewsWidget/index.js.map +1 -0
  150. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +10 -0
  151. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js.map +1 -0
  152. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +351 -0
  153. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -0
  154. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +71 -0
  155. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -0
  156. package/dist/esm/components/CnSectionsWidget/index.js +35 -0
  157. package/dist/esm/components/CnSectionsWidget/index.js.map +1 -0
  158. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
  159. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
  160. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js +10 -0
  161. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js.map +1 -0
  162. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js +347 -0
  163. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js.map +1 -0
  164. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js +184 -0
  165. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js.map +1 -0
  166. package/dist/esm/components/CnSettingsFormWidget/index.js +27 -0
  167. package/dist/esm/components/CnSettingsFormWidget/index.js.map +1 -0
  168. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +81 -2
  169. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  170. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  171. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +87 -6
  172. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  173. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +1 -0
  174. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  175. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +84 -1
  176. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
  177. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +85 -41
  178. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
  179. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js +10 -0
  180. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js.map +1 -0
  181. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js +159 -0
  182. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js.map +1 -0
  183. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js +60 -0
  184. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js.map +1 -0
  185. package/dist/esm/components/CnSwitchRowsWidget/index.js +26 -0
  186. package/dist/esm/components/CnSwitchRowsWidget/index.js.map +1 -0
  187. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +168 -7
  188. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  189. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +86 -23
  190. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  191. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +80 -1
  192. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
  193. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +75 -32
  194. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
  195. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +10 -0
  196. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js.map +1 -0
  197. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +269 -0
  198. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -0
  199. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js +106 -0
  200. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -0
  201. package/dist/esm/components/CnToggleTableWidget/index.js +27 -0
  202. package/dist/esm/components/CnToggleTableWidget/index.js.map +1 -0
  203. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +11 -0
  204. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  205. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +7 -2
  206. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  207. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  208. package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
  209. package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js.map +1 -1
  210. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +301 -6
  211. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  212. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +153 -55
  213. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  214. package/dist/esm/composables/useFormDraft.js +140 -9
  215. package/dist/esm/composables/useFormDraft.js.map +1 -1
  216. package/dist/esm/composables/useListView.js +4 -4
  217. package/dist/esm/composables/useListView.js.map +1 -1
  218. package/dist/esm/index.js +21 -1
  219. package/dist/esm/index.js.map +1 -1
  220. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +28 -20
  221. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
  222. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js +9 -0
  223. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
  224. package/dist/esm/integrations/builtin/field-inspection.js +21 -0
  225. package/dist/esm/integrations/builtin/field-inspection.js.map +1 -1
  226. package/dist/esm/integrations/offline/checklistSubmission.js +141 -0
  227. package/dist/esm/integrations/offline/checklistSubmission.js.map +1 -0
  228. package/dist/esm/integrations/offline/fieldCollectionHelpers.js +70 -5
  229. package/dist/esm/integrations/offline/fieldCollectionHelpers.js.map +1 -1
  230. package/dist/esm/integrations/offline/index.js +2 -1
  231. package/dist/esm/integrations/offline/index.js.map +1 -1
  232. package/dist/esm/integrations/offline/offlineDb.js +6 -1
  233. package/dist/esm/integrations/offline/offlineDb.js.map +1 -1
  234. package/dist/esm/integrations/offline/syncReplayService.js +8 -2
  235. package/dist/esm/integrations/offline/syncReplayService.js.map +1 -1
  236. package/dist/esm/l10n/en.json.js +20 -1
  237. package/dist/esm/l10n/en.json.js.map +1 -1
  238. package/dist/esm/l10n/nl.json.js +70 -2
  239. package/dist/esm/l10n/nl.json.js.map +1 -1
  240. package/dist/esm/nextcloud-vue.css +2192 -222
  241. package/dist/esm/utils/contentHeaderLink.js +51 -0
  242. package/dist/esm/utils/contentHeaderLink.js.map +1 -0
  243. package/dist/esm/utils/detailActionModel.js +60 -3
  244. package/dist/esm/utils/detailActionModel.js.map +1 -1
  245. package/dist/esm/utils/facets.js +75 -3
  246. package/dist/esm/utils/facets.js.map +1 -1
  247. package/dist/esm/utils/fetchFilterCounts.js +40 -5
  248. package/dist/esm/utils/fetchFilterCounts.js.map +1 -1
  249. package/dist/esm/utils/fillTemplate.js +120 -0
  250. package/dist/esm/utils/fillTemplate.js.map +1 -0
  251. package/dist/esm/utils/initials.js +32 -0
  252. package/dist/esm/utils/initials.js.map +1 -0
  253. package/dist/esm/utils/libraryWidgetKeys.js +11 -0
  254. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  255. package/dist/esm/utils/objectWrite.js +59 -0
  256. package/dist/esm/utils/objectWrite.js.map +1 -0
  257. package/dist/esm/utils/pageControls.js +81 -0
  258. package/dist/esm/utils/pageControls.js.map +1 -0
  259. package/dist/esm/utils/personalLenses.js +40 -3
  260. package/dist/esm/utils/personalLenses.js.map +1 -1
  261. package/dist/esm/utils/queryPresets.js +96 -0
  262. package/dist/esm/utils/queryPresets.js.map +1 -0
  263. package/dist/esm/utils/resolveFilterTokens.js +12 -1
  264. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  265. package/dist/esm/utils/resolveManifestTokens.js +2 -0
  266. package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
  267. package/dist/esm/utils/schema.js +21 -0
  268. package/dist/esm/utils/schema.js.map +1 -1
  269. package/dist/esm/utils/sentinelTokens.js +22 -4
  270. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  271. package/dist/esm/utils/userGroupsPeek.js +91 -0
  272. package/dist/esm/utils/userGroupsPeek.js.map +1 -0
  273. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  274. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  275. package/dist/esm/utils/visibleWhen.js +57 -5
  276. package/dist/esm/utils/visibleWhen.js.map +1 -1
  277. package/dist/esm/utils/widgetDispatch.js +7 -1
  278. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  279. package/dist/esm/utils/widgetVisibility.js +4 -57
  280. package/dist/esm/utils/widgetVisibility.js.map +1 -1
  281. package/dist/nextcloud-vue.cjs.js +19708 -9301
  282. package/dist/nextcloud-vue.cjs.js.map +2 -2
  283. package/dist/nextcloud-vue.css +2192 -222
  284. package/l10n/en.json +20 -1
  285. package/l10n/nl.json +70 -2
  286. package/package.json +2 -1
  287. package/scripts/check-docs-mdx.mjs +108 -0
  288. package/src/components/CnActionButtons/CnActionButtons.vue +2 -0
  289. package/src/components/CnActionsBar/CnActionsBar.md +4 -0
  290. package/src/components/CnActionsBar/CnActionsBar.vue +48 -11
  291. package/src/components/CnAppRoot/CnAppRoot.md +4 -2
  292. package/src/components/CnAppRoot/CnAppRoot.vue +151 -59
  293. package/src/components/CnBannerWidget/CnBannerWidget.vue +244 -23
  294. package/src/components/CnCellRenderer/CnCellRenderer.md +2 -0
  295. package/src/components/CnCellRenderer/CnCellRenderer.vue +235 -5
  296. package/src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue +433 -0
  297. package/src/components/CnChipsFieldWidget/index.js +25 -0
  298. package/src/components/CnChoicePickerWidget/CnChoicePickerWidget.vue +556 -0
  299. package/src/components/CnChoicePickerWidget/index.js +26 -0
  300. package/src/components/CnConversationThread/CnConversationWidget.vue +1 -1
  301. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +2 -2
  302. package/src/components/CnDashboardPage/CnDashboardPage.vue +78 -5
  303. package/src/components/CnDataTable/CnDataTable.vue +22 -12
  304. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  305. package/src/components/CnDetailPage/CnDetailPage.vue +152 -6
  306. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +66 -0
  307. package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +1 -1
  308. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +7 -7
  309. package/src/components/CnFactsWidget/CnFactsWidget.vue +1190 -0
  310. package/src/components/CnFactsWidget/index.js +29 -0
  311. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +1008 -0
  312. package/src/components/CnFieldListWidget/index.js +28 -0
  313. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +588 -117
  314. package/src/components/CnFilesBrowser/filesBrowser.js +100 -0
  315. package/src/components/CnFilesBrowser/filesBrowserColumns.js +140 -0
  316. package/src/components/CnFormDialog/CnFormDialog.md +9 -3
  317. package/src/components/CnFormDialog/CnFormDialog.vue +69 -21
  318. package/src/components/CnFormPage/CnFormPage.vue +99 -3
  319. package/src/components/CnIndexPage/CnIndexPage.vue +309 -9
  320. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +169 -0
  321. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +7 -7
  322. package/src/components/CnNextStepCard/CnNextStepWidget.vue +1 -1
  323. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +69 -2
  324. package/src/components/CnObjectSidebar/CnFilesTab.vue +70 -1
  325. package/src/components/CnObjectSidebar/CnNotesTab.vue +16 -0
  326. package/src/components/CnPageRenderer/CnPageRenderer.vue +29 -1
  327. package/src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue +313 -0
  328. package/src/components/CnRadioCardsWidget/index.js +27 -0
  329. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +652 -0
  330. package/src/components/CnRecordListWidget/index.js +30 -0
  331. package/src/components/CnSavedViewsWidget/CnSavedViewsWidget.vue +296 -0
  332. package/src/components/CnSavedViewsWidget/index.js +29 -0
  333. package/src/components/CnSectionsWidget/CnSectionsWidget.vue +489 -0
  334. package/src/components/CnSectionsWidget/index.js +34 -0
  335. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +13 -0
  336. package/src/components/CnSettingsFormWidget/CnSettingsFormWidget.vue +555 -0
  337. package/src/components/CnSettingsFormWidget/index.js +26 -0
  338. package/src/components/CnStagesWidget/CnStagesWidget.vue +81 -2
  339. package/src/components/CnStatWidget/CnStatWidget.vue +88 -7
  340. package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +180 -3
  341. package/src/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue +226 -0
  342. package/src/components/CnSwitchRowsWidget/index.js +25 -0
  343. package/src/components/CnTabsWidget/CnTabsWidget.vue +263 -8
  344. package/src/components/CnTasksWidget/CnTasksWidget.vue +175 -15
  345. package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +386 -0
  346. package/src/components/CnToggleTableWidget/index.js +26 -0
  347. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +11 -0
  348. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +7 -2
  349. package/src/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
  350. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +493 -11
  351. package/src/components/index.js +19 -0
  352. package/src/composables/__tests__/useFormDraft.spec.js +69 -0
  353. package/src/composables/useFormDraft.js +139 -8
  354. package/src/composables/useListView.js +4 -4
  355. package/src/css/form-field.css +14 -0
  356. package/src/css/index-page.css +71 -0
  357. package/src/css/kpi-card.css +32 -0
  358. package/src/css/look-board-detail.css +113 -2
  359. package/src/css/look-board-index.css +90 -8
  360. package/src/css/look-board.css +109 -2
  361. package/src/css/table.css +19 -0
  362. package/src/index.js +19 -0
  363. package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +35 -20
  364. package/src/integrations/builtin/field-inspection.js +21 -0
  365. package/src/integrations/offline/checklistSubmission.js +137 -0
  366. package/src/integrations/offline/fieldCollectionHelpers.js +69 -4
  367. package/src/integrations/offline/index.js +3 -0
  368. package/src/integrations/offline/offlineDb.js +6 -1
  369. package/src/integrations/offline/syncReplayService.js +8 -2
  370. package/src/schemas/app-manifest-v2.schema.json +196 -13
  371. package/src/utils/contentHeaderLink.js +48 -0
  372. package/src/utils/detailActionModel.js +59 -2
  373. package/src/utils/facets.js +74 -2
  374. package/src/utils/fetchFilterCounts.js +39 -4
  375. package/src/utils/fillTemplate.js +116 -0
  376. package/src/utils/initials.js +29 -0
  377. package/src/utils/libraryWidgetKeys.js +11 -0
  378. package/src/utils/objectWrite.js +55 -0
  379. package/src/utils/pageControls.js +78 -0
  380. package/src/utils/personalLenses.js +39 -2
  381. package/src/utils/queryPresets.js +93 -0
  382. package/src/utils/resolveFilterTokens.js +14 -1
  383. package/src/utils/resolveManifestTokens.js +2 -0
  384. package/src/utils/schema.js +21 -0
  385. package/src/utils/sentinelTokens.js +22 -4
  386. package/src/utils/userGroupsPeek.js +87 -0
  387. package/src/utils/validateManifestV2.compiled.js +3 -3
  388. package/src/utils/visibleWhen.js +56 -4
  389. package/src/utils/widgetDispatch.js +7 -1
  390. package/src/utils/widgetVisibility.js +7 -56
@@ -0,0 +1,489 @@
1
+ <!--
2
+ - SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ - SPDX-License-Identifier: EUPL-1.2
4
+ -->
5
+
6
+ <template>
7
+ <div
8
+ class="cn-sections-widget"
9
+ :class="{
10
+ 'cn-sections-widget--cards': cards,
11
+ 'cn-sections-widget--two-column': twoColumn,
12
+ }"
13
+ data-testid="cn-sections-widget">
14
+ <div
15
+ v-for="column in columns"
16
+ :key="column.id"
17
+ class="cn-sections-widget__column"
18
+ :class="`cn-sections-widget__column--${column.id}`">
19
+ <section
20
+ v-for="section in column.sections"
21
+ :key="section.key"
22
+ class="cn-sections-widget__section"
23
+ :class="{ 'cn-sections-widget__section--empty': !isShown(section.key) }"
24
+ :aria-labelledby="section.title && isShown(section.key) ? headingId(section.key) : undefined"
25
+ :data-testid="`cn-section-${section.key}`">
26
+ <!-- The heading waits for content: a widget type that does not
27
+ resolve renders nothing, and a heading over nothing is a
28
+ label on a void. -->
29
+ <h3
30
+ v-if="section.title && isShown(section.key)"
31
+ :id="headingId(section.key)"
32
+ class="cn-sections-widget__heading">
33
+ {{ section.title }}
34
+ </h3>
35
+ <p
36
+ v-if="section.description && isShown(section.key)"
37
+ class="cn-sections-widget__description">
38
+ {{ section.description }}
39
+ </p>
40
+ <!-- The host always mounts, also while the section reads as
41
+ empty: a widget that has not mounted cannot fetch, so it
42
+ could never gain the content that would show it. -->
43
+ <div :ref="(el) => setHostRef(section.key, el)" class="cn-sections-widget__body">
44
+ <CnDetailWidgetHost
45
+ :widget="section.widget"
46
+ chrome="bare"
47
+ :objectId="objectId"
48
+ :object="objectData"
49
+ :objectType="objectType"
50
+ :schemaObject="schemaObject"
51
+ :register="register"
52
+ :schema="schema"
53
+ :store="store"
54
+ :surface="surface"
55
+ :integrationContext="integrationContext"
56
+ :cnRegistry="cnRegistry"
57
+ :availableWidgets="availableWidgets" />
58
+ </div>
59
+ </section>
60
+ </div>
61
+ </div>
62
+ </template>
63
+
64
+ <script>
65
+ import CnDetailWidgetHost from '../CnDetailWidgetHost/CnDetailWidgetHost.vue'
66
+
67
+ /** Counter for unique heading ids across instances. */
68
+ let instanceCounter = 0
69
+
70
+ /**
71
+ * CnSectionsWidget — the `sections` widget: several widgets in one place,
72
+ * each under its own heading.
73
+ *
74
+ * A tab strip binds one widget per tab, and a tab often holds more than one
75
+ * thing: the documents list and the case folder (DqZaak), a portal's details
76
+ * form, house style and sign-in (PtPortalInstellingen). This widget stacks
77
+ * them as sections under headings with a rule between them (the default), or
78
+ * as one card per section (`cards: true`), optionally in a main and a side
79
+ * column (`column: "side"` on a section). A single column of separate titled
80
+ * cards in a tab is the tabs widget's own `widgetIds` stack; this widget is
81
+ * for headed sections, and for the two-column card grid a settings tab draws.
82
+ *
83
+ * ```json
84
+ * {
85
+ * "type": "sections",
86
+ * "content": {
87
+ * "sections": [
88
+ * { "title": "Documenten", "widgetId": "case-documents" },
89
+ * { "title": "Zaakmap", "widget": { "type": "files" } }
90
+ * ]
91
+ * }
92
+ * }
93
+ * ```
94
+ *
95
+ * A section names its widget inline (`widget`) or by id (`widgetId`, a
96
+ * sibling definition on the same surface). Children render through
97
+ * `CnDetailWidgetHost` in bare mode, the dispatch a tab panel uses, so a child
98
+ * behaves here as it does in a tab. A section whose widget draws nothing
99
+ * shows no heading and takes no space (`hideEmpty`, default true). Stacked
100
+ * children share one cell, so an object list in a section renders every
101
+ * fetched row (`content.fit: false`) unless its definition says otherwise.
102
+ *
103
+ * @spec openspec/changes/abstract-sections-widget/specs/sections-widget/spec.md
104
+ */
105
+ export default {
106
+ name: 'CnSectionsWidget',
107
+
108
+ components: { CnDetailWidgetHost },
109
+
110
+ inject: {
111
+ cnTranslate: { default: () => (key) => key },
112
+ },
113
+
114
+ props: {
115
+ /**
116
+ * The widget configuration.
117
+ *
118
+ * - `sections` — `[{ key?, title?, description?, column?, widget? | widgetId? }]`, in order.
119
+ * `label` is accepted as an alias of `title`; `column` is `main` (default) or `side`.
120
+ * - `cards` — draw each section as its own card (default false: headings and a rule between sections).
121
+ * - `hideEmpty` — hide the heading and the space of a section whose widget drew nothing (default true).
122
+ *
123
+ * @type {{sections?: Array<object>, cards?: boolean, hideEmpty?: boolean}}
124
+ */
125
+ content: {
126
+ type: Object,
127
+ default: () => ({}),
128
+ },
129
+
130
+ /** Sibling widget definitions on the surface, for `widgetId` sections. */
131
+ availableWidgets: {
132
+ type: Array,
133
+ default: () => [],
134
+ },
135
+
136
+ /** The bound record's id. */
137
+ objectId: {
138
+ type: [String, Number],
139
+ default: '',
140
+ },
141
+
142
+ /** The loaded record, or null while it is still being fetched. */
143
+ objectData: {
144
+ type: Object,
145
+ default: null,
146
+ },
147
+
148
+ /** The resolved object-type slug. */
149
+ objectType: {
150
+ type: String,
151
+ default: '',
152
+ },
153
+
154
+ /** The resolved JSON Schema object, needed by a `data` child. */
155
+ schemaObject: {
156
+ type: Object,
157
+ default: null,
158
+ },
159
+
160
+ /** OpenRegister register slug of the surface. */
161
+ register: {
162
+ type: [String, Object],
163
+ default: '',
164
+ },
165
+
166
+ /** OpenRegister schema slug of the surface. */
167
+ schema: {
168
+ type: [String, Object],
169
+ default: '',
170
+ },
171
+
172
+ /** The effective object store. */
173
+ store: {
174
+ type: Object,
175
+ default: null,
176
+ },
177
+
178
+ /** Rendering surface forwarded to the children. */
179
+ surface: {
180
+ type: String,
181
+ default: 'detail-page',
182
+ },
183
+
184
+ /** Object context forwarded to integration children. */
185
+ integrationContext: {
186
+ type: Object,
187
+ default: null,
188
+ },
189
+
190
+ /** The consumer's component registry, for custom child widget types. */
191
+ cnRegistry: {
192
+ type: Object,
193
+ default: () => ({}),
194
+ },
195
+ },
196
+
197
+ data() {
198
+ instanceCounter += 1
199
+ return {
200
+ uid: instanceCounter,
201
+ /**
202
+ * Section key to "has this section rendered anything".
203
+ *
204
+ * @type {Record<string, boolean>}
205
+ */
206
+ filled: {},
207
+ }
208
+ },
209
+
210
+ computed: {
211
+ /**
212
+ * Whether each section is its own card.
213
+ *
214
+ * @return {boolean}
215
+ */
216
+ cards() {
217
+ return this.content?.cards === true
218
+ },
219
+
220
+ /**
221
+ * Whether an empty section hides.
222
+ *
223
+ * @return {boolean}
224
+ */
225
+ hideEmpty() {
226
+ return this.content?.hideEmpty !== false
227
+ },
228
+
229
+ /**
230
+ * The sections to render: a stable key, a translated title, the column
231
+ * and the widget definition. A section whose widget cannot be found is
232
+ * dropped (with a development warning for an unknown id).
233
+ *
234
+ * @return {Array<{key: string, title: string, description: string, column: string, widget: object}>}
235
+ * @spec openspec/changes/abstract-sections-widget/specs/sections-widget/spec.md#requirement-a-sections-widget-stacks-configured-widgets-under-headings
236
+ */
237
+ sections() {
238
+ const raw = Array.isArray(this.content?.sections) ? this.content.sections : []
239
+ const out = []
240
+ raw.forEach((entry, index) => {
241
+ if (!entry || typeof entry !== 'object') {
242
+ return
243
+ }
244
+ let widget = entry.widget && typeof entry.widget === 'object' ? entry.widget : null
245
+ if (!widget && typeof entry.widgetId === 'string' && entry.widgetId !== '') {
246
+ widget = this.availableWidgets.find((w) => w && w.id === entry.widgetId) || null
247
+ if (!widget) {
248
+ // eslint-disable-next-line no-console
249
+ console.warn(`[CnSectionsWidget] section widgetId "${entry.widgetId}" names no widget on this surface; section skipped.`)
250
+ }
251
+ }
252
+ if (!widget || !widget.type) {
253
+ return
254
+ }
255
+ out.push({
256
+ key: String(entry.key || widget.id || entry.widgetId || `${widget.type}-${index}`),
257
+ title: this.tr(entry.title || entry.label || ''),
258
+ description: this.tr(entry.description || ''),
259
+ column: entry.column === 'side' ? 'side' : 'main',
260
+ widget: this.shared(widget),
261
+ })
262
+ })
263
+ return out
264
+ },
265
+
266
+ /**
267
+ * Whether any section sits in the side column.
268
+ *
269
+ * @return {boolean}
270
+ */
271
+ twoColumn() {
272
+ return this.sections.some((section) => section.column === 'side')
273
+ },
274
+
275
+ /**
276
+ * The columns to draw, each with its sections in order.
277
+ *
278
+ * @return {Array<{id: string, sections: Array<object>}>}
279
+ * @spec openspec/changes/abstract-sections-widget/specs/sections-widget/spec.md#requirement-a-sections-widget-can-draw-cards-in-a-main-and-a-side-column
280
+ */
281
+ columns() {
282
+ if (!this.twoColumn) {
283
+ return [{ id: 'main', sections: this.sections }]
284
+ }
285
+ return [
286
+ { id: 'main', sections: this.sections.filter((section) => section.column === 'main') },
287
+ { id: 'side', sections: this.sections.filter((section) => section.column === 'side') },
288
+ ]
289
+ },
290
+ },
291
+
292
+ beforeUnmount() {
293
+ this.stopObserving()
294
+ },
295
+
296
+ methods: {
297
+ /**
298
+ * Translate through the host app.
299
+ *
300
+ * @param {string} text The text.
301
+ * @return {string}
302
+ */
303
+ tr(text) {
304
+ if (typeof text !== 'string' || text === '') {
305
+ return ''
306
+ }
307
+ return typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text
308
+ },
309
+
310
+ /**
311
+ * The heading id of a section.
312
+ *
313
+ * @param {string} key The section key.
314
+ * @return {string}
315
+ */
316
+ headingId(key) {
317
+ return `cn-sections-${this.uid}-${key}`.replace(/[^\w-]/g, '-')
318
+ },
319
+
320
+ /**
321
+ * A child definition with the cell budget off: stacked children share
322
+ * one cell, so an object list must not size itself to that cell.
323
+ *
324
+ * @param {object} widget The definition.
325
+ * @return {object}
326
+ */
327
+ shared(widget) {
328
+ const content = widget.content || {}
329
+ if (Object.hasOwn(content, 'fit')) {
330
+ return widget
331
+ }
332
+ return { ...widget, content: { ...content, fit: false } }
333
+ },
334
+
335
+ /**
336
+ * Whether a section shows its heading and takes space.
337
+ *
338
+ * @param {string} key The section key.
339
+ * @return {boolean}
340
+ * @spec openspec/changes/abstract-sections-widget/specs/sections-widget/spec.md#requirement-a-section-whose-widget-draws-nothing-stays-silent
341
+ */
342
+ isShown(key) {
343
+ return !this.hideEmpty || this.filled[key] === true
344
+ },
345
+
346
+ /**
347
+ * Watch one section's host for content, so its heading appears when
348
+ * the widget renders and stays away when it never does. A
349
+ * MutationObserver, because most widgets mount empty and fill after a
350
+ * fetch.
351
+ *
352
+ * @param {string} key The section key.
353
+ * @param {HTMLElement|null} el The host wrapper, or null on teardown.
354
+ * @return {void}
355
+ */
356
+ setHostRef(key, el) {
357
+ this.observers = this.observers || {}
358
+ if (this.observers[key]) {
359
+ this.observers[key].disconnect()
360
+ delete this.observers[key]
361
+ }
362
+ if (!el) {
363
+ return
364
+ }
365
+ // Assign only on a change: `filled` drives the template, so an
366
+ // unconditional write re-renders, mutates, and fires again.
367
+ const measure = () => {
368
+ const next = this.hasContent(el)
369
+ if (this.filled[key] === next) {
370
+ return
371
+ }
372
+ this.filled = { ...this.filled, [key]: next }
373
+ }
374
+ if (typeof MutationObserver === 'function') {
375
+ const observer = new MutationObserver(measure)
376
+ observer.observe(el, { childList: true, subtree: true, characterData: true })
377
+ this.observers[key] = observer
378
+ }
379
+ // Not synchronously: a ref callback runs during the patch.
380
+ this.$nextTick(measure)
381
+ },
382
+
383
+ /**
384
+ * Whether a host rendered anything a reader would see: text (an empty
385
+ * state counts), or a graphical or interactive element.
386
+ *
387
+ * @param {HTMLElement} el The host wrapper.
388
+ * @return {boolean}
389
+ */
390
+ hasContent(el) {
391
+ if (!el) {
392
+ return false
393
+ }
394
+ if (el.textContent && el.textContent.trim().length > 0) {
395
+ return true
396
+ }
397
+ return el.querySelector('img, svg, canvas, table, input, button, select, textarea') !== null
398
+ },
399
+
400
+ /**
401
+ * Drop every observer.
402
+ *
403
+ * @return {void}
404
+ */
405
+ stopObserving() {
406
+ for (const observer of Object.values(this.observers || {})) {
407
+ observer.disconnect()
408
+ }
409
+ this.observers = {}
410
+ },
411
+ },
412
+ }
413
+ </script>
414
+
415
+ <style scoped>
416
+ .cn-sections-widget {
417
+ min-width: 0;
418
+ }
419
+
420
+ .cn-sections-widget__column {
421
+ display: flex;
422
+ flex-direction: column;
423
+ gap: calc(var(--default-grid-baseline, 4px) * 4);
424
+ min-width: 0;
425
+ }
426
+
427
+ /* A main and a side column (the settings boards: 1fr and 418px, 20px apart). */
428
+ .cn-sections-widget--two-column {
429
+ display: grid;
430
+ grid-template-columns: minmax(0, 1fr) minmax(280px, 418px);
431
+ gap: 20px;
432
+ align-items: start;
433
+ }
434
+
435
+ @media (max-width: 1024px) {
436
+ .cn-sections-widget--two-column {
437
+ grid-template-columns: minmax(0, 1fr);
438
+ }
439
+ }
440
+
441
+ /* A host page may space every <section>; these sections are spaced by the column gap only. */
442
+ .cn-sections-widget__section {
443
+ margin: 0;
444
+ min-width: 0;
445
+ }
446
+
447
+ /* A rule above a section that follows a shown one. */
448
+ .cn-sections-widget:not(.cn-sections-widget--cards) .cn-sections-widget__section:not(.cn-sections-widget__section--empty) ~ .cn-sections-widget__section {
449
+ padding-top: calc(var(--default-grid-baseline, 4px) * 4);
450
+ border-top: 1px solid var(--color-border);
451
+ }
452
+
453
+ /*
454
+ * An empty section keeps its host mounted (display: none still mounts it, so
455
+ * the widget fetches and can fill later) but takes no space, gap or rule.
456
+ */
457
+ .cn-sections-widget__section--empty {
458
+ display: none;
459
+ }
460
+
461
+ .cn-sections-widget__heading {
462
+ margin: 0 0 calc(var(--default-grid-baseline, 4px) * 2);
463
+ font-size: 16px;
464
+ font-weight: 600;
465
+ color: var(--color-main-text);
466
+ }
467
+
468
+ .cn-sections-widget__description {
469
+ margin: calc(var(--default-grid-baseline, 4px) * -1) 0 calc(var(--default-grid-baseline, 4px) * 3);
470
+ color: var(--color-text-maxcontrast);
471
+ }
472
+
473
+ /* One card per section. */
474
+ .cn-sections-widget--cards .cn-sections-widget__column {
475
+ gap: 20px;
476
+ }
477
+
478
+ .cn-sections-widget--cards .cn-sections-widget__section {
479
+ background: var(--color-main-background);
480
+ border: 1px solid var(--color-border);
481
+ border-radius: var(--cn-board-card-radius, var(--border-radius-large, 12px));
482
+ padding: var(--cn-board-card-padding, 16px 20px);
483
+ }
484
+
485
+ .cn-sections-widget--cards .cn-sections-widget__heading {
486
+ font-size: 18px;
487
+ margin-bottom: 12px;
488
+ }
489
+ </style>
@@ -0,0 +1,34 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ * SPDX-License-Identifier: EUPL-1.2
4
+ *
5
+ * CnSectionsWidget — self-registers the `sections` widget type (several
6
+ * widgets in one place, each under its own heading, optionally as cards in a
7
+ * main and a side column) into the shared dashboardWidgetRegistry at module
8
+ * load. Renderer only: the sections are declared in the manifest.
9
+ */
10
+
11
+ import CnSectionsWidget from './CnSectionsWidget.vue'
12
+ import { registerDashboardWidget } from '../CnWidgetGrid/dashboardWidgetRegistry.js'
13
+
14
+ registerDashboardWidget('sections', {
15
+ renderer: CnSectionsWidget,
16
+ form: null,
17
+ defaultContent: {
18
+ sections: [],
19
+ cards: false,
20
+ hideEmpty: true,
21
+ },
22
+ displayName: 'Sections',
23
+ icon: 'ViewSequential',
24
+ // Renders OTHER widgets, so CnDetailWidgetHost hands it the surface's
25
+ // sibling definitions and the context its children need.
26
+ container: true,
27
+ // The section headings are the titles; a card header above them would
28
+ // name the group twice.
29
+ ownsTitle: true,
30
+ surfaces: ['detail-page'],
31
+ })
32
+
33
+ export { CnSectionsWidget }
34
+ export default CnSectionsWidget
@@ -367,4 +367,17 @@ export default {
367
367
  border-color: transparent;
368
368
  box-shadow: 0 1px 2px var(--color-box-shadow);
369
369
  }
370
+
371
+ /* On a phone (screens-dashboard-phone) the compact group's segments are 44px
372
+ high touch targets, and the group wraps onto a second row instead of
373
+ running off the screen. */
374
+ @media (max-width: 640px) {
375
+ .cn-segmented-control.cn-segmented-control--compact {
376
+ flex-wrap: wrap;
377
+ }
378
+
379
+ .cn-segmented-control.cn-segmented-control--compact .cn-segmented-control__option {
380
+ min-height: 44px;
381
+ }
382
+ }
370
383
  </style>