@conduction/nextcloud-vue 2.56.0-beta.6 → 2.56.0-beta.7

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 (235) hide show
  1. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js +14 -1
  2. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
  4. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +39 -0
  5. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  6. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +46 -4
  7. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  8. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +224 -9
  9. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  10. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +79 -25
  11. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  12. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js +42 -3
  13. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js.map +1 -1
  14. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js +39 -6
  15. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js.map +1 -1
  16. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +46 -0
  17. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +11 -4
  19. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  20. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js +10 -0
  21. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js.map +1 -0
  22. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +39 -0
  23. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -0
  24. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +16 -0
  25. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js.map +1 -0
  26. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +117 -1
  27. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  28. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +147 -89
  29. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  30. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +10 -0
  31. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js.map +1 -0
  32. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +259 -0
  33. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -0
  34. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +131 -0
  35. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -0
  36. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +10 -0
  37. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js.map +1 -0
  38. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +116 -0
  39. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -0
  40. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +24 -0
  41. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -0
  42. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +503 -28
  43. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  44. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +300 -142
  45. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  46. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js +10 -0
  47. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js.map +1 -0
  48. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js +237 -0
  49. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js.map +1 -0
  50. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js +120 -0
  51. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js.map +1 -0
  52. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js +10 -0
  53. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js.map +1 -0
  54. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +77 -0
  55. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -0
  56. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js +27 -0
  57. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -0
  58. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +169 -12
  59. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
  60. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +15 -7
  61. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
  62. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js +37 -3
  63. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js.map +1 -1
  64. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js +44 -16
  65. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js.map +1 -1
  66. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +132 -3
  67. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  68. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +6 -3
  69. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  70. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js +10 -0
  71. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js.map +1 -0
  72. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js +150 -0
  73. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js.map +1 -0
  74. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js +106 -0
  75. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js.map +1 -0
  76. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js +9 -0
  77. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js.map +1 -0
  78. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +47 -0
  79. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -0
  80. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js +17 -0
  81. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js.map +1 -0
  82. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +49 -0
  83. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  84. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  85. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js +6 -0
  86. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js.map +1 -1
  87. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue3.js.map +1 -1
  88. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js +46 -0
  89. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js.map +1 -1
  90. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js +15 -3
  91. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js.map +1 -1
  92. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +37 -1
  93. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  94. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +29 -13
  95. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  96. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +50 -3
  97. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  98. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  99. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js +10 -0
  100. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js.map +1 -0
  101. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +186 -0
  102. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -0
  103. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +46 -0
  104. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -0
  105. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +11 -0
  106. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js.map +1 -0
  107. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +298 -0
  108. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -0
  109. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +77 -0
  110. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -0
  111. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js +10 -0
  112. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js.map +1 -0
  113. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js +169 -0
  114. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js.map +1 -0
  115. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js +48 -0
  116. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js.map +1 -0
  117. package/dist/esm/components/CnTabs/CnTab.vue2.js +35 -0
  118. package/dist/esm/components/CnTabs/CnTab.vue2.js.map +1 -1
  119. package/dist/esm/components/CnTabs/CnTab.vue3.js.map +1 -1
  120. package/dist/esm/components/CnTabs/CnTabs.vue2.js +120 -7
  121. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  122. package/dist/esm/components/CnTabs/CnTabs.vue3.js +57 -5
  123. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  124. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +59 -4
  125. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  126. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +6 -2
  127. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  128. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +10 -0
  129. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js.map +1 -0
  130. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +484 -0
  131. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -0
  132. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js +115 -0
  133. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -0
  134. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js +10 -0
  135. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js.map +1 -0
  136. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js +189 -0
  137. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js.map +1 -0
  138. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js +74 -0
  139. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js.map +1 -0
  140. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +82 -8
  141. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  142. package/dist/esm/index.js +10 -0
  143. package/dist/esm/index.js.map +1 -1
  144. package/dist/esm/l10n/en.json.js +54 -1
  145. package/dist/esm/l10n/en.json.js.map +1 -1
  146. package/dist/esm/l10n/nl.json.js +54 -1
  147. package/dist/esm/l10n/nl.json.js.map +1 -1
  148. package/dist/esm/nextcloud-vue.css +931 -4
  149. package/dist/esm/utils/dateVariant.js +124 -0
  150. package/dist/esm/utils/dateVariant.js.map +1 -0
  151. package/dist/esm/utils/detailActionModel.js +260 -0
  152. package/dist/esm/utils/detailActionModel.js.map +1 -0
  153. package/dist/esm/utils/dueRule.js +84 -0
  154. package/dist/esm/utils/dueRule.js.map +1 -0
  155. package/dist/esm/utils/fetchAggregate.js +37 -1
  156. package/dist/esm/utils/fetchAggregate.js.map +1 -1
  157. package/dist/esm/utils/fetchFilterCounts.js +186 -0
  158. package/dist/esm/utils/fetchFilterCounts.js.map +1 -0
  159. package/dist/esm/utils/libraryWidgetKeys.js +5 -0
  160. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  161. package/dist/esm/utils/readPath.js +30 -0
  162. package/dist/esm/utils/readPath.js.map +1 -0
  163. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  164. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  165. package/dist/nextcloud-vue.cjs.js +14970 -8991
  166. package/dist/nextcloud-vue.cjs.js.map +2 -2
  167. package/dist/nextcloud-vue.css +931 -4
  168. package/l10n/en.json +54 -1
  169. package/l10n/nl.json +54 -1
  170. package/package.json +1 -1
  171. package/scripts/.jsdoc-baselines.json +3 -0
  172. package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -1
  173. package/src/components/CnAppNav/CnAppNav.md +26 -0
  174. package/src/components/CnAppNav/CnAppNav.vue +104 -1
  175. package/src/components/CnBannerWidget/CnBannerWidget.vue +365 -10
  176. package/src/components/CnBannerWidgetForm/CnBannerWidgetForm.vue +65 -3
  177. package/src/components/CnBoardView/CnBoardView.vue +77 -0
  178. package/src/components/CnBrandStripe/CnBrandStripe.md +22 -0
  179. package/src/components/CnBrandStripe/CnBrandStripe.vue +100 -0
  180. package/src/components/CnBrandStripe/index.js +4 -0
  181. package/src/components/CnCellRenderer/CnCellRenderer.vue +207 -1
  182. package/src/components/CnConversationThread/CnConversationThread.md +51 -0
  183. package/src/components/CnConversationThread/CnConversationThread.vue +457 -0
  184. package/src/components/CnConversationThread/CnConversationWidget.vue +144 -0
  185. package/src/components/CnConversationThread/index.js +4 -0
  186. package/src/components/CnDetailPage/CnDetailPage.md +16 -0
  187. package/src/components/CnDetailPage/CnDetailPage.vue +683 -48
  188. package/src/components/CnDocumentReviewList/CnDocumentReviewList.md +55 -0
  189. package/src/components/CnDocumentReviewList/CnDocumentReviewList.vue +384 -0
  190. package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +108 -0
  191. package/src/components/CnDocumentReviewList/index.js +4 -0
  192. package/src/components/CnHeaderWidget/CnHeaderWidget.vue +189 -14
  193. package/src/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue +53 -3
  194. package/src/components/CnIndexPage/CnIndexPage.vue +135 -3
  195. package/src/components/CnNextStepCard/CnNextStepCard.md +40 -0
  196. package/src/components/CnNextStepCard/CnNextStepCard.vue +319 -0
  197. package/src/components/CnNextStepCard/CnNextStepWidget.vue +59 -0
  198. package/src/components/CnNextStepCard/index.js +4 -0
  199. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +49 -0
  200. package/src/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue +6 -0
  201. package/src/components/CnObjectKanban/CnObjectKanban.vue +86 -2
  202. package/src/components/CnQuickFilterBar/CnQuickFilterBar.md +3 -0
  203. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +60 -1
  204. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +50 -3
  205. package/src/components/CnSegmentedControl/CnSegmentedControl.md +46 -0
  206. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +291 -0
  207. package/src/components/CnSegmentedControl/index.js +4 -0
  208. package/src/components/CnStackedBarWidget/CnStackedBarWidget.md +15 -0
  209. package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +414 -0
  210. package/src/components/CnStackedBarWidget/index.js +14 -0
  211. package/src/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue +224 -0
  212. package/src/components/CnStackedBarWidgetForm/index.js +4 -0
  213. package/src/components/CnTabs/CnTab.vue +35 -0
  214. package/src/components/CnTabs/CnTabs.vue +244 -10
  215. package/src/components/CnTabsWidget/CnTabsWidget.vue +63 -4
  216. package/src/components/CnWeekStripWidget/CnWeekStripWidget.md +31 -0
  217. package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +668 -0
  218. package/src/components/CnWeekStripWidget/index.js +14 -0
  219. package/src/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue +265 -0
  220. package/src/components/CnWeekStripWidgetForm/index.js +4 -0
  221. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +74 -0
  222. package/src/components/index.js +11 -0
  223. package/src/css/detail-page.css +47 -0
  224. package/src/index.js +9 -0
  225. package/src/schemas/app-manifest-v2.schema.json +389 -1
  226. package/src/schemas/app-manifest.schema.json +2 -1
  227. package/src/utils/dateVariant.js +120 -0
  228. package/src/utils/detailActionModel.js +256 -0
  229. package/src/utils/dueRule.js +94 -0
  230. package/src/utils/fetchAggregate.js +36 -0
  231. package/src/utils/fetchFilterCounts.js +182 -0
  232. package/src/utils/index.js +1 -0
  233. package/src/utils/libraryWidgetKeys.js +5 -0
  234. package/src/utils/readPath.js +27 -0
  235. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -0,0 +1,265 @@
1
+ <!--
2
+ - SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ - SPDX-License-Identifier: EUPL-1.2
4
+ -->
5
+
6
+ <template>
7
+ <div class="cn-week-strip-form">
8
+ <div class="cn-week-strip-form__row2">
9
+ <CnRegisterSchemaSelect
10
+ :register="source.register"
11
+ :schema="source.schema"
12
+ @update:register="updateSource('register', $event)"
13
+ @update:schema="updateSource('schema', $event)" />
14
+ </div>
15
+
16
+ <div class="cn-week-strip-form__row2">
17
+ <CnFieldPicker
18
+ :value="dateField"
19
+ :label="t('nextcloud-vue', 'Date field')"
20
+ :options="availableFields"
21
+ placeholder="deadline"
22
+ @update="updateField('dateField', $event)" />
23
+ <CnFieldPicker
24
+ :value="titleField"
25
+ :label="t('nextcloud-vue', 'Title field')"
26
+ :options="availableFields"
27
+ placeholder="title"
28
+ @update="updateField('titleField', $event)" />
29
+ </div>
30
+
31
+ <NcTextField
32
+ :modelValue="metaFieldsText"
33
+ :label="t('nextcloud-vue', 'Extra fields under the title (comma separated)')"
34
+ placeholder="identifier, type"
35
+ @update:modelValue="updateField('metaFieldsText', $event)" />
36
+
37
+ <CnFilterRowsEditor :value="filterRows" :fields="availableFields" @input="onFilterRows" />
38
+
39
+ <div class="cn-week-strip-form__row2">
40
+ <NcSelect
41
+ :modelValue="days"
42
+ :options="dayOptions"
43
+ :inputLabel="t('nextcloud-vue', 'Days shown')"
44
+ :clearable="false"
45
+ @update:modelValue="updateField('days', $event)" />
46
+ <NcTextField
47
+ :modelValue="itemRoute"
48
+ :label="t('nextcloud-vue', 'Page an item opens (page id, optional)')"
49
+ @update:modelValue="updateField('itemRoute', $event)" />
50
+ </div>
51
+
52
+ <NcTextField
53
+ :modelValue="emptyText"
54
+ :label="t('nextcloud-vue', 'Text for a day without items')"
55
+ @update:modelValue="updateField('emptyText', $event)" />
56
+ </div>
57
+ </template>
58
+
59
+ <script>
60
+ import { translate as t } from '@nextcloud/l10n'
61
+ import { NcSelect, NcTextField } from '@nextcloud/vue'
62
+ import CnFieldPicker from '../CnFieldPicker/CnFieldPicker.vue'
63
+ import CnFilterRowsEditor from '../CnFilterRowsEditor/CnFilterRowsEditor.vue'
64
+ import CnRegisterSchemaSelect from '../CnRegisterSchemaSelect/CnRegisterSchemaSelect.vue'
65
+ import { fetchSchemaProperties } from '../../utils/fetchSchemaProperties.js'
66
+ import { filterToRows, rowsToFilter } from '../CnFilterRowsEditor/filterRows.js'
67
+
68
+ /**
69
+ * CnWeekStripWidgetForm is the settings form of a `week-strip` widget. It
70
+ * edits the source (register, schema, filter), the date field the items are
71
+ * bucketed by, what each item shows, how many days render and the text of an
72
+ * empty day. Static `items` and the `lateWhen` rule are written in the
73
+ * manifest and pass through untouched. Emits `update:content` on every
74
+ * change; `validate()` asks for a register, a schema and a date field unless
75
+ * the widget has static items.
76
+ */
77
+ export default {
78
+ name: 'CnWeekStripWidgetForm',
79
+
80
+ components: { NcSelect, NcTextField, CnFieldPicker, CnFilterRowsEditor, CnRegisterSchemaSelect },
81
+
82
+ props: {
83
+ /**
84
+ * The placement being edited (pre-fills from `editingWidget.content`), or null.
85
+ *
86
+ * @type {{content: object}|null}
87
+ */
88
+ editingWidget: { type: Object, default: null },
89
+ /**
90
+ * Initial content values when not editing (registry defaults).
91
+ *
92
+ * @type {object}
93
+ */
94
+ value: { type: Object, default: () => ({}) },
95
+ },
96
+
97
+ emits: [
98
+ /**
99
+ * Emitted with the assembled content blob on every field change.
100
+ *
101
+ * @event update:content
102
+ * @type {object}
103
+ */
104
+ 'update:content',
105
+ ],
106
+
107
+ data() {
108
+ const initial = this.editingWidget?.content || this.value || {}
109
+ const src = initial.source || {}
110
+ return {
111
+ initial,
112
+ source: { register: src.register ?? '', schema: src.schema ?? '' },
113
+ limit: src.limit,
114
+ filterRows: filterToRows(src.filter || {}),
115
+ dateField: initial.dateField ?? '',
116
+ titleField: initial.titleField ?? '',
117
+ metaFieldsText: Array.isArray(initial.metaFields) ? initial.metaFields.join(', ') : '',
118
+ days: Number(initial.days) === 7 ? 7 : 5,
119
+ itemRoute: initial.itemRoute ?? '',
120
+ emptyText: initial.emptyText ?? '',
121
+ availableFields: [],
122
+ }
123
+ },
124
+
125
+ computed: {
126
+ /**
127
+ * The day counts on offer: working days or the whole week.
128
+ *
129
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
130
+ */
131
+ dayOptions() {
132
+ return [5, 7]
133
+ },
134
+
135
+ /**
136
+ * The assembled content blob. Keys the form does not edit (static
137
+ * items, the late rule) are carried over from the initial content.
138
+ *
139
+ * @return {object}
140
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
141
+ */
142
+ assembledContent() {
143
+ const source = {
144
+ register: this.source.register,
145
+ schema: this.source.schema,
146
+ filter: rowsToFilter(this.filterRows),
147
+ }
148
+ if (this.limit !== undefined) {
149
+ source.limit = this.limit
150
+ }
151
+ return {
152
+ ...this.initial,
153
+ source,
154
+ dateField: this.dateField,
155
+ titleField: this.titleField,
156
+ metaFields: this.metaFieldsText.split(',').map((field) => field.trim()).filter((field) => field !== ''),
157
+ days: this.days,
158
+ itemRoute: this.itemRoute,
159
+ emptyText: this.emptyText,
160
+ }
161
+ },
162
+ },
163
+
164
+ watch: {
165
+ 'source.register': 'loadFields',
166
+ 'source.schema': 'loadFields',
167
+ },
168
+
169
+ mounted() {
170
+ this.loadFields()
171
+ },
172
+
173
+ methods: {
174
+ t,
175
+
176
+ /**
177
+ * Load the schema's field names for the pickers.
178
+ *
179
+ * @return {Promise<void>}
180
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
181
+ */
182
+ async loadFields() {
183
+ this.availableFields = await fetchSchemaProperties(this.source.register, this.source.schema)
184
+ },
185
+
186
+ /**
187
+ * Set one field and emit the assembled content.
188
+ *
189
+ * @param {string} field The data key to write.
190
+ * @param {string|number} value The new value.
191
+ * @return {void}
192
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
193
+ */
194
+ updateField(field, value) {
195
+ this[field] = value
196
+ this.$emit('update:content', this.assembledContent)
197
+ },
198
+
199
+ /**
200
+ * Set the register or the schema and emit.
201
+ *
202
+ * @param {'register'|'schema'} field The source key to write.
203
+ * @param {string} value The chosen slug.
204
+ * @return {void}
205
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
206
+ */
207
+ updateSource(field, value) {
208
+ this.source[field] = value
209
+ this.$emit('update:content', this.assembledContent)
210
+ },
211
+
212
+ /**
213
+ * Take the filter editor's rows and emit.
214
+ *
215
+ * @param {Array<{key: string, op: string, value: string}>} rows The rows.
216
+ * @return {void}
217
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
218
+ */
219
+ onFilterRows(rows) {
220
+ this.filterRows = rows
221
+ this.$emit('update:content', this.assembledContent)
222
+ },
223
+
224
+ /**
225
+ * Validate the form; an empty array means valid.
226
+ *
227
+ * @return {string[]} The validation errors.
228
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-week-strip-widget
229
+ */
230
+ validate() {
231
+ const hasStaticItems = Array.isArray(this.initial.items) && this.initial.items.length > 0
232
+ if (hasStaticItems && !this.source.register && !this.source.schema) {
233
+ return []
234
+ }
235
+ const errors = []
236
+ if (!this.source.register || !this.source.schema) {
237
+ errors.push(t('nextcloud-vue', 'A register and schema are required'))
238
+ }
239
+ if (!this.dateField) {
240
+ errors.push(t('nextcloud-vue', 'A date field is required'))
241
+ }
242
+ return errors
243
+ },
244
+ },
245
+ }
246
+ </script>
247
+
248
+ <style scoped>
249
+ .cn-week-strip-form {
250
+ display: flex;
251
+ flex-direction: column;
252
+ gap: 12px;
253
+ }
254
+
255
+ .cn-week-strip-form__row2 {
256
+ display: flex;
257
+ gap: 12px;
258
+ align-items: flex-end;
259
+ }
260
+
261
+ .cn-week-strip-form__row2 > * {
262
+ flex: 1;
263
+ min-width: 0;
264
+ }
265
+ </style>
@@ -0,0 +1,4 @@
1
+ import CnWeekStripWidgetForm from './CnWeekStripWidgetForm.vue'
2
+
3
+ export default CnWeekStripWidgetForm
4
+ export { CnWeekStripWidgetForm }
@@ -17,20 +17,27 @@
17
17
 
18
18
  import CnChartWidget from '../CnChartWidget/CnChartWidget.vue'
19
19
  import CnChartWidgetForm from '../CnChartWidgetForm/CnChartWidgetForm.vue'
20
+ import CnConversationWidget from '../CnConversationThread/CnConversationWidget.vue'
20
21
  import CnCountdownWidget from '../CnCountdownWidget/CnCountdownWidget.vue'
21
22
  import CnCountdownWidgetForm from '../CnCountdownWidgetForm/CnCountdownWidgetForm.vue'
23
+ import CnDocumentReviewWidget from '../CnDocumentReviewList/CnDocumentReviewWidget.vue'
22
24
  import CnMapWidget from '../CnMapWidget/CnMapWidget.vue'
23
25
  import CnMapWidgetForm from '../CnMapWidgetForm/CnMapWidgetForm.vue'
26
+ import CnNextStepWidget from '../CnNextStepCard/CnNextStepWidget.vue'
24
27
  import CnObjectListWidget2 from '../CnObjectListWidget/CnObjectListWidget.vue'
25
28
  import CnObjectListWidgetForm2 from '../CnObjectListWidgetForm/CnObjectListWidgetForm.vue'
26
29
  import CnRelatedObjectsWidget from '../CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue'
27
30
  import CnRelatedObjectsWidgetForm from '../CnRelatedObjectsWidgetForm/CnRelatedObjectsWidgetForm.vue'
31
+ import CnStackedBarWidget from '../CnStackedBarWidget/CnStackedBarWidget.vue'
32
+ import CnStackedBarWidgetForm from '../CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue'
28
33
  import CnStagesWidget from '../CnStagesWidget/CnStagesWidget.vue'
29
34
  import CnStagesWidgetForm from '../CnStagesWidgetForm/CnStagesWidgetForm.vue'
30
35
  import CnStatsBlockWidget from '../CnStatsBlockWidget/CnStatsBlockWidget.vue'
31
36
  import CnStatsBlockWidgetForm from '../CnStatsBlockWidgetForm/CnStatsBlockWidgetForm.vue'
32
37
  import CnTabsWidget from '../CnTabsWidget/CnTabsWidget.vue'
33
38
  import CnTabsWidgetForm from '../CnTabsWidgetForm/CnTabsWidgetForm.vue'
39
+ import CnWeekStripWidget from '../CnWeekStripWidget/CnWeekStripWidget.vue'
40
+ import CnWeekStripWidgetForm from '../CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue'
34
41
  // Typed widgets registered with an explicit renderer + config FORM. chart /
35
42
  // stats-block render through CnDashboardPage's own isChart()/isStatsBlock()
36
43
  // branches and `related` through CnDetailPage's isRelatedWidget() branch — the
@@ -217,6 +224,41 @@ registerDashboardWidget('countdown', {
217
224
  surfaces: ['detail-page'],
218
225
  })
219
226
 
227
+ // The case surfaces (detail-action-model-and-case-surfaces). Each reads the
228
+ // BOUND RECORD, which only a detail page has, and none has a config form yet,
229
+ // so `form: null` keeps them out of the Add-widget picker: they are placed
230
+ // from the manifest. Registered inline for the same tree-shaking reason as
231
+ // `map` above.
232
+ registerDashboardWidget('next-step', {
233
+ renderer: CnNextStepWidget,
234
+ form: null,
235
+ defaultContent: { field: 'status', stages: {} },
236
+ displayName: 'Next step',
237
+ icon: 'CheckCircleOutline',
238
+ surfaces: ['detail-page'],
239
+ ownsTitle: true,
240
+ })
241
+
242
+ registerDashboardWidget('document-review', {
243
+ renderer: CnDocumentReviewWidget,
244
+ form: null,
245
+ defaultContent: { field: 'documents', statusField: 'reviewStatus', statuses: [] },
246
+ displayName: 'Document review',
247
+ icon: 'FileDocumentCheckOutline',
248
+ surfaces: ['detail-page'],
249
+ ownsTitle: true,
250
+ })
251
+
252
+ registerDashboardWidget('conversation', {
253
+ renderer: CnConversationWidget,
254
+ form: null,
255
+ defaultContent: { field: 'messages', endpoint: '' },
256
+ displayName: 'Conversation',
257
+ icon: 'ForumOutline',
258
+ surfaces: ['detail-page'],
259
+ ownsTitle: true,
260
+ })
261
+
220
262
  // The record's stages, where clicking a stage moves the record there.
221
263
  // Registered inline for the same tree-shaking reason as `map` above.
222
264
  registerDashboardWidget('stages', {
@@ -258,6 +300,38 @@ registerDashboardWidget('tabs', {
258
300
  surfaces: ['detail-page'],
259
301
  })
260
302
 
303
+ // The current week as day columns, with the dated items under each day.
304
+ // Registered inline for the same tree-shaking reason as `map` above.
305
+ registerDashboardWidget('week-strip', {
306
+ renderer: CnWeekStripWidget,
307
+ form: CnWeekStripWidgetForm,
308
+ defaultContent: {
309
+ source: { register: '', schema: '', filter: {} },
310
+ dateField: '',
311
+ titleField: '',
312
+ metaFields: [],
313
+ days: 5,
314
+ itemRoute: '',
315
+ emptyText: '',
316
+ },
317
+ displayName: 'Week strip',
318
+ icon: 'Calendar',
319
+ })
320
+
321
+ // One segmented bar with a legend that carries the numbers.
322
+ registerDashboardWidget('stacked-bar', {
323
+ renderer: CnStackedBarWidget,
324
+ form: CnStackedBarWidgetForm,
325
+ defaultContent: {
326
+ source: { register: '', schema: '', groupBy: '', filter: {} },
327
+ order: [],
328
+ labels: {},
329
+ emptyText: '',
330
+ },
331
+ displayName: 'Stacked bar',
332
+ icon: 'ChartBar',
333
+ })
334
+
261
335
  /**
262
336
  * Explicit no-op that guarantees this module (and therefore every widget's
263
337
  * self-registration side effect) is evaluated. Call it once at app bootstrap if
@@ -130,6 +130,9 @@ export { CnLeafMountHost } from './CnLeafMountHost/index.js'
130
130
  export { CnDetailCard } from './CnDetailCard/index.js'
131
131
  export { CnCard } from './CnCard/index.js'
132
132
  export { CnChoiceCards } from './CnChoiceCards/index.js'
133
+ export { CnNextStepCard } from './CnNextStepCard/index.js'
134
+ export { CnDocumentReviewList } from './CnDocumentReviewList/index.js'
135
+ export { CnConversationThread } from './CnConversationThread/index.js'
133
136
  export { CnStatsPanel } from './CnStatsPanel/index.js'
134
137
  export { CnJsonViewer } from './CnJsonViewer/index.js'
135
138
  export { CnColorPicker } from './CnColorPicker/index.js'
@@ -352,3 +355,11 @@ export { CnDetailWidgetHost } from './CnDetailWidgetHost/index.js'
352
355
 
353
356
  // Guardian/parent portal surface pattern (nextcloud-vue:guardian-portal-surface-pattern).
354
357
  export { CnGuardianHome } from './CnGuardianHome/index.js'
358
+
359
+ // Workplace dashboard primitives (openspec: workplace-dashboard-primitives).
360
+ export { CnWeekStripWidget } from './CnWeekStripWidget/index.js'
361
+ export { CnWeekStripWidgetForm } from './CnWeekStripWidgetForm/index.js'
362
+ export { CnStackedBarWidget } from './CnStackedBarWidget/index.js'
363
+ export { CnStackedBarWidgetForm } from './CnStackedBarWidgetForm/index.js'
364
+ export { CnSegmentedControl } from './CnSegmentedControl/index.js'
365
+ export { CnBrandStripe } from './CnBrandStripe/index.js'
@@ -342,6 +342,53 @@
342
342
  }
343
343
  }
344
344
 
345
+ /* The action model and case surfaces (detail-action-model-and-case-surfaces) */
346
+
347
+ /* Type and status pills above the title. */
348
+ .cn-detail-page__pills {
349
+ align-items: center;
350
+ display: flex;
351
+ flex-wrap: wrap;
352
+ gap: calc(2 * var(--default-grid-baseline));
353
+ margin-bottom: calc(1.5 * var(--default-grid-baseline));
354
+ }
355
+
356
+ .cn-detail-page__next-step {
357
+ margin-bottom: calc(5 * var(--default-grid-baseline));
358
+ }
359
+
360
+ /* Side column. The page becomes a wrapping flex row in which every child
361
+ takes a full line, except the body and the side column: those two share a
362
+ line while there is room for both (520px + 300px) and the column drops
363
+ under the body when there is not. No breakpoint, so it also holds inside a
364
+ split pane or beside an open sidebar, where the viewport says nothing about
365
+ the room the page has. Pages without a side column never get this class. */
366
+ .cn-detail-page--with-side {
367
+ align-items: flex-start;
368
+ column-gap: calc(5 * var(--default-grid-baseline));
369
+ display: flex;
370
+ flex-wrap: wrap;
371
+ }
372
+
373
+ .cn-detail-page--with-side > * {
374
+ flex: 1 1 100%;
375
+ min-width: 0;
376
+ }
377
+
378
+ .cn-detail-page--with-side > .cn-detail-page__body {
379
+ flex: 999 1 520px;
380
+ }
381
+
382
+ .cn-detail-page--with-side > .cn-detail-page__side {
383
+ flex: 1 1 300px;
384
+ }
385
+
386
+ .cn-detail-page__side {
387
+ display: flex;
388
+ flex-direction: column;
389
+ gap: calc(5 * var(--default-grid-baseline));
390
+ }
391
+
345
392
  /* The record as a place (case-page-and-list-as-a-place) */
346
393
 
347
394
  /* A skip link that reaches the page's declared primary action. Off screen
package/src/index.js CHANGED
@@ -65,6 +65,7 @@ export {
65
65
  CnContainerWidget,
66
66
  CnContainerWidgetForm,
67
67
  CnContextMenu,
68
+ CnConversationThread,
68
69
  CnCopyDialog,
69
70
  CnCountdownWidget,
70
71
  CnCountdownWidgetForm,
@@ -91,6 +92,7 @@ export {
91
92
  CnDetailWidgetHost,
92
93
  CnDividerWidget,
93
94
  CnDividerWidgetForm,
95
+ CnDocumentReviewList,
94
96
  CnEditActionsModal,
95
97
  CnEditDataModal,
96
98
  CnEditMenuModal,
@@ -180,6 +182,7 @@ export {
180
182
  CnNcDashboardWidgetForm,
181
183
  CnNcWidgetGridPicker,
182
184
  CnNcWidgetWidget,
185
+ CnNextStepCard,
183
186
  CnNoteCard,
184
187
  CnNotesCard,
185
188
  CnNotificationMatrix,
@@ -303,6 +306,11 @@ export {
303
306
  // @deprecated Use `CnBuildiqEditButton`.
304
307
  export { CnOpenBuildEditButton } from './components/index.js'
305
308
 
309
+ // Workplace dashboard primitives (openspec: workplace-dashboard-primitives):
310
+ // the week strip and stacked bar widgets with their forms, the segmented
311
+ // control, and the brand stripe.
312
+ export { CnBrandStripe, CnSegmentedControl, CnStackedBarWidget, CnStackedBarWidgetForm, CnWeekStripWidget, CnWeekStripWidgetForm } from './components/index.js'
313
+
306
314
  // AI Chat Companion component family
307
315
  export {
308
316
  CnAiAgentPicker,
@@ -511,6 +519,7 @@ export { filterWidgetsByVisibility, getCurrentUserGroups, getCurrentUserId, isWi
511
519
  export { safeHref, safeImageSrc, safeSvgPath } from './utils/index.js'
512
520
  export { followLinkClick, isModifiedClick, isNewTabHandled, isRowMiddleClick, openRowTarget, resolveHref } from './utils/index.js'
513
521
  export { resolveImageUrl } from './utils/index.js'
522
+ export { resolveDateVariant } from './utils/index.js'
514
523
  export { actionLink, dispatchAction } from './utils/actionsDispatcher.js'
515
524
  // Nested-modal stacking. `CnAppRoot` installs this itself; apps that do not
516
525
  // mount `CnAppRoot` should call `installModalStack()` once from `main.js`, or