@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
@@ -5,9 +5,123 @@
5
5
 
6
6
  <template>
7
7
  <div class="cn-field-list-widget" data-testid="cn-field-list-widget">
8
+ <div v-if="canAdd && addTrigger && addPlacement === 'header'" class="cn-field-list-widget__toolbar">
9
+ <NcButton
10
+ variant="secondary"
11
+ :disabled="busy !== ''"
12
+ data-testid="cn-field-list-open-add"
13
+ @click="adding = !adding">
14
+ + {{ addLabel }}
15
+ </NcButton>
16
+ </div>
17
+ <form
18
+ v-if="canAdd && addTrigger && addPlacement === 'header' && adding"
19
+ class="cn-field-list-widget__add"
20
+ data-testid="cn-field-list-add"
21
+ @submit.prevent="add">
22
+ <div
23
+ v-for="field in addFields"
24
+ :key="field.key"
25
+ class="cn-field-list-widget__field"
26
+ :data-testid="`cn-field-list-input-${field.key}`">
27
+ <NcSelect
28
+ v-if="field.type === 'select'"
29
+ v-model="draft[field.key]"
30
+ :inputLabel="field.label"
31
+ :options="field.options"
32
+ :reduce="(option) => option.value"
33
+ :clearable="false"
34
+ label="label" />
35
+ <NcTextField
36
+ v-else
37
+ v-model="draft[field.key]"
38
+ :label="field.label"
39
+ :error="Boolean(errors[field.key])"
40
+ :helperText="errors[field.key] || ''" />
41
+ </div>
42
+ <NcButton type="submit"
43
+ variant="primary"
44
+ :disabled="busy !== ''"
45
+ data-testid="cn-field-list-submit">
46
+ {{ addLabel }}
47
+ </NcButton>
48
+ </form>
8
49
  <p v-if="rows.length === 0" class="cn-field-list-widget__empty" data-testid="cn-field-list-empty">
9
50
  {{ emptyLabel }}
10
51
  </p>
52
+ <div v-else-if="isTable" class="cn-field-list-widget__table-wrap">
53
+ <table class="cn-field-list-widget__table" data-testid="cn-field-list-table">
54
+ <thead>
55
+ <tr>
56
+ <th
57
+ v-for="column in tableColumns"
58
+ :key="column.key"
59
+ scope="col"
60
+ class="cn-field-list-widget__th">
61
+ {{ column.header }}
62
+ </th>
63
+ <th v-if="hasMenu" scope="col" class="cn-field-list-widget__th cn-field-list-widget__th--menu">
64
+ <span class="cn-field-list-widget__sr">{{ tr('Actions') }}</span>
65
+ </th>
66
+ </tr>
67
+ </thead>
68
+ <tbody>
69
+ <tr
70
+ v-for="row in rows"
71
+ :key="row.key"
72
+ class="cn-field-list-widget__tr"
73
+ :data-testid="`cn-field-list-row-${row.key}`">
74
+ <td
75
+ v-for="(column, index) in tableColumns"
76
+ :key="column.key"
77
+ class="cn-field-list-widget__td">
78
+ <CnStatusBadge
79
+ v-if="column.pill && row.cells[index].pill"
80
+ :label="row.cells[index].pill.label"
81
+ :variant="row.cells[index].pill.variant"
82
+ size="small" />
83
+ <strong v-else-if="column.strong">{{ row.cells[index].text }}</strong>
84
+ <template v-else>
85
+ {{ row.cells[index].text }}
86
+ </template>
87
+ </td>
88
+ <td v-if="hasMenu" class="cn-field-list-widget__td cn-field-list-widget__td--menu">
89
+ <NcActions
90
+ v-if="menuItems(row).length > 0"
91
+ :forceMenu="true"
92
+ :disabled="busy !== ''"
93
+ :ariaLabel="`${tr('More actions')}: ${row.title}`"
94
+ :data-testid="`cn-field-list-menu-${row.key}`">
95
+ <NcActionButton
96
+ v-for="item in menuItems(row)"
97
+ :key="item.id"
98
+ :data-testid="`cn-field-list-menu-${item.id}-${row.key}`"
99
+ @click="item.run">
100
+ {{ item.label }}
101
+ </NcActionButton>
102
+ </NcActions>
103
+ </td>
104
+ </tr>
105
+ </tbody>
106
+ </table>
107
+ <div
108
+ v-for="row in bandRows"
109
+ :key="row.key"
110
+ class="cn-field-list-widget__band"
111
+ role="note"
112
+ :data-testid="`cn-field-list-band-${row.key}`">
113
+ <span class="cn-field-list-widget__band-text">{{ row.detail }}</span>
114
+ <NcButton
115
+ v-for="action in row.bandActions"
116
+ :key="action.id"
117
+ variant="secondary"
118
+ :disabled="busy !== ''"
119
+ :data-testid="`cn-field-list-band-action-${action.id}-${row.key}`"
120
+ @click="runAction(action, row)">
121
+ {{ action.label }}
122
+ </NcButton>
123
+ </div>
124
+ </div>
11
125
  <ul v-else class="cn-field-list-widget__rows">
12
126
  <li
13
127
  v-for="row in rows"
@@ -55,8 +169,17 @@
55
169
  {{ hint }}
56
170
  </p>
57
171
 
172
+ <div v-if="canAdd && addTrigger && addPlacement !== 'header' && !adding" class="cn-field-list-widget__toolbar">
173
+ <NcButton
174
+ variant="secondary"
175
+ :disabled="busy !== ''"
176
+ data-testid="cn-field-list-open-add"
177
+ @click="adding = true">
178
+ + {{ addLabel }}
179
+ </NcButton>
180
+ </div>
58
181
  <form
59
- v-if="canAdd"
182
+ v-if="canAdd && !(addTrigger && addPlacement === 'header') && (!addTrigger || adding)"
60
183
  class="cn-field-list-widget__add"
61
184
  data-testid="cn-field-list-add"
62
185
  @submit.prevent="add">
@@ -95,7 +218,7 @@
95
218
  </template>
96
219
 
97
220
  <script>
98
- import { NcButton, NcNoteCard, NcSelect, NcTextField } from '@nextcloud/vue'
221
+ import { NcActionButton, NcActions, NcButton, NcNoteCard, NcSelect, NcTextField } from '@nextcloud/vue'
99
222
  import CnStatusBadge from '../CnStatusBadge/CnStatusBadge.vue'
100
223
  import { isBadgeVariant } from '../../utils/badgeVariants.js'
101
224
  import { formatBoardDate } from '../../utils/boardDate.js'
@@ -125,7 +248,7 @@ import { serverErrorMessage } from '../../utils/serverErrorMessage.js'
125
248
  export default {
126
249
  name: 'CnFieldListWidget',
127
250
 
128
- components: { CnStatusBadge, NcButton, NcNoteCard, NcSelect, NcTextField },
251
+ components: { CnStatusBadge, NcActionButton, NcActions, NcButton, NcNoteCard, NcSelect, NcTextField },
129
252
 
130
253
  inject: {
131
254
  cnTranslate: { default: () => (key) => key },
@@ -137,11 +260,13 @@ export default {
137
260
  *
138
261
  * - `field` (required) — the object field holding the array.
139
262
  * - `key` — the item field that identifies an entry (default: the item itself for strings).
140
- * - `row` — `{ title, titleFallback?, avatar?, meta?: [paths|{ path, map?, format? }], pill?: { path, map?, variantMap? }, aside?: { path, format?, prefix? }, detail?: { template, when? } }`.
263
+ * - `row` — `{ title, titleFallback?, avatar?, meta?: [paths|{ path, map?, format? }], pill?: { path, map?, variantMap? }, aside?: { path, format?, prefix?, fallback? }, detail?: { template, when? } }`.
141
264
  * - `add` — `{ label?, fields: [{ key, label, type?: 'text'|'select', options?, required?, pattern?, patternMessage? }], unique?, defaults? }`.
142
265
  * - `remove` — `{ label? }`; omitted = no remove.
143
- * - `rowActions` — `[{ id, label, when?, request: { method?, url, payload? } }]`; tokens `@object.<field>`, `@objectId`, `@row.<field>`.
266
+ * - `rowActions` — `[{ id, label, when?, placement?: 'band', request: { method?, url, payload? } }]`; tokens `@object.<field>`, `@objectId`, `@row.<field>`.
144
267
  * - `rowSource` — `{ url, path?, key }`: live per-row state merged by key.
268
+ * - `variant: 'table'` + `columns` — `[{ header, path, map?, format?, strong?, pill?, variantMap? }]`: rows as a table; a per-row "..." menu holds the row actions and remove; `detail` lines become a warning band under the table, with the row actions that have `placement: 'band'`.
269
+ * - `add.trigger: 'button'`, `add.placement: 'header' | 'footer'` — the add form opens from a button.
145
270
  * - `readOnly`, `hint`, `emptyText`.
146
271
  *
147
272
  * @type {object}
@@ -185,6 +310,8 @@ export default {
185
310
  /** Live per-row state from `rowSource`, by key. */
186
311
  live: {},
187
312
  draft: {},
313
+ /** Whether the add form is open (only with `add.trigger: 'button'`). */
314
+ adding: false,
188
315
  errors: {},
189
316
  busy: '',
190
317
  notice: '',
@@ -232,6 +359,7 @@ export default {
232
359
  aside: spec.aside ? this.asideOf(entry, spec.aside) : '',
233
360
  detail: spec.detail && this.matches(entry, spec.detail.when) ? this.fill(spec.detail.template, entry) : '',
234
361
  actions: this.actionsFor(entry),
362
+ cells: this.isTable ? this.cellsOf(entry) : [],
235
363
  }
236
364
  })
237
365
  },
@@ -269,6 +397,44 @@ export default {
269
397
  }))
270
398
  },
271
399
 
400
+ /** Whether the rows are drawn as a table (`variant: 'table'`). */
401
+ isTable() {
402
+ return this.content.variant === 'table' && this.tableColumns.length > 0
403
+ },
404
+
405
+ /**
406
+ * The table columns, headers translated.
407
+ *
408
+ * @return {Array<object>}
409
+ */
410
+ tableColumns() {
411
+ return (Array.isArray(this.content.columns) ? this.content.columns : [])
412
+ .filter((column) => column && column.path)
413
+ .map((column, index) => ({ ...column, key: `${column.path}-${index}`, header: this.tr(column.header || '') }))
414
+ },
415
+
416
+ /** Whether each row has a "more actions" menu (row actions not placed in the band, and remove). */
417
+ hasMenu() {
418
+ return this.isTable && !this.readOnly && (this.canRemove || this.rows.some((row) => this.menuItems(row).length > 0))
419
+ },
420
+
421
+ /** Rows with a detail line: in the table variant it is a warning band under the table. */
422
+ bandRows() {
423
+ return this.rows
424
+ .filter((row) => row.detail !== '')
425
+ .map((row) => ({ ...row, bandActions: row.actions.filter((action) => action.placement === 'band') }))
426
+ },
427
+
428
+ /** Whether the add form opens from a button (`add.trigger: 'button'`). */
429
+ addTrigger() {
430
+ return Boolean(this.content.add && this.content.add.trigger === 'button')
431
+ },
432
+
433
+ /** Where the add button sits: `header` (above the rows) or `footer` (default). */
434
+ addPlacement() {
435
+ return this.content.add && this.content.add.placement === 'header' ? 'header' : 'footer'
436
+ },
437
+
272
438
  addLabel() {
273
439
  return this.tr((this.content.add && this.content.add.label) || 'Add')
274
440
  },
@@ -315,6 +481,36 @@ export default {
315
481
  return typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text
316
482
  },
317
483
 
484
+ /**
485
+ * The cells of one table row, one per column.
486
+ *
487
+ * @param {object} entry The entry.
488
+ * @return {Array<{text: string, pill: object|null}>}
489
+ */
490
+ cellsOf(entry) {
491
+ return this.tableColumns.map((column) => ({
492
+ text: this.text(entry, column),
493
+ pill: column.pill ? this.pillOf(entry, column) : null,
494
+ }))
495
+ },
496
+
497
+ /**
498
+ * The items of a row's menu in the table variant: the row actions not
499
+ * placed in the band, then remove.
500
+ *
501
+ * @param {object} row The row.
502
+ * @return {Array<{id: string, label: string, run: Function}>}
503
+ */
504
+ menuItems(row) {
505
+ const items = row.actions
506
+ .filter((action) => action.placement !== 'band')
507
+ .map((action) => ({ id: action.id, label: action.label, run: () => this.runAction(action, row) }))
508
+ if (this.canRemove) {
509
+ items.push({ id: 'remove', label: this.removeLabel, run: () => this.remove(row) })
510
+ }
511
+ return items
512
+ },
513
+
318
514
  /**
319
515
  * The identity of an entry.
320
516
  *
@@ -375,7 +571,8 @@ export default {
375
571
  asideOf(entry, spec) {
376
572
  const value = this.text(entry, spec)
377
573
  if (value === '') {
378
- return ''
574
+ // No value: the optional `fallback` label, translated, instead of an empty aside.
575
+ return this.tr(spec.fallback)
379
576
  }
380
577
  return spec.prefix ? `${this.tr(spec.prefix)} ${value}` : value
381
578
  },
@@ -598,6 +795,7 @@ export default {
598
795
  }, '*')
599
796
  if (saved) {
600
797
  this.resetDraft()
798
+ this.adding = false
601
799
  this.loadLive()
602
800
  }
603
801
  },
@@ -743,4 +941,68 @@ export default {
743
941
  .cn-field-list-widget__add > button {
744
942
  flex: 0 0 auto;
745
943
  }
944
+
945
+ .cn-field-list-widget__toolbar {
946
+ display: flex;
947
+ justify-content: flex-end;
948
+ }
949
+
950
+ .cn-field-list-widget__table-wrap {
951
+ display: flex;
952
+ flex-direction: column;
953
+ gap: 12px;
954
+ overflow-x: auto;
955
+ }
956
+
957
+ .cn-field-list-widget__table {
958
+ width: 100%;
959
+ border-collapse: collapse;
960
+ }
961
+
962
+ .cn-field-list-widget__th {
963
+ padding: 8px 12px;
964
+ text-align: start;
965
+ font-size: 13px;
966
+ font-weight: 600;
967
+ white-space: nowrap;
968
+ color: var(--color-text-maxcontrast);
969
+ background: var(--color-background-hover);
970
+ }
971
+
972
+ .cn-field-list-widget__th--menu,
973
+ .cn-field-list-widget__td--menu {
974
+ width: 1%;
975
+ text-align: end;
976
+ }
977
+
978
+ .cn-field-list-widget__tr {
979
+ border-top: 1px solid var(--cn-board-hairline, var(--color-border));
980
+ }
981
+
982
+ .cn-field-list-widget__td {
983
+ padding: 10px 12px;
984
+ vertical-align: middle;
985
+ overflow-wrap: anywhere;
986
+ }
987
+
988
+ .cn-field-list-widget__sr {
989
+ position: absolute;
990
+ width: 1px;
991
+ height: 1px;
992
+ overflow: hidden;
993
+ clip-path: inset(50%);
994
+ }
995
+
996
+ .cn-field-list-widget__band {
997
+ display: flex;
998
+ flex-wrap: wrap;
999
+ align-items: center;
1000
+ justify-content: space-between;
1001
+ gap: 8px 12px;
1002
+ padding: 12px 14px;
1003
+ border: 1px solid var(--color-warning);
1004
+ border-radius: 10px;
1005
+ background: color-mix(in srgb, var(--color-warning) 14%, var(--color-main-background));
1006
+ font-size: 14px;
1007
+ }
746
1008
  </style>