@conduction/nextcloud-vue 2.79.0 → 2.81.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/dist/esm/components/CnActionButtons/CnActionButtons.vue2.js.map +1 -1
  2. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js +3 -1
  3. package/dist/esm/components/CnActionButtons/CnActionButtons.vue3.js.map +1 -1
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +32 -3
  5. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  6. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +13 -11
  7. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  8. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +80 -4
  9. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  10. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +95 -91
  11. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  12. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +179 -13
  13. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
  14. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +52 -16
  15. package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
  16. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js +96 -4
  17. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
  18. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +158 -110
  19. package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js.map +1 -1
  20. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js +10 -0
  21. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue.js.map +1 -0
  22. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js +252 -0
  23. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue2.js.map +1 -0
  24. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js +140 -0
  25. package/dist/esm/components/CnChipsFieldWidget/CnChipsFieldWidget.vue3.js.map +1 -0
  26. package/dist/esm/components/CnChipsFieldWidget/index.js +26 -0
  27. package/dist/esm/components/CnChipsFieldWidget/index.js.map +1 -0
  28. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js +10 -0
  29. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue.js.map +1 -0
  30. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js +354 -0
  31. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue2.js.map +1 -0
  32. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js +172 -0
  33. package/dist/esm/components/CnChoicePickerWidget/CnChoicePickerWidget.vue3.js.map +1 -0
  34. package/dist/esm/components/CnChoicePickerWidget/index.js +27 -0
  35. package/dist/esm/components/CnChoicePickerWidget/index.js.map +1 -0
  36. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +1 -1
  37. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -1
  38. package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -1
  39. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js +2 -2
  40. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue2.js.map +1 -1
  41. package/dist/esm/components/CnDashboardGrid/CnDashboardGrid.vue3.js.map +1 -1
  42. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +65 -5
  43. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
  44. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +2 -1
  45. package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
  46. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +19 -11
  47. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  48. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +4 -2
  49. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  50. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +134 -4
  51. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  52. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +21 -4
  53. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  54. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +24 -0
  55. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
  56. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js +43 -4
  57. package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
  58. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +1 -1
  59. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -1
  60. package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -1
  61. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js +7 -7
  62. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue2.js.map +1 -1
  63. package/dist/esm/components/CnFacetSidebar/CnFacetSidebar.vue3.js.map +1 -1
  64. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +11 -0
  65. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js.map +1 -0
  66. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +867 -0
  67. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -0
  68. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js +238 -0
  69. package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -0
  70. package/dist/esm/components/CnFactsWidget/index.js +30 -0
  71. package/dist/esm/components/CnFactsWidget/index.js.map +1 -0
  72. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js +10 -0
  73. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue.js.map +1 -0
  74. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js +626 -0
  75. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue2.js.map +1 -0
  76. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js +396 -0
  77. package/dist/esm/components/CnFieldListWidget/CnFieldListWidget.vue3.js.map +1 -0
  78. package/dist/esm/components/CnFieldListWidget/index.js +29 -0
  79. package/dist/esm/components/CnFieldListWidget/index.js.map +1 -0
  80. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +302 -4
  81. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  82. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +417 -244
  83. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  84. package/dist/esm/components/CnFilesBrowser/filesBrowser.js +101 -1
  85. package/dist/esm/components/CnFilesBrowser/filesBrowser.js.map +1 -1
  86. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js +141 -1
  87. package/dist/esm/components/CnFilesBrowser/filesBrowserColumns.js.map +1 -1
  88. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js +65 -17
  89. package/dist/esm/components/CnFormDialog/CnFormDialog.vue2.js.map +1 -1
  90. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js +4 -4
  91. package/dist/esm/components/CnFormDialog/CnFormDialog.vue3.js.map +1 -1
  92. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js +78 -3
  93. package/dist/esm/components/CnFormPage/CnFormPage.vue2.js.map +1 -1
  94. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js +74 -49
  95. package/dist/esm/components/CnFormPage/CnFormPage.vue3.js.map +1 -1
  96. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +333 -73
  97. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  98. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +79 -17
  99. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  100. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js +10 -0
  101. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue.js.map +1 -0
  102. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js +99 -0
  103. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue2.js.map +1 -0
  104. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js +48 -0
  105. package/dist/esm/components/CnIndexPage/CnIndexPageWidgets.vue3.js.map +1 -0
  106. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js +7 -7
  107. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue2.js.map +1 -1
  108. package/dist/esm/components/CnIndexSidebar/CnIndexSidebar.vue3.js.map +1 -1
  109. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +1 -1
  110. package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -1
  111. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +65 -2
  112. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  113. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +6 -2
  114. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  115. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js +63 -1
  116. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  117. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +8 -1
  118. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  119. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +14 -0
  120. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
  121. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js +5 -1
  122. package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
  123. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js +29 -1
  124. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  125. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  126. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js +10 -0
  127. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue.js.map +1 -0
  128. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js +174 -0
  129. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue2.js.map +1 -0
  130. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js +75 -0
  131. package/dist/esm/components/CnRadioCardsWidget/CnRadioCardsWidget.vue3.js.map +1 -0
  132. package/dist/esm/components/CnRadioCardsWidget/index.js +28 -0
  133. package/dist/esm/components/CnRadioCardsWidget/index.js.map +1 -0
  134. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +10 -0
  135. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js.map +1 -0
  136. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +411 -0
  137. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -0
  138. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js +178 -0
  139. package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -0
  140. package/dist/esm/components/CnRecordListWidget/index.js +31 -0
  141. package/dist/esm/components/CnRecordListWidget/index.js.map +1 -0
  142. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js +10 -0
  143. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue.js.map +1 -0
  144. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js +222 -0
  145. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue2.js.map +1 -0
  146. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js +64 -0
  147. package/dist/esm/components/CnSavedViewsWidget/CnSavedViewsWidget.vue3.js.map +1 -0
  148. package/dist/esm/components/CnSavedViewsWidget/index.js +30 -0
  149. package/dist/esm/components/CnSavedViewsWidget/index.js.map +1 -0
  150. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js +10 -0
  151. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue.js.map +1 -0
  152. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js +351 -0
  153. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue2.js.map +1 -0
  154. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js +71 -0
  155. package/dist/esm/components/CnSectionsWidget/CnSectionsWidget.vue3.js.map +1 -0
  156. package/dist/esm/components/CnSectionsWidget/index.js +35 -0
  157. package/dist/esm/components/CnSectionsWidget/index.js.map +1 -0
  158. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -1
  159. package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -1
  160. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js +10 -0
  161. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue.js.map +1 -0
  162. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js +347 -0
  163. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue2.js.map +1 -0
  164. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js +184 -0
  165. package/dist/esm/components/CnSettingsFormWidget/CnSettingsFormWidget.vue3.js.map +1 -0
  166. package/dist/esm/components/CnSettingsFormWidget/index.js +27 -0
  167. package/dist/esm/components/CnSettingsFormWidget/index.js.map +1 -0
  168. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js +81 -2
  169. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue2.js.map +1 -1
  170. package/dist/esm/components/CnStagesWidget/CnStagesWidget.vue3.js.map +1 -1
  171. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +87 -6
  172. package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
  173. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +1 -0
  174. package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
  175. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js +84 -1
  176. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue2.js.map +1 -1
  177. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js +85 -41
  178. package/dist/esm/components/CnStatsBlockWidget/CnStatsBlockWidget.vue3.js.map +1 -1
  179. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js +10 -0
  180. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue.js.map +1 -0
  181. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js +159 -0
  182. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue2.js.map +1 -0
  183. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js +60 -0
  184. package/dist/esm/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue3.js.map +1 -0
  185. package/dist/esm/components/CnSwitchRowsWidget/index.js +26 -0
  186. package/dist/esm/components/CnSwitchRowsWidget/index.js.map +1 -0
  187. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +168 -7
  188. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
  189. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +86 -23
  190. package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
  191. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +80 -1
  192. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
  193. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +75 -32
  194. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
  195. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +10 -0
  196. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js.map +1 -0
  197. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +269 -0
  198. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -0
  199. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js +106 -0
  200. package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -0
  201. package/dist/esm/components/CnToggleTableWidget/index.js +27 -0
  202. package/dist/esm/components/CnToggleTableWidget/index.js.map +1 -0
  203. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +11 -0
  204. package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
  205. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +7 -2
  206. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
  207. package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
  208. package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
  209. package/dist/esm/components/CnWidgetObjectTable/dashboardRegistration.js.map +1 -1
  210. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js +301 -6
  211. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue2.js.map +1 -1
  212. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js +153 -55
  213. package/dist/esm/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue3.js.map +1 -1
  214. package/dist/esm/composables/useFormDraft.js +140 -9
  215. package/dist/esm/composables/useFormDraft.js.map +1 -1
  216. package/dist/esm/composables/useListView.js +4 -4
  217. package/dist/esm/composables/useListView.js.map +1 -1
  218. package/dist/esm/index.js +21 -1
  219. package/dist/esm/index.js.map +1 -1
  220. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +28 -20
  221. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
  222. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js +9 -0
  223. package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
  224. package/dist/esm/integrations/builtin/field-inspection.js +21 -0
  225. package/dist/esm/integrations/builtin/field-inspection.js.map +1 -1
  226. package/dist/esm/integrations/offline/checklistSubmission.js +141 -0
  227. package/dist/esm/integrations/offline/checklistSubmission.js.map +1 -0
  228. package/dist/esm/integrations/offline/fieldCollectionHelpers.js +70 -5
  229. package/dist/esm/integrations/offline/fieldCollectionHelpers.js.map +1 -1
  230. package/dist/esm/integrations/offline/index.js +2 -1
  231. package/dist/esm/integrations/offline/index.js.map +1 -1
  232. package/dist/esm/integrations/offline/offlineDb.js +6 -1
  233. package/dist/esm/integrations/offline/offlineDb.js.map +1 -1
  234. package/dist/esm/integrations/offline/syncReplayService.js +8 -2
  235. package/dist/esm/integrations/offline/syncReplayService.js.map +1 -1
  236. package/dist/esm/l10n/en.json.js +20 -1
  237. package/dist/esm/l10n/en.json.js.map +1 -1
  238. package/dist/esm/l10n/nl.json.js +70 -2
  239. package/dist/esm/l10n/nl.json.js.map +1 -1
  240. package/dist/esm/nextcloud-vue.css +2192 -222
  241. package/dist/esm/utils/contentHeaderLink.js +51 -0
  242. package/dist/esm/utils/contentHeaderLink.js.map +1 -0
  243. package/dist/esm/utils/detailActionModel.js +60 -3
  244. package/dist/esm/utils/detailActionModel.js.map +1 -1
  245. package/dist/esm/utils/facets.js +75 -3
  246. package/dist/esm/utils/facets.js.map +1 -1
  247. package/dist/esm/utils/fetchFilterCounts.js +40 -5
  248. package/dist/esm/utils/fetchFilterCounts.js.map +1 -1
  249. package/dist/esm/utils/fillTemplate.js +120 -0
  250. package/dist/esm/utils/fillTemplate.js.map +1 -0
  251. package/dist/esm/utils/initials.js +32 -0
  252. package/dist/esm/utils/initials.js.map +1 -0
  253. package/dist/esm/utils/libraryWidgetKeys.js +11 -0
  254. package/dist/esm/utils/libraryWidgetKeys.js.map +1 -1
  255. package/dist/esm/utils/objectWrite.js +59 -0
  256. package/dist/esm/utils/objectWrite.js.map +1 -0
  257. package/dist/esm/utils/pageControls.js +81 -0
  258. package/dist/esm/utils/pageControls.js.map +1 -0
  259. package/dist/esm/utils/personalLenses.js +40 -3
  260. package/dist/esm/utils/personalLenses.js.map +1 -1
  261. package/dist/esm/utils/queryPresets.js +96 -0
  262. package/dist/esm/utils/queryPresets.js.map +1 -0
  263. package/dist/esm/utils/resolveFilterTokens.js +12 -1
  264. package/dist/esm/utils/resolveFilterTokens.js.map +1 -1
  265. package/dist/esm/utils/resolveManifestTokens.js +2 -0
  266. package/dist/esm/utils/resolveManifestTokens.js.map +1 -1
  267. package/dist/esm/utils/schema.js +21 -0
  268. package/dist/esm/utils/schema.js.map +1 -1
  269. package/dist/esm/utils/sentinelTokens.js +22 -4
  270. package/dist/esm/utils/sentinelTokens.js.map +1 -1
  271. package/dist/esm/utils/userGroupsPeek.js +91 -0
  272. package/dist/esm/utils/userGroupsPeek.js.map +1 -0
  273. package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
  274. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  275. package/dist/esm/utils/visibleWhen.js +57 -5
  276. package/dist/esm/utils/visibleWhen.js.map +1 -1
  277. package/dist/esm/utils/widgetDispatch.js +7 -1
  278. package/dist/esm/utils/widgetDispatch.js.map +1 -1
  279. package/dist/esm/utils/widgetVisibility.js +4 -57
  280. package/dist/esm/utils/widgetVisibility.js.map +1 -1
  281. package/dist/nextcloud-vue.cjs.js +19708 -9301
  282. package/dist/nextcloud-vue.cjs.js.map +2 -2
  283. package/dist/nextcloud-vue.css +2192 -222
  284. package/l10n/en.json +20 -1
  285. package/l10n/nl.json +70 -2
  286. package/package.json +2 -1
  287. package/scripts/check-docs-mdx.mjs +108 -0
  288. package/src/components/CnActionButtons/CnActionButtons.vue +2 -0
  289. package/src/components/CnActionsBar/CnActionsBar.md +4 -0
  290. package/src/components/CnActionsBar/CnActionsBar.vue +48 -11
  291. package/src/components/CnAppRoot/CnAppRoot.md +4 -2
  292. package/src/components/CnAppRoot/CnAppRoot.vue +151 -59
  293. package/src/components/CnBannerWidget/CnBannerWidget.vue +244 -23
  294. package/src/components/CnCellRenderer/CnCellRenderer.md +2 -0
  295. package/src/components/CnCellRenderer/CnCellRenderer.vue +235 -5
  296. package/src/components/CnChipsFieldWidget/CnChipsFieldWidget.vue +433 -0
  297. package/src/components/CnChipsFieldWidget/index.js +25 -0
  298. package/src/components/CnChoicePickerWidget/CnChoicePickerWidget.vue +556 -0
  299. package/src/components/CnChoicePickerWidget/index.js +26 -0
  300. package/src/components/CnConversationThread/CnConversationWidget.vue +1 -1
  301. package/src/components/CnDashboardGrid/CnDashboardGrid.vue +2 -2
  302. package/src/components/CnDashboardPage/CnDashboardPage.vue +78 -5
  303. package/src/components/CnDataTable/CnDataTable.vue +22 -12
  304. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  305. package/src/components/CnDetailPage/CnDetailPage.vue +152 -6
  306. package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +66 -0
  307. package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +1 -1
  308. package/src/components/CnFacetSidebar/CnFacetSidebar.vue +7 -7
  309. package/src/components/CnFactsWidget/CnFactsWidget.vue +1190 -0
  310. package/src/components/CnFactsWidget/index.js +29 -0
  311. package/src/components/CnFieldListWidget/CnFieldListWidget.vue +1008 -0
  312. package/src/components/CnFieldListWidget/index.js +28 -0
  313. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +588 -117
  314. package/src/components/CnFilesBrowser/filesBrowser.js +100 -0
  315. package/src/components/CnFilesBrowser/filesBrowserColumns.js +140 -0
  316. package/src/components/CnFormDialog/CnFormDialog.md +9 -3
  317. package/src/components/CnFormDialog/CnFormDialog.vue +69 -21
  318. package/src/components/CnFormPage/CnFormPage.vue +99 -3
  319. package/src/components/CnIndexPage/CnIndexPage.vue +309 -9
  320. package/src/components/CnIndexPage/CnIndexPageWidgets.vue +169 -0
  321. package/src/components/CnIndexSidebar/CnIndexSidebar.vue +7 -7
  322. package/src/components/CnNextStepCard/CnNextStepWidget.vue +1 -1
  323. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +69 -2
  324. package/src/components/CnObjectSidebar/CnFilesTab.vue +70 -1
  325. package/src/components/CnObjectSidebar/CnNotesTab.vue +16 -0
  326. package/src/components/CnPageRenderer/CnPageRenderer.vue +29 -1
  327. package/src/components/CnRadioCardsWidget/CnRadioCardsWidget.vue +313 -0
  328. package/src/components/CnRadioCardsWidget/index.js +27 -0
  329. package/src/components/CnRecordListWidget/CnRecordListWidget.vue +652 -0
  330. package/src/components/CnRecordListWidget/index.js +30 -0
  331. package/src/components/CnSavedViewsWidget/CnSavedViewsWidget.vue +296 -0
  332. package/src/components/CnSavedViewsWidget/index.js +29 -0
  333. package/src/components/CnSectionsWidget/CnSectionsWidget.vue +489 -0
  334. package/src/components/CnSectionsWidget/index.js +34 -0
  335. package/src/components/CnSegmentedControl/CnSegmentedControl.vue +13 -0
  336. package/src/components/CnSettingsFormWidget/CnSettingsFormWidget.vue +555 -0
  337. package/src/components/CnSettingsFormWidget/index.js +26 -0
  338. package/src/components/CnStagesWidget/CnStagesWidget.vue +81 -2
  339. package/src/components/CnStatWidget/CnStatWidget.vue +88 -7
  340. package/src/components/CnStatsBlockWidget/CnStatsBlockWidget.vue +180 -3
  341. package/src/components/CnSwitchRowsWidget/CnSwitchRowsWidget.vue +226 -0
  342. package/src/components/CnSwitchRowsWidget/index.js +25 -0
  343. package/src/components/CnTabsWidget/CnTabsWidget.vue +263 -8
  344. package/src/components/CnTasksWidget/CnTasksWidget.vue +175 -15
  345. package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +386 -0
  346. package/src/components/CnToggleTableWidget/index.js +26 -0
  347. package/src/components/CnWidgetGrid/registerDashboardWidgets.js +11 -0
  348. package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +7 -2
  349. package/src/components/CnWidgetObjectTable/dashboardRegistration.js +5 -0
  350. package/src/components/CnWorkspaceFilterWidget/CnWorkspaceFilterWidget.vue +493 -11
  351. package/src/components/index.js +19 -0
  352. package/src/composables/__tests__/useFormDraft.spec.js +69 -0
  353. package/src/composables/useFormDraft.js +139 -8
  354. package/src/composables/useListView.js +4 -4
  355. package/src/css/form-field.css +14 -0
  356. package/src/css/index-page.css +71 -0
  357. package/src/css/kpi-card.css +32 -0
  358. package/src/css/look-board-detail.css +113 -2
  359. package/src/css/look-board-index.css +90 -8
  360. package/src/css/look-board.css +109 -2
  361. package/src/css/table.css +19 -0
  362. package/src/index.js +19 -0
  363. package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +35 -20
  364. package/src/integrations/builtin/field-inspection.js +21 -0
  365. package/src/integrations/offline/checklistSubmission.js +137 -0
  366. package/src/integrations/offline/fieldCollectionHelpers.js +69 -4
  367. package/src/integrations/offline/index.js +3 -0
  368. package/src/integrations/offline/offlineDb.js +6 -1
  369. package/src/integrations/offline/syncReplayService.js +8 -2
  370. package/src/schemas/app-manifest-v2.schema.json +196 -13
  371. package/src/utils/contentHeaderLink.js +48 -0
  372. package/src/utils/detailActionModel.js +59 -2
  373. package/src/utils/facets.js +74 -2
  374. package/src/utils/fetchFilterCounts.js +39 -4
  375. package/src/utils/fillTemplate.js +116 -0
  376. package/src/utils/initials.js +29 -0
  377. package/src/utils/libraryWidgetKeys.js +11 -0
  378. package/src/utils/objectWrite.js +55 -0
  379. package/src/utils/pageControls.js +78 -0
  380. package/src/utils/personalLenses.js +39 -2
  381. package/src/utils/queryPresets.js +93 -0
  382. package/src/utils/resolveFilterTokens.js +14 -1
  383. package/src/utils/resolveManifestTokens.js +2 -0
  384. package/src/utils/schema.js +21 -0
  385. package/src/utils/sentinelTokens.js +22 -4
  386. package/src/utils/userGroupsPeek.js +87 -0
  387. package/src/utils/validateManifestV2.compiled.js +3 -3
  388. package/src/utils/visibleWhen.js +56 -4
  389. package/src/utils/widgetDispatch.js +7 -1
  390. package/src/utils/widgetVisibility.js +7 -56
@@ -7,7 +7,7 @@
7
7
  <section
8
8
  v-if="visible && isAttention"
9
9
  class="cn-banner-widget cn-banner-widget--attention"
10
- :class="'cn-banner-widget--' + resolvedVariant"
10
+ :class="['cn-banner-widget--' + resolvedVariant, { 'cn-banner-widget--stacked': isStacked }]"
11
11
  :aria-labelledby="headingId"
12
12
  data-testid="cn-banner-widget-attention">
13
13
  <div class="cn-banner-widget__body">
@@ -48,15 +48,27 @@
48
48
  </p>
49
49
  <div v-else-if="visible" class="cn-banner-widget">
50
50
  <NcNoteCard :type="resolvedVariant" class="cn-banner-widget__card">
51
- <component
52
- :is="clickable ? 'a' : 'span'"
53
- class="cn-banner-widget__text"
54
- :class="{ 'cn-banner-widget__text--clickable': clickable }"
55
- :href="clickable ? routeHref : null"
56
- data-testid="cn-banner-widget-text"
57
- @click="onClick">
58
- {{ displayText }}
59
- </component>
51
+ <!-- A named icon replaces the variant's own glyph. -->
52
+ <template v-if="resolvedIcon" #icon>
53
+ <CnIcon :name="resolvedIcon" :size="22" data-testid="cn-banner-widget-icon" />
54
+ </template>
55
+ <span class="cn-banner-widget__line">
56
+ <component
57
+ :is="clickable ? 'a' : 'span'"
58
+ class="cn-banner-widget__text"
59
+ :class="{ 'cn-banner-widget__text--clickable': clickable }"
60
+ :href="clickable ? routeHref : null"
61
+ data-testid="cn-banner-widget-text"
62
+ @click="onClick"><strong v-if="displayLead" class="cn-banner-widget__lead" data-testid="cn-banner-widget-lead">{{ displayLead }}</strong>{{ displayLead && displayText ? ' ' : '' }}{{ displayText }}</component>
63
+ <!-- Board look: the actions as links at the end of the line. -->
64
+ <a
65
+ v-for="action in noteActions"
66
+ :key="action.key"
67
+ class="cn-banner-widget__link"
68
+ :href="action.href || null"
69
+ data-testid="cn-banner-widget-link"
70
+ @click="onActionClick($event, action)">{{ action.label }}</a>
71
+ </span>
60
72
  </NcNoteCard>
61
73
  </div>
62
74
  </template>
@@ -64,7 +76,11 @@
64
76
  <script>
65
77
  import { translate as t } from '@nextcloud/l10n'
66
78
  import { NcNoteCard } from '@nextcloud/vue'
79
+ import CnIcon from '../CnIcon/CnIcon.vue'
80
+ import { normalizeLook } from '../../composables/useLook.js'
81
+ import { fillTemplate } from '../../utils/fillTemplate.js'
67
82
  import { followLinkClick, resolveHref } from '../../utils/linkNavigation.js'
83
+ import { readPath } from '../../utils/readPath.js'
68
84
  import { safeHref } from '../../utils/safeHref.js'
69
85
  import { nextUid } from '../../utils/uid.js'
70
86
  import { compareVisibleWhen, readVisibleWhenValue } from '../../utils/visibleWhen.js'
@@ -78,6 +94,12 @@ const LAYOUTS = ['banner', 'attention']
78
94
  /** An attention card offers a primary and a secondary action, no more. */
79
95
  const MAX_ACTIONS = 2
80
96
 
97
+ /**
98
+ * Under the board look the card takes what the boards draw: DqMijnWerk's
99
+ * "Vandaag eerst" has three secondary actions and the primary one.
100
+ */
101
+ const MAX_ACTIONS_BOARD = 4
102
+
81
103
  /**
82
104
  * CnBannerWidget — declarative notice banner for dashboards and v2 pages
83
105
  * (`banner` widget type, Wave 1 of nextcloud-vue#91).
@@ -140,7 +162,7 @@ const MAX_ACTIONS = 2
140
162
  export default {
141
163
  name: 'CnBannerWidget',
142
164
 
143
- components: { NcNoteCard },
165
+ components: { CnIcon, NcNoteCard },
144
166
 
145
167
  inject: {
146
168
  /**
@@ -148,6 +170,8 @@ export default {
148
170
  * label that is not a key renders as written.
149
171
  */
150
172
  cnTranslate: { default: () => (key) => key },
173
+ /** The app's look, provided by CnAppRoot or CnPageRenderer (`nextcloud` or `board`). */
174
+ cnLook: { default: 'nextcloud' },
151
175
  },
152
176
 
153
177
  props: {
@@ -168,6 +192,27 @@ export default {
168
192
  default: '',
169
193
  },
170
194
 
195
+ /**
196
+ * A bold lead in front of the text ("2 aanmeldingen wachten op
197
+ * goedkeuring." before the rest of the sentence). `{value}` is replaced
198
+ * like in `text`, and it goes through the app's translate. Empty falls
199
+ * back to the `content` blob.
200
+ */
201
+ lead: {
202
+ type: String,
203
+ default: '',
204
+ },
205
+
206
+ /**
207
+ * A named icon (`AccountPlus`, `AlertOutline`, ...) drawn before the
208
+ * text instead of the variant's own glyph. Empty falls back to the
209
+ * `content` blob, then to the variant glyph.
210
+ */
211
+ icon: {
212
+ type: String,
213
+ default: '',
214
+ },
215
+
171
216
  /**
172
217
  * Optional visibility condition. Shape:
173
218
  * `{ endpoint?, source?, field?, op?, value }` — exactly one of
@@ -232,7 +277,8 @@ export default {
232
277
  },
233
278
 
234
279
  /**
235
- * Attention card: at most two actions. Each is `{ label, route?,
280
+ * Attention card: its actions, two at most (four under the board look,
281
+ * or `maxActions`). Each is `{ label, route?,
236
282
  * href?, primary?, id? }`: `route` is a route name or location,
237
283
  * `href` an URL. An action with neither renders a button that emits
238
284
  * `action`. The first action is the primary one unless one sets
@@ -245,6 +291,29 @@ export default {
245
291
  default: null,
246
292
  },
247
293
 
294
+ /**
295
+ * Attention card: how many actions it shows at most. Null takes the
296
+ * default: two, four under the board look.
297
+ *
298
+ * @spec openspec/changes/screens-banner-actions-parity/specs/banner-actions/spec.md#requirement-the-board-attention-card-shows-the-boards-actions
299
+ */
300
+ maxActions: {
301
+ type: Number,
302
+ default: null,
303
+ },
304
+
305
+ /**
306
+ * Attention card: stack the actions under the text instead of beside it,
307
+ * the "Begin hier" card of PqMijnWerk (16px title, the action under the
308
+ * reason). Falls back to the `content` blob.
309
+ *
310
+ * @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-card-can-stack-its-action-under-the-text
311
+ */
312
+ stacked: {
313
+ type: Boolean,
314
+ default: false,
315
+ },
316
+
248
317
  /**
249
318
  * Stored content blob (CnDashboardPage registry branch) carrying the
250
319
  * same keys as the flat props: `{ variant, text, visibleWhen, route,
@@ -305,6 +374,12 @@ export default {
305
374
  * the text wherever it says `{value}`.
306
375
  */
307
376
  conditionValue: null,
377
+ /**
378
+ * The first row of the `visibleWhen` source query (its `order`
379
+ * applied), the card's subject: `{subject.<field>}` in the texts
380
+ * and `@subject.<field>` in an action route read it.
381
+ */
382
+ conditionRow: null,
308
383
  /** Whether the visibleWhen request itself failed (not: answered "no"). */
309
384
  conditionFailed: false,
310
385
  /** Why it failed, as the request reported it. */
@@ -319,9 +394,38 @@ export default {
319
394
  return VARIANTS.includes(v) ? v : 'info'
320
395
  },
321
396
 
322
- /** The effective banner text (prop → content → ''). */
397
+ /** The effective banner text (prop → content → ''), through the app's translate. */
323
398
  resolvedText() {
324
- return this.text || (this.content && this.content.text) || ''
399
+ const text = this.text || (this.content && this.content.text) || ''
400
+ return text ? this.tl(text) : ''
401
+ },
402
+
403
+ /** The effective bold lead (prop → content → ''), through the app's translate. */
404
+ resolvedLead() {
405
+ const lead = this.lead || (this.content && this.content.lead) || ''
406
+ return lead ? this.tl(lead) : ''
407
+ },
408
+
409
+ /** The lead with `{value}` filled in. */
410
+ displayLead() {
411
+ return this.fillValue(this.resolvedLead)
412
+ },
413
+
414
+ /** The effective icon name (prop → content → ''). */
415
+ resolvedIcon() {
416
+ return this.icon || (this.content && this.content.icon) || ''
417
+ },
418
+
419
+ /**
420
+ * The note card's actions as links, under the board look only: the
421
+ * first resolved action of `actions`, as the board draws "Beleid
422
+ * wijzigen" at the end of the line. Without the look the note card
423
+ * ignores `actions`, as it always did.
424
+ *
425
+ * @return {Array<object>} The resolved actions (at most one).
426
+ */
427
+ noteActions() {
428
+ return normalizeLook(this.cnLook) === 'board' ? this.resolvedActions.slice(0, 1) : []
325
429
  },
326
430
 
327
431
  /** The effective visibleWhen condition (prop → content → null). */
@@ -362,6 +466,15 @@ export default {
362
466
  return (this.layout || (this.content && this.content.layout) || 'banner') === 'attention'
363
467
  },
364
468
 
469
+ /**
470
+ * Whether the actions sit under the text.
471
+ *
472
+ * @return {boolean}
473
+ */
474
+ isStacked() {
475
+ return this.stacked || Boolean(this.content && this.content.stacked)
476
+ },
477
+
365
478
  /**
366
479
  * The attention card's kicker (prop, else content).
367
480
  *
@@ -370,7 +483,7 @@ export default {
370
483
  */
371
484
  resolvedKicker() {
372
485
  const kicker = this.kicker || (this.content && this.content.kicker) || ''
373
- return kicker ? this.tl(kicker) : ''
486
+ return kicker ? this.fillValue(this.tl(kicker)) : ''
374
487
  },
375
488
 
376
489
  /**
@@ -403,12 +516,27 @@ export default {
403
516
  },
404
517
 
405
518
  /**
406
- * The attention card's actions: the first two that have a label, each
519
+ * The attention card's actions: the first `actionCap` that have a label, each
407
520
  * with its href and whether it is the primary one.
408
521
  *
409
522
  * @return {Array<{key: string, id: (string|undefined), label: string, href: string, target: (object|null), primary: boolean, index: number}>}
410
523
  * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-attention-card
411
524
  */
525
+ /**
526
+ * How many actions the attention card shows: `maxActions` (prop, then
527
+ * content), else four under the board look and two without it.
528
+ *
529
+ * @return {number} The cap.
530
+ * @spec openspec/changes/screens-banner-actions-parity/specs/banner-actions/spec.md#requirement-the-board-attention-card-shows-the-boards-actions
531
+ */
532
+ actionCap() {
533
+ const explicit = this.maxActions ?? (this.content ? this.content.maxActions : undefined)
534
+ if (Number.isInteger(explicit) && explicit > 0) {
535
+ return explicit
536
+ }
537
+ return normalizeLook(this.cnLook) === 'board' ? MAX_ACTIONS_BOARD : MAX_ACTIONS
538
+ },
539
+
412
540
  resolvedActions() {
413
541
  const raw = this.actions || (this.content && this.content.actions) || []
414
542
  if (!Array.isArray(raw)) {
@@ -416,14 +544,14 @@ export default {
416
544
  }
417
545
  const usable = raw
418
546
  .filter((action) => action && typeof action === 'object' && typeof action.label === 'string' && action.label !== '')
419
- .slice(0, MAX_ACTIONS)
547
+ .slice(0, this.actionCap)
420
548
  const declaredPrimary = usable.findIndex((action) => action.primary === true)
421
549
  const primaryIndex = declaredPrimary === -1 ? 0 : declaredPrimary
422
550
  return usable.map((action, index) => {
423
551
  let target = null
424
552
  let href = ''
425
553
  if (action.route) {
426
- target = typeof action.route === 'string' ? { name: action.route } : action.route
554
+ target = typeof action.route === 'string' ? { name: action.route } : this.resolveSubject(action.route)
427
555
  href = resolveHref(target, this.$router)
428
556
  } else if (typeof action.href === 'string' && action.href !== '') {
429
557
  const safe = safeHref(action.href)
@@ -448,7 +576,7 @@ export default {
448
576
  */
449
577
  visible() {
450
578
  const title = this.title || (this.content && this.content.title) || ''
451
- if (this.resolvedText === '' && !(this.isAttention && title !== '')) {
579
+ if (this.resolvedText === '' && this.resolvedLead === '' && !(this.isAttention && title !== '')) {
452
580
  return false
453
581
  }
454
582
  if (!this.resolvedVisibleWhen) {
@@ -482,7 +610,7 @@ export default {
482
610
  */
483
611
  uncheckedText() {
484
612
  const title = this.title || (this.content && this.content.title) || this.resolvedText
485
- if (!title || title.includes('{value}')) {
613
+ if (!title || title.includes('{value}') || title.includes('{subject.')) {
486
614
  return t('nextcloud-vue', 'Could not check')
487
615
  }
488
616
  // `escape: false`: the result is rendered through `{{ }}`, which escapes.
@@ -554,10 +682,55 @@ export default {
554
682
  * @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-attention-card
555
683
  */
556
684
  fillValue(text) {
557
- if (this.conditionValue === null || !text.includes('{value}')) {
685
+ let out = text
686
+ if (this.conditionValue !== null && out.includes('{value}')) {
687
+ out = out.replaceAll('{value}', String(this.conditionValue))
688
+ }
689
+ return this.fillSubject(out)
690
+ },
691
+
692
+ /**
693
+ * Fill `{subject.<field>}` (and `{subject.<field>|date}`, `|days`) from
694
+ * the card's subject row. A token with no value empties the whole text,
695
+ * as in a record list. Text without a subject token is untouched.
696
+ *
697
+ * @param {string} text The text.
698
+ * @return {string} The filled text.
699
+ * @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-banner-can-name-the-first-row-of-a-query
700
+ */
701
+ fillSubject(text) {
702
+ if (typeof text !== 'string' || !text.includes('{subject.')) {
558
703
  return text
559
704
  }
560
- return text.replaceAll('{value}', String(this.conditionValue))
705
+ // `{value}` is not a subject token: keep it out of the template fill.
706
+ const guard = '\u0000value\u0000'
707
+ const filled = fillTemplate(text.replaceAll('{value}', guard), { subject: this.conditionRow || {} })
708
+ return filled.replaceAll(guard, '{value}')
709
+ },
710
+
711
+ /**
712
+ * Replace `@subject.<field>` strings anywhere in an action route
713
+ * (params, query) by the subject's value.
714
+ *
715
+ * @param {unknown} node A route name, location or any nested part of one.
716
+ * @return {unknown} The same shape with the tokens resolved.
717
+ * @spec openspec/changes/screens-start-here-banner/specs/start-here-banner/spec.md#requirement-a-banner-can-name-the-first-row-of-a-query
718
+ */
719
+ resolveSubject(node) {
720
+ if (typeof node === 'string') {
721
+ if (!node.startsWith('@subject.')) {
722
+ return node
723
+ }
724
+ const value = this.conditionRow ? readPath(this.conditionRow, node.slice('@subject.'.length)) : undefined
725
+ return value === undefined || value === null ? '' : String(value)
726
+ }
727
+ if (Array.isArray(node)) {
728
+ return node.map((item) => this.resolveSubject(item))
729
+ }
730
+ if (node && typeof node === 'object') {
731
+ return Object.fromEntries(Object.entries(node).map(([key, value]) => [key, this.resolveSubject(value)]))
732
+ }
733
+ return node
561
734
  },
562
735
 
563
736
  /**
@@ -600,6 +773,7 @@ export default {
600
773
  if (outcome) {
601
774
  this.conditionMet = outcome.met === true
602
775
  this.conditionValue = outcome.value !== undefined ? outcome.value : null
776
+ this.conditionRow = outcome.row && typeof outcome.row === 'object' ? outcome.row : null
603
777
  this.conditionFailed = outcome.failed === true
604
778
  this.conditionFailureReason = outcome.failed === true && typeof outcome.reason === 'string' ? outcome.reason : ''
605
779
  return
@@ -608,12 +782,15 @@ export default {
608
782
  if (!cond) {
609
783
  this.conditionMet = null
610
784
  this.conditionValue = null
785
+ this.conditionRow = null
611
786
  this.conditionFailed = false
612
787
  this.conditionFailureReason = ''
613
788
  return
614
789
  }
615
790
  try {
616
- const value = await readVisibleWhenValue(cond)
791
+ const sink = {}
792
+ const value = await readVisibleWhenValue(cond, undefined, sink)
793
+ this.conditionRow = sink.row || null
617
794
  this.conditionValue = value
618
795
  this.conditionMet = compareVisibleWhen(value, cond.op || 'eq', cond.value)
619
796
  this.conditionFailed = false
@@ -626,6 +803,7 @@ export default {
626
803
  console.warn('[CnBannerWidget] visibleWhen could not be evaluated, banner hidden:', error?.message || error)
627
804
  this.conditionMet = false
628
805
  this.conditionValue = null
806
+ this.conditionRow = null
629
807
  this.conditionFailed = true
630
808
  this.conditionFailureReason = typeof error?.message === 'string' ? error.message : String(error ?? '')
631
809
  }
@@ -657,6 +835,23 @@ export default {
657
835
  margin: 0;
658
836
  }
659
837
 
838
+ .cn-banner-widget__line {
839
+ display: flex;
840
+ flex-wrap: wrap;
841
+ align-items: baseline;
842
+ gap: 4px 20px;
843
+ }
844
+
845
+ .cn-banner-widget__lead {
846
+ font-weight: 700;
847
+ }
848
+
849
+ .cn-banner-widget__link {
850
+ margin-inline-start: auto;
851
+ font-size: 14px;
852
+ font-weight: 600;
853
+ }
854
+
660
855
  .cn-banner-widget__text--clickable {
661
856
  cursor: pointer;
662
857
  text-decoration: underline;
@@ -748,6 +943,32 @@ export default {
748
943
  color: var(--color-text-maxcontrast);
749
944
  }
750
945
 
946
+ /* Stacked (PqMijnWerk "Begin hier"): the text, then the action under it. */
947
+ .cn-banner-widget--stacked {
948
+ flex-direction: column;
949
+ align-items: flex-start;
950
+ gap: 10px;
951
+ }
952
+
953
+ .cn-banner-widget--stacked .cn-banner-widget__body {
954
+ flex: 0 0 auto;
955
+ gap: 10px;
956
+ }
957
+
958
+ .cn-banner-widget--stacked .cn-banner-widget__title {
959
+ font-size: 16px;
960
+ line-height: 1.4;
961
+ }
962
+
963
+ .cn-banner-widget--stacked .cn-banner-widget__reason {
964
+ font-size: 14px;
965
+ }
966
+
967
+ .cn-banner-widget--stacked .cn-banner-widget__action {
968
+ min-height: var(--cn-board-control-height, 40px);
969
+ font-size: 14px;
970
+ }
971
+
751
972
  .cn-banner-widget__actions {
752
973
  display: flex;
753
974
  flex-wrap: wrap;
@@ -86,6 +86,8 @@ fall back to the normal rendering. See `docs/migrating-to-manifest.md` →
86
86
  > `cnFormatters: { automationTrigger: v => ({ 'lead.created': 'Lead created' }[v] ?? v) }`);
87
87
  > standalone (no provider) it falls back to rendering the raw value.
88
88
 
89
+ The `secondary` prop is the column's secondary line: the `avatar` widget draws it under the name, beside the picture (`CnDataTable` passes it for an avatar column); other cells ignore it.
90
+
89
91
  Column widget — `widget="badge"`, `widget="fkResolve"` (uuid → related object label via the shared object store with per-schema caching; config `widgetProps { register, schema, labelField }`), and `widget="link"` are built-in; any other id resolves against the app's `cellWidgets` registry (`CnAppRoot`'s `cellWidgets` prop → `cnCellWidgets`), and that component receives `{ value, row, property, formatted, ...widgetProps }`. `widget` takes precedence over `formatter`; when both are set the widget gets the formatter-shaped value as `formatted`. See `docs/migrating-to-manifest.md` → "Column widgets" + "Built-in cell formatters / widgets".
90
92
 
91
93
  - `widget="badge"` — `CnStatusBadge` pill; `widgetProps.variant` picks the colour.