@conduction/nextcloud-vue 2.58.0 → 2.60.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 (507) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +12 -2
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +1 -2
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  5. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js +14 -1
  6. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
  7. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +0 -3
  8. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
  9. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  10. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -2
  11. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  12. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +39 -0
  13. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  14. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +46 -4
  15. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  16. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +224 -9
  17. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +79 -25
  19. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  20. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js +42 -3
  21. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js.map +1 -1
  22. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js +39 -6
  23. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js.map +1 -1
  24. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +58 -5
  25. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  26. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +13 -5
  27. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  28. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js +10 -0
  29. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js.map +1 -0
  30. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +39 -0
  31. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -0
  32. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +16 -0
  33. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js.map +1 -0
  34. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +9 -1
  35. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  36. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  37. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +117 -1
  38. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  39. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +147 -89
  40. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  41. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +6 -1
  42. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
  43. package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
  44. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +10 -0
  45. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js.map +1 -0
  46. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +259 -0
  47. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -0
  48. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +131 -0
  49. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -0
  50. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +10 -0
  51. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js.map +1 -0
  52. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +116 -0
  53. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -0
  54. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +24 -0
  55. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -0
  56. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +116 -15
  57. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  58. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +27 -14
  59. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  60. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js +13 -6
  61. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js.map +1 -1
  62. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js +2 -0
  63. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js.map +1 -1
  64. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +532 -29
  65. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  66. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +300 -142
  67. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  68. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js +10 -0
  69. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js.map +1 -0
  70. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js +237 -0
  71. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js.map +1 -0
  72. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js +120 -0
  73. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js.map +1 -0
  74. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js +10 -0
  75. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js.map +1 -0
  76. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +77 -0
  77. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -0
  78. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js +27 -0
  79. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -0
  80. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  81. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +1 -2
  82. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  83. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +3 -1
  84. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  85. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +17 -17
  86. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  87. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js +4 -21
  88. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js.map +1 -1
  89. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue3.js.map +1 -1
  90. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +0 -13
  91. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  92. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +8 -8
  93. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  94. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue2.js.map +1 -1
  95. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js +3 -2
  96. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js.map +1 -1
  97. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +169 -12
  98. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
  99. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +15 -7
  100. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
  101. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js +37 -3
  102. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js.map +1 -1
  103. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js +44 -16
  104. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js.map +1 -1
  105. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +199 -16
  106. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  107. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +20 -10
  108. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  109. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js +31 -11
  110. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js.map +1 -1
  111. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue2.js.map +1 -1
  112. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js +1 -2
  113. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js.map +1 -1
  114. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  115. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js +0 -1
  116. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  117. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js +2 -17
  118. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js.map +1 -1
  119. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue3.js.map +1 -1
  120. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js +35 -11
  121. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js.map +1 -1
  122. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js +3 -2
  123. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js.map +1 -1
  124. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js +10 -0
  125. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js.map +1 -0
  126. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js +150 -0
  127. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js.map +1 -0
  128. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js +106 -0
  129. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js.map +1 -0
  130. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js +9 -0
  131. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js.map +1 -0
  132. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +47 -0
  133. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -0
  134. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js +17 -0
  135. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js.map +1 -0
  136. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +23 -5
  137. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  138. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +1 -1
  139. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  140. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +49 -0
  141. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  142. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  143. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js +6 -0
  144. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js.map +1 -1
  145. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue3.js.map +1 -1
  146. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js +46 -0
  147. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js.map +1 -1
  148. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js +15 -3
  149. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js.map +1 -1
  150. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js +19 -3
  151. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js.map +1 -1
  152. package/dist/esm/components/CnObjectList/CnObjectList.vue3.js.map +1 -1
  153. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +45 -15
  154. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  155. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
  156. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  157. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js +24 -6
  158. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js.map +1 -1
  159. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js +1 -1
  160. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js.map +1 -1
  161. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  162. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +0 -1
  163. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  164. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  165. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +4 -2
  166. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  167. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +37 -1
  168. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  169. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +29 -13
  170. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  171. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +100 -3
  172. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
  173. package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue3.js.map +1 -1
  174. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +7 -2
  175. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
  176. package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
  177. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +50 -3
  178. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  179. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  180. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js +10 -0
  181. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js.map +1 -0
  182. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +186 -0
  183. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -0
  184. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +46 -0
  185. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -0
  186. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js +5 -3
  187. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js.map +1 -1
  188. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue3.js.map +1 -1
  189. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +11 -0
  190. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js.map +1 -0
  191. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +298 -0
  192. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -0
  193. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +77 -0
  194. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -0
  195. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js +10 -0
  196. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js.map +1 -0
  197. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js +169 -0
  198. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js.map +1 -0
  199. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js +48 -0
  200. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js.map +1 -0
  201. package/dist/esm/components/CnTabs/CnTab.vue2.js +35 -0
  202. package/dist/esm/components/CnTabs/CnTab.vue2.js.map +1 -1
  203. package/dist/esm/components/CnTabs/CnTab.vue3.js.map +1 -1
  204. package/dist/esm/components/CnTabs/CnTabs.vue2.js +120 -7
  205. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  206. package/dist/esm/components/CnTabs/CnTabs.vue3.js +57 -5
  207. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  208. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +59 -4
  209. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  210. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +6 -2
  211. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  212. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +3 -1
  213. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
  214. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +1 -0
  215. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
  216. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +10 -0
  217. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js.map +1 -0
  218. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +484 -0
  219. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -0
  220. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js +115 -0
  221. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -0
  222. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js +10 -0
  223. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js.map +1 -0
  224. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js +189 -0
  225. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js.map +1 -0
  226. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js +74 -0
  227. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js.map +1 -0
  228. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +82 -8
  229. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  230. package/dist/esm/index.js +10 -0
  231. package/dist/esm/index.js.map +1 -1
  232. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js +3 -1
  233. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js.map +1 -1
  234. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue3.js.map +1 -1
  235. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -1
  236. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
  237. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js +2 -4
  238. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
  239. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js +6 -0
  240. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js.map +1 -1
  241. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js +68 -53
  242. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js.map +1 -1
  243. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js +17 -0
  244. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js.map +1 -1
  245. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js +21 -19
  246. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js.map +1 -1
  247. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js +3 -1
  248. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js.map +1 -1
  249. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue3.js.map +1 -1
  250. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js +3 -1
  251. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js.map +1 -1
  252. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js +2 -4
  253. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js.map +1 -1
  254. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js +2 -1
  255. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js.map +1 -1
  256. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue3.js.map +1 -1
  257. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
  258. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
  259. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js +1 -2
  260. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
  261. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +2 -1
  262. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
  263. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
  264. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
  265. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
  266. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js +1 -2
  267. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
  268. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
  269. package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
  270. package/dist/esm/integrations/builtin/email/CnEmailTab.vue2.js.map +1 -1
  271. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js +1 -2
  272. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js.map +1 -1
  273. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js +2 -1
  274. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js.map +1 -1
  275. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue3.js.map +1 -1
  276. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js +2 -1
  277. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js.map +1 -1
  278. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js +1 -2
  279. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js.map +1 -1
  280. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js +3 -1
  281. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js.map +1 -1
  282. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue3.js.map +1 -1
  283. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js +3 -1
  284. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js.map +1 -1
  285. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js +2 -4
  286. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js.map +1 -1
  287. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js +3 -1
  288. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js.map +1 -1
  289. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue3.js.map +1 -1
  290. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js +3 -1
  291. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js.map +1 -1
  292. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js +2 -4
  293. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js.map +1 -1
  294. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js +3 -1
  295. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js.map +1 -1
  296. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue3.js.map +1 -1
  297. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js +3 -1
  298. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js.map +1 -1
  299. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js +2 -4
  300. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js.map +1 -1
  301. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js +2 -1
  302. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js.map +1 -1
  303. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue3.js.map +1 -1
  304. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
  305. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
  306. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js +1 -2
  307. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
  308. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js +2 -1
  309. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js.map +1 -1
  310. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue3.js.map +1 -1
  311. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js +2 -1
  312. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js.map +1 -1
  313. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js +1 -2
  314. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js.map +1 -1
  315. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue2.js.map +1 -1
  316. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js +3 -6
  317. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js.map +1 -1
  318. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js +3 -1
  319. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js.map +1 -1
  320. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue3.js.map +1 -1
  321. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js +3 -1
  322. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js.map +1 -1
  323. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js +2 -4
  324. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js.map +1 -1
  325. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js +2 -1
  326. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js.map +1 -1
  327. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue3.js.map +1 -1
  328. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js +2 -1
  329. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js.map +1 -1
  330. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js +1 -2
  331. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js.map +1 -1
  332. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js +4 -1
  333. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js.map +1 -1
  334. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue3.js.map +1 -1
  335. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js +6 -3
  336. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js.map +1 -1
  337. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js +2 -4
  338. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js.map +1 -1
  339. package/dist/esm/l10n/en.json.js +55 -1
  340. package/dist/esm/l10n/en.json.js.map +1 -1
  341. package/dist/esm/l10n/nl.json.js +55 -1
  342. package/dist/esm/l10n/nl.json.js.map +1 -1
  343. package/dist/esm/nextcloud-vue.css +998 -7
  344. package/dist/esm/utils/actionLink.js +5 -0
  345. package/dist/esm/utils/actionLink.js.map +1 -1
  346. package/dist/esm/utils/actionsDispatcher.js +16 -1
  347. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  348. package/dist/esm/utils/dateVariant.js +124 -0
  349. package/dist/esm/utils/dateVariant.js.map +1 -0
  350. package/dist/esm/utils/detailActionModel.js +260 -0
  351. package/dist/esm/utils/detailActionModel.js.map +1 -0
  352. package/dist/esm/utils/dueRule.js +84 -0
  353. package/dist/esm/utils/dueRule.js.map +1 -0
  354. package/dist/esm/utils/fetchAggregate.js +37 -1
  355. package/dist/esm/utils/fetchAggregate.js.map +1 -1
  356. package/dist/esm/utils/fetchFilterCounts.js +186 -0
  357. package/dist/esm/utils/fetchFilterCounts.js.map +1 -0
  358. package/dist/esm/utils/libraryWidgetKeys.js +5 -0
  359. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  360. package/dist/esm/utils/linkNavigation.js +6 -3
  361. package/dist/esm/utils/linkNavigation.js.map +1 -1
  362. package/dist/esm/utils/readPath.js +30 -0
  363. package/dist/esm/utils/readPath.js.map +1 -0
  364. package/dist/esm/utils/rowAuxClick.js +30 -5
  365. package/dist/esm/utils/rowAuxClick.js.map +1 -1
  366. package/dist/esm/utils/safeHref.js +18 -3
  367. package/dist/esm/utils/safeHref.js.map +1 -1
  368. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  369. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  370. package/dist/nextcloud-vue.cjs.js +15855 -9353
  371. package/dist/nextcloud-vue.cjs.js.map +2 -2
  372. package/dist/nextcloud-vue.css +998 -7
  373. package/l10n/en.json +55 -1
  374. package/l10n/nl.json +55 -1
  375. package/package.json +1 -1
  376. package/scripts/.jsdoc-baselines.json +3 -0
  377. package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
  378. package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -4
  379. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
  380. package/src/components/CnAppNav/CnAppNav.md +26 -0
  381. package/src/components/CnAppNav/CnAppNav.vue +104 -1
  382. package/src/components/CnBannerWidget/CnBannerWidget.vue +365 -10
  383. package/src/components/CnBannerWidgetForm/CnBannerWidgetForm.vue +65 -3
  384. package/src/components/CnBoardView/CnBoardView.vue +90 -5
  385. package/src/components/CnBrandStripe/CnBrandStripe.md +22 -0
  386. package/src/components/CnBrandStripe/CnBrandStripe.vue +100 -0
  387. package/src/components/CnBrandStripe/index.js +4 -0
  388. package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
  389. package/src/components/CnCellRenderer/CnCellRenderer.vue +207 -1
  390. package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
  391. package/src/components/CnConversationThread/CnConversationThread.md +51 -0
  392. package/src/components/CnConversationThread/CnConversationThread.vue +457 -0
  393. package/src/components/CnConversationThread/CnConversationWidget.vue +144 -0
  394. package/src/components/CnConversationThread/index.js +4 -0
  395. package/src/components/CnDataTable/CnDataTable.md +1 -1
  396. package/src/components/CnDataTable/CnDataTable.vue +131 -17
  397. package/src/components/CnDateAxisView/CnDateAxisView.vue +15 -6
  398. package/src/components/CnDetailPage/CnDetailPage.md +17 -1
  399. package/src/components/CnDetailPage/CnDetailPage.vue +712 -49
  400. package/src/components/CnDocumentReviewList/CnDocumentReviewList.md +55 -0
  401. package/src/components/CnDocumentReviewList/CnDocumentReviewList.vue +384 -0
  402. package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +108 -0
  403. package/src/components/CnDocumentReviewList/index.js +4 -0
  404. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -2
  405. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +5 -3
  406. package/src/components/CnFilesWidget/CnFilesWidget.vue +4 -21
  407. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +8 -21
  408. package/src/components/CnFlowsPage/CnFlowsPage.vue +2 -1
  409. package/src/components/CnHeaderWidget/CnHeaderWidget.vue +189 -14
  410. package/src/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue +53 -3
  411. package/src/components/CnIndexPage/CnIndexPage.vue +210 -17
  412. package/src/components/CnIndexPage/manifestActionDispatch.js +31 -11
  413. package/src/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue +1 -2
  414. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +0 -1
  415. package/src/components/CnLinkButtonWidget/CnLinkButtonWidget.vue +2 -17
  416. package/src/components/CnLogsPage/CnLogsPage.vue +37 -12
  417. package/src/components/CnNextStepCard/CnNextStepCard.md +40 -0
  418. package/src/components/CnNextStepCard/CnNextStepCard.vue +319 -0
  419. package/src/components/CnNextStepCard/CnNextStepWidget.vue +59 -0
  420. package/src/components/CnNextStepCard/index.js +4 -0
  421. package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
  422. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +49 -0
  423. package/src/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue +6 -0
  424. package/src/components/CnObjectKanban/CnObjectKanban.vue +86 -2
  425. package/src/components/CnObjectList/CnObjectList.vue +19 -3
  426. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +47 -15
  427. package/src/components/CnObjectRow/CnObjectRow.vue +25 -7
  428. package/src/components/CnObjectSidebar/CnFilesTab.vue +0 -1
  429. package/src/components/CnPageRenderer/CnPageRenderer.vue +2 -0
  430. package/src/components/CnQuickFilterBar/CnQuickFilterBar.md +3 -0
  431. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +60 -1
  432. package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +100 -3
  433. package/src/components/CnRowActions/CnRowActions.vue +7 -2
  434. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +50 -3
  435. package/src/components/CnSegmentedControl/CnSegmentedControl.md +46 -0
  436. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +291 -0
  437. package/src/components/CnSegmentedControl/index.js +4 -0
  438. package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
  439. package/src/components/CnStackedBarWidget/CnStackedBarWidget.md +15 -0
  440. package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +414 -0
  441. package/src/components/CnStackedBarWidget/index.js +14 -0
  442. package/src/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue +224 -0
  443. package/src/components/CnStackedBarWidgetForm/index.js +4 -0
  444. package/src/components/CnTabs/CnTab.vue +35 -0
  445. package/src/components/CnTabs/CnTabs.vue +251 -13
  446. package/src/components/CnTabsWidget/CnTabsWidget.vue +63 -4
  447. package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
  448. package/src/components/CnWeekStripWidget/CnWeekStripWidget.md +31 -0
  449. package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +668 -0
  450. package/src/components/CnWeekStripWidget/index.js +14 -0
  451. package/src/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue +265 -0
  452. package/src/components/CnWeekStripWidgetForm/index.js +4 -0
  453. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +74 -0
  454. package/src/components/index.js +11 -0
  455. package/src/css/detail-page.css +47 -0
  456. package/src/css/table.css +26 -0
  457. package/src/index.js +9 -0
  458. package/src/integrations/builtin/analytics/CnAnalyticsCard.vue +3 -2
  459. package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +5 -6
  460. package/src/integrations/builtin/bookmarks/CnBookmarksCard.vue +12 -1
  461. package/src/integrations/builtin/bookmarks/CnBookmarksTab.vue +23 -6
  462. package/src/integrations/builtin/bookmarks/__tests__/CnBookmarksTab.spec.js +7 -2
  463. package/src/integrations/builtin/collectives/CnCollectivesCard.vue +3 -2
  464. package/src/integrations/builtin/collectives/CnCollectivesTab.vue +5 -6
  465. package/src/integrations/builtin/cospend/CnCospendCard.vue +2 -2
  466. package/src/integrations/builtin/cospend/CnCospendTab.vue +3 -4
  467. package/src/integrations/builtin/deck/CnDeckCard.vue +2 -2
  468. package/src/integrations/builtin/deck/CnDeckTab.vue +3 -4
  469. package/src/integrations/builtin/email/CnEmailCard.vue +6 -2
  470. package/src/integrations/builtin/email/CnEmailTab.vue +7 -4
  471. package/src/integrations/builtin/flow/CnFlowCard.vue +2 -2
  472. package/src/integrations/builtin/flow/CnFlowTab.vue +3 -4
  473. package/src/integrations/builtin/forms/CnFormsCard.vue +3 -2
  474. package/src/integrations/builtin/forms/CnFormsTab.vue +5 -6
  475. package/src/integrations/builtin/maps/CnMapsCard.vue +3 -2
  476. package/src/integrations/builtin/maps/CnMapsTab.vue +5 -6
  477. package/src/integrations/builtin/maps/__tests__/CnMapsTab.spec.js +9 -0
  478. package/src/integrations/builtin/openproject/CnOpenprojectCard.vue +3 -2
  479. package/src/integrations/builtin/openproject/CnOpenprojectTab.vue +5 -6
  480. package/src/integrations/builtin/photos/CnPhotosCard.vue +2 -2
  481. package/src/integrations/builtin/photos/CnPhotosTab.vue +3 -4
  482. package/src/integrations/builtin/polls/CnPollsCard.vue +2 -2
  483. package/src/integrations/builtin/polls/CnPollsTab.vue +3 -4
  484. package/src/integrations/builtin/shares/CnSharesTab.vue +3 -6
  485. package/src/integrations/builtin/talk/CnTalkCard.vue +3 -2
  486. package/src/integrations/builtin/talk/CnTalkTab.vue +5 -6
  487. package/src/integrations/builtin/time-tracker/CnTimeTrackerCard.vue +2 -2
  488. package/src/integrations/builtin/time-tracker/CnTimeTrackerTab.vue +3 -4
  489. package/src/integrations/builtin/xwiki/CnXwikiCard.vue +4 -2
  490. package/src/integrations/builtin/xwiki/CnXwikiTab.vue +7 -7
  491. package/src/integrations/builtin/xwiki/__tests__/CnXwikiTab.spec.js +9 -0
  492. package/src/schemas/app-manifest-v2.schema.json +389 -1
  493. package/src/schemas/app-manifest.schema.json +2 -1
  494. package/src/utils/actionLink.js +5 -0
  495. package/src/utils/actionsDispatcher.js +15 -0
  496. package/src/utils/dateVariant.js +120 -0
  497. package/src/utils/detailActionModel.js +256 -0
  498. package/src/utils/dueRule.js +94 -0
  499. package/src/utils/fetchAggregate.js +36 -0
  500. package/src/utils/fetchFilterCounts.js +182 -0
  501. package/src/utils/index.js +1 -0
  502. package/src/utils/libraryWidgetKeys.js +5 -0
  503. package/src/utils/linkNavigation.js +6 -3
  504. package/src/utils/readPath.js +27 -0
  505. package/src/utils/rowAuxClick.js +29 -4
  506. package/src/utils/safeHref.js +18 -3
  507. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -163,7 +163,7 @@ export default {
163
163
  },
164
164
  },
165
165
 
166
- emits: ['click', 'select'],
166
+ emits: ['click', 'select', 'aux-click'],
167
167
 
168
168
  computed: {
169
169
  /**
@@ -194,6 +194,7 @@ export default {
194
194
  const listeners = { select: () => this.toggleSelect(object) }
195
195
  if (!this.selectable) {
196
196
  listeners.click = (_row, event) => this.emitClick(object, event)
197
+ listeners['aux-click'] = (_row, event) => this.emitAuxClick(object, event)
197
198
  }
198
199
  return listeners
199
200
  },
@@ -202,16 +203,31 @@ export default {
202
203
  * Emit `click` for a non-selectable row (navigation).
203
204
  *
204
205
  * @param {object} object The clicked row's object.
205
- * @param {MouseEvent} [event] The native click/auxclick event.
206
+ * @param {MouseEvent} [event] The native click event.
206
207
  */
207
208
  emitClick(object, event) {
208
209
  /**
209
- * @event click Emitted when a non-selectable row is clicked or middle-clicked (navigation). Payload: `(object, event)` — the row's object and the native click/auxclick event, for opening it in a new tab on a ctrl/cmd/shift or middle click.
210
+ * @event click Emitted when a non-selectable row is clicked (navigation). Payload: `(object, event)` — the row's object and the native click event, for opening it in a new tab on a ctrl/cmd/shift click. A middle click emits `aux-click` instead.
210
211
  * @type {object} The clicked row's object.
211
212
  */
212
213
  this.$emit('click', object, event)
213
214
  },
214
215
 
216
+ /**
217
+ * Emit `aux-click` for a middle click on a non-selectable row, kept off
218
+ * `click` so a navigating listener never moves the current tab away.
219
+ *
220
+ * @param {object} object The clicked row's object.
221
+ * @param {MouseEvent} event The native auxclick event.
222
+ */
223
+ emitAuxClick(object, event) {
224
+ /**
225
+ * @event aux-click Emitted when a non-selectable row is middle-clicked, for opening it in a new tab (see `openRowTarget`). Payload: `(object, event)` — the row's object and the native auxclick event.
226
+ * @type {object} The clicked row's object.
227
+ */
228
+ this.$emit('aux-click', object, event)
229
+ },
230
+
215
231
  toggleSelect(object) {
216
232
  const id = object[this.rowKey]
217
233
  const newIds = this.isSelected(object)
@@ -152,6 +152,7 @@
152
152
  :sortOrder="localSort.dir || 'asc'"
153
153
  borderless
154
154
  @rowClick="onRowClick"
155
+ @rowAuxClick="onRowAuxClick"
155
156
  @select="onSelect"
156
157
  @sort="onSort">
157
158
  <template v-if="mappedRowActions.length > 0" #row-actions="{ row }">
@@ -172,6 +173,7 @@
172
173
  :sortOrder="localSort.dir || 'asc'"
173
174
  borderless
174
175
  @rowClick="onRowClick"
176
+ @rowAuxClick="onRowAuxClick"
175
177
  @select="onSelect"
176
178
  @sort="onSort">
177
179
  <!-- Declarative per-row actions (`content.rowActions`).
@@ -286,7 +288,7 @@ import CnFkResolveCell from '../CnFkResolveCell/CnFkResolveCell.vue'
286
288
  import CnFormDialog from '../CnFormDialog/CnFormDialog.vue'
287
289
  import CnPagination from '../CnPagination/CnPagination.vue'
288
290
  import CnWidgetEmptyState from '../CnWidgetEmptyState/CnWidgetEmptyState.vue'
289
- import { actionLink, dispatchAction } from '../../utils/actionsDispatcher.js'
291
+ import { actionLink, dispatchAction, hasActionTargetTokens } from '../../utils/actionsDispatcher.js'
290
292
  import { followLinkClick, openRowTarget, resolveHref } from '../../utils/linkNavigation.js'
291
293
  import { objectFieldValue } from '../../utils/objectName.js'
292
294
  import { dropOptionalUnresolved, hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'
@@ -421,7 +423,7 @@ export default {
421
423
  },
422
424
  },
423
425
 
424
- emits: ['created', 'row-click', 'view-all', 'files-dropped'],
426
+ emits: ['created', 'row-click', 'row-aux-click', 'view-all', 'files-dropped'],
425
427
 
426
428
  data() {
427
429
  return {
@@ -1414,29 +1416,60 @@ export default {
1414
1416
 
1415
1417
  /**
1416
1418
  * Navigate to a configured detail route on row click (when `rowRoute`
1417
- * is set and a router is available); a ctrl/cmd/shift or middle click
1418
- * opens it in a new tab.
1419
+ * is set and a router is available); a ctrl/cmd/shift click opens it
1420
+ * in a new tab.
1419
1421
  *
1420
1422
  * @param {object} row The clicked object row.
1421
- * @param {MouseEvent} [event] The originating click/auxclick event.
1423
+ * @param {MouseEvent} [event] The originating click event.
1422
1424
  * @return {void}
1423
1425
  */
1424
1426
  onRowClick(row, event) {
1425
- const route = this.content.rowRoute
1426
- const id = row && (row.id || (row['@self'] && row['@self'].id))
1427
- if (route && id && this.$router) {
1428
- markNewTabHandled(event, openRowTarget(event, { name: route, params: { id } }, this.$router))
1429
- }
1427
+ this.openRowRoute(row, event)
1430
1428
  /**
1431
1429
  * @event row-click Emitted with the clicked object (for hosts that
1432
- * want to handle navigation themselves), on a click or middle click.
1433
- * Payload: `(row, event)`, the second being the native click/auxclick
1434
- * event.
1430
+ * want to handle navigation themselves). Payload: `(row, event)`, the
1431
+ * second being the native click event. A middle click emits
1432
+ * `row-aux-click` instead.
1435
1433
  * @type {object}
1436
1434
  */
1437
1435
  this.$emit('row-click', row, event)
1438
1436
  },
1439
1437
 
1438
+ /**
1439
+ * A row middle click: opens the configured detail route in a new tab
1440
+ * and emits `row-aux-click`, not `row-click`.
1441
+ *
1442
+ * @param {object} row The clicked object row.
1443
+ * @param {MouseEvent} event The originating auxclick event.
1444
+ * @return {void}
1445
+ */
1446
+ onRowAuxClick(row, event) {
1447
+ this.openRowRoute(row, event)
1448
+ /**
1449
+ * @event row-aux-click Emitted with the middle-clicked object, for
1450
+ * opening it in a new tab. Payload: `(row, event)`, the second being
1451
+ * the native auxclick event.
1452
+ * @type {object}
1453
+ */
1454
+ this.$emit('row-aux-click', row, event)
1455
+ },
1456
+
1457
+ /**
1458
+ * Open `content.rowRoute` for a row: in place, or in a new tab on a
1459
+ * ctrl/cmd/shift or middle click.
1460
+ *
1461
+ * @param {object} row The clicked object row.
1462
+ * @param {MouseEvent} [event] The originating event.
1463
+ * @return {void}
1464
+ */
1465
+ openRowRoute(row, event) {
1466
+ const route = this.content.rowRoute
1467
+ const id = row && (row.id || (row['@self'] && row['@self'].id))
1468
+ if (route && id && this.$router) {
1469
+ markNewTabHandled(event, openRowTarget(event, { name: route, params: { id } }, this.$router))
1470
+ }
1471
+ },
1472
+
1440
1473
  /**
1441
1474
  * Dispatch one declared row action. A `handler` action gets the row
1442
1475
  * appended as its last argument, the same convention CnWidgetObjectTable
@@ -1465,8 +1498,7 @@ export default {
1465
1498
  * @return {object} `{ href, linkTarget }`, `{ to }`, or `{}`.
1466
1499
  */
1467
1500
  rowActionLink(action) {
1468
- const target = typeof action.target === 'string' ? action.target : ''
1469
- if (/[@{]/.test(target)) {
1501
+ if (hasActionTargetTokens(action.target)) {
1470
1502
  return {}
1471
1503
  }
1472
1504
  const link = actionLink(action, { router: this.$router || null })
@@ -2,7 +2,7 @@
2
2
  <div
3
3
  class="cn-object-row"
4
4
  :class="{ 'cn-object-row--selected': selected }"
5
- @mousedown="onPointerDown"
5
+ @mousedown="onRowMouseDown"
6
6
  @click="onRowClick($event)"
7
7
  @auxclick="onRowAuxClick($event)">
8
8
  <!-- Selection checkbox -->
@@ -68,7 +68,7 @@
68
68
  import { NcCheckboxRadioSwitch } from '@nextcloud/vue'
69
69
  import { useClickDragGuard } from '../../composables/useClickDragGuard.js'
70
70
  import { resolveImageUrl } from '../../utils/resolveImageUrl.js'
71
- import { isRowMiddleClick } from '../../utils/rowAuxClick.js'
71
+ import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
72
72
  import { CnIcon } from '../CnIcon/index.js'
73
73
  import { CnStatusBadge } from '../CnStatusBadge/index.js'
74
74
 
@@ -146,7 +146,7 @@ export default {
146
146
  // again from `$emit('click', object)` — twice per click, with different
147
147
  // payloads. Declaring the names here removes them from `$attrs`, which is
148
148
  // also what stops VTU v2 recording the native DOM event into `emitted()`.
149
- emits: ['select', 'click'],
149
+ emits: ['select', 'click', 'aux-click'],
150
150
 
151
151
  setup() {
152
152
  // Tell a deliberate row click apart from a text-selection drag.
@@ -237,15 +237,29 @@ export default {
237
237
  return
238
238
  }
239
239
  /**
240
- * @event click Emitted when a non-selectable row is clicked or middle-clicked (navigation). Payload: `(object, event)` — the row's object and the native click/auxclick event, for opening it in a new tab on a ctrl/cmd/shift or middle click.
240
+ * @event click Emitted when a non-selectable row is clicked (navigation). Payload: `(object, event)` — the row's object and the native click event, for opening it in a new tab on a ctrl/cmd/shift click. A middle click emits `aux-click` instead.
241
241
  * @type {object} The row's object.
242
242
  */
243
243
  this.$emit('click', this.object, event)
244
244
  },
245
245
 
246
246
  /**
247
- * Row-body middle click: emits `click` like a click on a
248
- * non-selectable row.
247
+ * Row mousedown: record the press for the drag guard, and on a
248
+ * non-selectable row keep a middle press from starting autoscroll.
249
+ *
250
+ * @param {MouseEvent} event The mousedown event.
251
+ */
252
+ onRowMouseDown(event) {
253
+ this.onPointerDown(event)
254
+ if (!this.selectable) {
255
+ preventMiddleClickAutoscroll(event)
256
+ }
257
+ },
258
+
259
+ /**
260
+ * Row-body middle click on a non-selectable row: emits `aux-click`, not
261
+ * `click`, so an existing `click` listener that navigates never moves
262
+ * the current tab away.
249
263
  *
250
264
  * @param {MouseEvent} event The auxclick event.
251
265
  */
@@ -253,7 +267,11 @@ export default {
253
267
  if (this.selectable || !isRowMiddleClick(event)) {
254
268
  return
255
269
  }
256
- this.$emit('click', this.object, event)
270
+ /**
271
+ * @event aux-click Emitted when a non-selectable row is middle-clicked, for opening it in a new tab (see `openRowTarget`). Payload: `(object, event)` — the row's object and the native auxclick event.
272
+ * @type {object} The row's object.
273
+ */
274
+ this.$emit('aux-click', this.object, event)
257
275
  },
258
276
  },
259
277
  }
@@ -153,7 +153,6 @@
153
153
  v-if="file.id"
154
154
  :href="showInFilesUrl(file)"
155
155
  target="_blank"
156
- rel="noopener noreferrer"
157
156
  :closeAfterClick="true">
158
157
  <template #icon>
159
158
  <FolderOutline :size="20" />
@@ -128,6 +128,7 @@
128
128
  v-bind="{ ...$attrs, ...resolvedProps }"
129
129
  @view="onRowOpen"
130
130
  @rowClick="onRowOpen"
131
+ @rowAuxClick="onRowOpen"
131
132
  @editOpen="onRowOpen"
132
133
  @configure="showConfigModal = true">
133
134
  <!-- This `<template v-for>` defines dynamic SLOTS, not a
@@ -203,6 +204,7 @@
203
204
  v-bind="{ ...$attrs, ...resolvedProps }"
204
205
  @view="onRowOpen"
205
206
  @rowClick="onRowOpen"
207
+ @rowAuxClick="onRowOpen"
206
208
  @editOpen="onRowOpen"
207
209
  @configure="showConfigModal = true">
208
210
  <!-- Dynamic slot definition, not a rendered list — see the note on
@@ -45,6 +45,8 @@ In `manifest.json` (the usual entry-point — CnIndexPage mounts the bar for you
45
45
  | `filter` | Object | yes | Filter map merged into the fetch when this tab is active. Same value syntax as `config.filter`: literals pass through; `"@route.<name>"` / `":<name>"` resolve from `$route.params`. |
46
46
  | `default` | Boolean | no | Pre-selected on mount; first tab with `default:true` (else index 0) is active |
47
47
  | `icon` | String | no | Optional MDI icon name shown next to the label |
48
+ | `showCount` | Boolean | no | On a CnIndexPage: show how many records this tab matches. Tabs that filter the same single field share one grouped request. |
49
+ | `count` | Number | no | A count you supply yourself, shown after the label. |
48
50
 
49
51
  ## Props
50
52
 
@@ -57,6 +59,7 @@ In `manifest.json` (the usual entry-point — CnIndexPage mounts the bar for you
57
59
  - `selectLabel` (String, default `'Filter'`) — accessible label / placeholder for the dropdown control.
58
60
  - `placeholder` (String) — placeholder text for the dropdown (falls back to `selectLabel`).
59
61
  - `maxVisible` (Number, default `0`) — chips mode only: how many pills render inline before the rest move behind one more chip, a `⋯` pill that opens a small panel of the hidden lenses (also as chips). `0` renders every tab. The visible set is the first `maxVisible` entries of `tabs`, so their declared order decides what stays in the strip; an active hidden tab moves its label and fill onto that chip. Manifest: `config.quickFilterMaxVisible`.
62
+ - `counts` (Object or Array, default `null`): how many records each tab matches, keyed by tab index. A tab with a number shows it after its label. CnIndexPage fills this for tabs that set `showCount`.
60
63
 
61
64
  ### Events
62
65
 
@@ -44,6 +44,10 @@
44
44
  :size="16"
45
45
  class="cn-quick-filter-bar__icon" />
46
46
  <span class="cn-quick-filter-bar__label">{{ entry.tab.label }}</span>
47
+ <span
48
+ v-if="countOf(entry) !== null"
49
+ class="cn-quick-filter-bar__count"
50
+ data-testid="cn-quick-filter-count">{{ ' ' + countOf(entry) }}</span>
47
51
  </button>
48
52
  </div>
49
53
  <!-- The overflow is a CHIP and not a toolbar button: it is one of the
@@ -96,6 +100,10 @@
96
100
  :size="16"
97
101
  class="cn-quick-filter-bar__icon" />
98
102
  <span class="cn-quick-filter-bar__label">{{ entry.tab.label }}</span>
103
+ <span
104
+ v-if="countOf(entry) !== null"
105
+ class="cn-quick-filter-bar__count"
106
+ data-testid="cn-quick-filter-count">{{ ' ' + countOf(entry) }}</span>
99
107
  </button>
100
108
  </div>
101
109
  </div>
@@ -231,6 +239,19 @@ export default {
231
239
  default: 0,
232
240
  validator: (v) => Number.isFinite(v) && v >= 0,
233
241
  },
242
+
243
+ /**
244
+ * How many records each tab matches, keyed by tab index (an array in
245
+ * tab order works too). A tab with a number here shows it after its
246
+ * label; a tab without one shows no count. A tab can also carry its
247
+ * own `count`. `null` (the default) shows no counts at all.
248
+ *
249
+ * @type {{[index: number]: number}|Array<number|null>|null}
250
+ */
251
+ counts: {
252
+ type: [Object, Array],
253
+ default: null,
254
+ },
234
255
  },
235
256
 
236
257
  emits: ['update:active-index', 'update:selected-indices'],
@@ -324,10 +345,19 @@ export default {
324
345
  * omitted — an empty selection already means "all".
325
346
  *
326
347
  * @return {Array<{label: string, index: number, icon: string}>}
348
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
327
349
  */
328
350
  dropdownOptions() {
329
351
  return this.tabs
330
- .map((tab, index) => ({ label: tab.label, icon: tab.icon, index, _empty: this.isEmptyFilter(tab) }))
352
+ .map((tab, index) => {
353
+ const count = this.countOf({ tab, index })
354
+ return {
355
+ label: count === null ? tab.label : `${tab.label} (${count})`,
356
+ icon: tab.icon,
357
+ index,
358
+ _empty: this.isEmptyFilter(tab),
359
+ }
360
+ })
331
361
  .filter((o) => !o._empty)
332
362
  },
333
363
 
@@ -346,6 +376,20 @@ export default {
346
376
  },
347
377
 
348
378
  methods: {
379
+ /**
380
+ * The count to show on a tab, or null for none: `counts[index]`
381
+ * first, else the tab's own `count`.
382
+ *
383
+ * @param {{tab: object, index: number}} entry The tab and its index.
384
+ * @return {number|null}
385
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
386
+ */
387
+ countOf(entry) {
388
+ const fromProp = this.counts ? this.counts[entry.index] : undefined
389
+ const value = (fromProp !== undefined && fromProp !== null) ? fromProp : entry.tab.count
390
+ return (typeof value === 'number' && Number.isFinite(value)) ? value : null
391
+ },
392
+
349
393
  /**
350
394
  * Is tab `i` rendered active in chips mode (handles both single
351
395
  * `activeIndex` and `multiple` `selectedIndices`).
@@ -501,6 +545,21 @@ export default {
501
545
  line-height: 1;
502
546
  }
503
547
 
548
+ /* Inherits the chip's own text colour, so it stays readable on the active
549
+ (primary) fill as well as on the resting one. The count's text starts with
550
+ a space: the chip is a flex row, so the space is not drawn, but it keeps a
551
+ screen reader from reading label and count as one word. */
552
+ .cn-quick-filter-bar__count {
553
+ min-width: 1.5em;
554
+ padding: 2px 6px;
555
+ border: 1px solid currentColor;
556
+ border-radius: var(--border-radius-pill, 10px);
557
+ font-size: 0.85em;
558
+ font-weight: 600;
559
+ line-height: 1;
560
+ text-align: center;
561
+ }
562
+
504
563
  /* NcPopover wraps its trigger in a plain `<div class="v-popper">`, which as a
505
564
  block would drop the chip onto its own line under the strip. */
506
565
  .cn-quick-filter-bar > :deep(.v-popper) {
@@ -322,6 +322,26 @@ const CORE_TABS = ['files', 'notes', 'tags', 'tasks', 'auditTrail', 'shares']
322
322
  /** One-time guard so the legacy-path deprecation warning logs only once. */
323
323
  let legacyWarned = false
324
324
 
325
+ /**
326
+ * Schema titles by numeric schema id, shared by every widget on the page so a
327
+ * schema is asked for once. OpenRegister's `/uses` and `/used` answer
328
+ * `@self.schema` as that id ("120"), which is not a word anyone can read.
329
+ *
330
+ * @type {Map<string, Promise<string>>}
331
+ */
332
+ const schemaTitleCache = new Map()
333
+
334
+ /**
335
+ * Whether a value is a bare number, the way OpenRegister names a schema by id.
336
+ *
337
+ * @param {string|number|undefined|null} value The value.
338
+ * @return {boolean}
339
+ */
340
+ function isNumericId(value) {
341
+ return (typeof value === 'number' && Number.isFinite(value))
342
+ || (typeof value === 'string' && /^\d+$/.test(value.trim()))
343
+ }
344
+
325
345
  /**
326
346
  * Leaf groups surfaced by the aggregated `/relations` endpoint, in tab order.
327
347
  * `responseKey` is the key in the `/relations` payload; `integrationId` is the
@@ -404,6 +424,14 @@ export default {
404
424
  NcEmptyContent,
405
425
  },
406
426
 
427
+ inject: {
428
+ /**
429
+ * The host app's translator (CnAppRoot provides it), so a schema title
430
+ * reads in the app's language. Without it a title reads as stored.
431
+ */
432
+ cnTranslate: { default: () => (key) => key },
433
+ },
434
+
407
435
  props: {
408
436
  /** Widget title shown in the header. */
409
437
  title: {
@@ -667,6 +695,8 @@ export default {
667
695
  * @type {HTMLInputElement|null}
668
696
  */
669
697
  fileInputEl: null,
698
+ /** Schema titles by numeric schema id, for object rows. */
699
+ schemaTitles: {},
670
700
  /** Whether any section/tab is currently fetching. */
671
701
  loading: false,
672
702
  /** True once the first fetch has completed (gates the empty state). */
@@ -1359,9 +1389,74 @@ export default {
1359
1389
  self.name,
1360
1390
  raw.summary,
1361
1391
  raw.description,
1362
- ].find((v) => typeof v === 'string' && v.trim() && !isUuid(v)) || self.schema || String(id)
1363
- const meta = self.schema || raw.schema || ''
1364
- return { id, label, meta: typeof meta === 'string' ? meta : '', raw }
1392
+ ].find((v) => typeof v === 'string' && v.trim() && !isUuid(v))
1393
+ || [raw.givenName, raw.familyName].filter((v) => typeof v === 'string' && v.trim()).join(' ')
1394
+ // OpenRegister names the schema by numeric id: show its title, never the number.
1395
+ const schema = this.schemaName(self.schema || raw.schema)
1396
+ const finalLabel = label || schema || String(id)
1397
+ return { id, label: finalLabel, meta: schema === finalLabel ? '' : schema, raw }
1398
+ },
1399
+
1400
+ /**
1401
+ * How a row names its schema: the translated title for a numeric id
1402
+ * (empty until it is read, or when it cannot be), a slug as it is.
1403
+ *
1404
+ * @param {string|number|undefined|null} schema - `@self.schema` of the related object.
1405
+ * @return {string}
1406
+ */
1407
+ schemaName(schema) {
1408
+ if (isNumericId(schema)) {
1409
+ const title = this.schemaTitles[String(schema).trim()]
1410
+ return title ? this.cnTranslate(title) : ''
1411
+ }
1412
+ return typeof schema === 'string' ? schema : ''
1413
+ },
1414
+
1415
+ /**
1416
+ * Read the titles of the numeric schema ids in these envelopes once,
1417
+ * before the rows are built, so no row shows a number first.
1418
+ *
1419
+ * @param {Array<object|null>} envelopes - The `{ results }` payloads.
1420
+ * @return {Promise<void>}
1421
+ */
1422
+ async resolveSchemaTitles(envelopes) {
1423
+ const ids = new Set()
1424
+ for (const envelope of envelopes) {
1425
+ for (const raw of ((envelope && envelope.results) || [])) {
1426
+ const schema = (raw && (raw['@self'] || {}).schema) ?? (raw && raw.schema)
1427
+ if (isNumericId(schema)) {
1428
+ ids.add(String(schema).trim())
1429
+ }
1430
+ }
1431
+ }
1432
+ const titles = { ...this.schemaTitles }
1433
+ await Promise.all([...ids].filter((id) => !(id in titles)).map(async (id) => {
1434
+ if (!schemaTitleCache.has(id)) {
1435
+ schemaTitleCache.set(id, this.fetchSchemaTitle(id))
1436
+ }
1437
+ titles[id] = await schemaTitleCache.get(id)
1438
+ }))
1439
+ this.schemaTitles = titles
1440
+ },
1441
+
1442
+ /**
1443
+ * GET one schema's title; '' when it cannot be read.
1444
+ *
1445
+ * @param {string} id - The numeric schema id.
1446
+ * @return {Promise<string>}
1447
+ */
1448
+ async fetchSchemaTitle(id) {
1449
+ try {
1450
+ const response = await fetch(generateUrl('/apps/openregister/api/schemas/{id}', { id }), { method: 'GET', headers: buildHeaders() })
1451
+ if (!response.ok) {
1452
+ return ''
1453
+ }
1454
+ const schema = await response.json()
1455
+ const title = schema && (schema.title || schema.slug)
1456
+ return typeof title === 'string' ? title : ''
1457
+ } catch {
1458
+ return ''
1459
+ }
1365
1460
  },
1366
1461
 
1367
1462
  /**
@@ -1465,6 +1560,7 @@ export default {
1465
1560
  const groups = []
1466
1561
 
1467
1562
  if (this.showObjects) {
1563
+ await this.resolveSchemaTitles([uses, used, contracts])
1468
1564
  const objectItems = this.mergeObjectResults([uses, used, contracts])
1469
1565
  groups.push({ key: 'objects', label: this.objectsLabel, icon: 'FileTreeOutline', integrationId: '', items: objectItems, total: objectItems.length })
1470
1566
  }
@@ -1590,6 +1686,7 @@ export default {
1590
1686
  calls.push(store.fetchContracts(type, id))
1591
1687
  }
1592
1688
  const groups = await Promise.all(calls)
1689
+ await this.resolveSchemaTitles(groups.map((results) => ({ results: results || [] })))
1593
1690
  const seen = new Set()
1594
1691
  const merged = []
1595
1692
  for (const group of groups) {
@@ -41,6 +41,7 @@
41
41
  <script>
42
42
  import { NcActionButton, NcActionLink, NcActions } from '@nextcloud/vue'
43
43
  import { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'
44
+ import { isModifiedClick } from '../../utils/linkNavigation.js'
44
45
  import { evaluateVisibleWhenLocal, isLocallyDecidableVisibleWhen } from '../../utils/visibleWhen.js'
45
46
  import { CnIcon } from '../CnIcon/index.js'
46
47
 
@@ -215,16 +216,20 @@ export default {
215
216
  /**
216
217
  * A link entry was clicked: route a plain in-app click, leave the rest to
217
218
  * the browser, and emit `action` as a button would. The `handler` is not
218
- * called, since navigating is what the link already does.
219
+ * called, since navigating is what the link already does. A modified
220
+ * click opens a new tab, so nothing is emitted in this one.
219
221
  *
220
222
  * @param {object} action The action definition.
221
223
  * @param {object} link The resolved link.
222
224
  * @param {MouseEvent} event The click event.
223
225
  */
224
226
  onLinkAction(action, link, event) {
227
+ if (isModifiedClick(event)) {
228
+ return
229
+ }
225
230
  followItemActionLink(event, link, this.$router)
226
231
  /**
227
- * @event action User picked an entry. Payload: the action's label and the row. A button entry has already run its `handler`; a link entry navigates instead.
232
+ * @event action User picked an entry. Payload: the action's label and the row. A button entry has already run its `handler`; a link entry navigates instead, and a modified (new-tab) click on a link emits nothing.
228
233
  * @type {{ action: string, row: object|null }}
229
234
  */
230
235
  this.$emit('action', { action: action.label, row: this.row })
@@ -182,6 +182,18 @@ export default {
182
182
  type: Number,
183
183
  default: 3,
184
184
  },
185
+
186
+ /**
187
+ * How many records each view matches, keyed by view id (or slug). A
188
+ * view with a number here shows it after its name; a view can also
189
+ * carry its own `count`. `null` (the default) shows no counts.
190
+ *
191
+ * @type {{[viewId: string]: number}|null}
192
+ */
193
+ counts: {
194
+ type: Object,
195
+ default: null,
196
+ },
185
197
  },
186
198
 
187
199
  emits: ['apply', 'delete-request', 'save-request'],
@@ -245,9 +257,42 @@ export default {
245
257
  *
246
258
  * @param {object} row The row from buildViewTree().
247
259
  * @return {string} The name.
260
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
248
261
  */
249
262
  rowName(row) {
250
- return `${'\u2007'.repeat(row.depth * 2)}${row.view.name}`
263
+ return `${'\u2007'.repeat(row.depth * 2)}${this.nameWithCount(row.view)}`
264
+ },
265
+
266
+ /**
267
+ * The number of records a view matches, or null when none is known:
268
+ * `counts[id]` (or `counts[slug]`) first, else the view's own `count`.
269
+ *
270
+ * @param {object} view The saved view.
271
+ * @return {number|null}
272
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
273
+ */
274
+ countOf(view) {
275
+ const counts = this.counts || {}
276
+ let value = counts[view.id]
277
+ if (value === undefined || value === null) {
278
+ value = counts[view.slug]
279
+ }
280
+ if (value === undefined || value === null) {
281
+ value = view.count
282
+ }
283
+ return (typeof value === 'number' && Number.isFinite(value)) ? value : null
284
+ },
285
+
286
+ /**
287
+ * A view's name, followed by its count when one is known.
288
+ *
289
+ * @param {object} view The saved view.
290
+ * @return {string}
291
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
292
+ */
293
+ nameWithCount(view) {
294
+ const count = this.countOf(view)
295
+ return count === null ? view.name : `${view.name} (${count})`
251
296
  },
252
297
 
253
298
  /**
@@ -259,11 +304,13 @@ export default {
259
304
  *
260
305
  * @param {object} row The row from buildViewTree().
261
306
  * @return {string} The accessible label.
307
+ * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
262
308
  */
263
309
  rowLabel(row) {
310
+ const viewName = this.nameWithCount(row.view)
264
311
  const name = row.depth === 0
265
- ? row.view.name
266
- : t('nextcloud-vue', '{name}, level {level}', { name: row.view.name, level: row.depth + 1 })
312
+ ? viewName
313
+ : t('nextcloud-vue', '{name}, level {level}', { name: viewName, level: row.depth + 1 })
267
314
 
268
315
  if (row.orphaned !== true) {
269
316
  return name