@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
@@ -0,0 +1,10 @@
1
+ import script from './CnDocumentReviewList.vue2.js';
2
+ import { render } from './CnDocumentReviewList.vue3.js';
3
+
4
+ script.render = render;
5
+ script.__scopeId = "data-v-9a0e5e62";
6
+ script.__file = "src/components/CnDocumentReviewList/CnDocumentReviewList.vue";
7
+ const __sfc_main = script;
8
+
9
+ export { __sfc_main as default };
10
+ //# sourceMappingURL=CnDocumentReviewList.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnDocumentReviewList.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -0,0 +1,237 @@
1
+ import { translate } from '@nextcloud/l10n';
2
+ import { NcButton } from '@nextcloud/vue';
3
+ import FileDocumentOutline from 'vue-material-design-icons/FileDocumentOutline.vue';
4
+ import { readPath } from '../../utils/readPath.js';
5
+ import __sfc_main from '../CnStatusBadge/CnStatusBadge.vue.js';
6
+
7
+ let documentReviewListUid = 0;
8
+
9
+ /**
10
+ * CnDocumentReviewList: files that each need a verdict, and how far along you are.
11
+ *
12
+ * One row per file with its review status, a progress line ("2 of 5 reviewed")
13
+ * and one action per row. Built for a disclosure request, where every document
14
+ * is judged public, partly public or still to review, but the status field and
15
+ * its values are yours to configure.
16
+ *
17
+ * ```vue
18
+ * <CnDocumentReviewList
19
+ * title="Review documents"
20
+ * :documents="[
21
+ * { id: 1, name: 'Advice on street lighting', meta: 'PDF', reviewStatus: 'public' },
22
+ * { id: 2, name: 'Budget note', meta: 'Word, 2 February 2026' },
23
+ * ]"
24
+ * @row-action="openDocument" />
25
+ * ```
26
+ *
27
+ * The `document-review` detail widget type renders this list from a field on
28
+ * the record.
29
+ */
30
+ var script = {
31
+ name: 'CnDocumentReviewList',
32
+
33
+ components: {
34
+ CnStatusBadge: __sfc_main,
35
+ FileDocumentOutline,
36
+ NcButton,
37
+ },
38
+
39
+ props: {
40
+ /** The documents, one object per row. */
41
+ documents: {
42
+ type: Array,
43
+ default: () => [],
44
+ },
45
+
46
+ /** Heading of the list. */
47
+ title: {
48
+ type: String,
49
+ default: '',
50
+ },
51
+
52
+ /** Element the heading renders as. */
53
+ titleTag: {
54
+ type: String,
55
+ default: 'h3',
56
+ },
57
+
58
+ /** Dot-path to a document's display name. Falls back to `title`, then `filename`. */
59
+ nameField: {
60
+ type: String,
61
+ default: 'name',
62
+ },
63
+
64
+ /** Dot-path to the line under the name (type, date, origin). */
65
+ metaField: {
66
+ type: String,
67
+ default: 'meta',
68
+ },
69
+
70
+ /** Dot-path to a document's review status. */
71
+ statusField: {
72
+ type: String,
73
+ default: 'reviewStatus',
74
+ },
75
+
76
+ /** Dot-path to a URL that opens the document. When a row has one, its name is a link. */
77
+ hrefField: {
78
+ type: String,
79
+ default: 'href',
80
+ },
81
+
82
+ /** Dot-path to the value that identifies a row. */
83
+ rowKey: {
84
+ type: String,
85
+ default: 'id',
86
+ },
87
+
88
+ /**
89
+ * The review statuses: `{ value, label, variant?, reviewed? }` each.
90
+ * `variant` is a CnStatusBadge variant. `reviewed: true` counts the
91
+ * row in the progress line. Empty uses the built-in three: public,
92
+ * partly public and to review.
93
+ */
94
+ statuses: {
95
+ type: Array,
96
+ default: () => [],
97
+ },
98
+
99
+ /**
100
+ * The status of a document that carries none, or one this list does
101
+ * not know. Defaults to the first status that is not `reviewed`.
102
+ */
103
+ defaultStatus: {
104
+ type: String,
105
+ default: '',
106
+ },
107
+
108
+ /** Label of the per-row action button. An empty string renders no button. */
109
+ rowActionLabel: {
110
+ type: String,
111
+ default: () => translate('nextcloud-vue', 'Review'),
112
+ },
113
+
114
+ /** Shown when there are no documents. */
115
+ emptyText: {
116
+ type: String,
117
+ default: () => translate('nextcloud-vue', 'No documents to review.'),
118
+ },
119
+ },
120
+
121
+ emits: [
122
+ /** A row's action button was pressed. Payload: the document. */
123
+ 'row-action',
124
+ ],
125
+
126
+ data() {
127
+ documentReviewListUid += 1;
128
+ return {
129
+ titleId: `cn-document-review-title-${documentReviewListUid}`,
130
+ }
131
+ },
132
+
133
+ computed: {
134
+ /**
135
+ * The statuses in effect: the configured ones, or the built-in three.
136
+ *
137
+ * @return {Array<{value: string, label: string, variant: string, reviewed: boolean}>} The statuses.
138
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
139
+ */
140
+ effectiveStatuses() {
141
+ const configured = (Array.isArray(this.statuses) ? this.statuses : [])
142
+ .filter((status) => status && status.value !== undefined && status.value !== null)
143
+ .map((status) => ({
144
+ value: String(status.value),
145
+ label: typeof status.label === 'string' && status.label !== '' ? status.label : String(status.value),
146
+ variant: typeof status.variant === 'string' && status.variant !== '' ? status.variant : 'default',
147
+ reviewed: status.reviewed === true,
148
+ }));
149
+ if (configured.length > 0) {
150
+ return configured
151
+ }
152
+ return [
153
+ { value: 'public', label: translate('nextcloud-vue', 'Public'), variant: 'success', reviewed: true },
154
+ { value: 'partly-public', label: translate('nextcloud-vue', 'Partly public'), variant: 'warning', reviewed: true },
155
+ { value: 'to-review', label: translate('nextcloud-vue', 'To review'), variant: 'default', reviewed: false },
156
+ ]
157
+ },
158
+
159
+ /**
160
+ * The status a document without a known one falls back to.
161
+ *
162
+ * @return {{value: string, label: string, variant: string, reviewed: boolean}} The fallback status.
163
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
164
+ */
165
+ fallbackStatus() {
166
+ const statuses = this.effectiveStatuses;
167
+ return statuses.find((status) => status.value === this.defaultStatus)
168
+ || statuses.find((status) => !status.reviewed)
169
+ || statuses[0]
170
+ },
171
+
172
+ /**
173
+ * The rows, with everything the template needs resolved.
174
+ *
175
+ * @return {Array<{key: string, name: string, meta: string, href: string, status: object, document: object}>} The rows.
176
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
177
+ */
178
+ rows() {
179
+ return (Array.isArray(this.documents) ? this.documents : [])
180
+ .filter((document) => document && typeof document === 'object')
181
+ .map((document, index) => {
182
+ const raw = readPath(document, this.statusField);
183
+ const wanted = raw === null || raw === undefined ? '' : String(raw).toLowerCase();
184
+ const status = this.effectiveStatuses.find((candidate) => candidate.value.toLowerCase() === wanted)
185
+ || this.fallbackStatus;
186
+ const name = readPath(document, this.nameField) || document.title || document.filename || '';
187
+ const key = readPath(document, this.rowKey);
188
+ const href = readPath(document, this.hrefField);
189
+ const meta = readPath(document, this.metaField);
190
+ return {
191
+ key: key === undefined || key === null ? `row-${index}` : String(key),
192
+ name: String(name),
193
+ meta: typeof meta === 'string' ? meta : '',
194
+ href: typeof href === 'string' ? href : '',
195
+ status,
196
+ document,
197
+ }
198
+ })
199
+ },
200
+
201
+ /**
202
+ * How many rows carry a reviewed status.
203
+ *
204
+ * @return {number} The count.
205
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
206
+ */
207
+ reviewedCount() {
208
+ return this.rows.filter((row) => row.status.reviewed).length
209
+ },
210
+
211
+ /**
212
+ * The progress line, for example "2 of 5 reviewed".
213
+ *
214
+ * @return {string} The summary.
215
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
216
+ */
217
+ summary() {
218
+ return translate('nextcloud-vue', '{reviewed} of {total} reviewed', {
219
+ reviewed: this.reviewedCount,
220
+ total: this.rows.length,
221
+ })
222
+ },
223
+
224
+ /**
225
+ * Accessible name for a list without a title.
226
+ *
227
+ * @return {string} The label.
228
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
229
+ */
230
+ fallbackLabel() {
231
+ return translate('nextcloud-vue', 'Documents to review')
232
+ },
233
+ },
234
+ };
235
+
236
+ export { script as default };
237
+ //# sourceMappingURL=CnDocumentReviewList.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnDocumentReviewList.vue2.js","sources":["../../../../src/components/CnDocumentReviewList/CnDocumentReviewList.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<section\n\t\tclass=\"cn-document-review-list\"\n\t\tdata-testid=\"cn-document-review-list\"\n\t\t:aria-labelledby=\"title ? titleId : null\"\n\t\t:aria-label=\"title ? null : fallbackLabel\">\n\t\t<div v-if=\"title || rows.length > 0\" class=\"cn-document-review-list__header\">\n\t\t\t<component\n\t\t\t\t:is=\"titleTag\"\n\t\t\t\tv-if=\"title\"\n\t\t\t\t:id=\"titleId\"\n\t\t\t\tclass=\"cn-document-review-list__title\">\n\t\t\t\t{{ title }}\n\t\t\t</component>\n\t\t\t<span\n\t\t\t\tv-if=\"rows.length > 0\"\n\t\t\t\tclass=\"cn-document-review-list__summary\"\n\t\t\t\tdata-testid=\"cn-document-review-summary\">\n\t\t\t\t{{ summary }}\n\t\t\t</span>\n\t\t</div>\n\n\t\t<p v-if=\"rows.length === 0\" class=\"cn-document-review-list__empty\" data-testid=\"cn-document-review-empty\">\n\t\t\t{{ emptyText }}\n\t\t</p>\n\n\t\t<ul v-else class=\"cn-document-review-list__rows\">\n\t\t\t<li\n\t\t\t\tv-for=\"row in rows\"\n\t\t\t\t:key=\"row.key\"\n\t\t\t\tclass=\"cn-document-review-list__row\"\n\t\t\t\tdata-testid=\"cn-document-review-row\">\n\t\t\t\t<FileDocumentOutline class=\"cn-document-review-list__icon\" :size=\"22\" aria-hidden=\"true\" />\n\t\t\t\t<span class=\"cn-document-review-list__text\">\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"row.href\"\n\t\t\t\t\t\tclass=\"cn-document-review-list__name\"\n\t\t\t\t\t\t:href=\"row.href\">\n\t\t\t\t\t\t{{ row.name }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span v-else class=\"cn-document-review-list__name\">{{ row.name }}</span>\n\t\t\t\t\t<span v-if=\"row.meta\" class=\"cn-document-review-list__meta\">{{ row.meta }}</span>\n\t\t\t\t</span>\n\t\t\t\t<CnStatusBadge\n\t\t\t\t\tclass=\"cn-document-review-list__status\"\n\t\t\t\t\t:label=\"row.status.label\"\n\t\t\t\t\t:variant=\"row.status.variant\" />\n\t\t\t\t<!-- @slot row-action Replace the row's action button. -->\n\t\t\t\t<!-- @binding {object} document The row's document. -->\n\t\t\t\t<!-- @binding {object} status The row's resolved status ({ value, label, variant, reviewed }). -->\n\t\t\t\t<slot name=\"row-action\" :document=\"row.document\" :status=\"row.status\">\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tv-if=\"rowActionLabel\"\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t:aria-label=\"`${rowActionLabel}: ${row.name}`\"\n\t\t\t\t\t\tdata-testid=\"cn-document-review-action\"\n\t\t\t\t\t\t@click=\"$emit('row-action', row.document)\">\n\t\t\t\t\t\t{{ rowActionLabel }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</slot>\n\t\t\t</li>\n\t\t</ul>\n\t</section>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton } from '@nextcloud/vue'\nimport FileDocumentOutline from 'vue-material-design-icons/FileDocumentOutline.vue'\nimport { readPath } from '../../utils/readPath.js'\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\n\nlet documentReviewListUid = 0\n\n/**\n * CnDocumentReviewList: files that each need a verdict, and how far along you are.\n *\n * One row per file with its review status, a progress line (\"2 of 5 reviewed\")\n * and one action per row. Built for a disclosure request, where every document\n * is judged public, partly public or still to review, but the status field and\n * its values are yours to configure.\n *\n * ```vue\n * <CnDocumentReviewList\n * title=\"Review documents\"\n * :documents=\"[\n * { id: 1, name: 'Advice on street lighting', meta: 'PDF', reviewStatus: 'public' },\n * { id: 2, name: 'Budget note', meta: 'Word, 2 February 2026' },\n * ]\"\n * @row-action=\"openDocument\" />\n * ```\n *\n * The `document-review` detail widget type renders this list from a field on\n * the record.\n */\nexport default {\n\tname: 'CnDocumentReviewList',\n\n\tcomponents: {\n\t\tCnStatusBadge,\n\t\tFileDocumentOutline,\n\t\tNcButton,\n\t},\n\n\tprops: {\n\t\t/** The documents, one object per row. */\n\t\tdocuments: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Heading of the list. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Element the heading renders as. */\n\t\ttitleTag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'h3',\n\t\t},\n\n\t\t/** Dot-path to a document's display name. Falls back to `title`, then `filename`. */\n\t\tnameField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'name',\n\t\t},\n\n\t\t/** Dot-path to the line under the name (type, date, origin). */\n\t\tmetaField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'meta',\n\t\t},\n\n\t\t/** Dot-path to a document's review status. */\n\t\tstatusField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'reviewStatus',\n\t\t},\n\n\t\t/** Dot-path to a URL that opens the document. When a row has one, its name is a link. */\n\t\threfField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'href',\n\t\t},\n\n\t\t/** Dot-path to the value that identifies a row. */\n\t\trowKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'id',\n\t\t},\n\n\t\t/**\n\t\t * The review statuses: `{ value, label, variant?, reviewed? }` each.\n\t\t * `variant` is a CnStatusBadge variant. `reviewed: true` counts the\n\t\t * row in the progress line. Empty uses the built-in three: public,\n\t\t * partly public and to review.\n\t\t */\n\t\tstatuses: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The status of a document that carries none, or one this list does\n\t\t * not know. Defaults to the first status that is not `reviewed`.\n\t\t */\n\t\tdefaultStatus: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label of the per-row action button. An empty string renders no button. */\n\t\trowActionLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Review'),\n\t\t},\n\n\t\t/** Shown when there are no documents. */\n\t\temptyText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No documents to review.'),\n\t\t},\n\t},\n\n\temits: [\n\t\t/** A row's action button was pressed. Payload: the document. */\n\t\t'row-action',\n\t],\n\n\tdata() {\n\t\tdocumentReviewListUid += 1\n\t\treturn {\n\t\t\ttitleId: `cn-document-review-title-${documentReviewListUid}`,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The statuses in effect: the configured ones, or the built-in three.\n\t\t *\n\t\t * @return {Array<{value: string, label: string, variant: string, reviewed: boolean}>} The statuses.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\teffectiveStatuses() {\n\t\t\tconst configured = (Array.isArray(this.statuses) ? this.statuses : [])\n\t\t\t\t.filter((status) => status && status.value !== undefined && status.value !== null)\n\t\t\t\t.map((status) => ({\n\t\t\t\t\tvalue: String(status.value),\n\t\t\t\t\tlabel: typeof status.label === 'string' && status.label !== '' ? status.label : String(status.value),\n\t\t\t\t\tvariant: typeof status.variant === 'string' && status.variant !== '' ? status.variant : 'default',\n\t\t\t\t\treviewed: status.reviewed === true,\n\t\t\t\t}))\n\t\t\tif (configured.length > 0) {\n\t\t\t\treturn configured\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{ value: 'public', label: t('nextcloud-vue', 'Public'), variant: 'success', reviewed: true },\n\t\t\t\t{ value: 'partly-public', label: t('nextcloud-vue', 'Partly public'), variant: 'warning', reviewed: true },\n\t\t\t\t{ value: 'to-review', label: t('nextcloud-vue', 'To review'), variant: 'default', reviewed: false },\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * The status a document without a known one falls back to.\n\t\t *\n\t\t * @return {{value: string, label: string, variant: string, reviewed: boolean}} The fallback status.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tfallbackStatus() {\n\t\t\tconst statuses = this.effectiveStatuses\n\t\t\treturn statuses.find((status) => status.value === this.defaultStatus)\n\t\t\t\t|| statuses.find((status) => !status.reviewed)\n\t\t\t\t|| statuses[0]\n\t\t},\n\n\t\t/**\n\t\t * The rows, with everything the template needs resolved.\n\t\t *\n\t\t * @return {Array<{key: string, name: string, meta: string, href: string, status: object, document: object}>} The rows.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\trows() {\n\t\t\treturn (Array.isArray(this.documents) ? this.documents : [])\n\t\t\t\t.filter((document) => document && typeof document === 'object')\n\t\t\t\t.map((document, index) => {\n\t\t\t\t\tconst raw = readPath(document, this.statusField)\n\t\t\t\t\tconst wanted = raw === null || raw === undefined ? '' : String(raw).toLowerCase()\n\t\t\t\t\tconst status = this.effectiveStatuses.find((candidate) => candidate.value.toLowerCase() === wanted)\n\t\t\t\t\t\t|| this.fallbackStatus\n\t\t\t\t\tconst name = readPath(document, this.nameField) || document.title || document.filename || ''\n\t\t\t\t\tconst key = readPath(document, this.rowKey)\n\t\t\t\t\tconst href = readPath(document, this.hrefField)\n\t\t\t\t\tconst meta = readPath(document, this.metaField)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: key === undefined || key === null ? `row-${index}` : String(key),\n\t\t\t\t\t\tname: String(name),\n\t\t\t\t\t\tmeta: typeof meta === 'string' ? meta : '',\n\t\t\t\t\t\thref: typeof href === 'string' ? href : '',\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t\tdocument,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * How many rows carry a reviewed status.\n\t\t *\n\t\t * @return {number} The count.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\treviewedCount() {\n\t\t\treturn this.rows.filter((row) => row.status.reviewed).length\n\t\t},\n\n\t\t/**\n\t\t * The progress line, for example \"2 of 5 reviewed\".\n\t\t *\n\t\t * @return {string} The summary.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tsummary() {\n\t\t\treturn t('nextcloud-vue', '{reviewed} of {total} reviewed', {\n\t\t\t\treviewed: this.reviewedCount,\n\t\t\t\ttotal: this.rows.length,\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Accessible name for a list without a title.\n\t\t *\n\t\t * @return {string} The label.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tfallbackLabel() {\n\t\t\treturn t('nextcloud-vue', 'Documents to review')\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-document-review-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: calc(1.5 * var(--default-grid-baseline));\n}\n\n.cn-document-review-list__header {\n\talign-items: center;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: calc(2 * var(--default-grid-baseline));\n\tjustify-content: space-between;\n\tmargin-bottom: calc(2 * var(--default-grid-baseline));\n}\n\n.cn-document-review-list__title {\n\tfont-size: 1.1em;\n\tfont-weight: 700;\n\tmargin: 0;\n}\n\n.cn-document-review-list__summary,\n.cn-document-review-list__meta,\n.cn-document-review-list__empty {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-document-review-list__empty {\n\tmargin: 0;\n}\n\n.cn-document-review-list__rows {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-document-review-list__row {\n\talign-items: center;\n\tborder-top: 1px solid var(--color-border);\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: calc(3 * var(--default-grid-baseline));\n\tpadding: calc(2.5 * var(--default-grid-baseline)) 0;\n}\n\n.cn-document-review-list__icon {\n\tcolor: var(--color-text-maxcontrast);\n\tflex: none;\n}\n\n.cn-document-review-list__text {\n\tdisplay: flex;\n\tflex: 1 1 220px;\n\tflex-direction: column;\n\tmin-width: 0;\n}\n\n.cn-document-review-list__name {\n\tfont-weight: 500;\n\toverflow-wrap: anywhere;\n}\n\na.cn-document-review-list__name {\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n}\n\n.cn-document-review-list__meta {\n\tfont-size: 0.9em;\n}\n\n.cn-document-review-list__status {\n\tflex: none;\n}\n</style>\n"],"names":["CnStatusBadge","t"],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { resolveComponent, openBlock, createElementBlock, createBlock, resolveDynamicComponent, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList, createVNode, createElementVNode, renderSlot } from 'vue';
2
+
3
+ const _hoisted_1 = ["aria-labelledby", "aria-label"];
4
+ const _hoisted_2 = {
5
+ key: 0,
6
+ class: "cn-document-review-list__header"
7
+ };
8
+ const _hoisted_3 = {
9
+ key: 1,
10
+ class: "cn-document-review-list__summary",
11
+ "data-testid": "cn-document-review-summary"
12
+ };
13
+ const _hoisted_4 = {
14
+ key: 1,
15
+ class: "cn-document-review-list__empty",
16
+ "data-testid": "cn-document-review-empty"
17
+ };
18
+ const _hoisted_5 = {
19
+ key: 2,
20
+ class: "cn-document-review-list__rows"
21
+ };
22
+ const _hoisted_6 = { class: "cn-document-review-list__text" };
23
+ const _hoisted_7 = ["href"];
24
+ const _hoisted_8 = {
25
+ key: 1,
26
+ class: "cn-document-review-list__name"
27
+ };
28
+ const _hoisted_9 = {
29
+ key: 2,
30
+ class: "cn-document-review-list__meta"
31
+ };
32
+
33
+ function render(_ctx, _cache, $props, $setup, $data, $options) {
34
+ const _component_FileDocumentOutline = resolveComponent("FileDocumentOutline");
35
+ const _component_CnStatusBadge = resolveComponent("CnStatusBadge");
36
+ const _component_NcButton = resolveComponent("NcButton");
37
+
38
+ return (openBlock(), createElementBlock("section", {
39
+ class: "cn-document-review-list",
40
+ "data-testid": "cn-document-review-list",
41
+ "aria-labelledby": $props.title ? $data.titleId : null,
42
+ "aria-label": $props.title ? null : $options.fallbackLabel
43
+ }, [
44
+ ($props.title || $options.rows.length > 0)
45
+ ? (openBlock(), createElementBlock("div", _hoisted_2, [
46
+ ($props.title)
47
+ ? (openBlock(), createBlock(resolveDynamicComponent($props.titleTag), {
48
+ key: 0,
49
+ id: $data.titleId,
50
+ class: "cn-document-review-list__title"
51
+ }, {
52
+ default: withCtx(() => [
53
+ createTextVNode(toDisplayString($props.title), 1 /* TEXT */)
54
+ ]),
55
+ _: 1 /* STABLE */
56
+ }, 8 /* PROPS */, ["id"]))
57
+ : createCommentVNode("v-if", true),
58
+ ($options.rows.length > 0)
59
+ ? (openBlock(), createElementBlock("span", _hoisted_3, toDisplayString($options.summary), 1 /* TEXT */))
60
+ : createCommentVNode("v-if", true)
61
+ ]))
62
+ : createCommentVNode("v-if", true),
63
+ ($options.rows.length === 0)
64
+ ? (openBlock(), createElementBlock("p", _hoisted_4, toDisplayString($props.emptyText), 1 /* TEXT */))
65
+ : (openBlock(), createElementBlock("ul", _hoisted_5, [
66
+ (openBlock(true), createElementBlock(Fragment, null, renderList($options.rows, (row) => {
67
+ return (openBlock(), createElementBlock("li", {
68
+ key: row.key,
69
+ class: "cn-document-review-list__row",
70
+ "data-testid": "cn-document-review-row"
71
+ }, [
72
+ createVNode(_component_FileDocumentOutline, {
73
+ class: "cn-document-review-list__icon",
74
+ size: 22,
75
+ "aria-hidden": "true"
76
+ }),
77
+ createElementVNode("span", _hoisted_6, [
78
+ (row.href)
79
+ ? (openBlock(), createElementBlock("a", {
80
+ key: 0,
81
+ class: "cn-document-review-list__name",
82
+ href: row.href
83
+ }, toDisplayString(row.name), 9 /* TEXT, PROPS */, _hoisted_7))
84
+ : (openBlock(), createElementBlock("span", _hoisted_8, toDisplayString(row.name), 1 /* TEXT */)),
85
+ (row.meta)
86
+ ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(row.meta), 1 /* TEXT */))
87
+ : createCommentVNode("v-if", true)
88
+ ]),
89
+ createVNode(_component_CnStatusBadge, {
90
+ class: "cn-document-review-list__status",
91
+ label: row.status.label,
92
+ variant: row.status.variant
93
+ }, null, 8 /* PROPS */, ["label", "variant"]),
94
+ renderSlot(_ctx.$slots, "row-action", {
95
+ document: row.document,
96
+ status: row.status
97
+ }, () => [
98
+ ($props.rowActionLabel)
99
+ ? (openBlock(), createBlock(_component_NcButton, {
100
+ key: 0,
101
+ variant: "tertiary",
102
+ "aria-label": `${$props.rowActionLabel}: ${row.name}`,
103
+ "data-testid": "cn-document-review-action",
104
+ onClick: $event => (_ctx.$emit('row-action', row.document))
105
+ }, {
106
+ default: withCtx(() => [
107
+ createTextVNode(toDisplayString($props.rowActionLabel), 1 /* TEXT */)
108
+ ]),
109
+ _: 1 /* STABLE */
110
+ }, 8 /* PROPS */, ["aria-label", "onClick"]))
111
+ : createCommentVNode("v-if", true)
112
+ ])
113
+ ]))
114
+ }), 128 /* KEYED_FRAGMENT */))
115
+ ]))
116
+ ], 8 /* PROPS */, _hoisted_1))
117
+ }
118
+
119
+ export { render };
120
+ //# sourceMappingURL=CnDocumentReviewList.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnDocumentReviewList.vue3.js","sources":["../../../../src/components/CnDocumentReviewList/CnDocumentReviewList.vue?vue&type=template&id=9a0e5e62&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<section\n\t\tclass=\"cn-document-review-list\"\n\t\tdata-testid=\"cn-document-review-list\"\n\t\t:aria-labelledby=\"title ? titleId : null\"\n\t\t:aria-label=\"title ? null : fallbackLabel\">\n\t\t<div v-if=\"title || rows.length > 0\" class=\"cn-document-review-list__header\">\n\t\t\t<component\n\t\t\t\t:is=\"titleTag\"\n\t\t\t\tv-if=\"title\"\n\t\t\t\t:id=\"titleId\"\n\t\t\t\tclass=\"cn-document-review-list__title\">\n\t\t\t\t{{ title }}\n\t\t\t</component>\n\t\t\t<span\n\t\t\t\tv-if=\"rows.length > 0\"\n\t\t\t\tclass=\"cn-document-review-list__summary\"\n\t\t\t\tdata-testid=\"cn-document-review-summary\">\n\t\t\t\t{{ summary }}\n\t\t\t</span>\n\t\t</div>\n\n\t\t<p v-if=\"rows.length === 0\" class=\"cn-document-review-list__empty\" data-testid=\"cn-document-review-empty\">\n\t\t\t{{ emptyText }}\n\t\t</p>\n\n\t\t<ul v-else class=\"cn-document-review-list__rows\">\n\t\t\t<li\n\t\t\t\tv-for=\"row in rows\"\n\t\t\t\t:key=\"row.key\"\n\t\t\t\tclass=\"cn-document-review-list__row\"\n\t\t\t\tdata-testid=\"cn-document-review-row\">\n\t\t\t\t<FileDocumentOutline class=\"cn-document-review-list__icon\" :size=\"22\" aria-hidden=\"true\" />\n\t\t\t\t<span class=\"cn-document-review-list__text\">\n\t\t\t\t\t<a\n\t\t\t\t\t\tv-if=\"row.href\"\n\t\t\t\t\t\tclass=\"cn-document-review-list__name\"\n\t\t\t\t\t\t:href=\"row.href\">\n\t\t\t\t\t\t{{ row.name }}\n\t\t\t\t\t</a>\n\t\t\t\t\t<span v-else class=\"cn-document-review-list__name\">{{ row.name }}</span>\n\t\t\t\t\t<span v-if=\"row.meta\" class=\"cn-document-review-list__meta\">{{ row.meta }}</span>\n\t\t\t\t</span>\n\t\t\t\t<CnStatusBadge\n\t\t\t\t\tclass=\"cn-document-review-list__status\"\n\t\t\t\t\t:label=\"row.status.label\"\n\t\t\t\t\t:variant=\"row.status.variant\" />\n\t\t\t\t<!-- @slot row-action Replace the row's action button. -->\n\t\t\t\t<!-- @binding {object} document The row's document. -->\n\t\t\t\t<!-- @binding {object} status The row's resolved status ({ value, label, variant, reviewed }). -->\n\t\t\t\t<slot name=\"row-action\" :document=\"row.document\" :status=\"row.status\">\n\t\t\t\t\t<NcButton\n\t\t\t\t\t\tv-if=\"rowActionLabel\"\n\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t:aria-label=\"`${rowActionLabel}: ${row.name}`\"\n\t\t\t\t\t\tdata-testid=\"cn-document-review-action\"\n\t\t\t\t\t\t@click=\"$emit('row-action', row.document)\">\n\t\t\t\t\t\t{{ rowActionLabel }}\n\t\t\t\t\t</NcButton>\n\t\t\t\t</slot>\n\t\t\t</li>\n\t\t</ul>\n\t</section>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton } from '@nextcloud/vue'\nimport FileDocumentOutline from 'vue-material-design-icons/FileDocumentOutline.vue'\nimport { readPath } from '../../utils/readPath.js'\nimport { CnStatusBadge } from '../CnStatusBadge/index.js'\n\nlet documentReviewListUid = 0\n\n/**\n * CnDocumentReviewList: files that each need a verdict, and how far along you are.\n *\n * One row per file with its review status, a progress line (\"2 of 5 reviewed\")\n * and one action per row. Built for a disclosure request, where every document\n * is judged public, partly public or still to review, but the status field and\n * its values are yours to configure.\n *\n * ```vue\n * <CnDocumentReviewList\n * title=\"Review documents\"\n * :documents=\"[\n * { id: 1, name: 'Advice on street lighting', meta: 'PDF', reviewStatus: 'public' },\n * { id: 2, name: 'Budget note', meta: 'Word, 2 February 2026' },\n * ]\"\n * @row-action=\"openDocument\" />\n * ```\n *\n * The `document-review` detail widget type renders this list from a field on\n * the record.\n */\nexport default {\n\tname: 'CnDocumentReviewList',\n\n\tcomponents: {\n\t\tCnStatusBadge,\n\t\tFileDocumentOutline,\n\t\tNcButton,\n\t},\n\n\tprops: {\n\t\t/** The documents, one object per row. */\n\t\tdocuments: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Heading of the list. */\n\t\ttitle: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Element the heading renders as. */\n\t\ttitleTag: {\n\t\t\ttype: String,\n\t\t\tdefault: 'h3',\n\t\t},\n\n\t\t/** Dot-path to a document's display name. Falls back to `title`, then `filename`. */\n\t\tnameField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'name',\n\t\t},\n\n\t\t/** Dot-path to the line under the name (type, date, origin). */\n\t\tmetaField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'meta',\n\t\t},\n\n\t\t/** Dot-path to a document's review status. */\n\t\tstatusField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'reviewStatus',\n\t\t},\n\n\t\t/** Dot-path to a URL that opens the document. When a row has one, its name is a link. */\n\t\threfField: {\n\t\t\ttype: String,\n\t\t\tdefault: 'href',\n\t\t},\n\n\t\t/** Dot-path to the value that identifies a row. */\n\t\trowKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'id',\n\t\t},\n\n\t\t/**\n\t\t * The review statuses: `{ value, label, variant?, reviewed? }` each.\n\t\t * `variant` is a CnStatusBadge variant. `reviewed: true` counts the\n\t\t * row in the progress line. Empty uses the built-in three: public,\n\t\t * partly public and to review.\n\t\t */\n\t\tstatuses: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * The status of a document that carries none, or one this list does\n\t\t * not know. Defaults to the first status that is not `reviewed`.\n\t\t */\n\t\tdefaultStatus: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label of the per-row action button. An empty string renders no button. */\n\t\trowActionLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Review'),\n\t\t},\n\n\t\t/** Shown when there are no documents. */\n\t\temptyText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No documents to review.'),\n\t\t},\n\t},\n\n\temits: [\n\t\t/** A row's action button was pressed. Payload: the document. */\n\t\t'row-action',\n\t],\n\n\tdata() {\n\t\tdocumentReviewListUid += 1\n\t\treturn {\n\t\t\ttitleId: `cn-document-review-title-${documentReviewListUid}`,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The statuses in effect: the configured ones, or the built-in three.\n\t\t *\n\t\t * @return {Array<{value: string, label: string, variant: string, reviewed: boolean}>} The statuses.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\teffectiveStatuses() {\n\t\t\tconst configured = (Array.isArray(this.statuses) ? this.statuses : [])\n\t\t\t\t.filter((status) => status && status.value !== undefined && status.value !== null)\n\t\t\t\t.map((status) => ({\n\t\t\t\t\tvalue: String(status.value),\n\t\t\t\t\tlabel: typeof status.label === 'string' && status.label !== '' ? status.label : String(status.value),\n\t\t\t\t\tvariant: typeof status.variant === 'string' && status.variant !== '' ? status.variant : 'default',\n\t\t\t\t\treviewed: status.reviewed === true,\n\t\t\t\t}))\n\t\t\tif (configured.length > 0) {\n\t\t\t\treturn configured\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{ value: 'public', label: t('nextcloud-vue', 'Public'), variant: 'success', reviewed: true },\n\t\t\t\t{ value: 'partly-public', label: t('nextcloud-vue', 'Partly public'), variant: 'warning', reviewed: true },\n\t\t\t\t{ value: 'to-review', label: t('nextcloud-vue', 'To review'), variant: 'default', reviewed: false },\n\t\t\t]\n\t\t},\n\n\t\t/**\n\t\t * The status a document without a known one falls back to.\n\t\t *\n\t\t * @return {{value: string, label: string, variant: string, reviewed: boolean}} The fallback status.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tfallbackStatus() {\n\t\t\tconst statuses = this.effectiveStatuses\n\t\t\treturn statuses.find((status) => status.value === this.defaultStatus)\n\t\t\t\t|| statuses.find((status) => !status.reviewed)\n\t\t\t\t|| statuses[0]\n\t\t},\n\n\t\t/**\n\t\t * The rows, with everything the template needs resolved.\n\t\t *\n\t\t * @return {Array<{key: string, name: string, meta: string, href: string, status: object, document: object}>} The rows.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\trows() {\n\t\t\treturn (Array.isArray(this.documents) ? this.documents : [])\n\t\t\t\t.filter((document) => document && typeof document === 'object')\n\t\t\t\t.map((document, index) => {\n\t\t\t\t\tconst raw = readPath(document, this.statusField)\n\t\t\t\t\tconst wanted = raw === null || raw === undefined ? '' : String(raw).toLowerCase()\n\t\t\t\t\tconst status = this.effectiveStatuses.find((candidate) => candidate.value.toLowerCase() === wanted)\n\t\t\t\t\t\t|| this.fallbackStatus\n\t\t\t\t\tconst name = readPath(document, this.nameField) || document.title || document.filename || ''\n\t\t\t\t\tconst key = readPath(document, this.rowKey)\n\t\t\t\t\tconst href = readPath(document, this.hrefField)\n\t\t\t\t\tconst meta = readPath(document, this.metaField)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: key === undefined || key === null ? `row-${index}` : String(key),\n\t\t\t\t\t\tname: String(name),\n\t\t\t\t\t\tmeta: typeof meta === 'string' ? meta : '',\n\t\t\t\t\t\thref: typeof href === 'string' ? href : '',\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t\tdocument,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * How many rows carry a reviewed status.\n\t\t *\n\t\t * @return {number} The count.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\treviewedCount() {\n\t\t\treturn this.rows.filter((row) => row.status.reviewed).length\n\t\t},\n\n\t\t/**\n\t\t * The progress line, for example \"2 of 5 reviewed\".\n\t\t *\n\t\t * @return {string} The summary.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tsummary() {\n\t\t\treturn t('nextcloud-vue', '{reviewed} of {total} reviewed', {\n\t\t\t\treviewed: this.reviewedCount,\n\t\t\t\ttotal: this.rows.length,\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Accessible name for a list without a title.\n\t\t *\n\t\t * @return {string} The label.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tfallbackLabel() {\n\t\t\treturn t('nextcloud-vue', 'Documents to review')\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-document-review-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: calc(1.5 * var(--default-grid-baseline));\n}\n\n.cn-document-review-list__header {\n\talign-items: center;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: calc(2 * var(--default-grid-baseline));\n\tjustify-content: space-between;\n\tmargin-bottom: calc(2 * var(--default-grid-baseline));\n}\n\n.cn-document-review-list__title {\n\tfont-size: 1.1em;\n\tfont-weight: 700;\n\tmargin: 0;\n}\n\n.cn-document-review-list__summary,\n.cn-document-review-list__meta,\n.cn-document-review-list__empty {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.cn-document-review-list__empty {\n\tmargin: 0;\n}\n\n.cn-document-review-list__rows {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-document-review-list__row {\n\talign-items: center;\n\tborder-top: 1px solid var(--color-border);\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: calc(3 * var(--default-grid-baseline));\n\tpadding: calc(2.5 * var(--default-grid-baseline)) 0;\n}\n\n.cn-document-review-list__icon {\n\tcolor: var(--color-text-maxcontrast);\n\tflex: none;\n}\n\n.cn-document-review-list__text {\n\tdisplay: flex;\n\tflex: 1 1 220px;\n\tflex-direction: column;\n\tmin-width: 0;\n}\n\n.cn-document-review-list__name {\n\tfont-weight: 500;\n\toverflow-wrap: anywhere;\n}\n\na.cn-document-review-list__name {\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n}\n\n.cn-document-review-list__meta {\n\tfont-size: 0.9em;\n}\n\n.cn-document-review-list__status {\n\tflex: none;\n}\n</style>\n"],"names":["_createElementBlock","_openBlock","_createBlock","_resolveDynamicComponent","_toDisplayString","_createVNode","_renderSlot"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import script from './CnDocumentReviewWidget.vue2.js';
2
+ import { render } from './CnDocumentReviewWidget.vue3.js';
3
+
4
+ script.render = render;
5
+ script.__scopeId = "data-v-22291596";
6
+ script.__file = "src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue";
7
+ const __sfc_main = script;
8
+
9
+ export { __sfc_main as default };
10
+ //# sourceMappingURL=CnDocumentReviewWidget.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnDocumentReviewWidget.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
@@ -0,0 +1,77 @@
1
+ import __sfc_main from './CnDocumentReviewList.vue.js';
2
+ import { readPath } from '../../utils/readPath.js';
3
+
4
+ /**
5
+ * CnDocumentReviewWidget: the `document-review` detail widget type.
6
+ *
7
+ * Renders CnDocumentReviewList from a list on the bound record:
8
+ * `content: { field, title?, statusField?, statuses?, rowAction?: { label, route } }`.
9
+ * A row action with a `route` opens that route with the row's key as `id`.
10
+ * Resolved by its registry key, not exported.
11
+ */
12
+ var script = {
13
+ name: 'CnDocumentReviewWidget',
14
+
15
+ components: {
16
+ CnDocumentReviewList: __sfc_main,
17
+ },
18
+
19
+ props: {
20
+ /** The widget's content. `field` is the dot-path to the documents on the record. */
21
+ content: {
22
+ type: Object,
23
+ default: () => ({}),
24
+ },
25
+
26
+ /** The bound record. */
27
+ objectData: {
28
+ type: Object,
29
+ default: null,
30
+ },
31
+ },
32
+
33
+ computed: {
34
+ /**
35
+ * The documents read off the record.
36
+ *
37
+ * @return {Array<object>} The documents, or an empty list.
38
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
39
+ */
40
+ documents() {
41
+ const value = readPath(this.objectData || {}, this.content.field || 'documents');
42
+ return Array.isArray(value) ? value : []
43
+ },
44
+
45
+ /**
46
+ * The row action's label. Empty, and so no button, unless the content declares one.
47
+ *
48
+ * @return {string} The label.
49
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
50
+ */
51
+ rowActionLabel() {
52
+ const label = this.content.rowAction?.label;
53
+ return typeof label === 'string' ? label : ''
54
+ },
55
+ },
56
+
57
+ methods: {
58
+ /**
59
+ * Open the route the row action names, with the row's key as `id`.
60
+ *
61
+ * @param {object} document The row's document.
62
+ * @return {void}
63
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list
64
+ */
65
+ onRowAction(document) {
66
+ const route = this.content.rowAction?.route;
67
+ const id = readPath(document, this.content.rowKey || 'id');
68
+ if (typeof route !== 'string' || route === '' || !this.$router || id === undefined || id === null) {
69
+ return
70
+ }
71
+ this.$router.push({ name: route, params: { id: String(id) } });
72
+ },
73
+ },
74
+ };
75
+
76
+ export { script as default };
77
+ //# sourceMappingURL=CnDocumentReviewWidget.vue2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnDocumentReviewWidget.vue2.js","sources":["../../../../src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-case-widget-card\">\n\t\t<CnDocumentReviewList\n\t\t\t:documents=\"documents\"\n\t\t\t:title=\"content.title || ''\"\n\t\t\t:nameField=\"content.nameField || 'name'\"\n\t\t\t:metaField=\"content.metaField || 'meta'\"\n\t\t\t:statusField=\"content.statusField || 'reviewStatus'\"\n\t\t\t:hrefField=\"content.hrefField || 'href'\"\n\t\t\t:rowKey=\"content.rowKey || 'id'\"\n\t\t\t:statuses=\"content.statuses || []\"\n\t\t\t:defaultStatus=\"content.defaultStatus || ''\"\n\t\t\t:rowActionLabel=\"rowActionLabel\"\n\t\t\t:emptyText=\"content.emptyText || undefined\"\n\t\t\t@rowAction=\"onRowAction\" />\n\t</div>\n</template>\n\n<script>\nimport CnDocumentReviewList from './CnDocumentReviewList.vue'\nimport { readPath } from '../../utils/readPath.js'\n\n/**\n * CnDocumentReviewWidget: the `document-review` detail widget type.\n *\n * Renders CnDocumentReviewList from a list on the bound record:\n * `content: { field, title?, statusField?, statuses?, rowAction?: { label, route } }`.\n * A row action with a `route` opens that route with the row's key as `id`.\n * Resolved by its registry key, not exported.\n */\nexport default {\n\tname: 'CnDocumentReviewWidget',\n\n\tcomponents: {\n\t\tCnDocumentReviewList,\n\t},\n\n\tprops: {\n\t\t/** The widget's content. `field` is the dot-path to the documents on the record. */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The bound record. */\n\t\tobjectData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The documents read off the record.\n\t\t *\n\t\t * @return {Array<object>} The documents, or an empty list.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tdocuments() {\n\t\t\tconst value = readPath(this.objectData || {}, this.content.field || 'documents')\n\t\t\treturn Array.isArray(value) ? value : []\n\t\t},\n\n\t\t/**\n\t\t * The row action's label. Empty, and so no button, unless the content declares one.\n\t\t *\n\t\t * @return {string} The label.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\trowActionLabel() {\n\t\t\tconst label = this.content.rowAction?.label\n\t\t\treturn typeof label === 'string' ? label : ''\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Open the route the row action names, with the row's key as `id`.\n\t\t *\n\t\t * @param {object} document The row's document.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tonRowAction(document) {\n\t\t\tconst route = this.content.rowAction?.route\n\t\t\tconst id = readPath(document, this.content.rowKey || 'id')\n\t\t\tif (typeof route !== 'string' || route === '' || !this.$router || id === undefined || id === null) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$router.push({ name: route, params: { id: String(id) } })\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-case-widget-card {\n\tbackground: var(--color-main-background);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tpadding: calc(5 * var(--default-grid-baseline));\n}\n</style>\n"],"names":["CnDocumentReviewList"],"mappings":";;;AA2BA;;AAEC;;AAEA;;AAEA;;AAED,aAAe;CACd,IAAI,EAAE,wBAAwB;;CAE9B,UAAU,EAAE;AACX,wBAAAA,UAAoB;EACpB;;AAED,CAAA,KAAK,EAAE;AACN;AACA,EAAA,OAAO,EAAE;GACR,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,OAAO,EAAE,CAAC;GACnB;;AAED;EACA,UAAU,EAAE;GACX,IAAI,EAAE,MAAM;GACZ,OAAO,EAAE,IAAI;GACb;EACD;;AAED,CAAA,QAAQ,EAAE;AACT;;AAEC;;AAEA;;EAED,SAAS,GAAG;AACX,GAAA,MAAM,KAAI,GAAI,QAAQ,CAAC,IAAI,CAAC,UAAS,IAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,KAAM,IAAG,WAAW,EAAA;AAC/E,GAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAA,GAAI,KAAI,GAAI,EAAC;GACvC;;AAED;AACC;AACA;;AAEA;;AAED,EAAA,cAAc,GAAG;AAChB,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAI;AAC1C,GAAA,OAAO,OAAO,KAAM,KAAI,QAAS,GAAE,KAAI,GAAI,EAAC;GAC5C;EACD;;AAED,CAAA,OAAO,EAAE;AACR;;AAEC;AACA;;AAEA;;AAED,EAAA,WAAW,CAAC,QAAQ,EAAE;AACrB,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAI;GAC1C,MAAM,EAAG,GAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAK,IAAK,IAAI,EAAA;AACzD,GAAA,IAAI,OAAO,KAAI,KAAM,QAAS,IAAG,UAAU,EAAC,IAAK,CAAC,IAAI,CAAC,OAAM,IAAK,EAAG,KAAI,aAAa,EAAC,KAAM,IAAI,EAAE;IAClG,MAAK;AACN,IAAA;GACA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAE,EAAA,EAAG,EAAA;GAC7D;EACD;AACF;;;;"}
@@ -0,0 +1,27 @@
1
+ import { resolveComponent, openBlock, createElementBlock, createVNode } from 'vue';
2
+
3
+ const _hoisted_1 = { class: "cn-case-widget-card" };
4
+
5
+ function render(_ctx, _cache, $props, $setup, $data, $options) {
6
+ const _component_CnDocumentReviewList = resolveComponent("CnDocumentReviewList");
7
+
8
+ return (openBlock(), createElementBlock("div", _hoisted_1, [
9
+ createVNode(_component_CnDocumentReviewList, {
10
+ documents: $options.documents,
11
+ title: $props.content.title || '',
12
+ nameField: $props.content.nameField || 'name',
13
+ metaField: $props.content.metaField || 'meta',
14
+ statusField: $props.content.statusField || 'reviewStatus',
15
+ hrefField: $props.content.hrefField || 'href',
16
+ rowKey: $props.content.rowKey || 'id',
17
+ statuses: $props.content.statuses || [],
18
+ defaultStatus: $props.content.defaultStatus || '',
19
+ rowActionLabel: $options.rowActionLabel,
20
+ emptyText: $props.content.emptyText || undefined,
21
+ onRowAction: $options.onRowAction
22
+ }, null, 8 /* PROPS */, ["documents", "title", "nameField", "metaField", "statusField", "hrefField", "rowKey", "statuses", "defaultStatus", "rowActionLabel", "emptyText", "onRowAction"])
23
+ ]))
24
+ }
25
+
26
+ export { render };
27
+ //# sourceMappingURL=CnDocumentReviewWidget.vue3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CnDocumentReviewWidget.vue3.js","sources":["../../../../src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue?vue&type=template&id=22291596&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n\n<template>\n\t<div class=\"cn-case-widget-card\">\n\t\t<CnDocumentReviewList\n\t\t\t:documents=\"documents\"\n\t\t\t:title=\"content.title || ''\"\n\t\t\t:nameField=\"content.nameField || 'name'\"\n\t\t\t:metaField=\"content.metaField || 'meta'\"\n\t\t\t:statusField=\"content.statusField || 'reviewStatus'\"\n\t\t\t:hrefField=\"content.hrefField || 'href'\"\n\t\t\t:rowKey=\"content.rowKey || 'id'\"\n\t\t\t:statuses=\"content.statuses || []\"\n\t\t\t:defaultStatus=\"content.defaultStatus || ''\"\n\t\t\t:rowActionLabel=\"rowActionLabel\"\n\t\t\t:emptyText=\"content.emptyText || undefined\"\n\t\t\t@rowAction=\"onRowAction\" />\n\t</div>\n</template>\n\n<script>\nimport CnDocumentReviewList from './CnDocumentReviewList.vue'\nimport { readPath } from '../../utils/readPath.js'\n\n/**\n * CnDocumentReviewWidget: the `document-review` detail widget type.\n *\n * Renders CnDocumentReviewList from a list on the bound record:\n * `content: { field, title?, statusField?, statuses?, rowAction?: { label, route } }`.\n * A row action with a `route` opens that route with the row's key as `id`.\n * Resolved by its registry key, not exported.\n */\nexport default {\n\tname: 'CnDocumentReviewWidget',\n\n\tcomponents: {\n\t\tCnDocumentReviewList,\n\t},\n\n\tprops: {\n\t\t/** The widget's content. `field` is the dot-path to the documents on the record. */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** The bound record. */\n\t\tobjectData: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The documents read off the record.\n\t\t *\n\t\t * @return {Array<object>} The documents, or an empty list.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tdocuments() {\n\t\t\tconst value = readPath(this.objectData || {}, this.content.field || 'documents')\n\t\t\treturn Array.isArray(value) ? value : []\n\t\t},\n\n\t\t/**\n\t\t * The row action's label. Empty, and so no button, unless the content declares one.\n\t\t *\n\t\t * @return {string} The label.\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\trowActionLabel() {\n\t\t\tconst label = this.content.rowAction?.label\n\t\t\treturn typeof label === 'string' ? label : ''\n\t\t},\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Open the route the row action names, with the row's key as `id`.\n\t\t *\n\t\t * @param {object} document The row's document.\n\t\t * @return {void}\n\t\t * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-document-review-list\n\t\t */\n\t\tonRowAction(document) {\n\t\t\tconst route = this.content.rowAction?.route\n\t\t\tconst id = readPath(document, this.content.rowKey || 'id')\n\t\t\tif (typeof route !== 'string' || route === '' || !this.$router || id === undefined || id === null) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$router.push({ name: route, params: { id: String(id) } })\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-case-widget-card {\n\tbackground: var(--color-main-background);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-large);\n\tpadding: calc(5 * var(--default-grid-baseline));\n}\n</style>\n"],"names":["_openBlock","_createElementBlock"],"mappings":";;AAWM,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,qBAAqB,GAAA;;;;;AAA9B,EAAA,QAAAA,SAAA,EAAA,EAAAC,kBAAA,QAAA;;AAEC,MAAA,SAAS,EAAE,QAAS,CAAA,SAAA;MACpB,KAAK,EAAE,MAAO,CAAA,OAAA,CAAC,KAAK,IAAA,EAAA;MACpB,SAAS,EAAE,MAAO,CAAA,OAAA,CAAC,SAAS,IAAA,MAAA;MAC5B,SAAS,EAAE,MAAO,CAAA,OAAA,CAAC,SAAS,IAAA,MAAA;MAC5B,WAAW,EAAE,MAAO,CAAA,OAAA,CAAC,WAAS,IAAA,cAAA;MAC9B,SAAS,EAAE,MAAO,CAAA,OAAA,CAAC,SAAU,IAAA,MAAA;MAC7B,MAAM,EAAE,MAAO,CAAA,OAAA,CAAC,MAAM,IAAA,IAAA;MACtB,QAAE,EAAA,MAAA,CAAA,OAAA,CAAA,QAAA,IAAA,EAAA;;;;;;;;;;;"}