@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
@@ -0,0 +1,55 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ * SPDX-License-Identifier: EUPL-1.2
4
+ *
5
+ * objectWrite: the one-object PATCH the settings widgets share.
6
+ *
7
+ * @module utils/objectWrite
8
+ */
9
+
10
+ import { prefixUrl } from './headers.js'
11
+
12
+ /**
13
+ * The OpenRegister URL of one object, or '' when register, schema or id is missing.
14
+ *
15
+ * @param {string|object} register Register slug.
16
+ * @param {string|object} schema Schema slug.
17
+ * @param {string|number} id Object id.
18
+ * @return {string} The object URL.
19
+ */
20
+ export function objectUrlOf(register, schema, id) {
21
+ if (typeof register !== 'string' || typeof schema !== 'string' || !register || !schema || id === undefined || id === null || id === '') {
22
+ return ''
23
+ }
24
+ return `/apps/openregister/api/objects/${encodeURIComponent(register)}/${encodeURIComponent(schema)}/${encodeURIComponent(String(id))}`
25
+ }
26
+
27
+ /**
28
+ * PATCH only the given fields of one object.
29
+ *
30
+ * @param {string} url The object URL (see objectUrlOf).
31
+ * @param {object} patch The fields to write.
32
+ * @return {Promise<object>} The object the server answered with.
33
+ */
34
+ export async function patchObject(url, patch) {
35
+ const { default: axios } = await import('@nextcloud/axios')
36
+ const { data } = await axios.patch(prefixUrl(url), patch)
37
+ return data && typeof data === 'object' ? data : {}
38
+ }
39
+
40
+ /**
41
+ * The fields of `next` that differ from `base`, compared by value.
42
+ *
43
+ * @param {object} base What the server last held.
44
+ * @param {object} next What the form holds.
45
+ * @return {object} The changed fields only.
46
+ */
47
+ export function changedFields(base, next) {
48
+ const patch = {}
49
+ for (const [key, value] of Object.entries(next)) {
50
+ if (JSON.stringify(value === undefined ? null : value) !== JSON.stringify(base[key] === undefined ? null : base[key])) {
51
+ patch[key] = value
52
+ }
53
+ }
54
+ return patch
55
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ * SPDX-License-Identifier: EUPL-1.2
4
+ *
5
+ * pageControls: how a list widget listens to the page's controls.
6
+ *
7
+ * A page control (a `workspace-filter` select or switch) writes a value to the
8
+ * page workspace. A list widget declares which control it listens to and what
9
+ * the value means for it:
10
+ *
11
+ * pageControls: {
12
+ * sort: { key: "sort", map: { deadline: { field: "slaDeadline", dir: "asc" } } },
13
+ * toggle: { key: "showDone", removes: ["status"] }
14
+ * }
15
+ *
16
+ * `sort`: the workspace value at `key` picks an entry of `map` (the sort the
17
+ * list uses); a value with no entry leaves the list's own sort.
18
+ * `toggle`: while the workspace value at `key` is on (true, "1", "true"), the
19
+ * filter keys in `removes` are dropped, so a list that hides finished work
20
+ * shows it.
21
+ *
22
+ * @module utils/pageControls
23
+ */
24
+
25
+ /**
26
+ * Whether a workspace value reads as on.
27
+ *
28
+ * @param {unknown} value The value.
29
+ * @return {boolean} True for true, 1, "1" and "true".
30
+ */
31
+ export function isOn(value) {
32
+ return value === true || value === 1 || value === '1' || value === 'true'
33
+ }
34
+
35
+ /**
36
+ * The sort a list uses once the page's sort control is read.
37
+ *
38
+ * @param {object|null} pageControls The widget's `pageControls`.
39
+ * @param {object} workspace The plain workspace bag.
40
+ * @param {{field: string, dir?: string}|null} own The list's own sort.
41
+ * @return {{field: string, dir?: string}|null} The sort to use.
42
+ * @spec openspec/changes/screens-page-controls/specs/page-controls/spec.md#requirement-a-list-listens-to-the-pages-controls
43
+ */
44
+ export function pageSort(pageControls, workspace, own) {
45
+ const listen = pageControls && typeof pageControls === 'object' ? pageControls.sort : null
46
+ if (!listen || typeof listen.key !== 'string' || !listen.map || typeof listen.map !== 'object') {
47
+ return own
48
+ }
49
+ const chosen = workspace ? workspace[listen.key] : undefined
50
+ const entry = chosen !== undefined && chosen !== null ? listen.map[String(chosen)] : null
51
+ return entry && typeof entry === 'object' && typeof entry.field === 'string' && entry.field !== '' ? entry : own
52
+ }
53
+
54
+ /**
55
+ * The filter a list uses once the page's toggle is read: with the toggle on,
56
+ * the keys it `removes` are gone.
57
+ *
58
+ * @param {object|null} pageControls The widget's `pageControls`.
59
+ * @param {object} workspace The plain workspace bag.
60
+ * @param {object} filter The list's own filter (before token resolution).
61
+ * @return {object} The filter to use (the same object when nothing is removed).
62
+ * @spec openspec/changes/screens-page-controls/specs/page-controls/spec.md#requirement-a-list-listens-to-the-pages-controls
63
+ */
64
+ export function pageFilter(pageControls, workspace, filter) {
65
+ const listen = pageControls && typeof pageControls === 'object' ? pageControls.toggle : null
66
+ const base = filter && typeof filter === 'object' ? filter : {}
67
+ if (!listen || typeof listen.key !== 'string' || !Array.isArray(listen.removes)) {
68
+ return base
69
+ }
70
+ if (!isOn(workspace ? workspace[listen.key] : undefined)) {
71
+ return base
72
+ }
73
+ const out = { ...base }
74
+ for (const key of listen.removes) {
75
+ delete out[key]
76
+ }
77
+ return out
78
+ }
@@ -37,6 +37,42 @@ export function personalLensTabs(lenses) {
37
37
  .map((id) => ({ label: labels[id], filter: { [LENS_FILTER_KEYS[id]]: true }, lens: id }))
38
38
  }
39
39
 
40
+ /**
41
+ * Turn the `empty` / `notEmpty` shorthand of quick filters into a filter.
42
+ *
43
+ * `{ label: "Not logged in yet", empty: "lastLoginAt" }` is the rows where the
44
+ * field has no value: the filter `{ lastLoginAt: { isnull: true } }`, which
45
+ * OpenRegister reads as `lastLoginAt[isnull]=true`. `notEmpty` is the rows
46
+ * where it has one. Either takes a field or a list of fields and merges with
47
+ * the entry's own `filter`. Returns the same array when no entry uses it.
48
+ *
49
+ * @param {Array<object>|null} quickFilters The page's quick filters.
50
+ * @return {Array<object>|null} The quick filters with the shorthand expanded.
51
+ */
52
+ export function expandEmptyFilters(quickFilters) {
53
+ if (!Array.isArray(quickFilters)) {
54
+ return quickFilters
55
+ }
56
+ const uses = (tab) => tab && typeof tab === 'object' && (tab.empty || tab.notEmpty)
57
+ if (!quickFilters.some(uses)) {
58
+ return quickFilters
59
+ }
60
+ const fieldsOf = (value) => (Array.isArray(value) ? value : [value]).filter((f) => typeof f === 'string' && f !== '')
61
+ return quickFilters.map((tab) => {
62
+ if (!uses(tab)) {
63
+ return tab
64
+ }
65
+ const filter = { ...(tab.filter && typeof tab.filter === 'object' ? tab.filter : {}) }
66
+ for (const field of fieldsOf(tab.empty)) {
67
+ filter[field] = { isnull: true }
68
+ }
69
+ for (const field of fieldsOf(tab.notEmpty)) {
70
+ filter[field] = { isnull: false }
71
+ }
72
+ return { ...tab, filter }
73
+ })
74
+ }
75
+
40
76
  /**
41
77
  * The page's quick filters with its personal lenses appended. A page with no
42
78
  * quick filters of its own gets an "All" tab first, so a lens is not active
@@ -48,10 +84,11 @@ export function personalLensTabs(lenses) {
48
84
  */
49
85
  export function withPersonalLenses(quickFilters, lenses) {
50
86
  const tabs = personalLensTabs(lenses)
87
+ const expanded = expandEmptyFilters(quickFilters)
51
88
  if (tabs.length === 0) {
52
- return quickFilters
89
+ return expanded
53
90
  }
54
- const own = Array.isArray(quickFilters) ? quickFilters : []
91
+ const own = Array.isArray(expanded) ? expanded : []
55
92
  return own.length > 0
56
93
  ? [...own, ...tabs]
57
94
  : [{ label: t('nextcloud-vue', 'All'), filter: {}, default: true }, ...tabs]
@@ -67,7 +67,9 @@
67
67
 
68
68
  import { getCurrentUser } from '@nextcloud/auth'
69
69
  import { TODAY_DELTA_RE } from './sentinelTokens.js'
70
- import { peekCurrentUserGroups } from './widgetVisibility.js'
70
+ // userGroupsPeek, not widgetVisibility: that one imports @nextcloud/axios, and
71
+ // this resolver runs on public pages and in node (see userGroupsPeek.js).
72
+ import { peekCurrentUserGroups } from './userGroupsPeek.js'
71
73
 
72
74
  /** The filter token for the current user's group ids. */
73
75
  export const MY_GROUPS_TOKEN = '@myGroups'
@@ -54,6 +54,8 @@ export const SENTINEL_RESOLVERS = Object.freeze({
54
54
  declarative: 'fetchAggregate (OpenRegister server-side)',
55
55
  visibleWhen: 'evaluateVisibleWhen (utils/visibleWhen.js)',
56
56
  answer: 'resolveAssignValue (utils/formAssign.js)',
57
+ row: 'CnFieldListWidget (rowActions request)',
58
+ subject: 'CnBannerWidget (action route)',
57
59
  })
58
60
 
59
61
  /**
@@ -83,6 +83,12 @@ export const SENTINEL_TOKEN_PATTERNS = Object.freeze({
83
83
  visibleWhen: '^@total$',
84
84
  // form-live-values: another answer in the same form, read by a field's `assign` rule.
85
85
  answer: '^@answer\\.[A-Za-z][A-Za-z0-9_]*$',
86
+ // A field of the row a row action is run on (`@row.<field>`, dot path), read by the
87
+ // field-list widget's `rowActions` request URL and payload.
88
+ row: '^@row\\.[A-Za-z][A-Za-z0-9_.@]*$',
89
+ // A field of the record a start-here attention card names (`@subject.<field>`, dot path),
90
+ // read by the banner widget's action routes.
91
+ subject: '^@subject\\.[A-Za-z][A-Za-z0-9_.]*$',
86
92
  // Deprecated-but-not-yet-removed tokens. Kept in the schema union so
87
93
  // deployed manifests still validate during the migration window; the gate
88
94
  // downgrades them to a WARN (see SENTINEL_DEPRECATIONS).
@@ -90,7 +96,7 @@ export const SENTINEL_TOKEN_PATTERNS = Object.freeze({
90
96
  })
91
97
 
92
98
  /**
93
- * The eight canonical context names (excludes `deprecated`, which is a
99
+ * The nine canonical context names (excludes `deprecated`, which is a
94
100
  * transitional overlay, not a resolution context).
95
101
  *
96
102
  * @type {string[]}
@@ -104,6 +110,8 @@ export const SENTINEL_CONTEXTS = Object.freeze([
104
110
  'declarative',
105
111
  'visibleWhen',
106
112
  'answer',
113
+ 'row',
114
+ 'subject',
107
115
  ])
108
116
 
109
117
  /**
@@ -154,6 +162,16 @@ export const SENTINEL_VOCABULARY = Object.freeze({
154
162
  description: 'Another answer in the same form, read by a field\'s `assign` rule.',
155
163
  members: ['@answer.<field>'],
156
164
  },
165
+ row: {
166
+ resolver: 'CnFieldListWidget (rowActions request url and payload)',
167
+ description: 'A field of the row a row action runs on, read by the field-list widget when it sends the action\'s request. Dot paths are allowed (`@row.owner.id`).',
168
+ members: ['@row.<field>'],
169
+ },
170
+ subject: {
171
+ resolver: 'CnBannerWidget (action route params and query)',
172
+ description: 'A field of the record an attention card names (the first row of its ordered `visibleWhen` source query), read when the card builds an action\'s route. Dot paths are allowed (`@subject.owner.id`).',
173
+ members: ['@subject.<field>'],
174
+ },
157
175
  })
158
176
 
159
177
  /**
@@ -0,0 +1,87 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ * SPDX-License-Identifier: EUPL-1.2
4
+ *
5
+ * The synchronous, reactive read of the current user's group ids, without
6
+ * the request that loads them.
7
+ *
8
+ * `resolveFilterTokens` (and through it `visibleWhen`) needs the groups for
9
+ * `@myGroups`, and those utilities are used on public, signed-out pages too.
10
+ * Importing `widgetVisibility.js` statically pulled `@nextcloud/axios` and
11
+ * `@nextcloud/router` into every bundle that resolves a filter token: a public
12
+ * site bundle broke its size budget, and node specs crashed because axios
13
+ * reads the request token when it is imported. This module imports no
14
+ * `@nextcloud/*` package. It loads `widgetVisibility.js` lazily, only the
15
+ * first time a signed-in user's groups are actually peeked.
16
+ *
17
+ * @module utils/userGroupsPeek
18
+ */
19
+
20
+ import { reactive } from 'vue'
21
+
22
+ /**
23
+ * Reactive mirror of the group cache, keyed by user id. A computed that reads
24
+ * a missing key tracks it, so it re-runs when the groups arrive.
25
+ *
26
+ * @type {{ byUser: Record<string, string[]> }}
27
+ */
28
+ const _peek = reactive({ byUser: {} })
29
+
30
+ /** User ids whose groups a peek already asked for (not reactive on purpose). */
31
+ const _peekRequested = new Set()
32
+
33
+ /**
34
+ * Get the current Nextcloud user ID from OC.currentUser.
35
+ *
36
+ * @return {string|null} The current user ID, or null if not logged in
37
+ */
38
+ export function getCurrentUserId() {
39
+ return window.OC?.currentUser?.uid
40
+ || window.OC?.currentUser
41
+ || null
42
+ }
43
+
44
+ /**
45
+ * Synchronous, reactive read of the current user's group ids, for code that
46
+ * cannot await (the `@myGroups` filter token). Returns the ids once they are
47
+ * loaded, `null` while the first request is in flight (and starts that
48
+ * request on first use), and `[]` when nobody is signed in. Read inside a
49
+ * computed, the computed re-runs when the groups arrive.
50
+ *
51
+ * @spec openspec/changes/nextcloud-group-surfaces/specs/schema-utilities/spec.md#requirement-mygroups-resolves-to-the-current-users-group-ids
52
+ * @return {string[]|null} The group ids, or null while loading.
53
+ */
54
+ export function peekCurrentUserGroups() {
55
+ const userId = getCurrentUserId()
56
+ if (!userId) {
57
+ return []
58
+ }
59
+ const known = _peek.byUser[userId]
60
+ if (Array.isArray(known)) {
61
+ return known
62
+ }
63
+ if (!_peekRequested.has(userId)) {
64
+ _peekRequested.add(userId)
65
+ import('./widgetVisibility.js')
66
+ .then((module) => module.getCurrentUserGroups())
67
+ .then((groups) => {
68
+ _peek.byUser[userId] = Array.isArray(groups) ? [...groups] : []
69
+ })
70
+ .catch(() => {
71
+ _peek.byUser[userId] = []
72
+ })
73
+ }
74
+ return null
75
+ }
76
+
77
+ /**
78
+ * Forget every peeked group list. `resetVisibilityCache()` calls this.
79
+ *
80
+ * @spec exclude test helper behind resetVisibilityCache, no behaviour of its own
81
+ */
82
+ export function resetGroupsPeek() {
83
+ _peekRequested.clear()
84
+ for (const key of Object.keys(_peek.byUser)) {
85
+ delete _peek.byUser[key]
86
+ }
87
+ }