@conduction/nextcloud-vue 2.59.0 → 2.61.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 (254) hide show
  1. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js +14 -1
  2. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
  4. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js +80 -1
  5. package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
  6. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +46 -4
  7. package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
  8. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +232 -10
  9. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  10. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +79 -25
  11. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  12. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js +42 -3
  13. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js.map +1 -1
  14. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js +39 -6
  15. package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js.map +1 -1
  16. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +46 -0
  17. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  18. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +11 -4
  19. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  20. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js +10 -0
  21. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js.map +1 -0
  22. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +39 -0
  23. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -0
  24. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +16 -0
  25. package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js.map +1 -0
  26. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +117 -1
  27. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  28. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +147 -89
  29. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  30. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +10 -0
  31. package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js.map +1 -0
  32. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +259 -0
  33. package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -0
  34. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +131 -0
  35. package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -0
  36. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +10 -0
  37. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js.map +1 -0
  38. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +116 -0
  39. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -0
  40. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +24 -0
  41. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -0
  42. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +10 -2
  43. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  44. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  45. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +503 -28
  46. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  47. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +303 -144
  48. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  49. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js +10 -0
  50. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js.map +1 -0
  51. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js +237 -0
  52. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js.map +1 -0
  53. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js +120 -0
  54. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js.map +1 -0
  55. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js +10 -0
  56. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js.map +1 -0
  57. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +77 -0
  58. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -0
  59. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js +27 -0
  60. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -0
  61. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js +171 -12
  62. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +15 -7
  64. package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
  65. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js +37 -3
  66. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js.map +1 -1
  67. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js +44 -16
  68. package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js.map +1 -1
  69. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +132 -3
  70. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  71. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +6 -3
  72. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  73. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue.js +10 -0
  74. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue.js.map +1 -0
  75. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue2.js +316 -0
  76. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue2.js.map +1 -0
  77. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js +105 -0
  78. package/dist/esm/components/CnLinkCardsPage/CnLinkCardsPage.vue3.js.map +1 -0
  79. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js +10 -0
  80. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js.map +1 -0
  81. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js +150 -0
  82. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js.map +1 -0
  83. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js +106 -0
  84. package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js.map +1 -0
  85. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js +9 -0
  86. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js.map +1 -0
  87. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +47 -0
  88. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -0
  89. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js +17 -0
  90. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js.map +1 -0
  91. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +49 -0
  92. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
  93. package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
  94. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js +6 -0
  95. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js.map +1 -1
  96. package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue3.js.map +1 -1
  97. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js +46 -0
  98. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js.map +1 -1
  99. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js +15 -3
  100. package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js.map +1 -1
  101. package/dist/esm/components/CnPageRenderer/pageTypes.js +1 -0
  102. package/dist/esm/components/CnPageRenderer/pageTypes.js.map +1 -1
  103. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js +37 -1
  104. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
  105. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +29 -13
  106. package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
  107. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js +50 -3
  108. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
  109. package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
  110. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js +10 -0
  111. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js.map +1 -0
  112. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +186 -0
  113. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -0
  114. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +46 -0
  115. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -0
  116. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js +11 -0
  117. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js.map +1 -0
  118. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +298 -0
  119. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -0
  120. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +77 -0
  121. package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -0
  122. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js +10 -0
  123. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js.map +1 -0
  124. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js +169 -0
  125. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js.map +1 -0
  126. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js +48 -0
  127. package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js.map +1 -0
  128. package/dist/esm/components/CnTabs/CnTab.vue2.js +35 -0
  129. package/dist/esm/components/CnTabs/CnTab.vue2.js.map +1 -1
  130. package/dist/esm/components/CnTabs/CnTab.vue3.js.map +1 -1
  131. package/dist/esm/components/CnTabs/CnTabs.vue2.js +120 -7
  132. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  133. package/dist/esm/components/CnTabs/CnTabs.vue3.js +57 -5
  134. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  135. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +59 -4
  136. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  137. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +6 -2
  138. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  139. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +10 -0
  140. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js.map +1 -0
  141. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +484 -0
  142. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -0
  143. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js +115 -0
  144. package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -0
  145. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js +10 -0
  146. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js.map +1 -0
  147. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js +189 -0
  148. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js.map +1 -0
  149. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js +74 -0
  150. package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js.map +1 -0
  151. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +82 -8
  152. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  153. package/dist/esm/index.js +16 -0
  154. package/dist/esm/index.js.map +1 -1
  155. package/dist/esm/l10n/en.json.js +55 -1
  156. package/dist/esm/l10n/en.json.js.map +1 -1
  157. package/dist/esm/l10n/nl.json.js +55 -1
  158. package/dist/esm/l10n/nl.json.js.map +1 -1
  159. package/dist/esm/nextcloud-vue.css +1036 -19
  160. package/dist/esm/utils/dateVariant.js +124 -0
  161. package/dist/esm/utils/dateVariant.js.map +1 -0
  162. package/dist/esm/utils/detailActionModel.js +260 -0
  163. package/dist/esm/utils/detailActionModel.js.map +1 -0
  164. package/dist/esm/utils/dueRule.js +84 -0
  165. package/dist/esm/utils/dueRule.js.map +1 -0
  166. package/dist/esm/utils/fetchAggregate.js +37 -1
  167. package/dist/esm/utils/fetchAggregate.js.map +1 -1
  168. package/dist/esm/utils/fetchFilterCounts.js +186 -0
  169. package/dist/esm/utils/fetchFilterCounts.js.map +1 -0
  170. package/dist/esm/utils/headers.js +28 -2
  171. package/dist/esm/utils/headers.js.map +1 -1
  172. package/dist/esm/utils/libraryWidgetKeys.js +5 -0
  173. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  174. package/dist/esm/utils/readPath.js +30 -0
  175. package/dist/esm/utils/readPath.js.map +1 -0
  176. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  177. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  178. package/dist/nextcloud-vue.cjs.js +16019 -9528
  179. package/dist/nextcloud-vue.cjs.js.map +2 -2
  180. package/dist/nextcloud-vue.css +1036 -19
  181. package/l10n/en.json +55 -1
  182. package/l10n/nl.json +55 -1
  183. package/package.json +1 -1
  184. package/scripts/.jsdoc-baselines.json +4 -0
  185. package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -1
  186. package/src/components/CnAppNav/CnAppNav.md +26 -0
  187. package/src/components/CnAppNav/CnAppNav.vue +145 -2
  188. package/src/components/CnBannerWidget/CnBannerWidget.vue +373 -11
  189. package/src/components/CnBannerWidgetForm/CnBannerWidgetForm.vue +65 -3
  190. package/src/components/CnBoardView/CnBoardView.vue +77 -0
  191. package/src/components/CnBrandStripe/CnBrandStripe.md +22 -0
  192. package/src/components/CnBrandStripe/CnBrandStripe.vue +100 -0
  193. package/src/components/CnBrandStripe/index.js +4 -0
  194. package/src/components/CnCellRenderer/CnCellRenderer.vue +207 -1
  195. package/src/components/CnConversationThread/CnConversationThread.md +51 -0
  196. package/src/components/CnConversationThread/CnConversationThread.vue +457 -0
  197. package/src/components/CnConversationThread/CnConversationWidget.vue +144 -0
  198. package/src/components/CnConversationThread/index.js +4 -0
  199. package/src/components/CnDashboardPage/CnDashboardPage.vue +10 -2
  200. package/src/components/CnDetailPage/CnDetailPage.md +16 -0
  201. package/src/components/CnDetailPage/CnDetailPage.vue +687 -49
  202. package/src/components/CnDocumentReviewList/CnDocumentReviewList.md +55 -0
  203. package/src/components/CnDocumentReviewList/CnDocumentReviewList.vue +384 -0
  204. package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +108 -0
  205. package/src/components/CnDocumentReviewList/index.js +4 -0
  206. package/src/components/CnHeaderWidget/CnHeaderWidget.vue +191 -14
  207. package/src/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue +53 -3
  208. package/src/components/CnIndexPage/CnIndexPage.vue +135 -3
  209. package/src/components/CnLinkCardsPage/CnLinkCardsPage.vue +484 -0
  210. package/src/components/CnLinkCardsPage/index.js +4 -0
  211. package/src/components/CnNextStepCard/CnNextStepCard.md +40 -0
  212. package/src/components/CnNextStepCard/CnNextStepCard.vue +319 -0
  213. package/src/components/CnNextStepCard/CnNextStepWidget.vue +59 -0
  214. package/src/components/CnNextStepCard/index.js +4 -0
  215. package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +49 -0
  216. package/src/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue +6 -0
  217. package/src/components/CnObjectKanban/CnObjectKanban.vue +86 -2
  218. package/src/components/CnPageRenderer/pageTypes.js +1 -0
  219. package/src/components/CnQuickFilterBar/CnQuickFilterBar.md +3 -0
  220. package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +60 -1
  221. package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +50 -3
  222. package/src/components/CnSegmentedControl/CnSegmentedControl.md +46 -0
  223. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +291 -0
  224. package/src/components/CnSegmentedControl/index.js +4 -0
  225. package/src/components/CnStackedBarWidget/CnStackedBarWidget.md +15 -0
  226. package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +414 -0
  227. package/src/components/CnStackedBarWidget/index.js +14 -0
  228. package/src/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue +224 -0
  229. package/src/components/CnStackedBarWidgetForm/index.js +4 -0
  230. package/src/components/CnTabs/CnTab.vue +35 -0
  231. package/src/components/CnTabs/CnTabs.vue +244 -10
  232. package/src/components/CnTabsWidget/CnTabsWidget.vue +63 -4
  233. package/src/components/CnWeekStripWidget/CnWeekStripWidget.md +31 -0
  234. package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +668 -0
  235. package/src/components/CnWeekStripWidget/index.js +14 -0
  236. package/src/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue +265 -0
  237. package/src/components/CnWeekStripWidgetForm/index.js +4 -0
  238. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +74 -0
  239. package/src/components/index.js +12 -0
  240. package/src/css/detail-page.css +57 -2
  241. package/src/index.js +16 -0
  242. package/src/schemas/app-manifest-v2.schema.json +433 -3
  243. package/src/schemas/app-manifest.schema.json +2 -1
  244. package/src/types/manifest.d.ts +1 -1
  245. package/src/utils/dateVariant.js +120 -0
  246. package/src/utils/detailActionModel.js +256 -0
  247. package/src/utils/dueRule.js +94 -0
  248. package/src/utils/fetchAggregate.js +36 -0
  249. package/src/utils/fetchFilterCounts.js +182 -0
  250. package/src/utils/headers.js +28 -2
  251. package/src/utils/index.js +1 -0
  252. package/src/utils/libraryWidgetKeys.js +5 -0
  253. package/src/utils/readPath.js +27 -0
  254. 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;;;;;;;;;;;"}