@conduction/nextcloud-vue 2.80.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 (290) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +3 -3
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  4. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +80 -4
  5. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  6. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +95 -91
  7. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  8. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +140 -10
  9. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  10. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +52 -16
  11. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  12. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +17 -3
  13. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  14. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +63 -52
  15. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  16. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js +10 -0
  17. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js.map +1 -0
  18. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js +252 -0
  19. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js.map +1 -0
  20. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js +140 -0
  21. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js.map +1 -0
  22. package/dist/esm/components/CnChipsFieldWidget/index.js +26 -0
  23. package/dist/esm/components/CnChipsFieldWidget/index.js.map +1 -0
  24. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js +10 -0
  25. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js.map +1 -0
  26. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js +354 -0
  27. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js.map +1 -0
  28. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js +172 -0
  29. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js.map +1 -0
  30. package/dist/esm/components/CnChoicePickerWidget/index.js +27 -0
  31. package/dist/esm/components/CnChoicePickerWidget/index.js.map +1 -0
  32. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +1 -1
  33. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
  34. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
  35. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +2 -2
  36. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
  37. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
  38. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +65 -5
  39. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  40. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -1
  41. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  42. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +19 -11
  43. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  44. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +3 -2
  45. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  46. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +72 -0
  47. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  48. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +21 -4
  49. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  50. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +1 -1
  51. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -1
  52. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -1
  53. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js +7 -7
  54. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js.map +1 -1
  55. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue3.js.map +1 -1
  56. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +131 -0
  57. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
  58. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
  59. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +80 -5
  60. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -1
  61. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +282 -69
  62. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -1
  63. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +302 -4
  64. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  65. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +417 -244
  66. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  67. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +101 -1
  68. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  69. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +141 -1
  70. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
  71. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +60 -0
  72. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  73. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js +74 -49
  74. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  75. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +29 -2
  76. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  77. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +48 -4
  78. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  79. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +7 -7
  80. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  81. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  82. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +1 -1
  83. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -1
  84. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +65 -2
  85. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  86. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +6 -2
  87. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  88. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +63 -1
  89. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  90. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +8 -1
  91. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  92. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +14 -0
  93. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
  94. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js +5 -1
  95. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
  96. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js +10 -0
  97. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js.map +1 -0
  98. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js +174 -0
  99. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js.map +1 -0
  100. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js +75 -0
  101. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js.map +1 -0
  102. package/dist/esm/components/CnRadioCardsWidget/index.js +28 -0
  103. package/dist/esm/components/CnRadioCardsWidget/index.js.map +1 -0
  104. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +30 -6
  105. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
  106. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +34 -25
  107. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
  108. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js +10 -0
  109. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js.map +1 -0
  110. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js +222 -0
  111. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js.map +1 -0
  112. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js +64 -0
  113. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js.map +1 -0
  114. package/dist/esm/components/CnSavedViewsWidget/index.js +30 -0
  115. package/dist/esm/components/CnSavedViewsWidget/index.js.map +1 -0
  116. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
  117. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
  118. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js +10 -0
  119. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js.map +1 -0
  120. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js +347 -0
  121. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js.map +1 -0
  122. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js +184 -0
  123. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js.map +1 -0
  124. package/dist/esm/components/CnSettingsFormWidget/index.js +27 -0
  125. package/dist/esm/components/CnSettingsFormWidget/index.js.map +1 -0
  126. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +87 -6
  127. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  128. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  129. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +84 -1
  130. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
  131. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +85 -41
  132. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
  133. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js +10 -0
  134. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js.map +1 -0
  135. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js +159 -0
  136. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js.map +1 -0
  137. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js +60 -0
  138. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js.map +1 -0
  139. package/dist/esm/components/CnSwitchRowsWidget/index.js +26 -0
  140. package/dist/esm/components/CnSwitchRowsWidget/index.js.map +1 -0
  141. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +47 -1
  142. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  143. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +16 -14
  144. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  145. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +80 -1
  146. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
  147. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +75 -32
  148. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
  149. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +10 -0
  150. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js.map +1 -0
  151. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +269 -0
  152. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -0
  153. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js +106 -0
  154. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -0
  155. package/dist/esm/components/CnToggleTableWidget/index.js +27 -0
  156. package/dist/esm/components/CnToggleTableWidget/index.js.map +1 -0
  157. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +7 -0
  158. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  159. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +7 -2
  160. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  161. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  162. package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
  163. package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js.map +1 -1
  164. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +197 -6
  165. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  166. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +96 -50
  167. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  168. package/dist/esm/composables/useListView.js +4 -4
  169. package/dist/esm/composables/useListView.js.map +1 -1
  170. package/dist/esm/index.js +17 -1
  171. package/dist/esm/index.js.map +1 -1
  172. package/dist/esm/l10n/en.json.js +9 -1
  173. package/dist/esm/l10n/en.json.js.map +1 -1
  174. package/dist/esm/l10n/nl.json.js +55 -1
  175. package/dist/esm/l10n/nl.json.js.map +1 -1
  176. package/dist/esm/nextcloud-vue.css +1041 -12
  177. package/dist/esm/utils/contentHeaderLink.js +51 -0
  178. package/dist/esm/utils/contentHeaderLink.js.map +1 -0
  179. package/dist/esm/utils/facets.js +75 -3
  180. package/dist/esm/utils/facets.js.map +1 -1
  181. package/dist/esm/utils/fetchFilterCounts.js +40 -5
  182. package/dist/esm/utils/fetchFilterCounts.js.map +1 -1
  183. package/dist/esm/utils/fillTemplate.js +7 -1
  184. package/dist/esm/utils/fillTemplate.js.map +1 -1
  185. package/dist/esm/utils/initials.js +32 -0
  186. package/dist/esm/utils/initials.js.map +1 -0
  187. package/dist/esm/utils/libraryWidgetKeys.js +7 -0
  188. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  189. package/dist/esm/utils/objectWrite.js +59 -0
  190. package/dist/esm/utils/objectWrite.js.map +1 -0
  191. package/dist/esm/utils/pageControls.js +81 -0
  192. package/dist/esm/utils/pageControls.js.map +1 -0
  193. package/dist/esm/utils/personalLenses.js +40 -3
  194. package/dist/esm/utils/personalLenses.js.map +1 -1
  195. package/dist/esm/utils/resolveFilterTokens.js +1 -1
  196. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  197. package/dist/esm/utils/resolveManifestTokens.js +2 -0
  198. package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
  199. package/dist/esm/utils/sentinelTokens.js +19 -1
  200. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  201. package/dist/esm/utils/userGroupsPeek.js +91 -0
  202. package/dist/esm/utils/userGroupsPeek.js.map +1 -0
  203. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  204. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  205. package/dist/esm/utils/visibleWhen.js +57 -5
  206. package/dist/esm/utils/visibleWhen.js.map +1 -1
  207. package/dist/esm/utils/widgetDispatch.js +1 -1
  208. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  209. package/dist/esm/utils/widgetVisibility.js +4 -57
  210. package/dist/esm/utils/widgetVisibility.js.map +1 -1
  211. package/dist/nextcloud-vue.cjs.js +13589 -7833
  212. package/dist/nextcloud-vue.cjs.js.map +2 -2
  213. package/dist/nextcloud-vue.css +1041 -12
  214. package/l10n/en.json +9 -1
  215. package/l10n/nl.json +55 -1
  216. package/package.json +2 -1
  217. package/scripts/check-docs-mdx.mjs +108 -0
  218. package/src/components/CnActionsBar/CnActionsBar.vue +6 -1
  219. package/src/components/CnAppRoot/CnAppRoot.md +4 -2
  220. package/src/components/CnAppRoot/CnAppRoot.vue +151 -59
  221. package/src/components/CnBannerWidget/CnBannerWidget.vue +205 -20
  222. package/src/components/CnCellRenderer/CnCellRenderer.md +2 -0
  223. package/src/components/CnCellRenderer/CnCellRenderer.vue +47 -4
  224. package/src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue +433 -0
  225. package/src/components/CnChipsFieldWidget/index.js +25 -0
  226. package/src/components/CnChoicePickerWidget/CnChoicePickerWidget.vue +556 -0
  227. package/src/components/CnChoicePickerWidget/index.js +26 -0
  228. package/src/components/CnConversationThread/CnConversationWidget.vue +1 -1
  229. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +2 -2
  230. package/src/components/CnDashboardPage/CnDashboardPage.vue +78 -5
  231. package/src/components/CnDataTable/CnDataTable.vue +21 -12
  232. package/src/components/CnDetailPage/CnDetailPage.vue +89 -3
  233. package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +1 -1
  234. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +7 -7
  235. package/src/components/CnFactsWidget/CnFactsWidget.vue +142 -2
  236. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +268 -6
  237. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +588 -117
  238. package/src/components/CnFilesBrowser/filesBrowser.js +100 -0
  239. package/src/components/CnFilesBrowser/filesBrowserColumns.js +140 -0
  240. package/src/components/CnFormPage/CnFormPage.vue +81 -0
  241. package/src/components/CnIndexPage/CnIndexPage.vue +56 -4
  242. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +7 -7
  243. package/src/components/CnNextStepCard/CnNextStepWidget.vue +1 -1
  244. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +69 -2
  245. package/src/components/CnObjectSidebar/CnFilesTab.vue +70 -1
  246. package/src/components/CnObjectSidebar/CnNotesTab.vue +16 -0
  247. package/src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue +313 -0
  248. package/src/components/CnRadioCardsWidget/index.js +27 -0
  249. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +55 -6
  250. package/src/components/CnSavedViewsWidget/CnSavedViewsWidget.vue +296 -0
  251. package/src/components/CnSavedViewsWidget/index.js +29 -0
  252. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +13 -0
  253. package/src/components/CnSettingsFormWidget/CnSettingsFormWidget.vue +555 -0
  254. package/src/components/CnSettingsFormWidget/index.js +26 -0
  255. package/src/components/CnStatWidget/CnStatWidget.vue +87 -6
  256. package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +180 -3
  257. package/src/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue +226 -0
  258. package/src/components/CnSwitchRowsWidget/index.js +25 -0
  259. package/src/components/CnTabsWidget/CnTabsWidget.vue +82 -3
  260. package/src/components/CnTasksWidget/CnTasksWidget.vue +175 -15
  261. package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +386 -0
  262. package/src/components/CnToggleTableWidget/index.js +26 -0
  263. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +7 -0
  264. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +7 -2
  265. package/src/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
  266. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +309 -11
  267. package/src/components/index.js +15 -0
  268. package/src/composables/useListView.js +4 -4
  269. package/src/css/look-board-detail.css +36 -2
  270. package/src/css/look-board-index.css +39 -8
  271. package/src/css/look-board.css +72 -0
  272. package/src/index.js +15 -0
  273. package/src/schemas/app-manifest-v2.schema.json +93 -9
  274. package/src/utils/contentHeaderLink.js +48 -0
  275. package/src/utils/facets.js +74 -2
  276. package/src/utils/fetchFilterCounts.js +39 -4
  277. package/src/utils/fillTemplate.js +7 -1
  278. package/src/utils/initials.js +29 -0
  279. package/src/utils/libraryWidgetKeys.js +7 -0
  280. package/src/utils/objectWrite.js +55 -0
  281. package/src/utils/pageControls.js +78 -0
  282. package/src/utils/personalLenses.js +39 -2
  283. package/src/utils/resolveFilterTokens.js +3 -1
  284. package/src/utils/resolveManifestTokens.js +2 -0
  285. package/src/utils/sentinelTokens.js +19 -1
  286. package/src/utils/userGroupsPeek.js +87 -0
  287. package/src/utils/validateManifestV2.compiled.js +3 -3
  288. package/src/utils/visibleWhen.js +56 -4
  289. package/src/utils/widgetDispatch.js +1 -1
  290. package/src/utils/widgetVisibility.js +7 -56
@@ -7,7 +7,7 @@
7
7
  <section
8
8
  v-if="visible && isAttention"
9
9
  class="cn-banner-widget cn-banner-widget--attention"
10
- :class="'cn-banner-widget--' + resolvedVariant"
10
+ :class="['cn-banner-widget--' + resolvedVariant, { 'cn-banner-widget--stacked': isStacked }]"
11
11
  :aria-labelledby="headingId"
12
12
  data-testid="cn-banner-widget-attention">
13
13
  <div class="cn-banner-widget__body">
@@ -48,15 +48,27 @@
48
48
  </p>
49
49
  <div v-else-if="visible" class="cn-banner-widget">
50
50
  <NcNoteCard :type="resolvedVariant" class="cn-banner-widget__card">
51
- <component
52
- :is="clickable ? 'a' : 'span'"
53
- class="cn-banner-widget__text"
54
- :class="{ 'cn-banner-widget__text--clickable': clickable }"
55
- :href="clickable ? routeHref : null"
56
- data-testid="cn-banner-widget-text"
57
- @click="onClick">
58
- {{ displayText }}
59
- </component>
51
+ <!-- A named icon replaces the variant's own glyph. -->
52
+ <template v-if="resolvedIcon" #icon>
53
+ <CnIcon :name="resolvedIcon" :size="22" data-testid="cn-banner-widget-icon" />
54
+ </template>
55
+ <span class="cn-banner-widget__line">
56
+ <component
57
+ :is="clickable ? 'a' : 'span'"
58
+ class="cn-banner-widget__text"
59
+ :class="{ 'cn-banner-widget__text--clickable': clickable }"
60
+ :href="clickable ? routeHref : null"
61
+ data-testid="cn-banner-widget-text"
62
+ @click="onClick"><strong v-if="displayLead" class="cn-banner-widget__lead" data-testid="cn-banner-widget-lead">{{ displayLead }}</strong>{{ displayLead && displayText ? ' ' : '' }}{{ displayText }}</component>
63
+ <!-- Board look: the actions as links at the end of the line. -->
64
+ <a
65
+ v-for="action in noteActions"
66
+ :key="action.key"
67
+ class="cn-banner-widget__link"
68
+ :href="action.href || null"
69
+ data-testid="cn-banner-widget-link"
70
+ @click="onActionClick($event, action)">{{ action.label }}</a>
71
+ </span>
60
72
  </NcNoteCard>
61
73
  </div>
62
74
  </template>
@@ -64,8 +76,11 @@
64
76
  <script>
65
77
  import { translate as t } from '@nextcloud/l10n'
66
78
  import { NcNoteCard } from '@nextcloud/vue'
79
+ import CnIcon from '../CnIcon/CnIcon.vue'
67
80
  import { normalizeLook } from '../../composables/useLook.js'
81
+ import { fillTemplate } from '../../utils/fillTemplate.js'
68
82
  import { followLinkClick, resolveHref } from '../../utils/linkNavigation.js'
83
+ import { readPath } from '../../utils/readPath.js'
69
84
  import { safeHref } from '../../utils/safeHref.js'
70
85
  import { nextUid } from '../../utils/uid.js'
71
86
  import { compareVisibleWhen, readVisibleWhenValue } from '../../utils/visibleWhen.js'
@@ -147,7 +162,7 @@ const MAX_ACTIONS_BOARD = 4
147
162
  export default {
148
163
  name: 'CnBannerWidget',
149
164
 
150
- components: { NcNoteCard },
165
+ components: { CnIcon, NcNoteCard },
151
166
 
152
167
  inject: {
153
168
  /**
@@ -177,6 +192,27 @@ export default {
177
192
  default: '',
178
193
  },
179
194
 
195
+ /**
196
+ * A bold lead in front of the text ("2 aanmeldingen wachten op
197
+ * goedkeuring." before the rest of the sentence). `{value}` is replaced
198
+ * like in `text`, and it goes through the app's translate. Empty falls
199
+ * back to the `content` blob.
200
+ */
201
+ lead: {
202
+ type: String,
203
+ default: '',
204
+ },
205
+
206
+ /**
207
+ * A named icon (`AccountPlus`, `AlertOutline`, ...) drawn before the
208
+ * text instead of the variant's own glyph. Empty falls back to the
209
+ * `content` blob, then to the variant glyph.
210
+ */
211
+ icon: {
212
+ type: String,
213
+ default: '',
214
+ },
215
+
180
216
  /**
181
217
  * Optional visibility condition. Shape:
182
218
  * `{ endpoint?, source?, field?, op?, value }` — exactly one of
@@ -266,6 +302,18 @@ export default {
266
302
  default: null,
267
303
  },
268
304
 
305
+ /**
306
+ * Attention card: stack the actions under the text instead of beside it,
307
+ * the "Begin hier" card of PqMijnWerk (16px title, the action under the
308
+ * reason). Falls back to the `content` blob.
309
+ *
310
+ * @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-card-can-stack-its-action-under-the-text
311
+ */
312
+ stacked: {
313
+ type: Boolean,
314
+ default: false,
315
+ },
316
+
269
317
  /**
270
318
  * Stored content blob (CnDashboardPage registry branch) carrying the
271
319
  * same keys as the flat props: `{ variant, text, visibleWhen, route,
@@ -326,6 +374,12 @@ export default {
326
374
  * the text wherever it says `{value}`.
327
375
  */
328
376
  conditionValue: null,
377
+ /**
378
+ * The first row of the `visibleWhen` source query (its `order`
379
+ * applied), the card's subject: `{subject.<field>}` in the texts
380
+ * and `@subject.<field>` in an action route read it.
381
+ */
382
+ conditionRow: null,
329
383
  /** Whether the visibleWhen request itself failed (not: answered "no"). */
330
384
  conditionFailed: false,
331
385
  /** Why it failed, as the request reported it. */
@@ -340,9 +394,38 @@ export default {
340
394
  return VARIANTS.includes(v) ? v : 'info'
341
395
  },
342
396
 
343
- /** The effective banner text (prop → content → ''). */
397
+ /** The effective banner text (prop → content → ''), through the app's translate. */
344
398
  resolvedText() {
345
- return this.text || (this.content && this.content.text) || ''
399
+ const text = this.text || (this.content && this.content.text) || ''
400
+ return text ? this.tl(text) : ''
401
+ },
402
+
403
+ /** The effective bold lead (prop → content → ''), through the app's translate. */
404
+ resolvedLead() {
405
+ const lead = this.lead || (this.content && this.content.lead) || ''
406
+ return lead ? this.tl(lead) : ''
407
+ },
408
+
409
+ /** The lead with `{value}` filled in. */
410
+ displayLead() {
411
+ return this.fillValue(this.resolvedLead)
412
+ },
413
+
414
+ /** The effective icon name (prop → content → ''). */
415
+ resolvedIcon() {
416
+ return this.icon || (this.content && this.content.icon) || ''
417
+ },
418
+
419
+ /**
420
+ * The note card's actions as links, under the board look only: the
421
+ * first resolved action of `actions`, as the board draws "Beleid
422
+ * wijzigen" at the end of the line. Without the look the note card
423
+ * ignores `actions`, as it always did.
424
+ *
425
+ * @return {Array<object>} The resolved actions (at most one).
426
+ */
427
+ noteActions() {
428
+ return normalizeLook(this.cnLook) === 'board' ? this.resolvedActions.slice(0, 1) : []
346
429
  },
347
430
 
348
431
  /** The effective visibleWhen condition (prop → content → null). */
@@ -383,6 +466,15 @@ export default {
383
466
  return (this.layout || (this.content && this.content.layout) || 'banner') === 'attention'
384
467
  },
385
468
 
469
+ /**
470
+ * Whether the actions sit under the text.
471
+ *
472
+ * @return {boolean}
473
+ */
474
+ isStacked() {
475
+ return this.stacked || Boolean(this.content && this.content.stacked)
476
+ },
477
+
386
478
  /**
387
479
  * The attention card's kicker (prop, else content).
388
480
  *
@@ -391,7 +483,7 @@ export default {
391
483
  */
392
484
  resolvedKicker() {
393
485
  const kicker = this.kicker || (this.content && this.content.kicker) || ''
394
- return kicker ? this.tl(kicker) : ''
486
+ return kicker ? this.fillValue(this.tl(kicker)) : ''
395
487
  },
396
488
 
397
489
  /**
@@ -459,7 +551,7 @@ export default {
459
551
  let target = null
460
552
  let href = ''
461
553
  if (action.route) {
462
- target = typeof action.route === 'string' ? { name: action.route } : action.route
554
+ target = typeof action.route === 'string' ? { name: action.route } : this.resolveSubject(action.route)
463
555
  href = resolveHref(target, this.$router)
464
556
  } else if (typeof action.href === 'string' && action.href !== '') {
465
557
  const safe = safeHref(action.href)
@@ -484,7 +576,7 @@ export default {
484
576
  */
485
577
  visible() {
486
578
  const title = this.title || (this.content && this.content.title) || ''
487
- if (this.resolvedText === '' && !(this.isAttention && title !== '')) {
579
+ if (this.resolvedText === '' && this.resolvedLead === '' && !(this.isAttention && title !== '')) {
488
580
  return false
489
581
  }
490
582
  if (!this.resolvedVisibleWhen) {
@@ -518,7 +610,7 @@ export default {
518
610
  */
519
611
  uncheckedText() {
520
612
  const title = this.title || (this.content && this.content.title) || this.resolvedText
521
- if (!title || title.includes('{value}')) {
613
+ if (!title || title.includes('{value}') || title.includes('{subject.')) {
522
614
  return t('nextcloud-vue', 'Could not check')
523
615
  }
524
616
  // `escape: false`: the result is rendered through `{{ }}`, which escapes.
@@ -590,10 +682,55 @@ export default {
590
682
  * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-attention-card
591
683
  */
592
684
  fillValue(text) {
593
- if (this.conditionValue === null || !text.includes('{value}')) {
685
+ let out = text
686
+ if (this.conditionValue !== null && out.includes('{value}')) {
687
+ out = out.replaceAll('{value}', String(this.conditionValue))
688
+ }
689
+ return this.fillSubject(out)
690
+ },
691
+
692
+ /**
693
+ * Fill `{subject.<field>}` (and `{subject.<field>|date}`, `|days`) from
694
+ * the card's subject row. A token with no value empties the whole text,
695
+ * as in a record list. Text without a subject token is untouched.
696
+ *
697
+ * @param {string} text The text.
698
+ * @return {string} The filled text.
699
+ * @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-banner-can-name-the-first-row-of-a-query
700
+ */
701
+ fillSubject(text) {
702
+ if (typeof text !== 'string' || !text.includes('{subject.')) {
594
703
  return text
595
704
  }
596
- return text.replaceAll('{value}', String(this.conditionValue))
705
+ // `{value}` is not a subject token: keep it out of the template fill.
706
+ const guard = '\u0000value\u0000'
707
+ const filled = fillTemplate(text.replaceAll('{value}', guard), { subject: this.conditionRow || {} })
708
+ return filled.replaceAll(guard, '{value}')
709
+ },
710
+
711
+ /**
712
+ * Replace `@subject.<field>` strings anywhere in an action route
713
+ * (params, query) by the subject's value.
714
+ *
715
+ * @param {unknown} node A route name, location or any nested part of one.
716
+ * @return {unknown} The same shape with the tokens resolved.
717
+ * @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-banner-can-name-the-first-row-of-a-query
718
+ */
719
+ resolveSubject(node) {
720
+ if (typeof node === 'string') {
721
+ if (!node.startsWith('@subject.')) {
722
+ return node
723
+ }
724
+ const value = this.conditionRow ? readPath(this.conditionRow, node.slice('@subject.'.length)) : undefined
725
+ return value === undefined || value === null ? '' : String(value)
726
+ }
727
+ if (Array.isArray(node)) {
728
+ return node.map((item) => this.resolveSubject(item))
729
+ }
730
+ if (node && typeof node === 'object') {
731
+ return Object.fromEntries(Object.entries(node).map(([key, value]) => [key, this.resolveSubject(value)]))
732
+ }
733
+ return node
597
734
  },
598
735
 
599
736
  /**
@@ -636,6 +773,7 @@ export default {
636
773
  if (outcome) {
637
774
  this.conditionMet = outcome.met === true
638
775
  this.conditionValue = outcome.value !== undefined ? outcome.value : null
776
+ this.conditionRow = outcome.row && typeof outcome.row === 'object' ? outcome.row : null
639
777
  this.conditionFailed = outcome.failed === true
640
778
  this.conditionFailureReason = outcome.failed === true && typeof outcome.reason === 'string' ? outcome.reason : ''
641
779
  return
@@ -644,12 +782,15 @@ export default {
644
782
  if (!cond) {
645
783
  this.conditionMet = null
646
784
  this.conditionValue = null
785
+ this.conditionRow = null
647
786
  this.conditionFailed = false
648
787
  this.conditionFailureReason = ''
649
788
  return
650
789
  }
651
790
  try {
652
- const value = await readVisibleWhenValue(cond)
791
+ const sink = {}
792
+ const value = await readVisibleWhenValue(cond, undefined, sink)
793
+ this.conditionRow = sink.row || null
653
794
  this.conditionValue = value
654
795
  this.conditionMet = compareVisibleWhen(value, cond.op || 'eq', cond.value)
655
796
  this.conditionFailed = false
@@ -662,6 +803,7 @@ export default {
662
803
  console.warn('[CnBannerWidget] visibleWhen could not be evaluated, banner hidden:', error?.message || error)
663
804
  this.conditionMet = false
664
805
  this.conditionValue = null
806
+ this.conditionRow = null
665
807
  this.conditionFailed = true
666
808
  this.conditionFailureReason = typeof error?.message === 'string' ? error.message : String(error ?? '')
667
809
  }
@@ -693,6 +835,23 @@ export default {
693
835
  margin: 0;
694
836
  }
695
837
 
838
+ .cn-banner-widget__line {
839
+ display: flex;
840
+ flex-wrap: wrap;
841
+ align-items: baseline;
842
+ gap: 4px 20px;
843
+ }
844
+
845
+ .cn-banner-widget__lead {
846
+ font-weight: 700;
847
+ }
848
+
849
+ .cn-banner-widget__link {
850
+ margin-inline-start: auto;
851
+ font-size: 14px;
852
+ font-weight: 600;
853
+ }
854
+
696
855
  .cn-banner-widget__text--clickable {
697
856
  cursor: pointer;
698
857
  text-decoration: underline;
@@ -784,6 +943,32 @@ export default {
784
943
  color: var(--color-text-maxcontrast);
785
944
  }
786
945
 
946
+ /* Stacked (PqMijnWerk "Begin hier"): the text, then the action under it. */
947
+ .cn-banner-widget--stacked {
948
+ flex-direction: column;
949
+ align-items: flex-start;
950
+ gap: 10px;
951
+ }
952
+
953
+ .cn-banner-widget--stacked .cn-banner-widget__body {
954
+ flex: 0 0 auto;
955
+ gap: 10px;
956
+ }
957
+
958
+ .cn-banner-widget--stacked .cn-banner-widget__title {
959
+ font-size: 16px;
960
+ line-height: 1.4;
961
+ }
962
+
963
+ .cn-banner-widget--stacked .cn-banner-widget__reason {
964
+ font-size: 14px;
965
+ }
966
+
967
+ .cn-banner-widget--stacked .cn-banner-widget__action {
968
+ min-height: var(--cn-board-control-height, 40px);
969
+ font-size: 14px;
970
+ }
971
+
787
972
  .cn-banner-widget__actions {
788
973
  display: flex;
789
974
  flex-wrap: wrap;
@@ -86,6 +86,8 @@ fall back to the normal rendering. See `docs/migrating-to-manifest.md` →
86
86
  > `cnFormatters: { automationTrigger: v => ({ 'lead.created': 'Lead created' }[v] ?? v) }`);
87
87
  > standalone (no provider) it falls back to rendering the raw value.
88
88
 
89
+ The `secondary` prop is the column's secondary line: the `avatar` widget draws it under the name, beside the picture (`CnDataTable` passes it for an avatar column); other cells ignore it.
90
+
89
91
  Column widget — `widget="badge"`, `widget="fkResolve"` (uuid → related object label via the shared object store with per-schema caching; config `widgetProps { register, schema, labelField }`), and `widget="link"` are built-in; any other id resolves against the app's `cellWidgets` registry (`CnAppRoot`'s `cellWidgets` prop → `cnCellWidgets`), and that component receives `{ value, row, property, formatted, ...widgetProps }`. `widget` takes precedence over `formatter`; when both are set the widget gets the formatter-shaped value as `formatted`. See `docs/migrating-to-manifest.md` → "Column widgets" + "Built-in cell formatters / widgets".
90
92
 
91
93
  - `widget="badge"` — `CnStatusBadge` pill; `widgetProps.variant` picks the colour.
@@ -113,7 +113,14 @@
113
113
  class="cn-cell-renderer__avatar-initials"
114
114
  :style="{ width: avatarSize + 'px', height: avatarSize + 'px' }"
115
115
  aria-hidden="true">{{ avatarInitials }}</span>
116
- <span class="cn-cell-renderer__avatar-name" :title="avatarName || avatarUserId">{{ avatarName || avatarUserId }}</span>
116
+ <span class="cn-cell-renderer__avatar-text">
117
+ <span class="cn-cell-renderer__avatar-name" :title="avatarName || avatarUserId">{{ avatarName || avatarUserId }}</span>
118
+ <!-- The column's secondary line (e-mail), under the name and beside the picture. -->
119
+ <span
120
+ v-if="secondary"
121
+ class="cn-cell-renderer__avatar-secondary"
122
+ data-testid="cn-cell-secondary">{{ secondary }}</span>
123
+ </span>
117
124
  </span>
118
125
  <span v-else class="cn-cell-renderer__dash">—</span>
119
126
  </template>
@@ -406,6 +413,16 @@ export default {
406
413
  default: () => ({}),
407
414
  },
408
415
 
416
+ /**
417
+ * The column's secondary line (a muted second line under the value).
418
+ * The `avatar` widget draws it under the name, beside the picture;
419
+ * other cells ignore it, because the table draws it under the cell.
420
+ */
421
+ secondary: {
422
+ type: String,
423
+ default: '',
424
+ },
425
+
409
426
  /**
410
427
  * Optional declarative cell-format spec — a no-code alternative to a
411
428
  * registry `formatter`. Recognised `style` values:
@@ -560,14 +577,15 @@ export default {
560
577
  },
561
578
 
562
579
  /**
563
- * `avatar` widget: the picture size in pixels (`widgetProps.size`, default 24).
580
+ * `avatar` widget: the picture size in pixels (`widgetProps.size`, default 24,
581
+ * 32 under the board look).
564
582
  *
565
583
  * @return {number}
566
584
  * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
567
585
  */
568
586
  avatarSize() {
569
587
  const size = Number(this.widgetProps && this.widgetProps.size)
570
- return Number.isFinite(size) && size > 0 ? size : 24
588
+ return Number.isFinite(size) && size > 0 ? size : (this.isBoardLook ? 32 : 24)
571
589
  },
572
590
 
573
591
  /**
@@ -882,11 +900,14 @@ export default {
882
900
  * a `{ value: variant }` map (e.g. `{ placed: 'primary', delivered: 'success' }`)
883
901
  * that CnStatusBadge resolves per label. Null when unset (falls back to
884
902
  * `badgeVariant`). Lets a manifest colour a status column without code.
903
+ * A column-level `colorMap` (it reaches the cell as the property's
904
+ * `colorMap`) works too, so `{ widget: 'badge', colorMap }` and
905
+ * `{ widget: 'badge', widgetProps: { colorMap } }` read the same.
885
906
  *
886
907
  * @return {object|null}
887
908
  */
888
909
  badgeColorMap() {
889
- return (this.widgetProps && this.widgetProps.colorMap) || null
910
+ return (this.widgetProps && this.widgetProps.colorMap) || this.enumColorMap || null
890
911
  },
891
912
 
892
913
  /**
@@ -1316,11 +1337,33 @@ export default {
1316
1337
  line-height: 1;
1317
1338
  }
1318
1339
 
1340
+ .cn-cell-renderer__avatar-text {
1341
+ display: flex;
1342
+ flex-direction: column;
1343
+ min-width: 0;
1344
+ }
1345
+
1319
1346
  .cn-cell-renderer__avatar-name {
1320
1347
  min-width: 0;
1321
1348
  overflow: hidden;
1322
1349
  text-overflow: ellipsis;
1323
1350
  white-space: nowrap;
1351
+ /* The name is the cell's text: it keeps the weight, size and colour the
1352
+ cell sets, as a plain value does. */
1353
+ font: inherit;
1354
+ color: inherit;
1355
+ }
1356
+
1357
+ .cn-cell-renderer__avatar-secondary {
1358
+ min-width: 0;
1359
+ overflow: hidden;
1360
+ color: var(--color-text-maxcontrast);
1361
+ font-size: 13px;
1362
+ font-weight: 400;
1363
+ line-height: 1.35;
1364
+ text-overflow: ellipsis;
1365
+ text-decoration: none;
1366
+ white-space: nowrap;
1324
1367
  }
1325
1368
 
1326
1369
  /* A date that matched a rule is also set in a heavier weight, so the signal