@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,319 @@
1
+ <!--
2
+ - SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ - SPDX-License-Identifier: EUPL-1.2
4
+ -->
5
+
6
+ <template>
7
+ <section
8
+ v-if="normalisedItems.length > 0"
9
+ class="cn-next-step-card"
10
+ data-testid="cn-next-step-card"
11
+ :aria-labelledby="title ? titleId : null"
12
+ :aria-label="title ? null : fallbackLabel">
13
+ <div class="cn-next-step-card__main">
14
+ <component
15
+ :is="titleTag"
16
+ v-if="title"
17
+ :id="titleId"
18
+ class="cn-next-step-card__title">
19
+ {{ title }}
20
+ </component>
21
+ <ul class="cn-next-step-card__list">
22
+ <li
23
+ v-for="(item, index) in normalisedItems"
24
+ :key="`${index}-${item.label}`"
25
+ class="cn-next-step-card__item"
26
+ :class="{
27
+ 'cn-next-step-card__item--done': item.done,
28
+ 'cn-next-step-card__item--current': index === currentIndex,
29
+ }"
30
+ data-testid="cn-next-step-item">
31
+ <span class="cn-next-step-card__marker" aria-hidden="true">
32
+ <Check v-if="item.done" :size="14" />
33
+ </span>
34
+ <span class="cn-next-step-card__label">{{ item.label }}</span>
35
+ <span v-if="item.hint" class="cn-next-step-card__hint">{{ item.hint }}</span>
36
+ <!-- The state in words. The marker is a shape and a colour, and
37
+ neither reaches a screen reader or a reader who cannot tell
38
+ the two colours apart. -->
39
+ <span class="cn-next-step-card__state">{{ item.done ? doneLabel : todoLabel }}</span>
40
+ </li>
41
+ </ul>
42
+ </div>
43
+ <div v-if="actionLabel || $slots.action || after" class="cn-next-step-card__side">
44
+ <!-- @slot action Replace the primary button, for a host that renders its own control. -->
45
+ <slot name="action">
46
+ <NcButton
47
+ v-if="actionLabel"
48
+ :id="actionId || null"
49
+ variant="primary"
50
+ :disabled="actionDisabled"
51
+ data-testid="cn-next-step-action"
52
+ @click="$emit('action')">
53
+ {{ actionLabel }}
54
+ </NcButton>
55
+ </slot>
56
+ <span v-if="after" class="cn-next-step-card__after">{{ after }}</span>
57
+ </div>
58
+ </section>
59
+ </template>
60
+
61
+ <script>
62
+ import { translate as t } from '@nextcloud/l10n'
63
+ import { NcButton } from '@nextcloud/vue'
64
+ import Check from 'vue-material-design-icons/Check.vue'
65
+
66
+ let nextStepCardUid = 0
67
+
68
+ /**
69
+ * CnNextStepCard: what this record needs now, next to the button that does it.
70
+ *
71
+ * A short checklist for the current step and one primary action. It answers
72
+ * "what do I do next?" on a record whose menu would otherwise make the handler
73
+ * guess. Renders nothing when there is no checklist, so a step that needs no
74
+ * explaining shows no empty card.
75
+ *
76
+ * ```vue
77
+ * <CnNextStepCard
78
+ * title="What now? Step 2: handling"
79
+ * :items="[
80
+ * { label: 'Receipt confirmed', done: true },
81
+ * { label: 'Review the open documents', hint: '2 of 5 done' },
82
+ * { label: 'Draft the decision' },
83
+ * ]"
84
+ * action-label="Continue reviewing"
85
+ * after="Then: step 3, decision"
86
+ * @action="onContinue" />
87
+ * ```
88
+ *
89
+ * CnDetailPage renders this card from its `nextStep` config, and the
90
+ * `next-step` detail widget type renders it inside a grid.
91
+ */
92
+ export default {
93
+ name: 'CnNextStepCard',
94
+
95
+ components: {
96
+ Check,
97
+ NcButton,
98
+ },
99
+
100
+ props: {
101
+ /** Heading of the card, for example "What now? Step 2: handling". */
102
+ title: {
103
+ type: String,
104
+ default: '',
105
+ },
106
+
107
+ /** Element the heading renders as. Pick the level that fits the page outline. */
108
+ titleTag: {
109
+ type: String,
110
+ default: 'h3',
111
+ },
112
+
113
+ /**
114
+ * The checklist: `{ label, done?, hint? }` per item. The first item
115
+ * that is not done is emphasised as the one to pick up now.
116
+ */
117
+ items: {
118
+ type: Array,
119
+ default: () => [],
120
+ },
121
+
122
+ /** Label of the primary button. Empty renders no button. */
123
+ actionLabel: {
124
+ type: String,
125
+ default: '',
126
+ },
127
+
128
+ /** DOM id for the primary button, so a skip link can land on it. */
129
+ actionId: {
130
+ type: String,
131
+ default: '',
132
+ },
133
+
134
+ /** Disable the primary button, for example while its request is in flight. */
135
+ actionDisabled: {
136
+ type: Boolean,
137
+ default: false,
138
+ },
139
+
140
+ /** One line under the button saying what follows, for example "Then: step 3, decision". */
141
+ after: {
142
+ type: String,
143
+ default: '',
144
+ },
145
+
146
+ /** Text state of a done item, read by screen readers. */
147
+ doneLabel: {
148
+ type: String,
149
+ default: () => t('nextcloud-vue', 'Done'),
150
+ },
151
+
152
+ /** Text state of an open item, read by screen readers. */
153
+ todoLabel: {
154
+ type: String,
155
+ default: () => t('nextcloud-vue', 'To do'),
156
+ },
157
+ },
158
+
159
+ emits: [
160
+ /** The primary button was pressed. */
161
+ 'action',
162
+ ],
163
+
164
+ data() {
165
+ nextStepCardUid += 1
166
+ return {
167
+ titleId: `cn-next-step-title-${nextStepCardUid}`,
168
+ }
169
+ },
170
+
171
+ computed: {
172
+ /**
173
+ * The items that can render: an object with a label.
174
+ *
175
+ * @return {Array<{label: string, done: boolean, hint: string}>} The checklist.
176
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-next-step-card
177
+ */
178
+ normalisedItems() {
179
+ return (Array.isArray(this.items) ? this.items : [])
180
+ .filter((item) => item && typeof item.label === 'string' && item.label !== '')
181
+ .map((item) => ({
182
+ label: item.label,
183
+ done: item.done === true,
184
+ hint: typeof item.hint === 'string' ? item.hint : '',
185
+ }))
186
+ },
187
+
188
+ /**
189
+ * Index of the first open item, the one to pick up now.
190
+ *
191
+ * @return {number} The index, or -1 when everything is done.
192
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-next-step-card
193
+ */
194
+ currentIndex() {
195
+ return this.normalisedItems.findIndex((item) => !item.done)
196
+ },
197
+
198
+ /**
199
+ * Accessible name for a card without a title.
200
+ *
201
+ * @return {string} The label.
202
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-next-step-card
203
+ */
204
+ fallbackLabel() {
205
+ return t('nextcloud-vue', 'Next step')
206
+ },
207
+ },
208
+ }
209
+ </script>
210
+
211
+ <style scoped>
212
+ .cn-next-step-card {
213
+ align-items: center;
214
+ background: var(--color-main-background);
215
+ border: 1px solid var(--color-border);
216
+ border-radius: var(--border-radius-large);
217
+ /* The edge says "this is the thing to act on". An inset shadow, so it
218
+ follows the card's rounded corners instead of squaring them off. */
219
+ box-shadow: inset 4px 0 0 var(--color-primary-element);
220
+ display: flex;
221
+ flex-wrap: wrap;
222
+ gap: calc(4 * var(--default-grid-baseline)) calc(8 * var(--default-grid-baseline));
223
+ padding: calc(5 * var(--default-grid-baseline)) calc(6 * var(--default-grid-baseline));
224
+ padding-inline-start: calc(7 * var(--default-grid-baseline));
225
+ }
226
+
227
+ .cn-next-step-card__main {
228
+ display: flex;
229
+ flex: 1 1 420px;
230
+ flex-direction: column;
231
+ gap: calc(2.5 * var(--default-grid-baseline));
232
+ min-width: 0;
233
+ }
234
+
235
+ .cn-next-step-card__title {
236
+ color: var(--color-main-text);
237
+ font-size: 0.85em;
238
+ font-weight: 700;
239
+ letter-spacing: 0.06em;
240
+ margin: 0;
241
+ text-transform: uppercase;
242
+ }
243
+
244
+ .cn-next-step-card__list {
245
+ display: grid;
246
+ gap: calc(2 * var(--default-grid-baseline));
247
+ list-style: none;
248
+ margin: 0;
249
+ padding: 0;
250
+ }
251
+
252
+ .cn-next-step-card__item {
253
+ align-items: center;
254
+ color: var(--color-text-maxcontrast);
255
+ display: flex;
256
+ flex-wrap: wrap;
257
+ gap: calc(2.5 * var(--default-grid-baseline));
258
+ }
259
+
260
+ .cn-next-step-card__item--current {
261
+ color: var(--color-main-text);
262
+ }
263
+
264
+ .cn-next-step-card__item--current .cn-next-step-card__label {
265
+ font-weight: 700;
266
+ }
267
+
268
+ .cn-next-step-card__marker {
269
+ align-items: center;
270
+ border: 2px solid var(--color-border-maxcontrast);
271
+ border-radius: 50%;
272
+ box-sizing: border-box;
273
+ display: inline-flex;
274
+ flex: none;
275
+ height: 20px;
276
+ justify-content: center;
277
+ width: 20px;
278
+ }
279
+
280
+ .cn-next-step-card__item--current .cn-next-step-card__marker {
281
+ border-color: var(--color-primary-element);
282
+ }
283
+
284
+ .cn-next-step-card__item--done .cn-next-step-card__marker {
285
+ background: var(--color-primary-element);
286
+ border-color: var(--color-primary-element);
287
+ color: var(--color-primary-element-text);
288
+ }
289
+
290
+ .cn-next-step-card__hint {
291
+ color: var(--color-text-maxcontrast);
292
+ font-weight: 400;
293
+ }
294
+
295
+ /* Read, not seen. */
296
+ .cn-next-step-card__state {
297
+ border: 0;
298
+ clip-path: inset(50%);
299
+ height: 1px;
300
+ margin: -1px;
301
+ overflow: hidden;
302
+ padding: 0;
303
+ position: absolute;
304
+ white-space: nowrap;
305
+ width: 1px;
306
+ }
307
+
308
+ .cn-next-step-card__side {
309
+ align-items: flex-start;
310
+ display: flex;
311
+ flex-direction: column;
312
+ gap: calc(2 * var(--default-grid-baseline));
313
+ }
314
+
315
+ .cn-next-step-card__after {
316
+ color: var(--color-text-maxcontrast);
317
+ font-size: 0.9em;
318
+ }
319
+ </style>
@@ -0,0 +1,59 @@
1
+ <!--
2
+ - SPDX-FileCopyrightText: 2026 Conduction B.V.
3
+ - SPDX-License-Identifier: EUPL-1.2
4
+ -->
5
+
6
+ <template>
7
+ <CnNextStepCard
8
+ v-if="step"
9
+ :title="step.title"
10
+ :items="step.items"
11
+ :after="step.after" />
12
+ </template>
13
+
14
+ <script>
15
+ import CnNextStepCard from './CnNextStepCard.vue'
16
+ import { resolveNextStep } from '../../utils/detailActionModel.js'
17
+
18
+ /**
19
+ * CnNextStepWidget: the `next-step` detail widget type.
20
+ *
21
+ * Renders CnNextStepCard for the bound record's stage from
22
+ * `content: { field?, stages: { <stage>: { title?, checklist, after? } } }`.
23
+ * The checklist only: the page's own primary button stays where the page
24
+ * puts it. Resolved by its registry key, not exported.
25
+ */
26
+ export default {
27
+ name: 'CnNextStepWidget',
28
+
29
+ components: {
30
+ CnNextStepCard,
31
+ },
32
+
33
+ props: {
34
+ /** The widget's content: `{ field?, title?, stages }`. */
35
+ content: {
36
+ type: Object,
37
+ default: () => ({}),
38
+ },
39
+
40
+ /** The bound record. */
41
+ objectData: {
42
+ type: Object,
43
+ default: null,
44
+ },
45
+ },
46
+
47
+ computed: {
48
+ /**
49
+ * The card for the record's stage.
50
+ *
51
+ * @return {object|null} The resolved card, or null when the stage declares none.
52
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-next-step-card
53
+ */
54
+ step() {
55
+ return resolveNextStep(this.content, this.objectData)
56
+ },
57
+ },
58
+ }
59
+ </script>
@@ -0,0 +1,4 @@
1
+ import CnNextStepCard from './CnNextStepCard.vue'
2
+
3
+ export default CnNextStepCard
4
+ export { CnNextStepCard }
@@ -2,7 +2,7 @@
2
2
  <div
3
3
  class="cn-object-card"
4
4
  :class="{ 'cn-object-card--selected': selected }"
5
- @mousedown="onPointerDown"
5
+ @mousedown="onCardMouseDown"
6
6
  @click="onCardClick($event)"
7
7
  @auxclick="onCardAuxClick($event)">
8
8
  <!-- Selection checkbox -->
@@ -76,7 +76,7 @@
76
76
  import { NcCheckboxRadioSwitch } from '@nextcloud/vue'
77
77
  import { useClickDragGuard } from '../../composables/useClickDragGuard.js'
78
78
  import { resolveImageUrl } from '../../utils/resolveImageUrl.js'
79
- import { isRowMiddleClick } from '../../utils/rowAuxClick.js'
79
+ import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
80
80
  import { formatValue } from '../../utils/schema.js'
81
81
  import { CnCellRenderer } from '../CnCellRenderer/index.js'
82
82
  import { CnLockIndicator } from '../CnLockIndicator/index.js'
@@ -161,7 +161,7 @@ export default {
161
161
  },
162
162
  },
163
163
 
164
- emits: ['click', 'select'],
164
+ emits: ['click', 'select', 'aux-click'],
165
165
 
166
166
  setup() {
167
167
  // Tell a deliberate card click apart from a text-selection drag.
@@ -287,14 +287,28 @@ export default {
287
287
  return
288
288
  }
289
289
  /**
290
- * @event click Emitted when a non-selectable (or `clickToView`) card is clicked or middle-clicked. Payload: `(object, event)` — the card's object and the native click/auxclick event, for opening it in a new tab on a ctrl/cmd/shift or middle click. Selectable cards emit `select`; they also emit `click` (deprecated) when a `click` listener is present, so migrate selectable consumers to `@select`.
290
+ * @event click Emitted when a non-selectable (or `clickToView`) card is clicked. Payload: `(object, event)` — the card'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. Selectable cards emit `select`; they also emit `click` (deprecated) when a `click` listener is present, so migrate selectable consumers to `@select`.
291
291
  * @type {object} The card's object.
292
292
  */
293
293
  this.$emit('click', this.object, event)
294
294
  },
295
295
 
296
296
  /**
297
- * Card-body middle click: emits `click` like a navigating click.
297
+ * Card mousedown: record the press for the drag guard, and on a card a
298
+ * middle click opens, keep the browser from starting autoscroll.
299
+ *
300
+ * @param {MouseEvent} event The mousedown event.
301
+ */
302
+ onCardMouseDown(event) {
303
+ this.onPointerDown(event)
304
+ if (!this.selectable || this.clickToView) {
305
+ preventMiddleClickAutoscroll(event)
306
+ }
307
+ },
308
+
309
+ /**
310
+ * Card-body middle click: emits `aux-click`, not `click`, so an existing
311
+ * `click` listener that navigates never moves the current tab away.
298
312
  * Ignored on a select-on-click card, on nested controls and on drags.
299
313
  *
300
314
  * @param {MouseEvent} event The auxclick event.
@@ -306,7 +320,11 @@ export default {
306
320
  if (this.selectable && !this.clickToView) {
307
321
  return
308
322
  }
309
- this.$emit('click', this.object, event)
323
+ /**
324
+ * @event aux-click Emitted when a non-selectable (or `clickToView`) card is middle-clicked, for opening it in a new tab (see `openRowTarget`). Payload: `(object, event)` — the card's object and the native auxclick event.
325
+ * @type {object} The card's object.
326
+ */
327
+ this.$emit('aux-click', this.object, event)
310
328
  },
311
329
  },
312
330
  }
@@ -456,6 +456,13 @@ export default {
456
456
  * identity when used standalone (no CnAppRoot ancestor).
457
457
  */
458
458
  cnTranslate: { default: () => (key) => key },
459
+ /**
460
+ * Formatter registry, provided by CnAppRoot (`cnFormatters`: the
461
+ * library's built-ins plus the app's `formatters`). A field override
462
+ * `{ formatter: '<id>' }` renders the value through the same function a
463
+ * table column with that `formatter` uses. Empty when used standalone.
464
+ */
465
+ cnFormatters: { default: () => ({}) },
459
466
  /**
460
467
  * The host surface's panel-action channel, when this widget is rendered
461
468
  * in a tab panel. Null everywhere else, which is every other surface.
@@ -641,6 +648,11 @@ export default {
641
648
  * - `editable` (boolean) — Override editability (default: based on schema readOnly)
642
649
  * - `label` (string) — Override the display label
643
650
  * - `widget` (string) — Override the widget type for editing
651
+ * - `formatter` (string) — Display the value through the formatter
652
+ * registered under this id on CnAppRoot (`cnFormatters`), called as
653
+ * `(value, object, property)` like a table cell's formatter. An id
654
+ * nobody registered, or a formatter that throws, keeps the default
655
+ * rendering. Editing still writes the stored value.
644
656
  *
645
657
  * Accepts an Array too: an empty overrides map (`{}`) round-trips through
646
658
  * PHP/JSON as an empty Array (`[]`), so a persisted manifest can deliver
@@ -917,12 +929,46 @@ export default {
917
929
  }
918
930
  },
919
931
 
932
+ /**
933
+ * Display values of the fields whose override names a registered
934
+ * formatter, keyed by field key. A field is left out when its formatter
935
+ * id is not registered or the formatter throws, so it falls back to the
936
+ * default rendering.
937
+ *
938
+ * @return {Record<string, string>}
939
+ */
940
+ formatterDisplayValues() {
941
+ const values = {}
942
+ for (const field of this.resolvedFields) {
943
+ const fn = field.formatter && this.cnFormatters && this.cnFormatters[field.formatter]
944
+ if (typeof fn !== 'function') {
945
+ continue
946
+ }
947
+ const raw = field.key in this.dirtyFields
948
+ ? this.dirtyFields[field.key]
949
+ : (this.objectData || {})[field.key]
950
+ const prop = (this.schema.properties && this.schema.properties[field.key]) || {}
951
+ try {
952
+ const formatted = fn(raw, this.objectData || {}, prop)
953
+ values[field.key] = (formatted === null || formatted === undefined || formatted === '') ? '—' : String(formatted)
954
+ } catch (e) {
955
+ // eslint-disable-next-line no-console
956
+ console.warn(`[CnObjectDataWidget] formatter "${field.formatter}" threw; falling back`, e)
957
+ }
958
+ }
959
+ return values
960
+ },
961
+
920
962
  /**
921
963
  * Formatted display values for each field.
922
964
  */
923
965
  displayValues() {
924
966
  const values = {}
925
967
  for (const field of this.resolvedFields) {
968
+ if (field.key in this.formatterDisplayValues) {
969
+ values[field.key] = this.formatterDisplayValues[field.key]
970
+ continue
971
+ }
926
972
  // Show pending edit value if dirty
927
973
  const raw = field.key in this.dirtyFields
928
974
  ? this.dirtyFields[field.key]
@@ -1191,6 +1237,9 @@ export default {
1191
1237
  * @return {'object-array'|'scalar-array'|'object'|'scalar'} The value kind.
1192
1238
  */
1193
1239
  fieldValueKind(field) {
1240
+ if (field.key in this.formatterDisplayValues) {
1241
+ return 'scalar'
1242
+ }
1194
1243
  const prop = ((this.schema && this.schema.properties) || {})[field.key]
1195
1244
  if (this.isRelationField(prop)) {
1196
1245
  return 'scalar'
@@ -268,6 +268,9 @@ export default {
268
268
  gridColumn: Number.isFinite(o.gridColumn) ? o.gridColumn : 1,
269
269
  widget: o.widget || 'auto',
270
270
  editable: o.editable !== false,
271
+ // Not edited here, but carried through, so saving the
272
+ // cog editor does not drop a manifest-authored formatter.
273
+ formatter: typeof o.formatter === 'string' ? o.formatter : '',
271
274
  }
272
275
  })
273
276
  },
@@ -386,6 +389,9 @@ export default {
386
389
  if (row.editable === false) {
387
390
  o.editable = false
388
391
  }
392
+ if (row.formatter) {
393
+ o.formatter = row.formatter
394
+ }
389
395
  if (Object.keys(o).length) {
390
396
  out[row.key] = o
391
397
  }
@@ -50,11 +50,27 @@
50
50
  <template #item="{ element: card }">
51
51
  <div
52
52
  class="cn-object-kanban__card"
53
- :class="{ 'cn-object-kanban__card--pending': isPending(card) }">
53
+ :class="{
54
+ 'cn-object-kanban__card--pending': isPending(card),
55
+ 'cn-object-kanban__card--overdue': dueState(card) === 'overdue',
56
+ 'cn-object-kanban__card--soon': dueState(card) === 'soon',
57
+ }">
54
58
  <!-- @slot card Fully replace the default card rendering. -->
55
59
  <!-- @binding {object} object The card's object. -->
56
60
  <!-- @binding {object} column The column the card currently sits in. -->
57
- <slot name="card" :object="card" :column="column">
61
+ <!-- @binding {string|null} dueState The card's due state under `dueRule`: `overdue`, `soon`, `ok`, or null without a rule. -->
62
+ <slot
63
+ name="card"
64
+ :object="card"
65
+ :column="column"
66
+ :dueState="dueState(card)">
67
+ <span
68
+ v-if="dueLabel(card)"
69
+ class="cn-object-kanban__due"
70
+ :class="`cn-object-kanban__due--${dueState(card)}`"
71
+ data-testid="cn-kanban-due">
72
+ {{ dueLabel(card) }}
73
+ </span>
58
74
  <div class="cn-object-kanban__card-title" @click="onCardClick(card)">
59
75
  {{ cardTitle(card) }}
60
76
  </div>
@@ -92,6 +108,7 @@ import { translate as t } from '@nextcloud/l10n'
92
108
  import { NcButton, NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'
93
109
  import draggable from 'vuedraggable'
94
110
  import ViewColumn from 'vue-material-design-icons/ViewColumn.vue'
111
+ import { dueStateForRow } from '../../utils/dueRule.js'
95
112
  import { CnCellRenderer } from '../CnCellRenderer/index.js'
96
113
 
97
114
  /**
@@ -225,6 +242,22 @@ export default {
225
242
  type: String,
226
243
  default: 'id',
227
244
  },
245
+
246
+ /**
247
+ * Marks late cards: `{ field, soonDays? }`. `field` is the dot-path to
248
+ * a card's due date. A date before today gets an error edge and the
249
+ * label "Overdue"; a date within `soonDays` (default 3) gets "Due
250
+ * soon" in the warning colour. `null` (the default) marks nothing.
251
+ *
252
+ * The same rule shape the table's date cell uses, so a list and its
253
+ * board agree on what late means.
254
+ *
255
+ * @type {{field: string, soonDays?: number}|null}
256
+ */
257
+ dueRule: {
258
+ type: Object,
259
+ default: null,
260
+ },
228
261
  },
229
262
 
230
263
  emits: ['card-click', 'load-more', 'move', 'move-rejected'],
@@ -240,6 +273,8 @@ export default {
240
273
  // objectId -> { fromValue, toValue, card, originIndex }
241
274
  pendingMoves: {},
242
275
  dragOriginValue: null,
276
+ // The day late marking measures from.
277
+ today: new Date(),
243
278
  }
244
279
  },
245
280
 
@@ -294,6 +329,33 @@ export default {
294
329
  methods: {
295
330
  t,
296
331
 
332
+ /**
333
+ * A card's due state under `dueRule`.
334
+ *
335
+ * @param {object} card The card's row.
336
+ * @return {'overdue'|'soon'|'ok'|null} The state, or null when no rule applies.
337
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-late-marking-on-board-cards
338
+ */
339
+ dueState(card) {
340
+ return dueStateForRow(card, this.dueRule, this.today)
341
+ },
342
+
343
+ /**
344
+ * The words a late card carries. Colour alone would not reach a reader
345
+ * who cannot see it, or cannot tell red from amber.
346
+ *
347
+ * @param {object} card The card's row.
348
+ * @return {string} "Overdue", "Due soon", or '' for a card that is fine.
349
+ * @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-late-marking-on-board-cards
350
+ */
351
+ dueLabel(card) {
352
+ const state = this.dueState(card)
353
+ if (state === 'overdue') {
354
+ return t('nextcloud-vue', 'Overdue')
355
+ }
356
+ return state === 'soon' ? t('nextcloud-vue', 'Due soon') : ''
357
+ },
358
+
297
359
  /**
298
360
  * Rebuild `localColumns` from either the `columns` prop (backend-paginated
299
361
  * mode) or `objects` + `groupByField` (locally-derived mode).
@@ -703,6 +765,28 @@ export default {
703
765
  opacity: 0.6;
704
766
  }
705
767
 
768
+ /* A late card. The label carries the meaning; the edge helps a sighted
769
+ reader find it. An inset shadow, so the card keeps its size. */
770
+ .cn-object-kanban__card--overdue {
771
+ border-color: var(--color-error);
772
+ box-shadow: inset 3px 0 0 var(--color-error);
773
+ }
774
+
775
+ .cn-object-kanban__due {
776
+ display: block;
777
+ font-size: 0.85em;
778
+ font-weight: 700;
779
+ }
780
+
781
+ .cn-object-kanban__due--overdue {
782
+ color: var(--color-error-text, var(--color-error));
783
+ }
784
+
785
+ .cn-object-kanban__due--soon {
786
+ color: var(--color-warning-text, var(--color-main-text));
787
+ font-weight: 600;
788
+ }
789
+
706
790
  .cn-object-kanban__card-title {
707
791
  font-weight: 500;
708
792
  cursor: pointer;