@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,386 @@
1
+ <!--
2
+ - SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ - SPDX-License-Identifier: EUPL-1.2
4
+ -->
5
+
6
+ <template>
7
+ <div class="cn-toggle-table" data-testid="cn-toggle-table">
8
+ <p v-if="rows.length === 0" class="cn-toggle-table__empty" data-testid="cn-toggle-table-empty">
9
+ {{ emptyLabel }}
10
+ </p>
11
+ <table v-else class="cn-toggle-table__table">
12
+ <thead v-if="showHeader">
13
+ <tr>
14
+ <th scope="col" class="cn-toggle-table__head">
15
+ {{ titleHeader }}
16
+ </th>
17
+ <th
18
+ v-for="column in columns"
19
+ :key="column.path"
20
+ scope="col"
21
+ class="cn-toggle-table__head">
22
+ {{ column.header }}
23
+ </th>
24
+ <th scope="col" class="cn-toggle-table__head cn-toggle-table__head--toggle">
25
+ {{ toggleHeader }}
26
+ </th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ <tr
31
+ v-for="row in rows"
32
+ :key="row.key"
33
+ class="cn-toggle-table__row"
34
+ :data-testid="`cn-toggle-table-row-${row.key}`">
35
+ <td class="cn-toggle-table__cell cn-toggle-table__cell--main">
36
+ <span class="cn-toggle-table__title">{{ row.title }}</span>
37
+ <span v-if="row.hint" class="cn-toggle-table__hint">{{ row.hint }}</span>
38
+ </td>
39
+ <td
40
+ v-for="column in columns"
41
+ :key="column.path"
42
+ class="cn-toggle-table__cell">
43
+ {{ cell(row, column) }}
44
+ </td>
45
+ <td class="cn-toggle-table__cell cn-toggle-table__cell--toggle">
46
+ <NcCheckboxRadioSwitch
47
+ :key="`${row.key}-${undone[row.key] || 0}`"
48
+ :modelValue="isOn(row)"
49
+ type="switch"
50
+ :disabled="readOnly || busy === row.key"
51
+ :aria-label="row.title"
52
+ @update:modelValue="toggle(row, $event)" />
53
+ </td>
54
+ </tr>
55
+ </tbody>
56
+ </table>
57
+ <NcNoteCard v-if="notice" type="error" data-testid="cn-toggle-table-notice">
58
+ {{ notice }}
59
+ </NcNoteCard>
60
+ </div>
61
+ </template>
62
+
63
+ <script>
64
+ import { NcCheckboxRadioSwitch, NcNoteCard } from '@nextcloud/vue'
65
+ import { prefixUrl } from '../../utils/headers.js'
66
+ import { objectUrlOf, patchObject } from '../../utils/objectWrite.js'
67
+ import { readPath } from '../../utils/readPath.js'
68
+ import { serverErrorMessage } from '../../utils/serverErrorMessage.js'
69
+
70
+ /**
71
+ * CnToggleTableWidget — the `toggle-table` widget: rows from a configured list
72
+ * (`rows`) or read from a source (`source`), each with a switch bound to the
73
+ * CURRENT object, and optional extra columns read off the row. A switch is
74
+ * stored in one of two ways:
75
+ *
76
+ * - `bind.mode: 'flag'` — each row names its own boolean field of the object
77
+ * (`row.field`); the switch is that field.
78
+ * - `bind.mode: 'list'` — ONE array field of the object (`bind.field`) holds
79
+ * the keys of the rows that are in it; the switch is on when the row's key is
80
+ * in the list, or NOT in it with `bind.invert` (a list of hidden items shown
81
+ * as "visible" switches).
82
+ *
83
+ * A toggle saves at once with ONE PATCH of that field; a refused PATCH puts the
84
+ * switch back and shows the server's words.
85
+ *
86
+ * @spec openspec/changes/abstract-toggle-table/specs/toggle-table/spec.md
87
+ */
88
+ export default {
89
+ name: 'CnToggleTableWidget',
90
+
91
+ components: { NcCheckboxRadioSwitch, NcNoteCard },
92
+
93
+ inject: {
94
+ cnTranslate: { default: () => (key) => key },
95
+ },
96
+
97
+ props: {
98
+ /**
99
+ * The widget configuration.
100
+ *
101
+ * - `bind` — `{ mode: 'flag' }` (default) or `{ mode: 'list', field, invert? }`.
102
+ * - `rows` — static rows `[{ key, label, hint?, field?, ...extra }]`.
103
+ * - `source` — `{ url, path?, key, label, hint? }`: rows read from an endpoint (tokens `@objectId`, `@object.<field>`), in addition to `rows`.
104
+ * - `columns` — extra columns `[{ header, path, map? }]` read off each row.
105
+ * - `titleHeader`, `toggleHeader`, `emptyText`, `readOnly`.
106
+ *
107
+ * @type {object}
108
+ */
109
+ content: {
110
+ type: Object,
111
+ default: () => ({}),
112
+ },
113
+
114
+ /** The current detail-page object. */
115
+ objectData: {
116
+ type: Object,
117
+ default: null,
118
+ },
119
+
120
+ /** The current object id. */
121
+ objectId: {
122
+ type: [String, Number],
123
+ default: '',
124
+ },
125
+
126
+ /** OpenRegister register slug of the surface. */
127
+ register: {
128
+ type: [String, Object],
129
+ default: '',
130
+ },
131
+
132
+ /** OpenRegister schema slug of the surface. */
133
+ schema: {
134
+ type: [String, Object],
135
+ default: '',
136
+ },
137
+ },
138
+
139
+ emits: ['saved'],
140
+
141
+ data() {
142
+ return {
143
+ /** Rows read from `source`. */
144
+ sourced: [],
145
+ /** What the object holds, by field: the flags and the list, as last saved. */
146
+ saved: {},
147
+ busy: '',
148
+ notice: '',
149
+ /** Per row, how often a refused toggle forced the switch to be drawn again from the stored value. */
150
+ undone: {},
151
+ }
152
+ },
153
+
154
+ computed: {
155
+ bind() {
156
+ const bind = this.content.bind || {}
157
+ return bind.mode === 'list' ? { mode: 'list', field: bind.field, invert: bind.invert === true } : { mode: 'flag' }
158
+ },
159
+
160
+ /** The drawn rows: configured first, then sourced, each with a key, title and hint. */
161
+ rows() {
162
+ const configured = (Array.isArray(this.content.rows) ? this.content.rows : [])
163
+ .filter((row) => row && row.key !== undefined)
164
+ .map((row) => ({ ...row, key: String(row.key), title: this.tr(row.label || String(row.key)), hint: this.tr(row.hint || '') }))
165
+ return [...configured, ...this.sourced]
166
+ },
167
+
168
+ columns() {
169
+ return (Array.isArray(this.content.columns) ? this.content.columns : [])
170
+ .filter((column) => column && column.path)
171
+ .map((column) => ({ ...column, header: this.tr(column.header || '') }))
172
+ },
173
+
174
+ showHeader() {
175
+ return this.columns.length > 0 || Boolean(this.content.titleHeader || this.content.toggleHeader)
176
+ },
177
+
178
+ titleHeader() {
179
+ return this.tr(this.content.titleHeader || '')
180
+ },
181
+
182
+ toggleHeader() {
183
+ return this.tr(this.content.toggleHeader || '')
184
+ },
185
+
186
+ emptyLabel() {
187
+ return this.tr(this.content.emptyText || 'Nothing listed yet')
188
+ },
189
+
190
+ readOnly() {
191
+ return this.content.readOnly === true
192
+ },
193
+
194
+ objectUrl() {
195
+ return objectUrlOf(this.register, this.schema, this.objectId || (this.objectData && this.objectData.id))
196
+ },
197
+ },
198
+
199
+ watch: {
200
+ objectData() {
201
+ this.saved = {}
202
+ this.loadSource()
203
+ },
204
+ },
205
+
206
+ created() {
207
+ this.loadSource()
208
+ },
209
+
210
+ methods: {
211
+ tr(text) {
212
+ if (typeof text !== 'string' || text === '') {
213
+ return ''
214
+ }
215
+ return typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text
216
+ },
217
+
218
+ /**
219
+ * The stored value of a field: what this widget last saved, else the object's.
220
+ *
221
+ * @param {string} field The field.
222
+ * @return {unknown}
223
+ */
224
+ stored(field) {
225
+ return Object.hasOwn(this.saved, field) ? this.saved[field] : readPath(this.objectData || {}, field)
226
+ },
227
+
228
+ /**
229
+ * Whether a row's switch is on.
230
+ *
231
+ * @param {object} row The row.
232
+ * @return {boolean}
233
+ */
234
+ isOn(row) {
235
+ if (this.bind.mode === 'list') {
236
+ const list = this.stored(this.bind.field)
237
+ const inList = Array.isArray(list) && list.map(String).includes(row.key)
238
+ return this.bind.invert ? !inList : inList
239
+ }
240
+ return row.field ? this.stored(row.field) === true : false
241
+ },
242
+
243
+ /**
244
+ * The text of an extra column for a row.
245
+ *
246
+ * @param {object} row The row.
247
+ * @param {object} column The column.
248
+ * @return {string}
249
+ */
250
+ cell(row, column) {
251
+ const raw = readPath(row, column.path)
252
+ if (raw === undefined || raw === null || raw === '') {
253
+ return ''
254
+ }
255
+ if (column.map && Object.hasOwn(column.map, String(raw))) {
256
+ return this.tr(column.map[String(raw)])
257
+ }
258
+ return typeof raw === 'object' ? '' : String(raw)
259
+ },
260
+
261
+ /** Read the rows of `source`, resolving tokens in its url. */
262
+ async loadSource() {
263
+ const source = this.content.source
264
+ if (!source || !source.url || !source.key) {
265
+ return
266
+ }
267
+ const object = this.objectData || {}
268
+ const url = String(source.url)
269
+ .replace(/@objectId/g, () => encodeURIComponent(String(this.objectId || object.id || '')))
270
+ .replace(/@object\.([\w.@]+)/g, (m, path) => encodeURIComponent(String(readPath(object, path) ?? '')))
271
+ try {
272
+ const { default: axios } = await import('@nextcloud/axios')
273
+ const { data } = await axios.get(prefixUrl(url))
274
+ const list = source.path ? readPath(data, source.path) : data
275
+ this.sourced = (Array.isArray(list) ? list : [])
276
+ .filter((item) => item && readPath(item, source.key) !== undefined)
277
+ .map((item) => ({
278
+ ...item,
279
+ key: String(readPath(item, source.key)),
280
+ title: String(readPath(item, source.label || source.key) ?? readPath(item, source.key)),
281
+ hint: source.hint ? String(readPath(item, source.hint) ?? '') : '',
282
+ }))
283
+ } catch (e) {
284
+ this.notice = serverErrorMessage(e)
285
+ }
286
+ },
287
+
288
+ /**
289
+ * Flip one switch and save that one field.
290
+ *
291
+ * @param {object} row The row.
292
+ * @param {boolean} on The new switch state.
293
+ * @return {Promise<void>}
294
+ * @spec openspec/changes/abstract-toggle-table/specs/toggle-table/spec.md#requirement-a-toggle-saves-one-field
295
+ */
296
+ async toggle(row, on) {
297
+ const field = this.bind.mode === 'list' ? this.bind.field : row.field
298
+ if (!this.objectUrl || !field) {
299
+ this.notice = this.tr('This switch cannot be saved here.')
300
+ return
301
+ }
302
+ let next
303
+ if (this.bind.mode === 'list') {
304
+ const list = (Array.isArray(this.stored(field)) ? this.stored(field) : []).map(String)
305
+ const wantInList = this.bind.invert ? !on : on
306
+ next = wantInList ? (list.includes(row.key) ? list : [...list, row.key]) : list.filter((key) => key !== row.key)
307
+ } else {
308
+ next = on
309
+ }
310
+ this.notice = ''
311
+ this.busy = row.key
312
+ try {
313
+ const data = await patchObject(this.objectUrl, { [field]: next })
314
+ const written = data[field] !== undefined ? data[field] : next
315
+ this.saved = { ...this.saved, [field]: written }
316
+ /**
317
+ * @event saved A switch was written.
318
+ * @type {{field: string, value: unknown}}
319
+ */
320
+ this.$emit('saved', { field, value: written })
321
+ } catch (e) {
322
+ this.notice = serverErrorMessage(e)
323
+ this.undone = { ...this.undone, [row.key]: (this.undone[row.key] || 0) + 1 }
324
+ } finally {
325
+ this.busy = ''
326
+ }
327
+ },
328
+ },
329
+ }
330
+ </script>
331
+
332
+ <style scoped>
333
+ .cn-toggle-table {
334
+ display: flex;
335
+ flex-direction: column;
336
+ gap: 8px;
337
+ min-width: 0;
338
+ }
339
+
340
+ .cn-toggle-table__table {
341
+ width: 100%;
342
+ border-collapse: collapse;
343
+ }
344
+
345
+ .cn-toggle-table__head {
346
+ padding: 8px 12px;
347
+ text-align: start;
348
+ font-size: 13px;
349
+ font-weight: 600;
350
+ color: var(--color-text-maxcontrast);
351
+ background: var(--color-background-hover);
352
+ }
353
+
354
+ .cn-toggle-table__head--toggle,
355
+ .cn-toggle-table__cell--toggle {
356
+ width: 1%;
357
+ white-space: nowrap;
358
+ text-align: end;
359
+ }
360
+
361
+ .cn-toggle-table__row {
362
+ border-top: 1px solid var(--cn-board-hairline, var(--color-border));
363
+ }
364
+
365
+ .cn-toggle-table__cell {
366
+ padding: 10px 12px;
367
+ vertical-align: middle;
368
+ overflow-wrap: anywhere;
369
+ }
370
+
371
+ .cn-toggle-table__title {
372
+ display: block;
373
+ font-weight: 600;
374
+ }
375
+
376
+ .cn-toggle-table__hint {
377
+ display: block;
378
+ font-size: 12px;
379
+ color: var(--color-text-maxcontrast);
380
+ }
381
+
382
+ .cn-toggle-table__empty {
383
+ margin: 0;
384
+ color: var(--color-text-maxcontrast);
385
+ }
386
+ </style>
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ * SPDX-License-Identifier: EUPL-1.2
4
+ *
5
+ * CnToggleTableWidget — self-registers the `toggle-table` widget type (rows
6
+ * from a configured list or a source, each with a switch bound to the current
7
+ * object, and optional extra columns) into the shared dashboardWidgetRegistry.
8
+ */
9
+
10
+ import CnToggleTableWidget from './CnToggleTableWidget.vue'
11
+ import { registerDashboardWidget } from '../CnWidgetGrid/dashboardWidgetRegistry.js'
12
+
13
+ registerDashboardWidget('toggle-table', {
14
+ renderer: CnToggleTableWidget,
15
+ form: null,
16
+ defaultContent: {
17
+ bind: { mode: 'flag' },
18
+ rows: [],
19
+ },
20
+ displayName: 'Toggle table',
21
+ icon: 'TableCheck',
22
+ surfaces: ['detail-page'],
23
+ })
24
+
25
+ export { CnToggleTableWidget }
26
+ export default CnToggleTableWidget
@@ -75,7 +75,14 @@ import '../CnTasksWidget/index.js'
75
75
  import '../CnSectionsWidget/index.js'
76
76
  import '../CnFactsWidget/index.js'
77
77
  import '../CnFieldListWidget/index.js'
78
+ import '../CnSettingsFormWidget/index.js'
79
+ import '../CnSwitchRowsWidget/index.js'
80
+ import '../CnRadioCardsWidget/index.js'
81
+ import '../CnChipsFieldWidget/index.js'
82
+ import '../CnToggleTableWidget/index.js'
83
+ import '../CnChoicePickerWidget/index.js'
78
84
  import '../CnRecordListWidget/index.js'
85
+ import '../CnSavedViewsWidget/index.js'
79
86
  import '../CnNotepadWidget/index.js'
80
87
  import '../CnObjectDataWidget/dashboardRegistration.js'
81
88
  import '../CnObjectGeoWidget/dashboardRegistration.js'
@@ -86,6 +86,7 @@ import { useEndpointSource } from '../../composables/useEndpointSource.js'
86
86
  import { useObjectStore } from '../../store/useObjectStore.js'
87
87
  import { dispatchAction, resolveObjectOpType } from '../../utils/actionsDispatcher.js'
88
88
  import { resolveObjectTokenContext } from '../../utils/detailObjectContext.js'
89
+ import { pageFilter, pageSort } from '../../utils/pageControls.js'
89
90
  import { dropOptionalUnresolved, hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'
90
91
  import { compareVisibleWhen, readVisibleWhenPath } from '../../utils/visibleWhen.js'
91
92
  import { CnIcon } from '../CnIcon/index.js'
@@ -517,7 +518,8 @@ export default {
517
518
  * @return {object}
518
519
  */
519
520
  resolvedFilter() {
520
- return dropOptionalUnresolved(resolveFilterTokens((this.source && this.source.filter) || {}, this.tokenCtx))
521
+ const filter = pageFilter(this.source && this.source.pageControls, this.workspaceCtx, this.source && this.source.filter)
522
+ return dropOptionalUnresolved(resolveFilterTokens(filter, this.tokenCtx))
521
523
  },
522
524
 
523
525
  /**
@@ -590,7 +592,10 @@ export default {
590
592
  resolvedFetchParams() {
591
593
  const src = this.source || {}
592
594
  const params = {}
593
- for (const [field, dir] of Object.entries(src.order || {})) {
595
+ // A page sort control (`source.pageControls.sort`) replaces the order.
596
+ const chosen = pageSort(src.pageControls, this.workspaceCtx, null)
597
+ const order = chosen ? { [chosen.field]: chosen.dir } : (src.order || {})
598
+ for (const [field, dir] of Object.entries(order)) {
594
599
  params[`_order[${field}]`] = dir === 'desc' ? 'desc' : 'asc'
595
600
  }
596
601
  if (typeof src.limit === 'number' && src.limit > 0) {
@@ -73,6 +73,11 @@ export function objectTableContentToProps(content) {
73
73
  if (hasLimit) {
74
74
  source.limit = limit
75
75
  }
76
+ // The page controls the table listens to belong to its source.
77
+ if (rest.pageControls && typeof rest.pageControls === 'object') {
78
+ source.pageControls = rest.pageControls
79
+ delete rest.pageControls
80
+ }
76
81
  return { ...rest, source }
77
82
  }
78
83