@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
@@ -0,0 +1,626 @@
1
+ import { NcActionButton, NcActions, NcButton, NcNoteCard, NcSelect, NcTextField } from '@nextcloud/vue';
2
+ import __sfc_main from '../CnStatusBadge/CnStatusBadge.vue.js';
3
+ import { isBadgeVariant } from '../../utils/badgeVariants.js';
4
+ import { formatBoardDate } from '../../utils/boardDate.js';
5
+ import { parseDateValue } from '../../utils/dateVariant.js';
6
+ import { prefixUrl } from '../../utils/headers.js';
7
+ import { readPath } from '../../utils/readPath.js';
8
+ import { serverErrorMessage } from '../../utils/serverErrorMessage.js';
9
+
10
+ /**
11
+ * CnFieldListWidget — the `field-list` widget: a list stored INSIDE one field
12
+ * of the current object (a portal's `domains[]`, its `editors[]`), shown as
13
+ * rows and edited in place.
14
+ *
15
+ * Rows are drawn from configuration (title, meta line, pill, aside, a detail
16
+ * line); a small form adds an entry, a button removes one, and each change is
17
+ * saved as ONE PATCH of that field on the object, after re-reading the stored
18
+ * value so a concurrent change to the same list is not overwritten with a
19
+ * stale copy. Optional row actions call a configured endpoint (a "check
20
+ * again"), and an optional `rowSource` merges live per-row state read from an
21
+ * endpoint by key without writing it back.
22
+ *
23
+ * The server decides who may write: a refused PATCH shows the server's words
24
+ * and leaves the list as stored.
25
+ *
26
+ * @spec openspec/changes/abstract-field-list/specs/field-list/spec.md
27
+ */
28
+ var script = {
29
+ name: 'CnFieldListWidget',
30
+
31
+ components: { CnStatusBadge: __sfc_main, NcActionButton, NcActions, NcButton, NcNoteCard, NcSelect, NcTextField },
32
+
33
+ inject: {
34
+ cnTranslate: { default: () => (key) => key },
35
+ },
36
+
37
+ props: {
38
+ /**
39
+ * The widget configuration.
40
+ *
41
+ * - `field` (required) — the object field holding the array.
42
+ * - `key` — the item field that identifies an entry (default: the item itself for strings).
43
+ * - `row` — `{ title, titleFallback?, avatar?, meta?: [paths|{ path, map?, format? }], pill?: { path, map?, variantMap? }, aside?: { path, format?, prefix?, fallback? }, detail?: { template, when? } }`.
44
+ * - `add` — `{ label?, fields: [{ key, label, type?: 'text'|'select', options?, required?, pattern?, patternMessage? }], unique?, defaults? }`.
45
+ * - `remove` — `{ label? }`; omitted = no remove.
46
+ * - `rowActions` — `[{ id, label, when?, placement?: 'band', request: { method?, url, payload? } }]`; tokens `@object.<field>`, `@objectId`, `@row.<field>`.
47
+ * - `rowSource` — `{ url, path?, key }`: live per-row state merged by key.
48
+ * - `variant: 'table'` + `columns` — `[{ header, path, map?, format?, strong?, pill?, variantMap? }]`: rows as a table; a per-row "..." menu holds the row actions and remove; `detail` lines become a warning band under the table, with the row actions that have `placement: 'band'`.
49
+ * - `add.trigger: 'button'`, `add.placement: 'header' | 'footer'` — the add form opens from a button.
50
+ * - `readOnly`, `hint`, `emptyText`.
51
+ *
52
+ * @type {object}
53
+ */
54
+ content: {
55
+ type: Object,
56
+ default: () => ({}),
57
+ },
58
+
59
+ /** The current detail-page object. */
60
+ objectData: {
61
+ type: Object,
62
+ default: null,
63
+ },
64
+
65
+ /** The current object id. */
66
+ objectId: {
67
+ type: [String, Number],
68
+ default: '',
69
+ },
70
+
71
+ /** OpenRegister register slug of the surface. */
72
+ register: {
73
+ type: [String, Object],
74
+ default: '',
75
+ },
76
+
77
+ /** OpenRegister schema slug of the surface. */
78
+ schema: {
79
+ type: [String, Object],
80
+ default: '',
81
+ },
82
+ },
83
+
84
+ emits: ['saved'],
85
+
86
+ data() {
87
+ return {
88
+ /** The list as last saved by this widget; null = read it off objectData. */
89
+ saved: null,
90
+ /** Live per-row state from `rowSource`, by key. */
91
+ live: {},
92
+ draft: {},
93
+ /** Whether the add form is open (only with `add.trigger: 'button'`). */
94
+ adding: false,
95
+ errors: {},
96
+ busy: '',
97
+ notice: '',
98
+ noticeType: 'error',
99
+ }
100
+ },
101
+
102
+ computed: {
103
+ /**
104
+ * The stored list.
105
+ *
106
+ * @return {Array}
107
+ */
108
+ items() {
109
+ const list = this.saved !== null ? this.saved : readPath(this.objectData || {}, this.content.field);
110
+ return Array.isArray(list) ? list : []
111
+ },
112
+
113
+ /**
114
+ * The rows to draw.
115
+ *
116
+ * @return {Array<object>}
117
+ * @spec openspec/changes/abstract-field-list/specs/field-list/spec.md#requirement-a-field-list-draws-the-entries-of-one-object-field
118
+ */
119
+ rows() {
120
+ const spec = this.content.row || {};
121
+ return this.items.map((item, index) => {
122
+ const key = this.keyOf(item, index);
123
+ const entry = item && typeof item === 'object'
124
+ ? { ...item, ...(this.live[key] || {}) }
125
+ : { value: item, ...(this.live[key] || {}) };
126
+ const title = this.text(entry, spec.title) || this.text(entry, spec.titleFallback) || (typeof item === 'string' ? item : key);
127
+ const meta = (Array.isArray(spec.meta) ? spec.meta : [])
128
+ .map((part) => this.text(entry, part))
129
+ .filter((part) => part !== '')
130
+ .join(' · ');
131
+ return {
132
+ key,
133
+ item,
134
+ entry,
135
+ title,
136
+ initials: spec.avatar ? this.initials(title) : '',
137
+ meta,
138
+ pill: this.pillOf(entry, spec.pill),
139
+ aside: spec.aside ? this.asideOf(entry, spec.aside) : '',
140
+ detail: spec.detail && this.matches(entry, spec.detail.when) ? this.fill(spec.detail.template, entry) : '',
141
+ actions: this.actionsFor(entry),
142
+ cells: this.isTable ? this.cellsOf(entry) : [],
143
+ }
144
+ })
145
+ },
146
+
147
+ /** Whether the list is read-only. */
148
+ readOnly() {
149
+ return this.content.readOnly === true
150
+ },
151
+
152
+ /** Whether entries can be added. */
153
+ canAdd() {
154
+ return !this.readOnly && this.addFields.length > 0 && Boolean(this.content.field)
155
+ },
156
+
157
+ /** Whether entries can be removed. */
158
+ canRemove() {
159
+ return !this.readOnly && Boolean(this.content.remove) && Boolean(this.content.field)
160
+ },
161
+
162
+ /**
163
+ * The add form's fields, labels translated, select options translated.
164
+ *
165
+ * @return {Array<object>}
166
+ */
167
+ addFields() {
168
+ const fields = this.content.add && Array.isArray(this.content.add.fields) ? this.content.add.fields : [];
169
+ return fields
170
+ .filter((field) => field && field.key)
171
+ .map((field) => ({
172
+ ...field,
173
+ label: this.tr(field.label || field.key),
174
+ options: (Array.isArray(field.options) ? field.options : []).map((option) => (
175
+ typeof option === 'object' ? { value: option.value, label: this.tr(option.label || String(option.value)) } : { value: option, label: this.tr(String(option)) }
176
+ )),
177
+ }))
178
+ },
179
+
180
+ /** Whether the rows are drawn as a table (`variant: 'table'`). */
181
+ isTable() {
182
+ return this.content.variant === 'table' && this.tableColumns.length > 0
183
+ },
184
+
185
+ /**
186
+ * The table columns, headers translated.
187
+ *
188
+ * @return {Array<object>}
189
+ */
190
+ tableColumns() {
191
+ return (Array.isArray(this.content.columns) ? this.content.columns : [])
192
+ .filter((column) => column && column.path)
193
+ .map((column, index) => ({ ...column, key: `${column.path}-${index}`, header: this.tr(column.header || '') }))
194
+ },
195
+
196
+ /** Whether each row has a "more actions" menu (row actions not placed in the band, and remove). */
197
+ hasMenu() {
198
+ return this.isTable && !this.readOnly && (this.canRemove || this.rows.some((row) => this.menuItems(row).length > 0))
199
+ },
200
+
201
+ /** Rows with a detail line: in the table variant it is a warning band under the table. */
202
+ bandRows() {
203
+ return this.rows
204
+ .filter((row) => row.detail !== '')
205
+ .map((row) => ({ ...row, bandActions: row.actions.filter((action) => action.placement === 'band') }))
206
+ },
207
+
208
+ /** Whether the add form opens from a button (`add.trigger: 'button'`). */
209
+ addTrigger() {
210
+ return Boolean(this.content.add && this.content.add.trigger === 'button')
211
+ },
212
+
213
+ /** Where the add button sits: `header` (above the rows) or `footer` (default). */
214
+ addPlacement() {
215
+ return this.content.add && this.content.add.placement === 'header' ? 'header' : 'footer'
216
+ },
217
+
218
+ addLabel() {
219
+ return this.tr((this.content.add && this.content.add.label) || 'Add')
220
+ },
221
+
222
+ removeLabel() {
223
+ return this.tr((this.content.remove && this.content.remove.label) || 'Remove')
224
+ },
225
+
226
+ hint() {
227
+ return this.tr(this.content.hint || '')
228
+ },
229
+
230
+ emptyLabel() {
231
+ return this.tr(this.content.emptyText || 'Nothing listed yet')
232
+ },
233
+
234
+ /** The object URL the list is saved to, or '' when it is not known. */
235
+ objectUrl() {
236
+ const id = this.objectId || (this.objectData && this.objectData.id);
237
+ if (!this.register || !this.schema || !id || typeof this.register !== 'string' || typeof this.schema !== 'string') {
238
+ return ''
239
+ }
240
+ return `/apps/openregister/api/objects/${encodeURIComponent(this.register)}/${encodeURIComponent(this.schema)}/${encodeURIComponent(String(id))}`
241
+ },
242
+ },
243
+
244
+ watch: {
245
+ objectData() {
246
+ this.saved = null;
247
+ this.loadLive();
248
+ },
249
+ },
250
+
251
+ created() {
252
+ this.resetDraft();
253
+ this.loadLive();
254
+ },
255
+
256
+ methods: {
257
+ tr(text) {
258
+ if (typeof text !== 'string' || text === '') {
259
+ return ''
260
+ }
261
+ return typeof this.cnTranslate === 'function' ? this.cnTranslate(text) : text
262
+ },
263
+
264
+ /**
265
+ * The cells of one table row, one per column.
266
+ *
267
+ * @param {object} entry The entry.
268
+ * @return {Array<{text: string, pill: object|null}>}
269
+ */
270
+ cellsOf(entry) {
271
+ return this.tableColumns.map((column) => ({
272
+ text: this.text(entry, column),
273
+ pill: column.pill ? this.pillOf(entry, column) : null,
274
+ }))
275
+ },
276
+
277
+ /**
278
+ * The items of a row's menu in the table variant: the row actions not
279
+ * placed in the band, then remove.
280
+ *
281
+ * @param {object} row The row.
282
+ * @return {Array<{id: string, label: string, run: Function}>}
283
+ */
284
+ menuItems(row) {
285
+ const items = row.actions
286
+ .filter((action) => action.placement !== 'band')
287
+ .map((action) => ({ id: action.id, label: action.label, run: () => this.runAction(action, row) }));
288
+ if (this.canRemove) {
289
+ items.push({ id: 'remove', label: this.removeLabel, run: () => this.remove(row) });
290
+ }
291
+ return items
292
+ },
293
+
294
+ /**
295
+ * The identity of an entry.
296
+ *
297
+ * @param {unknown} item The entry.
298
+ * @param {number} index Its position.
299
+ * @return {string}
300
+ */
301
+ keyOf(item, index) {
302
+ if (item === null || typeof item !== 'object') {
303
+ return String(item)
304
+ }
305
+ const key = this.content.key ? readPath(item, this.content.key) : undefined;
306
+ return key === undefined || key === null || key === '' ? `item-${index}` : String(key)
307
+ },
308
+
309
+ /**
310
+ * A display text off an entry: a path, or `{ path, map?, format? }`.
311
+ *
312
+ * @param {object} entry The entry.
313
+ * @param {string|object} spec The spec.
314
+ * @return {string}
315
+ */
316
+ text(entry, spec) {
317
+ if (!spec) {
318
+ return ''
319
+ }
320
+ const def = typeof spec === 'string' ? { path: spec } : spec;
321
+ const raw = readPath(entry, def.path);
322
+ if (raw === null || raw === undefined || raw === '') {
323
+ return ''
324
+ }
325
+ if (def.format === 'date' || def.format === 'date-long') {
326
+ const date = parseDateValue(raw);
327
+ if (date === null) {
328
+ return ''
329
+ }
330
+ return def.format === 'date-long' ? formatBoardDate(date, new Date(date.getFullYear() + 1, 0, 1)) : formatBoardDate(date)
331
+ }
332
+ if (def.map && Object.hasOwn(def.map, String(raw))) {
333
+ return this.tr(def.map[String(raw)])
334
+ }
335
+ return typeof raw === 'object' ? '' : String(raw)
336
+ },
337
+
338
+ pillOf(entry, spec) {
339
+ if (!spec || !spec.path) {
340
+ return null
341
+ }
342
+ const raw = readPath(entry, spec.path);
343
+ if (raw === null || raw === undefined || raw === '') {
344
+ return null
345
+ }
346
+ const label = this.text(entry, spec);
347
+ const variant = spec.variantMap && spec.variantMap[String(raw)];
348
+ return { label, variant: isBadgeVariant(variant) ? variant : 'default' }
349
+ },
350
+
351
+ asideOf(entry, spec) {
352
+ const value = this.text(entry, spec);
353
+ if (value === '') {
354
+ // No value: the optional `fallback` label, translated, instead of an empty aside.
355
+ return this.tr(spec.fallback)
356
+ }
357
+ return spec.prefix ? `${this.tr(spec.prefix)} ${value}` : value
358
+ },
359
+
360
+ /**
361
+ * Whether an entry matches a `{ field: value }` condition (every field equal).
362
+ *
363
+ * @param {object} entry The entry.
364
+ * @param {object|undefined} when The condition.
365
+ * @return {boolean}
366
+ */
367
+ matches(entry, when) {
368
+ if (!when || typeof when !== 'object') {
369
+ return true
370
+ }
371
+ return Object.entries(when).every(([field, expected]) => {
372
+ const actual = readPath(entry, field);
373
+ if (expected === false) {
374
+ return actual === false || actual === undefined || actual === null || actual === ''
375
+ }
376
+ return String(actual) === String(expected)
377
+ })
378
+ },
379
+
380
+ /**
381
+ * Fill `{path}` placeholders from an entry; '' when one stays empty.
382
+ *
383
+ * @param {string} template The template, translated first.
384
+ * @param {object} entry The entry.
385
+ * @return {string}
386
+ */
387
+ fill(template, entry) {
388
+ if (typeof template !== 'string') {
389
+ return ''
390
+ }
391
+ let missing = false;
392
+ const out = this.tr(template).replace(/\{([\w.@]+)\}/g, (match, path) => {
393
+ const value = readPath(entry, path);
394
+ if (value === undefined || value === null || value === '') {
395
+ missing = true;
396
+ return match
397
+ }
398
+ return String(value)
399
+ });
400
+ return missing ? '' : out
401
+ },
402
+
403
+ actionsFor(entry) {
404
+ if (this.readOnly) {
405
+ return []
406
+ }
407
+ const actions = Array.isArray(this.content.rowActions) ? this.content.rowActions : [];
408
+ return actions
409
+ .filter((action) => action && action.id && action.request && action.request.url && this.matches(entry, action.when))
410
+ .map((action) => ({ ...action, label: this.tr(action.label || action.id) }))
411
+ },
412
+
413
+ initials(name) {
414
+ return String(name || '').split(/[\s@._-]+/).filter(Boolean).slice(0, 2).map((part) => part.charAt(0).toUpperCase()).join('')
415
+ },
416
+
417
+ removeAriaLabel(row) {
418
+ return `${this.removeLabel}: ${row.title}`
419
+ },
420
+
421
+ resetDraft() {
422
+ const draft = {};
423
+ for (const field of this.addFields) {
424
+ const first = field.type === 'select' && field.options.length > 0 ? field.options[0].value : '';
425
+ draft[field.key] = field.default !== undefined ? field.default : first;
426
+ }
427
+ this.draft = draft;
428
+ this.errors = {};
429
+ },
430
+
431
+ /**
432
+ * Resolve `@objectId`, `@object.<field>` and `@row.<field>` inside a string or a payload.
433
+ *
434
+ * @param {unknown} value The value.
435
+ * @param {object} entry The row entry.
436
+ * @return {unknown}
437
+ */
438
+ resolve(value, entry) {
439
+ if (Array.isArray(value)) {
440
+ return value.map((v) => this.resolve(v, entry))
441
+ }
442
+ if (value && typeof value === 'object') {
443
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, this.resolve(v, entry)]))
444
+ }
445
+ if (typeof value !== 'string') {
446
+ return value
447
+ }
448
+ const object = this.objectData || {};
449
+ const read = (source, path) => {
450
+ const v = readPath(source || {}, path);
451
+ return v === undefined || v === null ? '' : v
452
+ };
453
+ const whole = value.match(/^@(row|object)\.([\w.@]+)$/);
454
+ if (whole) {
455
+ return read(whole[1] === 'row' ? entry : object, whole[2])
456
+ }
457
+ return value
458
+ .replace(/@objectId/g, () => encodeURIComponent(String(this.objectId || object.id || '')))
459
+ .replace(/@(row|object)\.([\w.@]+)/g, (m, scope, path) => encodeURIComponent(String(read(scope === 'row' ? entry : object, path))))
460
+ },
461
+
462
+ async http() {
463
+ const { default: axios } = await import('@nextcloud/axios');
464
+ return { axios }
465
+ },
466
+
467
+ /**
468
+ * Read live per-row state from `rowSource` and keep it by key.
469
+ *
470
+ * @return {Promise<void>}
471
+ */
472
+ async loadLive() {
473
+ const source = this.content.rowSource;
474
+ if (!source || !source.url || !source.key || !this.objectData) {
475
+ return
476
+ }
477
+ try {
478
+ const { axios } = await this.http();
479
+ const response = await axios.get(prefixUrl(this.resolve(source.url, {})));
480
+ const data = response && response.data;
481
+ const list = source.path ? readPath(data, source.path) : data;
482
+ const live = {};
483
+ for (const item of Array.isArray(list) ? list : []) {
484
+ const key = item && readPath(item, source.key);
485
+ if (key !== undefined && key !== null) {
486
+ live[String(key)] = item;
487
+ }
488
+ }
489
+ this.live = live;
490
+ } catch (e) {
491
+ // eslint-disable-next-line no-console
492
+ console.warn('[CnFieldListWidget] rowSource could not be read:', e?.message || e);
493
+ }
494
+ },
495
+
496
+ /**
497
+ * Save a new list: re-read the stored value, apply the change to it, and
498
+ * PATCH that one field.
499
+ *
500
+ * @param {(stored: Array) => Array} change Builds the next list from the stored one, or throws an Error with a `userMessage`.
501
+ * @param {string} busyKey What is busy.
502
+ * @return {Promise<boolean>} Whether it saved.
503
+ * @spec openspec/changes/abstract-field-list/specs/field-list/spec.md#requirement-a-field-list-saves-one-field-with-one-patch
504
+ */
505
+ async save(change, busyKey) {
506
+ if (!this.objectUrl) {
507
+ this.notify(this.tr('This list cannot be saved here.'));
508
+ return false
509
+ }
510
+ this.busy = busyKey;
511
+ this.notice = '';
512
+ try {
513
+ const { axios } = await this.http();
514
+ const { data: stored } = await axios.get(prefixUrl(this.objectUrl));
515
+ const current = readPath(stored || {}, this.content.field);
516
+ const next = change(Array.isArray(current) ? current : []);
517
+ const { data } = await axios.patch(prefixUrl(this.objectUrl), { [this.content.field]: next });
518
+ const written = readPath(data || {}, this.content.field);
519
+ this.saved = Array.isArray(written) ? written : next;
520
+ /**
521
+ * @event saved The list was saved: one PATCH of the field succeeded.
522
+ * @type {{field: string, value: Array}}
523
+ */
524
+ this.$emit('saved', { field: this.content.field, value: this.saved });
525
+ return true
526
+ } catch (e) {
527
+ this.notify(e && e.userMessage ? e.userMessage : serverErrorMessage(e));
528
+ return false
529
+ } finally {
530
+ this.busy = '';
531
+ }
532
+ },
533
+
534
+ notify(message, type = 'error') {
535
+ this.notice = message;
536
+ this.noticeType = type;
537
+ },
538
+
539
+ /**
540
+ * Validate the draft and add it.
541
+ *
542
+ * @return {Promise<void>}
543
+ * @spec openspec/changes/abstract-field-list/specs/field-list/spec.md#requirement-a-field-list-adds-and-removes-entries
544
+ */
545
+ async add() {
546
+ const errors = {};
547
+ for (const field of this.addFields) {
548
+ const value = this.draft[field.key];
549
+ const empty = value === undefined || value === null || String(value).trim() === '';
550
+ if (field.required && empty) {
551
+ errors[field.key] = this.tr('Fill this in.');
552
+ } else if (!empty && field.pattern && !new RegExp(field.pattern).test(String(value).trim())) {
553
+ errors[field.key] = this.tr(field.patternMessage || 'This value is not valid.');
554
+ }
555
+ }
556
+ this.errors = errors;
557
+ if (Object.keys(errors).length > 0) {
558
+ return
559
+ }
560
+ const entry = { ...((this.content.add && this.content.add.defaults) || {}) };
561
+ for (const field of this.addFields) {
562
+ const value = this.draft[field.key];
563
+ if (value !== undefined && value !== null && String(value).trim() !== '') {
564
+ entry[field.key] = typeof value === 'string' ? value.trim() : value;
565
+ }
566
+ }
567
+ const unique = this.content.add && this.content.add.unique;
568
+ const saved = await this.save((stored) => {
569
+ if (unique && stored.some((item) => item && String(readPath(item, unique)) === String(entry[unique]))) {
570
+ const error = new Error('duplicate');
571
+ error.userMessage = this.tr('This is already in the list.');
572
+ throw error
573
+ }
574
+ return [...stored, entry]
575
+ }, '*');
576
+ if (saved) {
577
+ this.resetDraft();
578
+ this.adding = false;
579
+ this.loadLive();
580
+ }
581
+ },
582
+
583
+ /**
584
+ * Remove an entry by its key.
585
+ *
586
+ * @param {object} row The row.
587
+ * @return {Promise<void>}
588
+ */
589
+ async remove(row) {
590
+ await this.save((stored) => stored.filter((item, index) => this.keyOf(item, index) !== row.key), row.key);
591
+ },
592
+
593
+ /**
594
+ * Run a row action's request, then re-read the live state.
595
+ *
596
+ * @param {object} action The action.
597
+ * @param {object} row The row.
598
+ * @return {Promise<void>}
599
+ * @spec openspec/changes/abstract-field-list/specs/field-list/spec.md#requirement-a-field-list-row-can-run-a-configured-request
600
+ */
601
+ async runAction(action, row) {
602
+ this.busy = row.key;
603
+ this.notice = '';
604
+ try {
605
+ const { axios } = await this.http();
606
+ const method = String(action.request.method || 'POST').toLowerCase();
607
+ const payload = this.resolve(action.request.payload || {}, row.entry);
608
+ const response = method === 'get'
609
+ ? await axios.get(prefixUrl(this.resolve(action.request.url, row.entry)))
610
+ : await axios[method](prefixUrl(this.resolve(action.request.url, row.entry)), payload);
611
+ const message = response && response.data && typeof response.data.message === 'string' ? response.data.message : '';
612
+ if (message) {
613
+ this.notify(message, 'info');
614
+ }
615
+ await this.loadLive();
616
+ } catch (e) {
617
+ this.notify(serverErrorMessage(e));
618
+ } finally {
619
+ this.busy = '';
620
+ }
621
+ },
622
+ },
623
+ };
624
+
625
+ export { script as default };
626
+ //# sourceMappingURL=CnFieldListWidget.vue2.js.map