@conduction/nextcloud-vue 2.56.0-beta.3 → 2.56.0-beta.5

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 (314) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +12 -2
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +1 -2
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  5. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
  6. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +0 -3
  7. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
  8. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -2
  10. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  11. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +21 -1
  12. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  13. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +1 -1
  14. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  15. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +12 -5
  16. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  17. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +2 -1
  18. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  19. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +9 -1
  20. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  21. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  22. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +6 -1
  23. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
  24. package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
  25. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +116 -15
  26. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +27 -14
  28. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  29. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js +13 -6
  30. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js.map +1 -1
  31. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js +2 -0
  32. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js.map +1 -1
  33. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +29 -1
  34. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  35. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  36. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  37. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +1 -2
  38. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  39. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +3 -1
  40. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  41. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +17 -17
  42. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  43. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js +4 -21
  44. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js.map +1 -1
  45. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue3.js.map +1 -1
  46. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +0 -13
  47. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  48. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +8 -8
  49. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  50. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue2.js.map +1 -1
  51. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js +3 -2
  52. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js.map +1 -1
  53. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +67 -13
  54. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  55. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +15 -8
  56. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  57. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js +31 -11
  58. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js.map +1 -1
  59. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue2.js.map +1 -1
  60. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js +1 -2
  61. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js.map +1 -1
  62. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js +0 -1
  64. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  65. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js +2 -17
  66. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js.map +1 -1
  67. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue3.js.map +1 -1
  68. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js +35 -11
  69. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js.map +1 -1
  70. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js +3 -2
  71. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js.map +1 -1
  72. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +23 -5
  73. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  74. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +1 -1
  75. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  76. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js +19 -3
  77. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js.map +1 -1
  78. package/dist/esm/components/CnObjectList/CnObjectList.vue3.js.map +1 -1
  79. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +45 -15
  80. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  81. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
  82. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  83. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js +24 -6
  84. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js.map +1 -1
  85. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js +1 -1
  86. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js.map +1 -1
  87. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  88. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +0 -1
  89. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  90. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  91. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +4 -2
  92. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  93. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +7 -2
  94. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
  95. package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
  96. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +49 -5
  97. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  98. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +1 -1
  99. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  100. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js +5 -3
  101. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js.map +1 -1
  102. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue3.js.map +1 -1
  103. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  104. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  105. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +3 -1
  106. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
  107. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +1 -0
  108. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
  109. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js +3 -1
  110. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js.map +1 -1
  111. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue3.js.map +1 -1
  112. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -1
  113. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
  114. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js +2 -4
  115. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
  116. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js +6 -0
  117. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js.map +1 -1
  118. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js +68 -53
  119. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js.map +1 -1
  120. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js +17 -0
  121. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js.map +1 -1
  122. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js +21 -19
  123. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js.map +1 -1
  124. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js +3 -1
  125. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js.map +1 -1
  126. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue3.js.map +1 -1
  127. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js +3 -1
  128. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js.map +1 -1
  129. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js +2 -4
  130. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js.map +1 -1
  131. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js +2 -1
  132. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js.map +1 -1
  133. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue3.js.map +1 -1
  134. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
  135. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
  136. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js +1 -2
  137. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
  138. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +2 -1
  139. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
  140. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
  141. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
  142. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
  143. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js +1 -2
  144. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
  145. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
  146. package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
  147. package/dist/esm/integrations/builtin/email/CnEmailTab.vue2.js.map +1 -1
  148. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js +1 -2
  149. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js.map +1 -1
  150. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js +2 -1
  151. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js.map +1 -1
  152. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue3.js.map +1 -1
  153. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js +2 -1
  154. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js.map +1 -1
  155. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js +1 -2
  156. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js.map +1 -1
  157. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js +3 -1
  158. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js.map +1 -1
  159. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue3.js.map +1 -1
  160. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js +3 -1
  161. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js.map +1 -1
  162. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js +2 -4
  163. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js.map +1 -1
  164. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js +3 -1
  165. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js.map +1 -1
  166. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue3.js.map +1 -1
  167. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js +3 -1
  168. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js.map +1 -1
  169. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js +2 -4
  170. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js.map +1 -1
  171. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js +3 -1
  172. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js.map +1 -1
  173. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue3.js.map +1 -1
  174. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js +3 -1
  175. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js.map +1 -1
  176. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js +2 -4
  177. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js.map +1 -1
  178. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js +2 -1
  179. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js.map +1 -1
  180. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue3.js.map +1 -1
  181. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
  182. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
  183. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js +1 -2
  184. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
  185. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js +2 -1
  186. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js.map +1 -1
  187. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue3.js.map +1 -1
  188. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js +2 -1
  189. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js.map +1 -1
  190. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js +1 -2
  191. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js.map +1 -1
  192. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue2.js.map +1 -1
  193. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js +3 -6
  194. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js.map +1 -1
  195. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js +3 -1
  196. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js.map +1 -1
  197. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue3.js.map +1 -1
  198. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js +3 -1
  199. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js.map +1 -1
  200. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js +2 -4
  201. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js.map +1 -1
  202. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js +2 -1
  203. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js.map +1 -1
  204. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue3.js.map +1 -1
  205. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js +2 -1
  206. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js.map +1 -1
  207. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js +1 -2
  208. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js.map +1 -1
  209. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js +4 -1
  210. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js.map +1 -1
  211. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue3.js.map +1 -1
  212. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js +6 -3
  213. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js.map +1 -1
  214. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js +2 -4
  215. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js.map +1 -1
  216. package/dist/esm/l10n/en.json.js +2 -0
  217. package/dist/esm/l10n/en.json.js.map +1 -1
  218. package/dist/esm/l10n/nl.json.js +2 -0
  219. package/dist/esm/l10n/nl.json.js.map +1 -1
  220. package/dist/esm/nextcloud-vue.css +78 -7
  221. package/dist/esm/utils/actionLink.js +5 -0
  222. package/dist/esm/utils/actionLink.js.map +1 -1
  223. package/dist/esm/utils/actionsDispatcher.js +16 -1
  224. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  225. package/dist/esm/utils/linkNavigation.js +6 -3
  226. package/dist/esm/utils/linkNavigation.js.map +1 -1
  227. package/dist/esm/utils/rowAuxClick.js +30 -5
  228. package/dist/esm/utils/rowAuxClick.js.map +1 -1
  229. package/dist/esm/utils/safeHref.js +18 -3
  230. package/dist/esm/utils/safeHref.js.map +1 -1
  231. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  232. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  233. package/dist/nextcloud-vue.cjs.js +885 -393
  234. package/dist/nextcloud-vue.cjs.js.map +2 -2
  235. package/dist/nextcloud-vue.css +78 -7
  236. package/l10n/en.json +2 -0
  237. package/l10n/nl.json +2 -0
  238. package/package.json +1 -1
  239. package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
  240. package/src/components/CnActionsMenu/CnActionsMenu.vue +0 -3
  241. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
  242. package/src/components/CnAppRoot/CnAppRoot.vue +31 -2
  243. package/src/components/CnBoardView/CnBoardView.vue +13 -5
  244. package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
  245. package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
  246. package/src/components/CnDataTable/CnDataTable.md +1 -1
  247. package/src/components/CnDataTable/CnDataTable.vue +131 -17
  248. package/src/components/CnDateAxisView/CnDateAxisView.vue +15 -6
  249. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  250. package/src/components/CnDetailPage/CnDetailPage.vue +29 -1
  251. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -2
  252. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +5 -3
  253. package/src/components/CnFilesWidget/CnFilesWidget.vue +4 -21
  254. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +8 -21
  255. package/src/components/CnFlowsPage/CnFlowsPage.vue +2 -1
  256. package/src/components/CnIndexPage/CnIndexPage.vue +75 -14
  257. package/src/components/CnIndexPage/manifestActionDispatch.js +31 -11
  258. package/src/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue +1 -2
  259. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +0 -1
  260. package/src/components/CnLinkButtonWidget/CnLinkButtonWidget.vue +2 -17
  261. package/src/components/CnLogsPage/CnLogsPage.vue +37 -12
  262. package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
  263. package/src/components/CnObjectList/CnObjectList.vue +19 -3
  264. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +47 -15
  265. package/src/components/CnObjectRow/CnObjectRow.vue +25 -7
  266. package/src/components/CnObjectSidebar/CnFilesTab.vue +0 -1
  267. package/src/components/CnPageRenderer/CnPageRenderer.vue +2 -0
  268. package/src/components/CnRowActions/CnRowActions.vue +7 -2
  269. package/src/components/CnSetupWizard/CnSetupWizard.vue +57 -6
  270. package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
  271. package/src/components/CnTabs/CnTabs.vue +7 -3
  272. package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
  273. package/src/css/table.css +26 -0
  274. package/src/integrations/builtin/analytics/CnAnalyticsCard.vue +3 -2
  275. package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +5 -6
  276. package/src/integrations/builtin/bookmarks/CnBookmarksCard.vue +12 -1
  277. package/src/integrations/builtin/bookmarks/CnBookmarksTab.vue +23 -6
  278. package/src/integrations/builtin/bookmarks/__tests__/CnBookmarksTab.spec.js +7 -2
  279. package/src/integrations/builtin/collectives/CnCollectivesCard.vue +3 -2
  280. package/src/integrations/builtin/collectives/CnCollectivesTab.vue +5 -6
  281. package/src/integrations/builtin/cospend/CnCospendCard.vue +2 -2
  282. package/src/integrations/builtin/cospend/CnCospendTab.vue +3 -4
  283. package/src/integrations/builtin/deck/CnDeckCard.vue +2 -2
  284. package/src/integrations/builtin/deck/CnDeckTab.vue +3 -4
  285. package/src/integrations/builtin/email/CnEmailCard.vue +6 -2
  286. package/src/integrations/builtin/email/CnEmailTab.vue +7 -4
  287. package/src/integrations/builtin/flow/CnFlowCard.vue +2 -2
  288. package/src/integrations/builtin/flow/CnFlowTab.vue +3 -4
  289. package/src/integrations/builtin/forms/CnFormsCard.vue +3 -2
  290. package/src/integrations/builtin/forms/CnFormsTab.vue +5 -6
  291. package/src/integrations/builtin/maps/CnMapsCard.vue +3 -2
  292. package/src/integrations/builtin/maps/CnMapsTab.vue +5 -6
  293. package/src/integrations/builtin/maps/__tests__/CnMapsTab.spec.js +9 -0
  294. package/src/integrations/builtin/openproject/CnOpenprojectCard.vue +3 -2
  295. package/src/integrations/builtin/openproject/CnOpenprojectTab.vue +5 -6
  296. package/src/integrations/builtin/photos/CnPhotosCard.vue +2 -2
  297. package/src/integrations/builtin/photos/CnPhotosTab.vue +3 -4
  298. package/src/integrations/builtin/polls/CnPollsCard.vue +2 -2
  299. package/src/integrations/builtin/polls/CnPollsTab.vue +3 -4
  300. package/src/integrations/builtin/shares/CnSharesTab.vue +3 -6
  301. package/src/integrations/builtin/talk/CnTalkCard.vue +3 -2
  302. package/src/integrations/builtin/talk/CnTalkTab.vue +5 -6
  303. package/src/integrations/builtin/time-tracker/CnTimeTrackerCard.vue +2 -2
  304. package/src/integrations/builtin/time-tracker/CnTimeTrackerTab.vue +3 -4
  305. package/src/integrations/builtin/xwiki/CnXwikiCard.vue +4 -2
  306. package/src/integrations/builtin/xwiki/CnXwikiTab.vue +7 -7
  307. package/src/integrations/builtin/xwiki/__tests__/CnXwikiTab.spec.js +9 -0
  308. package/src/schemas/app-manifest-v2.schema.json +2 -1
  309. package/src/utils/actionLink.js +5 -0
  310. package/src/utils/actionsDispatcher.js +15 -0
  311. package/src/utils/linkNavigation.js +6 -3
  312. package/src/utils/rowAuxClick.js +29 -4
  313. package/src/utils/safeHref.js +18 -3
  314. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"CnObjectListWidget.vue2.js","sources":["../../../../src/components/CnObjectListWidget/CnObjectListWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div\n\t\tclass=\"cn-object-list-widget\"\n\t\t:class=\"{ 'cn-object-list-widget--dropping': dropping }\"\n\t\t@dragenter=\"onDragEnter\"\n\t\t@dragover=\"onDragOver\"\n\t\t@dragleave=\"onDragLeave\"\n\t\t@drop=\"onDrop\">\n\t\t<!-- Drop overlay. Rendered only while a drag carrying files is over a\n\t\t widget that declares `content.dropZone`; without the key the drag\n\t\t handlers below all return before touching any state, so a widget\n\t\t that did not ask for a drop zone behaves exactly as before. -->\n\t\t<div v-if=\"dropping\" class=\"cn-object-list-widget__drop-overlay\">\n\t\t\t{{ dropLabel }}\n\t\t</div>\n\t\t<p v-if=\"waitingForContext\" class=\"cn-object-list-widget__prompt\">\n\t\t\t{{ promptText }}\n\t\t</p>\n\t\t<!-- A fetch failed: show ONE quiet line WITHOUT the raw axios status\n\t\t text (\"Request failed with status code 404\") — the real error is\n\t\t logged to the console (ADR-062: an error surface is never a leaked\n\t\t stack). Takes precedence over the empty state so the two never\n\t\t stack. -->\n\t\t<p v-else-if=\"error\" class=\"cn-object-list-widget__error\">\n\t\t\t{{ loadErrorLabel }}\n\t\t</p>\n\t\t<!-- Designed empty state. This used to be a bare CnDataTable with no\n\t\t rows, which paints its <thead> — a full-width grey strip floating\n\t\t in the middle of an otherwise blank card, the \"strange grey bar\"\n\t\t from the review. CnWidgetEmptyState replaces it with something\n\t\t deliberate, and stays `compact` inside a fit-measured cell so it\n\t\t cannot outgrow a short tile (ADR-062). -->\n\t\t<CnWidgetEmptyState\n\t\t\tv-else-if=\"!loading && rows.length === 0\"\n\t\t\t:name=\"resolvedEmptyText\"\n\t\t\t:compact=\"fitRows !== null && fitRows < 3\"\n\t\t\tclass=\"cn-object-list-widget__empty\">\n\t\t\t<template v-if=\"allowCreate && !waitingForContext\" #action>\n\t\t\t\t<NcButton @click=\"openCreate\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ addLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</CnWidgetEmptyState>\n\t\t<!-- The fetch came back with rows, but the active facet selection\n\t\t matches none of them (all loaded rows have that filter row set\n\t\t empty of a facet-clearable state). Distinct from the \"no items at\n\t\t all\" state above: an Add button is not the fix here, clearing the\n\t\t filter is. -->\n\t\t<CnWidgetEmptyState\n\t\t\tv-else-if=\"showNoFacetMatchState\"\n\t\t\t:name=\"t('nextcloud-vue', 'No items match this filter')\"\n\t\t\t:compact=\"fitRows !== null && fitRows < 3\"\n\t\t\tclass=\"cn-object-list-widget__empty\">\n\t\t\t<template #action>\n\t\t\t\t<button type=\"button\" class=\"cn-object-list-widget__facet-clear\" @click=\"clearFacet\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear filter') }}\n\t\t\t\t</button>\n\t\t\t</template>\n\t\t</CnWidgetEmptyState>\n\t\t<template v-else>\n\t\t\t<!-- Facet filter (`content.facet`). Chips built from the values\n\t\t\t actually present on the loaded rows, matching the \"keyword\n\t\t\t filter\" pattern this seam was measured against — narrows the\n\t\t\t rendered rows client-side, no refetch. Absent facet config\n\t\t\t renders nothing, so an ungrouped/unfiltered widget is unchanged. -->\n\t\t\t<div v-if=\"facetOptions.length > 0\" class=\"cn-object-list-widget__facet\" data-testid=\"object-list-facet\">\n\t\t\t\t<span class=\"cn-object-list-widget__facet-label\">{{ facetLabel }}</span>\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"value in facetOptions\"\n\t\t\t\t\t:key=\"value\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-object-list-widget__facet-chip\"\n\t\t\t\t\t:class=\"{ 'cn-object-list-widget__facet-chip--active': facetSelected.includes(value) }\"\n\t\t\t\t\t:aria-pressed=\"facetSelected.includes(value)\"\n\t\t\t\t\tdata-testid=\"object-list-facet-chip\"\n\t\t\t\t\t@click=\"toggleFacetValue(value)\">\n\t\t\t\t\t{{ value }}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"facetSelected.length > 0\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-object-list-widget__facet-clear\"\n\t\t\t\t\t@click=\"clearFacet\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear filter') }}\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<!-- Bulk-actions bar (`content.selectable` + `content.bulkActions`).\n\t\t\t Renders only once something is selected, so a selectable widget\n\t\t\t with nothing picked looks exactly like a non-selectable one. -->\n\t\t\t<div\n\t\t\t\tv-if=\"content.selectable && mappedBulkActions.length > 0 && selectedIds.length > 0\"\n\t\t\t\tclass=\"cn-object-list-widget__bulk-bar\"\n\t\t\t\tdata-testid=\"object-list-bulk-bar\">\n\t\t\t\t<span class=\"cn-object-list-widget__bulk-count\">\n\t\t\t\t\t{{ t('nextcloud-vue', '{count} selected', { count: selectedIds.length }) }}\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"(action, index) in mappedBulkActions\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-object-list-widget__bulk-action\"\n\t\t\t\t\t:class=\"{ 'cn-object-list-widget__bulk-action--destructive': action.destructive }\"\n\t\t\t\t\tdata-testid=\"object-list-bulk-action\"\n\t\t\t\t\t@click=\"action.handler\">\n\t\t\t\t\t{{ action.label }}\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"cn-object-list-widget__bulk-clear\" @click=\"clearSelection\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"isGrouped\" class=\"cn-object-list-widget__groups\">\n\t\t\t\t<div v-for=\"group in groupedRows\"\n\t\t\t\t\t:key=\"group.key\"\n\t\t\t\t\tclass=\"cn-object-list-widget__group\"\n\t\t\t\t\tdata-testid=\"object-list-group\">\n\t\t\t\t\t<h4 class=\"cn-object-list-widget__group-heading\">\n\t\t\t\t\t\t<!-- `groupLabelResolve` reuses the fkResolve cell for the\n\t\t\t\t\t\t heading itself: `groupBy` may bucket by a uuid that is\n\t\t\t\t\t\t ONE MORE hop past what `extend` inlined (e.g. a\n\t\t\t\t\t\t reference's own reference), which `objectFieldValue`\n\t\t\t\t\t\t cannot read off the row at all. The live object-store\n\t\t\t\t\t\t lookup CnDataTable columns already use for a `$ref`\n\t\t\t\t\t\t column is the same answer for a `$ref` GROUP. -->\n\t\t\t\t\t\t<CnFkResolveCell\n\t\t\t\t\t\t\tv-if=\"groupLabelResolveConfig\"\n\t\t\t\t\t\t\t:value=\"group.key\"\n\t\t\t\t\t\t\t:register=\"groupLabelResolveConfig.register\"\n\t\t\t\t\t\t\t:schema=\"groupLabelResolveConfig.schema\"\n\t\t\t\t\t\t\t:labelField=\"groupLabelResolveConfig.labelField || 'name'\" />\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t{{ group.label }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t({{ group.rows.length }})\n\t\t\t\t\t</h4>\n\t\t\t\t\t<CnDataTable\n\t\t\t\t\t\t:columns=\"resolvedColumns\"\n\t\t\t\t\t\t:rows=\"group.rows\"\n\t\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t\t:emptyText=\"emptyText\"\n\t\t\t\t\t\t:selectable=\"content.selectable === true\"\n\t\t\t\t\t\t:selectedIds=\"selectedIds\"\n\t\t\t\t\t\t:sortKey=\"localSort.field || null\"\n\t\t\t\t\t\t:sortOrder=\"localSort.dir || 'asc'\"\n\t\t\t\t\t\tborderless\n\t\t\t\t\t\t@rowClick=\"onRowClick\"\n\t\t\t\t\t\t@select=\"onSelect\"\n\t\t\t\t\t\t@sort=\"onSort\">\n\t\t\t\t\t\t<template v-if=\"mappedRowActions.length > 0\" #row-actions=\"{ row }\">\n\t\t\t\t\t\t\t<CnRowActions :actions=\"mappedRowActions\" :row=\"row\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</CnDataTable>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-object-list-widget__table\">\n\t\t\t\t<CnDataTable\n\t\t\t\t\t:columns=\"resolvedColumns\"\n\t\t\t\t\t:rows=\"facetedRows\"\n\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t:emptyText=\"emptyText\"\n\t\t\t\t\t:selectable=\"content.selectable === true\"\n\t\t\t\t\t:selectedIds=\"selectedIds\"\n\t\t\t\t\t:sortKey=\"localSort.field || null\"\n\t\t\t\t\t:sortOrder=\"localSort.dir || 'asc'\"\n\t\t\t\t\tborderless\n\t\t\t\t\t@rowClick=\"onRowClick\"\n\t\t\t\t\t@select=\"onSelect\"\n\t\t\t\t\t@sort=\"onSort\">\n\t\t\t\t\t<!-- Declarative per-row actions (`content.rowActions`).\n\t\t\t\t\t CnDataTable only paints the trailing actions column\n\t\t\t\t\t when this slot is supplied, so a widget without\n\t\t\t\t\t `rowActions` keeps the column count it had. -->\n\t\t\t\t\t<template v-if=\"mappedRowActions.length > 0\" #row-actions=\"{ row }\">\n\t\t\t\t\t\t<CnRowActions :actions=\"mappedRowActions\" :row=\"row\" />\n\t\t\t\t\t</template>\n\t\t\t\t</CnDataTable>\n\t\t\t</div>\n\t\t\t<!--\n\t\t\t Footer. Two affordances, and they answer different questions.\n\n\t\t\t The PAGER walks the rest of the matching objects in place —\n\t\t\t server-side (`_page`), so \"1–5 of 137\" is the truth and not a\n\t\t\t count of what happened to be fetched. It renders only when a\n\t\t\t whole page fits the cell; on a cell too short for one page the\n\t\t\t fit-to-cell path below is all there is, because a pager under\n\t\t\t rows that are themselves clipped would page a lie.\n\n\t\t\t VIEW ALL leaves for the full index. It shows whenever there is\n\t\t\t more than the widget is showing, pager or no pager — a widget is\n\t\t\t a summary, and the index is where the list actually lives.\n\t\t\t-->\n\t\t\t<CnPagination\n\t\t\t\tv-if=\"showPager\"\n\t\t\t\tcompact\n\t\t\t\tclass=\"cn-object-list-widget__pager\"\n\t\t\t\t:currentPage=\"page\"\n\t\t\t\t:totalPages=\"totalPages\"\n\t\t\t\t:totalItems=\"total\"\n\t\t\t\t:currentPageSize=\"pageSize\"\n\t\t\t\t:minItemsToShow=\"0\"\n\t\t\t\t@pageChanged=\"onPageChange\" />\n\t\t\t<a\n\t\t\t\tv-if=\"hiddenCount > 0 && content.viewAllRoute && viewAllHref\"\n\t\t\t\tclass=\"cn-object-list-widget__view-all\"\n\t\t\t\t:href=\"viewAllHref\"\n\t\t\t\t@click=\"onViewAll\">\n\t\t\t\t{{ viewAllLabel }}\n\t\t\t</a>\n\t\t\t<button\n\t\t\t\tv-else-if=\"hiddenCount > 0 && content.viewAllRoute\"\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"cn-object-list-widget__view-all\"\n\t\t\t\t@click=\"onViewAll\">\n\t\t\t\t{{ viewAllLabel }}\n\t\t\t</button>\n\t\t\t<p v-else-if=\"hiddenCount > 0 && !showPager\" class=\"cn-object-list-widget__more\">\n\t\t\t\t{{ moreLabel }}\n\t\t\t</p>\n\t\t</template>\n\t\t<!-- Create affordance (ADR-062): every collection carries its Add at\n\t\t the bottom of the widget; the host card's Actions menu calls the\n\t\t same openCreate() through the public method. Suppressed while the\n\t\t empty state is showing — that renders its own copy in its #action\n\t\t slot, and two Add buttons on one empty card read as a bug. -->\n\t\t<div\n\t\t\tv-if=\"allowCreate && !waitingForContext && !showingEmptyState\"\n\t\t\tclass=\"cn-object-list-widget__add\">\n\t\t\t<NcButton variant=\"tertiary\" wide @click=\"openCreate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\t\t<!-- Upload affordance. A `dropZone` action already accepts a dropped\n\t\t `File[]`; this is the click-to-pick equivalent of the same drop,\n\t\t for the reader who never drags a file. `content.upload: false`\n\t\t opts a drop-only widget out of the button. -->\n\t\t<button\n\t\t\tv-if=\"showUploadButton\"\n\t\t\ttype=\"button\"\n\t\t\tclass=\"cn-object-list-widget__upload\"\n\t\t\tdata-testid=\"object-list-upload\"\n\t\t\t@click=\"triggerUpload\">\n\t\t\t{{ uploadLabel }}\n\t\t</button>\n\t\t<input\n\t\t\tv-if=\"showUploadButton\"\n\t\t\tref=\"uploadInput\"\n\t\t\ttype=\"file\"\n\t\t\tmultiple\n\t\t\t:aria-label=\"uploadLabel\"\n\t\t\tclass=\"cn-object-list-widget__upload-input\"\n\t\t\tdata-testid=\"object-list-upload-input\"\n\t\t\t@change=\"onUploadFilesSelected\">\n\t\t<CnFormDialog\n\t\t\tv-if=\"showCreate && createSchema\"\n\t\t\tref=\"createDialog\"\n\t\t\t:schema=\"createSchema\"\n\t\t\t:item=\"null\"\n\t\t\t:size=\"formSize\"\n\t\t\t:columns=\"formColumns\"\n\t\t\t:includeFields=\"formIncludeFields\"\n\t\t\t:excludeFields=\"formExcludeFields\"\n\t\t\t:fieldOverrides=\"formFieldOverrides\"\n\t\t\t@confirm=\"onCreateConfirm\"\n\t\t\t@close=\"showCreate = false\" />\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton } from '@nextcloud/vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnDataTable from '../CnDataTable/CnDataTable.vue'\nimport CnFkResolveCell from '../CnFkResolveCell/CnFkResolveCell.vue'\nimport CnFormDialog from '../CnFormDialog/CnFormDialog.vue'\nimport CnPagination from '../CnPagination/CnPagination.vue'\nimport CnWidgetEmptyState from '../CnWidgetEmptyState/CnWidgetEmptyState.vue'\nimport { actionLink, dispatchAction } from '../../utils/actionsDispatcher.js'\nimport { followLinkClick, openRowTarget, resolveHref } from '../../utils/linkNavigation.js'\nimport { objectFieldValue } from '../../utils/objectName.js'\nimport { dropOptionalUnresolved, hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\nimport { markNewTabHandled } from '../../utils/rowAuxClick.js'\nimport { CnRowActions } from '../CnRowActions/index.js'\n\n/**\n * Event-bus channel a page-level refresh is announced on. The page's Actions\n * menu emits it, the manifest `refresh` / `api-call` actions bump it, and an\n * app's own dialog emits it after a successful write.\n */\nconst PAGE_REFRESH_CHANNEL = 'cn:page:refresh'\n\n/**\n * CnObjectListWidget — an abstract, manifest-configured object list / table.\n *\n * Queries OpenRegister objects for a `register` + `schema` with a `filter`,\n * `sort`, and `limit`, then renders the chosen `columns` in a `CnDataTable`.\n * Replaces per-app coded list widgets (closing-soon, recently-won-lost,\n * renewals-due, …) — the data, columns, filter and ordering are all editable\n * through the cog modal (ADR-041). Resolved by its registry type key\n * `object-list`; configured via `CnObjectListWidgetForm`.\n *\n * Example content blob:\n * ```js\n * content: {\n * register: 'pipelinq', schema: 'lead',\n * filter: { status: 'open' },\n * sort: { field: 'expectedCloseDate', dir: 'asc' },\n * limit: 5,\n * columns: [{ key: 'title', label: 'Deal' }, { key: 'value', label: 'Value' }],\n * rowRoute: 'leads-detail',\n * }\n * ```\n */\nexport default {\n\tname: 'CnObjectListWidget',\n\n\tcomponents: { CnDataTable, CnFormDialog, CnPagination, CnWidgetEmptyState, CnRowActions, CnFkResolveCell, NcButton, Plus },\n\n\tinject: {\n\t\t/**\n\t\t * Detail-page object context (`{ objectId, object, register, schema }`)\n\t\t * provided by CnDetailPage. Enables `@objectId` / `@object.<field>`\n\t\t * filter tokens so a detail-page list can be scoped to the current\n\t\t * object. Null on dashboards (tokens then pass through unresolved).\n\t\t */\n\t\tcnObjectContext: { default: null },\n\t\t/**\n\t\t * Page-level workspace context (reactive `ref({})`) provided by\n\t\t * CnDashboardPage. Lets `@workspace.<key>` filter tokens resolve so a\n\t\t * list can react to state another widget on the page wrote (e.g. a\n\t\t * client-overview list scoped to the selected client). Null on pages\n\t\t * that don't provide it (tokens then stay unresolved and the list shows\n\t\t * its `promptText`).\n\t\t */\n\t\tcnWorkspaceContext: { default: null },\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored `content.emptyText` is run through it for this\n\t\t * component's OWN empty state, and so is `content.prompt`. Defaults to an identity function so\n\t\t * an untranslated key renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/**\n\t\t * Pre-bound `dispatchAction` provided by CnPageRenderer (router,\n\t\t * registry, handlers and openModal already wired). `rowActions` and\n\t\t * `dropZone` dispatch through it; outside a CnPageRenderer tree the\n\t\t * component falls back to a bare `dispatchAction` call, which reaches\n\t\t * the router-backed types and warns on the registry-backed ones.\n\t\t */\n\t\tcnDispatchAction: { default: null },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget's persisted configuration blob. `limit` is a fetch cap\n\t\t * (default 25) — the rendered row count fits the host cell (ADR-062).\n\t\t * `viewAllRoute` / `viewAllQuery` configure the \"View all (N)\" footer\n\t\t * navigation; `viewAllQuery` values are token-resolved (`@objectId`).\n\t\t *\n\t\t * `extend` is the OpenRegister `_extend[]` list forwarded on the fetch.\n\t\t * It is what makes a DOTTED column key work: `CnDataTable` reads\n\t\t * `informatieobject.title` as a path into the row, and without\n\t\t * `extend: ['informatieobject']` the row holds a uuid string at that\n\t\t * key, so six columns off one referenced object render as six copies\n\t\t * of the same uuid. `fkResolve` is the one-label answer; `extend` is\n\t\t * the several-fields-off-the-same-reference answer.\n\t\t *\n\t\t * `rowActions` is an array in the unified manifest action shape\n\t\t * (`handler` | `open-modal` | `open-page` | `navigate` | …), rendered\n\t\t * per row through CnRowActions. `dropZone` is one action of that same\n\t\t * shape, dispatched when files are dropped on the widget, with the\n\t\t * dropped `File[]` handed to it. `content.upload: false` hides the\n\t\t * click-to-pick button that otherwise renders alongside a `dropZone`.\n\t\t * Neither carries authorization: OpenRegister RBAC is the only\n\t\t * authority over what a write may do.\n\t\t *\n\t\t * `groupBy` (a row field path, dotted paths read the `extend`-inlined\n\t\t * reference the same way a column does) buckets the fetched rows into\n\t\t * one heading + table per distinct value, in first-seen order.\n\t\t * `groupLabel` is the field path used for the heading text; it\n\t\t * defaults to the raw `groupBy` value when absent. `groupLabelResolve`\n\t\t * (`{register, schema, labelField?}`) is for a `groupBy` whose human\n\t\t * label sits a hop further than `extend` reaches (a reference's own\n\t\t * reference): the heading resolves the raw group key through the\n\t\t * shared object store, the same `fkResolve` cell widget a column uses.\n\t\t *\n\t\t * `selectable` turns on CnDataTable's checkbox column; `bulkActions`\n\t\t * (same action shape as `rowActions`) render as buttons in a bar that\n\t\t * appears once something is selected. A `handler` bulk action receives\n\t\t * the array of selected row objects appended to its `args`; an\n\t\t * `open-modal` bulk action receives them as `props.selectedIds`\n\t\t * (mirroring how a drop hands `props.files` to a modal).\n\t\t *\n\t\t * `sortable` (`true`, or an array of column keys) makes the matching\n\t\t * `CnDataTable` headers clickable; clicking re-fetches with that\n\t\t * field's `_order`, same as the fixed `sort` key but user-driven.\n\t\t *\n\t\t * `facet` (`{ field, label? }`) renders one filter chip per distinct\n\t\t * value of that field across the currently loaded rows (an array\n\t\t * field's entries are flattened) and narrows the rendered rows to\n\t\t * those carrying a selected value. Client-side over the fetched page,\n\t\t * like the rest of this widget's row set.\n\t\t *\n\t\t * @type {{register?: string, schema?: string, filter?: object, sort?: {field?: string, dir?: string}, limit?: number, extend?: Array<string>, columns?: Array, rowActions?: Array<object>, dropZone?: object, upload?: boolean, groupBy?: string, groupLabel?: string, groupLabelResolve?: {register: string, schema: string, labelField?: string}, selectable?: boolean, bulkActions?: Array<object>, sortable?: boolean, facet?: {field: string, label?: string}, rowRoute?: string, prompt?: string, emptyText?: string, viewAllRoute?: string, viewAllQuery?: object}}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\n\temits: ['created', 'row-click', 'view-all', 'files-dropped'],\n\n\tdata() {\n\t\treturn {\n\t\t\trows: [],\n\t\t\tloading: false,\n\t\t\terror: '',\n\t\t\t/** Server-side total for the resolved filter (drives \"View all (N)\"). */\n\t\t\ttotal: 0,\n\t\t\t/** Current 1-based page. Paging is SERVER-side (`_page`). */\n\t\t\tpage: 1,\n\t\t\t/** Rows that fit the host cell; null = unconstrained (dashboards). */\n\t\t\tfitRows: null,\n\t\t\t/** Whether the create dialog is open. */\n\t\t\tshowCreate: false,\n\t\t\t/**\n\t\t\t * The list's own schema definition, once fetched.\n\t\t\t *\n\t\t\t * Shared by two readers: the create dialog renders its form from it,\n\t\t\t * and `resolvedColumns` takes a column's HEADING from the matching\n\t\t\t * property's `title` when the manifest gave only a key.\n\t\t\t */\n\t\t\tcreateSchema: null,\n\t\t\t/**\n\t\t\t * Depth of nested dragenter/dragleave pairs over the widget.\n\t\t\t * A single counter, because `dragleave` fires when the pointer\n\t\t\t * crosses into a CHILD element: tracking a boolean instead makes\n\t\t\t * the overlay flicker off the moment the drag reaches the table.\n\t\t\t */\n\t\t\tdragDepth: 0,\n\t\t\t/** Selected row ids (`content.selectable`). Shared across groups. */\n\t\t\tselectedIds: [],\n\t\t\t/**\n\t\t\t * The active sort, seeded from `content.sort` and overwritten by an\n\t\t\t * interactive header click (`content.sortable`). Kept as component\n\t\t\t * state rather than read from `content` directly so a click can\n\t\t\t * override the manifest-declared default without mutating a prop.\n\t\t\t */\n\t\t\tlocalSort: { ...(this.content.sort || {}) },\n\t\t\t/** Facet values currently toggled on (`content.facet`). */\n\t\t\tfacetSelected: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The unwrapped detail-page object context for token resolution, or null\n\t\t * on surfaces (dashboards) that don't provide one.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tobjectCtx() {\n\t\t\tconst c = this.cnObjectContext\n\t\t\tif (!c) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn (typeof c === 'object' && 'value' in c) ? c.value : c\n\t\t},\n\n\t\t/**\n\t\t * The unwrapped workspace context bag (or null). Vue 2.7 `setup`/inject\n\t\t * may hand back a raw ref; unwrap `.value` so token resolution reads the\n\t\t * plain object.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tworkspaceCtx() {\n\t\t\tconst c = this.cnWorkspaceContext\n\t\t\tif (!c) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn (typeof c === 'object' && 'value' in c) ? c.value : c\n\t\t},\n\n\t\t/**\n\t\t * Token-resolution context merged from the detail-page object context\n\t\t * and the page-level workspace bag (`@workspace.<key>`).\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\ttokenCtx() {\n\t\t\tconst base = this.objectCtx ? { ...this.objectCtx } : {}\n\t\t\tbase.workspace = this.workspaceCtx || {}\n\t\t\treturn base\n\t\t},\n\n\t\t/**\n\t\t * The filter with every `@`-token resolved against `tokenCtx`, then with\n\t\t * any UNRESOLVED OPTIONAL token (`@workspace.<key>?`) dropped — so an\n\t\t * optional queue filter simply shows all rows until a queue is picked,\n\t\t * while a REQUIRED token (`@workspace.selectedClient`) stays to trigger the\n\t\t * prompt.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tresolvedFilter() {\n\t\t\treturn dropOptionalUnresolved(resolveFilterTokens(this.content.filter || {}, this.tokenCtx))\n\t\t},\n\n\t\t/**\n\t\t * Whether a context-dependent filter token (e.g. `@workspace.selectedClient`)\n\t\t * is still unresolved — the page state this list depends on isn't set yet,\n\t\t * so the list renders a prompt instead of fetching the whole register.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\twaitingForContext() {\n\t\t\treturn hasUnresolvedTokens(this.resolvedFilter)\n\t\t},\n\n\t\t/**\n\t\t * Prompt shown while a context-bound list has an unresolved REQUIRED\n\t\t * token. A `content.prompt` override always wins. Otherwise the default\n\t\t * is context-aware: the \"Select an item to see related records\"\n\t\t * master-detail copy only fits a DASHBOARD list waiting on a selection —\n\t\t * on a detail page (an object context is present) that copy is wrong, so\n\t\t * fall back to the neutral \"Nothing here yet\" (ADR-062).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tpromptText() {\n\t\t\tif (this.content.prompt) {\n\t\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\t\treturn fn(this.content.prompt)\n\t\t\t}\n\t\t\treturn this.objectCtx\n\t\t\t\t? t('nextcloud-vue', 'Nothing here yet')\n\t\t\t\t: t('nextcloud-vue', 'Select an item to see related records')\n\t\t},\n\n\t\t/**\n\t\t * Quiet, status-code-free label shown when a fetch fails. The real\n\t\t * axios error is logged to the console, never rendered (ADR-062).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tloadErrorLabel() {\n\t\t\treturn this.content.errorText || t('nextcloud-vue', 'Could not load these records')\n\t\t},\n\n\t\t/**\n\t\t * Column definitions normalised for CnDataTable. A string column becomes\n\t\t * `{ key, label }`; an object column keeps its key/label AND carries the\n\t\t * presentation hints CnDataTable forwards to CnCellRenderer — `format`\n\t\t * (currency / duration / number / percent / date / date-time), `widget`\n\t\t * (badge / link / swatch), `widgetProps`, `formatter`, `align`, and\n\t\t * `width`. Without this pass-through a `relatedCollections` column's\n\t\t * `format: 'currency'` / `'date'` would silently render as plain text.\n\t\t *\n\t\t * `enumLabels` travels alongside `enum` for the same reason `enum`\n\t\t * itself is here: a list column often addresses a DOTTED path into an\n\t\t * `extend`-inlined reference (e.g. `informatieobject.direction`), and\n\t\t * this widget never fetches that reference's own schema to feed\n\t\t * CnDataTable's live `:schema` prop — only `openCreate()`'s create-form\n\t\t * schema is ever fetched. A column that needs its raw enum code\n\t\t * (`\"incoming\"`) to render as a human label (`\"Incoming\"`) has to carry\n\t\t * that mapping itself, the same way it already carries `enum`. This is\n\t\t * the same generic mechanism CnCellRenderer already applies to a real\n\t\t * schema property's `x-enum-labels`, completed here for the\n\t\t * manifest-column path rather than special-cased per column.\n\t\t */\n\t\tresolvedColumns() {\n\t\t\tconst cols = Array.isArray(this.content.columns) ? this.content.columns : []\n\t\t\tconst sortableConfig = this.content.sortable\n\t\t\t// A column may arrive as a bare key. Falling back to that key as the\n\t\t\t// HEADING is what printed `customerName` and `dateReceived` at users\n\t\t\t// on a dashboard, while the index page beside it said \"Customer name\"\n\t\t\t// and \"Date received\" — the same data, labelled twice, differently.\n\t\t\t// The schema already holds the answer, so ask it, and keep the key\n\t\t\t// only when it has nothing to say.\n\t\t\tconst props = (this.createSchema && this.createSchema.properties) || {}\n\t\t\tconst headingFor = (key) => {\n\t\t\t\tconst prop = props[key]\n\t\t\t\tconst title = prop && typeof prop.title === 'string' ? prop.title.trim() : ''\n\t\t\t\treturn title !== '' ? title : key\n\t\t\t}\n\t\t\tconst mapped = cols.map((c) => {\n\t\t\t\tif (typeof c === 'string') {\n\t\t\t\t\treturn { key: c, label: headingFor(c) }\n\t\t\t\t}\n\t\t\t\tconst out = { key: c.key, label: c.label || headingFor(c.key) }\n\t\t\t\tfor (const k of ['format', 'widget', 'widgetProps', 'formatter', 'align', 'width', 'type', 'enum', 'enumLabels', 'sortable']) {\n\t\t\t\t\tif (c[k] !== undefined) {\n\t\t\t\t\t\tout[k] = c[k]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// `content.sortable` (bool = every column, array = the listed\n\t\t\t\t// keys) fills in `sortable` for a column that did not already\n\t\t\t\t// say so on its own definition — an explicit `sortable: false`\n\t\t\t\t// on the column still wins, so one header can opt out of an\n\t\t\t\t// otherwise sortable list.\n\t\t\t\tif (out.sortable === undefined && sortableConfig !== undefined) {\n\t\t\t\t\tout.sortable = sortableConfig === true\n\t\t\t\t\t\t|| (Array.isArray(sortableConfig) && sortableConfig.includes(out.key))\n\t\t\t\t}\n\t\t\t\treturn out\n\t\t\t})\n\n\t\t\t// The registry used to default to `[{ key: 'title' }]`, but plenty of schemas\n\t\t\t// have no `title` — a Barn has `name`. Such a widget rendered a table of\n\t\t\t// em-dashes forever, and nothing told the user why.\n\t\t\t//\n\t\t\t// Don't guess the right key from the data: OpenRegister already guessed, and\n\t\t\t// published the answer as `@self.name`. When NOT ONE configured column\n\t\t\t// resolves on any loaded row, fall back to that single display-name column.\n\t\t\t//\n\t\t\t// Only when none resolve: a partly-matching column set is a deliberate choice\n\t\t\t// (a column can be legitimately empty across the current page of rows), and\n\t\t\t// silently replacing it would override the user.\n\t\t\tif (this.rows.length > 0 && mapped.length > 0) {\n\t\t\t\tconst resolves = mapped.some((c) => this.rows.some((r) => objectFieldValue(r, c.key) !== undefined))\n\t\t\t\tif (resolves === false) {\n\t\t\t\t\treturn [{ key: 'name', label: t('nextcloud-vue', 'Name') }]\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mapped\n\t\t},\n\n\t\t/**\n\t\t * Declared per-row actions mapped onto the CnRowActions shape. Every\n\t\t * entry keeps its label, icon and `destructive` flag and routes its\n\t\t * click back through `runRowAction`, so the dispatcher decides what a\n\t\t * type means and this component does not grow a second action\n\t\t * vocabulary.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tmappedRowActions() {\n\t\t\tconst declared = Array.isArray(this.content.rowActions) ? this.content.rowActions : []\n\t\t\treturn declared\n\t\t\t\t.filter((a) => a && typeof a === 'object')\n\t\t\t\t.map((action) => ({\n\t\t\t\t\tlabel: action.label,\n\t\t\t\t\ticon: action.icon,\n\t\t\t\t\tdestructive: action.destructive === true,\n\t\t\t\t\t// CnRowActions renders a link when these are set and skips the handler.\n\t\t\t\t\t...this.rowActionLink(action),\n\t\t\t\t\thandler: (row) => this.runRowAction(action, row),\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * The declared drop-zone action, or null. A widget without the key\n\t\t * takes no part in a drag at all.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tdropZoneAction() {\n\t\t\tconst dz = this.content.dropZone\n\t\t\treturn (dz && typeof dz === 'object') ? dz : null\n\t\t},\n\n\t\t/** Whether a file drag is currently over a drop-enabled widget. */\n\t\tdropping() {\n\t\t\treturn this.dropZoneAction !== null && this.dragDepth > 0\n\t\t},\n\n\t\t/** Copy shown on the drop overlay (overridable via `dropZone.label`). */\n\t\tdropLabel() {\n\t\t\treturn (this.dropZoneAction && this.dropZoneAction.label)\n\t\t\t\t|| t('nextcloud-vue', 'Drop files here')\n\t\t},\n\n\t\t/**\n\t\t * Whether the click-to-pick upload button renders: a `dropZone` is\n\t\t * declared and the host has not opted out with `content.upload: false`.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshowUploadButton() {\n\t\t\treturn this.dropZoneAction !== null && this.content.upload !== false\n\t\t},\n\n\t\t/** Pre-translated Upload label (overridable via `content.uploadLabel`). */\n\t\tuploadLabel() {\n\t\t\treturn this.content.uploadLabel || t('nextcloud-vue', 'Upload')\n\t\t},\n\n\t\t/**\n\t\t * Declared bulk actions mapped onto the same `{label, icon, destructive,\n\t\t * handler}` shape `mappedRowActions` uses, so CnRowActions and the bulk\n\t\t * bar render identically — the only difference is what `handler` does:\n\t\t * a row action dispatches with one row, a bulk action with the whole\n\t\t * selection.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tmappedBulkActions() {\n\t\t\tconst declared = Array.isArray(this.content.bulkActions) ? this.content.bulkActions : []\n\t\t\treturn declared\n\t\t\t\t.filter((a) => a && typeof a === 'object')\n\t\t\t\t.map((action) => ({\n\t\t\t\t\tlabel: action.label,\n\t\t\t\t\ticon: action.icon,\n\t\t\t\t\tdestructive: action.destructive === true,\n\t\t\t\t\thandler: () => this.runBulkAction(action),\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * The currently selected row objects, resolved from `rows` (not just\n\t\t * the visible/faceted slice) so a selection made before a facet filter\n\t\t * narrows the view is not silently dropped from a bulk action.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tselectedRows() {\n\t\t\treturn this.rows.filter((row) => this.selectedIds.includes(row.id))\n\t\t},\n\n\t\t/**\n\t\t * Distinct values of `content.facet.field` across the currently loaded\n\t\t * rows, flattening an array-valued field (the \"keywords across the\n\t\t * dossier\" shape this seam was measured against). Sorted for a stable\n\t\t * chip order run to run.\n\t\t *\n\t\t * @return {Array<string>}\n\t\t */\n\t\tfacetOptions() {\n\t\t\tconst facet = this.content.facet\n\t\t\tif (!facet || !facet.field) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst values = new Set()\n\t\t\tfor (const row of this.visibleRows) {\n\t\t\t\tconst raw = objectFieldValue(row, facet.field)\n\t\t\t\tconst list = Array.isArray(raw) ? raw : (raw !== undefined && raw !== null && raw !== '' ? [raw] : [])\n\t\t\t\tfor (const v of list) {\n\t\t\t\t\tif (v !== undefined && v !== null && v !== '') {\n\t\t\t\t\t\tvalues.add(v)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Array.from(values).sort()\n\t\t},\n\n\t\t/** Pre-translated facet label (`content.facet.label`, falls back to a generic \"Filter\"). */\n\t\tfacetLabel() {\n\t\t\tconst facet = this.content.facet\n\t\t\treturn (facet && facet.label) || t('nextcloud-vue', 'Filter')\n\t\t},\n\n\t\t/**\n\t\t * Rows narrowed by the selected facet values. A row matches when at\n\t\t * least one of its (possibly array) values at `facet.field` is among\n\t\t * `facetSelected` — no selection means no narrowing at all.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tfacetedRows() {\n\t\t\tconst facet = this.content.facet\n\t\t\tif (!facet || !facet.field || this.facetSelected.length === 0) {\n\t\t\t\treturn this.visibleRows\n\t\t\t}\n\t\t\treturn this.visibleRows.filter((row) => {\n\t\t\t\tconst raw = objectFieldValue(row, facet.field)\n\t\t\t\tconst list = Array.isArray(raw) ? raw : (raw !== undefined && raw !== null ? [raw] : [])\n\t\t\t\treturn list.some((v) => this.facetSelected.includes(v))\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Whether the fetch returned rows but the active facet selection\n\t\t * matches none of them — the \"clear filter\" empty state, distinct\n\t\t * from \"there are no items at all\".\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshowNoFacetMatchState() {\n\t\t\treturn !this.loading && this.rows.length > 0 && this.facetSelected.length > 0 && this.facetedRows.length === 0\n\t\t},\n\n\t\t/** Whether `content.groupBy` is declared, so the template picks the grouped render path. */\n\t\tisGrouped() {\n\t\t\treturn typeof this.content.groupBy === 'string' && this.content.groupBy !== ''\n\t\t},\n\n\t\t/**\n\t\t * `content.groupLabelResolve` (`{register, schema, labelField?}`), or\n\t\t * null. When set, the group heading resolves `group.key` through the\n\t\t * shared object store instead of reading a plain field off the row —\n\t\t * for a `groupBy` whose human label lives a hop further than `extend`\n\t\t * inlined (a reference's own reference, e.g. grouping documents by\n\t\t * type when only the document itself, not its type, was extended).\n\t\t *\n\t\t * @return {{register: string, schema: string, labelField?: string}|null}\n\t\t */\n\t\tgroupLabelResolveConfig() {\n\t\t\tconst cfg = this.content.groupLabelResolve\n\t\t\treturn (cfg && typeof cfg === 'object' && cfg.register && cfg.schema) ? cfg : null\n\t\t},\n\n\t\t/**\n\t\t * The faceted rows bucketed by `content.groupBy`, one entry per\n\t\t * distinct value in first-seen order (matching how the rows already\n\t\t * arrived — server-sorted). A `$ref` group key that resolves to an\n\t\t * object (an `extend`-inlined reference) groups by its `id`, so\n\t\t * `groupBy: 'informatieobjecttype'` groups the actual referenced\n\t\t * objects rather than one group per string-ified object.\n\t\t *\n\t\t * @return {Array<{key: string, label: string, rows: Array<object>}>}\n\t\t */\n\t\tgroupedRows() {\n\t\t\tif (!this.isGrouped) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst field = this.content.groupBy\n\t\t\tconst labelField = this.content.groupLabel || field\n\t\t\tconst order = []\n\t\t\tconst byKey = new Map()\n\t\t\tfor (const row of this.facetedRows) {\n\t\t\t\tconst rawKey = objectFieldValue(row, field)\n\t\t\t\tconst key = (rawKey && typeof rawKey === 'object')\n\t\t\t\t\t? (rawKey.id || JSON.stringify(rawKey))\n\t\t\t\t\t: String(rawKey ?? '')\n\t\t\t\tif (!byKey.has(key)) {\n\t\t\t\t\tconst rawLabel = objectFieldValue(row, labelField)\n\t\t\t\t\tconst label = (rawLabel && typeof rawLabel === 'object')\n\t\t\t\t\t\t? (rawLabel.title || rawLabel.name || key)\n\t\t\t\t\t\t: (rawLabel || key || t('nextcloud-vue', 'Ungrouped'))\n\t\t\t\t\tbyKey.set(key, { key, label, rows: [] })\n\t\t\t\t\torder.push(key)\n\t\t\t\t}\n\t\t\t\tbyKey.get(key).rows.push(row)\n\t\t\t}\n\t\t\treturn order.map((key) => byKey.get(key))\n\t\t},\n\n\t\t/** Empty-state text (overridable via `content.emptyText`). */\n\t\temptyText() {\n\t\t\treturn this.content.emptyText || t('nextcloud-vue', 'No items')\n\t\t},\n\n\t\t/**\n\t\t * The empty-state text run through the host translate function. Used\n\t\t * only by this component's OWN empty state — the raw `emptyText`\n\t\t * still goes to CnDataTable, which translates at its own render\n\t\t * boundary, so the string is never translated twice.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tresolvedEmptyText() {\n\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\treturn this.emptyText ? fn(this.emptyText) : this.emptyText\n\t\t},\n\n\t\t/**\n\t\t * The rows actually rendered: capped to what fits the host grid cell\n\t\t * (ADR-062 — content adapts to the cell, never a nested scrollbar).\n\t\t * Unconstrained on surfaces without a fixed-height cell (dashboards\n\t\t * measure null and render every fetched row, as before).\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tvisibleRows() {\n\t\t\treturn this.fitRows ? this.rows.slice(0, this.fitRows) : this.rows\n\t\t},\n\n\t\t/**\n\t\t * Rows per page. This is `content.limit` (the fetch cap) — a FIXED\n\t\t * number, deliberately not the measured `fitRows`: a page size derived\n\t\t * from a post-render measurement would change the pagination under the\n\t\t * reader every time the tile resized, and would need a refetch to\n\t\t * settle.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\tpageSize() {\n\t\t\treturn Number((this.content || {}).limit) || 25\n\t\t},\n\n\t\t/**\n\t\t * Total pages for the resolved filter, from the SERVER's total.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\ttotalPages() {\n\t\t\treturn Math.max(Math.ceil((this.total || 0) / this.pageSize), 1)\n\t\t},\n\n\t\t/**\n\t\t * Whether the compact pager renders.\n\t\t *\n\t\t * Two conditions, and the second is the load-bearing one. There must\n\t\t * be more than one page (otherwise there is nothing to page), AND the\n\t\t * cell must be able to show a whole page — because `visibleRows` clips\n\t\t * the page to what fits, and a pager over clipped rows would claim to\n\t\t * be showing \"1–25 of 137\" while five rows are on screen. On a cell\n\t\t * that short the existing fit-to-cell \"View all\" is the honest answer.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshowPager() {\n\t\t\tif (this.totalPages <= 1) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.fitRows === null || this.fitRows >= this.rows.length\n\t\t},\n\n\t\t/** Whether the designed empty state is what the widget is showing. */\n\t\tshowingEmptyState() {\n\t\t\treturn !this.waitingForContext && !this.error && !this.loading && this.rows.length === 0\n\t\t},\n\n\t\t/**\n\t\t * How many matching objects are NOT rendered (server total minus the\n\t\t * visible slice). Drives the \"View all (N)\" footer.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\thiddenCount() {\n\t\t\treturn Math.max((this.total || this.rows.length) - this.visibleRows.length, 0)\n\t\t},\n\n\t\t/** Pre-translated \"View all (N)\" footer label. */\n\t\tviewAllLabel() {\n\t\t\treturn t('nextcloud-vue', 'View all ({total})', { total: this.total || this.rows.length })\n\t\t},\n\n\t\t/**\n\t\t * The \"View all (N)\" router location: `viewAllRoute` with its\n\t\t * token-resolved `viewAllQuery`, or null without a route.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tviewAllLocation() {\n\t\t\tconst route = this.content.viewAllRoute\n\t\t\tif (!route) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { name: route, query: resolveFilterTokens(this.content.viewAllQuery || {}, this.tokenCtx) }\n\t\t},\n\n\t\t/**\n\t\t * The href \"View all (N)\" links to, or '' when there is no router to\n\t\t * resolve it (the footer then renders as a button).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tviewAllHref() {\n\t\t\treturn resolveHref(this.viewAllLocation, this.$router)\n\t\t},\n\n\t\t/** Pre-translated \"+N more\" footer label (no viewAllRoute configured). */\n\t\tmoreLabel() {\n\t\t\treturn t('nextcloud-vue', '+{count} more', { count: this.hiddenCount })\n\t\t},\n\n\t\t/** Whether the create affordance renders (on by default; `content.allowCreate: false` opts out). */\n\t\tallowCreate() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn c.allowCreate !== false && Boolean(c.register) && Boolean(c.schema)\n\t\t},\n\n\t\t/**\n\t\t * NcDialog size for the create dialog (`content.formSize`).\n\t\t *\n\t\t * The widget fetches the WHOLE schema to build this form, so a list\n\t\t * scoped to a handful of columns still opened a create dialog asking\n\t\t * every property the schema declares — at `normal` width, in one\n\t\t * column. A case schema with thirty visible properties is unusable\n\t\t * that way, and every consumer that hit it worked around it by\n\t\t * turning the create button off.\n\t\t */\n\t\tformSize() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn c.formSize || 'normal'\n\t\t},\n\n\t\t/** How many columns the create dialog flows its fields into (`content.formColumns`). */\n\t\tformColumns() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn c.formColumns === 2 ? 2 : 1\n\t\t},\n\n\t\t/** Whitelist of fields the create dialog asks for (`content.formIncludeFields`). Null means all. */\n\t\tformIncludeFields() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn Array.isArray(c.formIncludeFields) ? c.formIncludeFields : null\n\t\t},\n\n\t\t/** Fields the create dialog leaves out (`content.formExcludeFields`). */\n\t\tformExcludeFields() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn Array.isArray(c.formExcludeFields) ? c.formExcludeFields : []\n\t\t},\n\n\t\t/** Per-field overrides for the create dialog (`content.formFieldOverrides`). */\n\t\tformFieldOverrides() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn (c.formFieldOverrides && typeof c.formFieldOverrides === 'object') ? c.formFieldOverrides : {}\n\t\t},\n\n\t\t/** Pre-translated Add label (overridable via `content.addLabel`). */\n\t\taddLabel() {\n\t\t\treturn this.content.addLabel || t('nextcloud-vue', 'Add')\n\t\t},\n\n\t\t/** Stable signature of the query so the watcher only refetches on real change. */\n\t\tsourceKey() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn JSON.stringify({\n\t\t\t\tregister: c.register || '',\n\t\t\t\tschema: c.schema || '',\n\t\t\t\t// The RESOLVED filter (workspace + object tokens applied) so the\n\t\t\t\t// watcher refetches when page-level state a token reads changes.\n\t\t\t\tfilter: this.resolvedFilter,\n\t\t\t\t// `localSort`, not `c.sort` — an interactive header click\n\t\t\t\t// (`content.sortable`) overrides the manifest default without\n\t\t\t\t// touching the prop, and the fetch must follow that override.\n\t\t\t\tsort: this.localSort || {},\n\t\t\t\tlimit: c.limit || 25,\n\t\t\t\tobjectId: this.objectCtx ? this.objectCtx.objectId : null,\n\t\t\t})\n\t\t},\n\t},\n\n\twatch: {\n\t\tsourceKey() {\n\t\t\t// The query changed, so page 3 of the OLD result set means nothing\n\t\t\t// against the new one — and an out-of-range `_page` returns an empty\n\t\t\t// list, which would read as \"no matches\" rather than \"wrong page\".\n\t\t\tthis.page = 1\n\t\t\tthis.fetchRows()\n\t\t},\n\n\t\t// The create-dialog schema is cached per instance, and an instance can\n\t\t// be retargeted (CnRelatedCollections keys its children by index, so a\n\t\t// reordered entry reuses the component). A schema resolved for the OLD\n\t\t// register is exactly the wrong-app schema the register scoping above\n\t\t// exists to prevent — drop it so the next open resolves it again.\n\t\t//\n\t\t// The headings read the same cache, and unlike the dialog they have no\n\t\t// later moment that reloads it: without the second call a retargeted\n\t\t// widget goes back to printing `customerName` at the user until\n\t\t// somebody happens to open Add.\n\t\t'content.register': function() {\n\t\t\tthis.forgetCreateSchema()\n\t\t\tthis.loadHeadingsIfNeeded()\n\t\t},\n\n\t\t'content.schema': function() {\n\t\t\tthis.forgetCreateSchema()\n\t\t\tthis.loadHeadingsIfNeeded()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.fetchRows()\n\t\tthis.loadHeadingsIfNeeded()\n\t\t// Re-read on a page-level refresh. This list fetches its own rows from\n\t\t// OpenRegister and subscribed to nothing, so after a write elsewhere on\n\t\t// the page it went on rendering the result set it fetched on mount —\n\t\t// values the backend had already changed. The endpoint-bound widgets\n\t\t// have answered this channel since Wave 2 (useEndpointSource); the\n\t\t// store-backed ones did not.\n\t\t//\n\t\t// Guarded on `loading`: the channel is a broadcast, and a page whose\n\t\t// action fires it more than once (or a dialog that emits alongside the\n\t\t// page's own Refresh) must not turn one write into a queue of\n\t\t// overlapping reads for one list.\n\t\tthis._onPageRefresh = (payload) => {\n\t\t\tif (this.loading) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst done = this.fetchRows()\n\t\t\tpayload?.waitUntil?.(done)\n\t\t}\n\t\tsubscribe(PAGE_REFRESH_CHANNEL, this._onPageRefresh)\n\t\t// Observe the host grid cell so the visible row count re-fits on\n\t\t// resize/layout changes. Only detail-grid cells constrain height;\n\t\t// on dashboards the closest() lookup misses and fitRows stays null.\n\t\tconst cell = this.$el.closest && this.$el.closest('.grid-stack-item-content')\n\t\tif (cell && typeof ResizeObserver !== 'undefined') {\n\t\t\tthis._fitObserver = new ResizeObserver(() => this.measureFit())\n\t\t\tthis._fitObserver.observe(cell)\n\t\t}\n\t\tthis.$nextTick(() => this.measureFit())\n\t},\n\n\tbeforeUnmount() {\n\t\tif (this._onPageRefresh) {\n\t\t\tunsubscribe(PAGE_REFRESH_CHANNEL, this._onPageRefresh)\n\t\t\tthis._onPageRefresh = null\n\t\t}\n\t\tif (this._fitObserver) {\n\t\t\tthis._fitObserver.disconnect()\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Fetch the object rows from OpenRegister. Lazily imports the\n\t\t * axios/router helpers (the library never hard-depends on them at module\n\t\t * load — same pattern as CnStatWidget / CnFilesWidget).\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fetchRows() {\n\t\t\tconst c = this.content || {}\n\t\t\tif (!c.register || !c.schema) {\n\t\t\t\tthis.rows = []\n\t\t\t\tthis.error = ''\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// A context token this list depends on (e.g. @workspace.selectedClient)\n\t\t\t// isn't set yet — don't fetch the whole register; the prompt shows.\n\t\t\tif (this.waitingForContext) {\n\t\t\t\tthis.rows = []\n\t\t\t\tthis.error = ''\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst url = generateUrl(\n\t\t\t\t\t'/apps/openregister/api/objects/{register}/{schema}',\n\t\t\t\t\t{ register: c.register, schema: c.schema },\n\t\t\t\t)\n\t\t\t\t// `limit` is a FETCH CAP (ADR-062), not a render promise — the\n\t\t\t\t// visible count fits the cell; fetch enough to fill big cells.\n\t\t\t\t// It doubles as the PAGE SIZE: one fetch is exactly one page, so\n\t\t\t\t// the pager's \"1–25 of 137\" is the server's arithmetic and not a\n\t\t\t\t// client-side count of an already-capped window.\n\t\t\t\tconst params = { _limit: this.pageSize, _page: this.page }\n\t\t\t\tif (this.localSort && this.localSort.field) {\n\t\t\t\t\tparams[`_order[${this.localSort.field}]`] = (this.localSort.dir === 'desc' ? 'desc' : 'asc')\n\t\t\t\t}\n\t\t\t\t// `content.extend` → OpenRegister's repeated `_extend[]`. axios\n\t\t\t\t// serializes an array value as `_extend[]=a&_extend[]=b`, which\n\t\t\t\t// is the wire form OR reads. This is what turns a dotted column\n\t\t\t\t// key into a real value: the referenced object is inlined on the\n\t\t\t\t// row, so `informatieobject.title` resolves instead of reading a\n\t\t\t\t// uuid string as an object path.\n\t\t\t\tif (Array.isArray(c.extend)) {\n\t\t\t\t\tconst extend = c.extend.filter((e) => typeof e === 'string' && e !== '')\n\t\t\t\t\tif (extend.length > 0) {\n\t\t\t\t\t\tparams._extend = extend\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// The OpenRegister OBJECT-SEARCH endpoint filters on DIRECT field\n\t\t\t\t// params (`status=open`, `value[gt]=30000`) — unlike the\n\t\t\t\t// aggregation endpoints which use the nested `filter[...]` shape.\n\t\t\t\tconst filter = this.resolvedFilter\n\t\t\t\tif (filter && typeof filter === 'object') {\n\t\t\t\t\tfor (const [k, v] of Object.entries(filter)) {\n\t\t\t\t\t\tif (v && typeof v === 'object') {\n\t\t\t\t\t\t\tfor (const [op, ov] of Object.entries(v)) {\n\t\t\t\t\t\t\t\tparams[`${k}[${op}]`] = ov\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (v !== '' && v !== null && v !== undefined) {\n\t\t\t\t\t\t\tparams[k] = v\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst res = await axios.get(url, { params })\n\t\t\t\tthis.rows = (res && res.data && res.data.results) || []\n\t\t\t\tthis.total = (res && res.data && typeof res.data.total === 'number') ? res.data.total : this.rows.length\n\t\t\t\tthis.$nextTick(() => this.measureFit())\n\t\t\t} catch (e) {\n\t\t\t\t// Keep the raw message OUT of the template — log it for\n\t\t\t\t// debugging, surface only the quiet `loadErrorLabel` line.\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn('[CnObjectListWidget] failed to load objects:', e)\n\t\t\t\tthis.error = (e && e.message) || 'error'\n\t\t\t\tthis.rows = []\n\t\t\t\tthis.total = 0\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fit the visible row count to the host grid cell (ADR-062 — the cell\n\t\t * is the budget). Measures the cell's remaining height below the table\n\t\t * top, reserves room for the \"View all\" footer, and derives the row\n\t\t * budget from the first rendered row's height. No-ops (fitRows null =\n\t\t * render all fetched rows) outside a fixed-height cell.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tmeasureFit() {\n\t\t\t// `content.fit: false` opts out of the cell budget: render every row\n\t\t\t// fetched and let the container scroll. The budget below assumes the\n\t\t\t// list OWNS its cell, measuring from where the table starts to the\n\t\t\t// cell's bottom. That is wrong for a list stacked below other content\n\t\t\t// in the same cell (a section of a tabbed panel, say): it starts near\n\t\t\t// the bottom, the budget floors to one row, and the rest are clipped.\n\t\t\t// Only an explicit `false` opts out, so a manifest that never sets the\n\t\t\t// key keeps the ADR-062 behaviour unchanged.\n\t\t\tif (this.content && this.content.fit === false) {\n\t\t\t\tthis.fitRows = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst cell = this.$el && this.$el.closest && this.$el.closest('.grid-stack-item-content')\n\t\t\tif (!cell) {\n\t\t\t\tthis.fitRows = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst table = this.$el.querySelector('.cn-object-list-widget__table table')\n\t\t\tif (!table) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst cellRect = cell.getBoundingClientRect()\n\t\t\tconst tableRect = table.getBoundingClientRect()\n\t\t\tconst firstRow = table.querySelector('tbody tr')\n\t\t\tconst rowH = (firstRow && firstRow.getBoundingClientRect().height) || 44\n\t\t\tconst head = table.querySelector('thead')\n\t\t\tconst headH = (head && head.getBoundingClientRect().height) || 40\n\t\t\t// Room for the \"View all\" footer AND the Add button (ADR-062).\n\t\t\tconst footerReserve = 68\n\t\t\tconst available = cellRect.bottom - tableRect.top - footerReserve\n\t\t\tconst fit = Math.floor((available - headH) / rowH)\n\t\t\tthis.fitRows = Math.max(fit, 1)\n\t\t},\n\n\t\t/**\n\t\t * Drop the cached create-dialog schema (and close the dialog if it is\n\t\t * open) when the list points at another register or schema.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tforgetCreateSchema() {\n\t\t\tthis.createSchema = null\n\t\t\tthis.showCreate = false\n\t\t},\n\n\t\t/**\n\t\t * Open the create dialog for the list's target schema. PUBLIC — the\n\t\t * host card's Actions-menu \"Add\" entry calls this through a ref, the\n\t\t * widget's own footer button calls it directly (ADR-062: both\n\t\t * affordances, one dialog).\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync openCreate() {\n\t\t\tconst c = this.content || {}\n\t\t\tif (!c.schema) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.ensureSchema()\n\t\t\t\tthis.showCreate = true\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = (e && e.message) || 'error'\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch this list's schema once, for whoever needs it.\n\t\t *\n\t\t * Two readers share it: the create dialog builds its form from the\n\t\t * properties, and `resolvedColumns` reads each property's `title` to\n\t\t * label a column the manifest gave only a key for.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync ensureSchema() {\n\t\t\tconst c = this.content || {}\n\t\t\tif (this.createSchema || !c.schema) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\timport('@nextcloud/router'),\n\t\t\t])\n\t\t\t// A slug is NOT a namespace (same rule as useObjectStore.fetchSchema,\n\t\t\t// #725): on an instance where two apps both own a `page` schema the\n\t\t\t// bare endpoint resolves instance-wide and serves the OTHER app's\n\t\t\t// schema into this form — the dialog then asks for fields the\n\t\t\t// register-scoped POST does not know and refuses the ones it\n\t\t\t// requires (portaliq + opencatalogi, WOO-564: a 400 on every\n\t\t\t// \"Add page\"/\"Add menu\"). Name the list's own register whenever it\n\t\t\t// has one; a backend that does not know the parameter ignores it.\n\t\t\tconst url = generateUrl('/apps/openregister/api/schemas/{sch}', { sch: c.schema })\n\t\t\tconst params = c.register ? { register: c.register } : undefined\n\t\t\tconst res = await axios.get(url, params ? { params } : undefined)\n\t\t\tthis.createSchema = (res && res.data) || null\n\t\t},\n\n\t\t/**\n\t\t * Load the schema when, and only when, a column heading needs it.\n\t\t *\n\t\t * A widget whose every column carries its own `label` never makes this\n\t\t * request. One that gave bare keys does, because the alternative is\n\t\t * printing the key at the user.\n\t\t *\n\t\t * Failure is deliberately silent: an unreachable schema costs the nicer\n\t\t * heading, and the column still renders under its key. It must never\n\t\t * cost the list itself.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadHeadingsIfNeeded() {\n\t\t\tconst cols = Array.isArray(this.content.columns) ? this.content.columns : []\n\t\t\tconst needsHeadings = cols.some((c) => (typeof c === 'string') || !c.label)\n\t\t\tif (needsHeadings === false) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.ensureSchema()\n\t\t\t} catch {\n\t\t\t\t// Headings only. Swallowed on purpose; see the docblock.\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Persist the create-dialog form: the resolved scalar filter values\n\t\t * are merged in as defaults (an FK-scoped list creates PRE-LINKED\n\t\t * children — a task added on a case detail already carries the case).\n\t\t *\n\t\t * @param {object} formData Confirmed form values.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onCreateConfirm(formData) {\n\t\t\tconst c = this.content || {}\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst payload = { ...formData }\n\t\t\t\tconst filter = this.resolvedFilter || {}\n\t\t\t\tfor (const [k, v] of Object.entries(filter)) {\n\t\t\t\t\tif (v && typeof v !== 'object' && (payload[k] === undefined || payload[k] === null || payload[k] === '')) {\n\t\t\t\t\t\tpayload[k] = v\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', { register: c.register, schema: c.schema })\n\t\t\t\tawait axios.post(url, payload)\n\t\t\t\tif (this.$refs.createDialog) {\n\t\t\t\t\tthis.$refs.createDialog.setResult({ success: true })\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\t * @event created Emitted after a successful create with the sent payload.\n\t\t\t\t * @type {object}\n\t\t\t\t */\n\t\t\t\tthis.$emit('created', payload)\n\t\t\t\tthis.fetchRows()\n\t\t\t} catch (e) {\n\t\t\t\tif (this.$refs.createDialog) {\n\t\t\t\t\tthis.$refs.createDialog.setResult({ error: (e && e.message) || 'error' })\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Pager click — refetch that page from the server. Paging is never\n\t\t * client-side over an already-capped window: that would silently drop\n\t\t * every row past the cap while still displaying a total that counted\n\t\t * them.\n\t\t *\n\t\t * @param {number} next The 1-based page to load.\n\t\t * @return {void}\n\t\t */\n\t\tonPageChange(next) {\n\t\t\tconst target = Math.min(Math.max(Number(next) || 1, 1), this.totalPages)\n\t\t\tif (target === this.page) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.page = target\n\t\t\tthis.fetchRows()\n\t\t},\n\n\t\t/**\n\t\t * \"View all (N)\" footer click: emits `view-all` and, when the content\n\t\t * blob names a `viewAllRoute`, navigates there with `viewAllQuery`\n\t\t * (its values token-resolved, so `{\"case\": \"@objectId\"}` carries the\n\t\t * current object scope into the target index page). A modified click\n\t\t * on the link is left to the browser.\n\t\t *\n\t\t * @param {MouseEvent} [event] The click event.\n\t\t * @return {void}\n\t\t */\n\t\tonViewAll(event) {\n\t\t\t/**\n\t\t\t * @event view-all Emitted when the \"View all (N)\" footer is clicked.\n\t\t\t * @type {{ total: number }}\n\t\t\t */\n\t\t\tthis.$emit('view-all', { total: this.total })\n\t\t\tif (this.viewAllLocation) {\n\t\t\t\tfollowLinkClick(event, this.viewAllLocation, this.$router)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Navigate to a configured detail route on row click (when `rowRoute`\n\t\t * is set and a router is available); a ctrl/cmd/shift or middle click\n\t\t * opens it in a new tab.\n\t\t *\n\t\t * @param {object} row The clicked object row.\n\t\t * @param {MouseEvent} [event] The originating click/auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowClick(row, event) {\n\t\t\tconst route = this.content.rowRoute\n\t\t\tconst id = row && (row.id || (row['@self'] && row['@self'].id))\n\t\t\tif (route && id && this.$router) {\n\t\t\t\tmarkNewTabHandled(event, openRowTarget(event, { name: route, params: { id } }, this.$router))\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event row-click Emitted with the clicked object (for hosts that\n\t\t\t * want to handle navigation themselves), on a click or middle click.\n\t\t\t * Payload: `(row, event)`, the second being the native click/auxclick\n\t\t\t * event.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('row-click', row, event)\n\t\t},\n\n\t\t/**\n\t\t * Dispatch one declared row action. A `handler` action gets the row\n\t\t * appended as its last argument, the same convention CnWidgetObjectTable\n\t\t * uses, so a registry function reads its row from where it already\n\t\t * expects one. An `open-modal` action gets the row merged onto its\n\t\t * `props` as `row` — mirroring how a drop hands a modal `props.files`\n\t\t * and a bulk action hands it `props.selectedIds` — because a \"Versions\"\n\t\t * or \"Delete\" row action is meaningless without knowing WHICH row it\n\t\t * was clicked on, and `open-modal`'s `action.props` is forwarded\n\t\t * verbatim otherwise (it carries no per-click information at all).\n\t\t *\n\t\t * @param {object} action The declared action.\n\t\t * @param {object|null} row The row the action was triggered on.\n\t\t * @return {void}\n\t\t */\n\t\trunRowAction(action, row) {\n\t\t\tthis.dispatch(action, [row], { row })\n\t\t},\n\n\t\t/**\n\t\t * Link fields for a declared row action that only navigates, so\n\t\t * CnRowActions renders it as a link. A target with tokens is left to\n\t\t * dispatch, which resolves them against the page.\n\t\t *\n\t\t * @param {object} action The declared row action.\n\t\t * @return {object} `{ href, linkTarget }`, `{ to }`, or `{}`.\n\t\t */\n\t\trowActionLink(action) {\n\t\t\tconst target = typeof action.target === 'string' ? action.target : ''\n\t\t\tif (/[@{]/.test(target)) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\tconst link = actionLink(action, { router: this.$router || null })\n\t\t\tif (!link) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn link.external ? { href: link.href, linkTarget: '_blank' } : { to: link.to }\n\t\t},\n\n\t\t/**\n\t\t * Dispatch a declared action through the page's pre-bound dispatcher,\n\t\t * falling back to a bare `dispatchAction` when this widget is mounted\n\t\t * outside a CnPageRenderer tree.\n\t\t *\n\t\t * `extraArgs` is appended to a `handler` action's `args`; it is NOT\n\t\t * merged into any other type, because only `handler` has an argument\n\t\t * list. A drop's `File[]` additionally rides an `open-modal` action's\n\t\t * `props.files`, since that is how a modal receives anything at all.\n\t\t *\n\t\t * @param {object} action The declared action.\n\t\t * @param {Array} extraArgs Arguments appended for a `handler` action.\n\t\t * @param {object} extraProps Props merged for an `open-modal` action.\n\t\t * @return {void}\n\t\t */\n\t\tdispatch(action, extraArgs = [], extraProps = {}) {\n\t\t\tif (!action || typeof action !== 'object') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst type = action.type || 'handler'\n\t\t\tlet wrapped = action\n\t\t\tif (type === 'handler') {\n\t\t\t\twrapped = { ...action, args: [...(action.args || []), ...extraArgs] }\n\t\t\t} else if (type === 'open-modal' && Object.keys(extraProps).length > 0) {\n\t\t\t\twrapped = { ...action, props: { ...(action.props || {}), ...extraProps } }\n\t\t\t}\n\t\t\tif (typeof this.cnDispatchAction === 'function') {\n\t\t\t\tthis.cnDispatchAction(wrapped)\n\t\t\t} else {\n\t\t\t\tdispatchAction(wrapped, { router: this.$router || null })\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether a drag event is carrying files. A drag of text or of a row\n\t\t * from another table is not a file drop and must not paint the\n\t\t * overlay; `dataTransfer.types` is the only thing readable during a\n\t\t * dragover (the items themselves are not).\n\t\t *\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {boolean}\n\t\t */\n\t\tdragHasFiles(event) {\n\t\t\tconst types = event && event.dataTransfer && event.dataTransfer.types\n\t\t\tif (!types) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn Array.prototype.indexOf.call(types, 'Files') !== -1\n\t\t},\n\n\t\t/**\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonDragEnter(event) {\n\t\t\tif (!this.dropZoneAction || !this.dragHasFiles(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.dragDepth += 1\n\t\t},\n\n\t\t/**\n\t\t * `dragover` must preventDefault or the browser refuses the drop and\n\t\t * navigates to the file instead.\n\t\t *\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonDragOver(event) {\n\t\t\tif (!this.dropZoneAction || !this.dragHasFiles(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t},\n\n\t\t/**\n\t\t * Leaving one element of the widget. The event is not read: a\n\t\t * `dragleave` fires for the widget AND for every child crossed, so the\n\t\t * counter — not this event — decides whether the drag is still over us.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonDragLeave() {\n\t\t\tif (!this.dropZoneAction) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.dragDepth = Math.max(0, this.dragDepth - 1)\n\t\t},\n\n\t\t/**\n\t\t * Hand the dropped files to the declared `dropZone` action. Nothing is\n\t\t * uploaded here: this component reads no file content and calls no\n\t\t * write endpoint, so whoever receives the files decides where they go\n\t\t * — the same split the form file field keeps.\n\t\t *\n\t\t * @param {DragEvent} event The drop event.\n\t\t * @return {void}\n\t\t */\n\t\tonDrop(event) {\n\t\t\tif (!this.dropZoneAction) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this.dragHasFiles(event)) {\n\t\t\t\tthis.dragDepth = 0\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.dragDepth = 0\n\t\t\tconst files = Array.from((event.dataTransfer && event.dataTransfer.files) || [])\n\t\t\tif (files.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event files-dropped Emitted with the dropped files, for a host\n\t\t\t * that wants to handle the drop itself rather than declare an action.\n\t\t\t * @type {Array<File>}\n\t\t\t */\n\t\t\tthis.$emit('files-dropped', files)\n\t\t\tthis.dispatch(this.dropZoneAction, [files], { files })\n\t\t},\n\n\t\t/**\n\t\t * Open the native file picker for the click-to-upload button — the\n\t\t * same `dropZoneAction` a drop dispatches, so a reader who never drags\n\t\t * a file reaches the identical outcome.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\ttriggerUpload() {\n\t\t\tif (this.$refs.uploadInput) {\n\t\t\t\tthis.$refs.uploadInput.click()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle files chosen via the upload button's file picker.\n\t\t *\n\t\t * @param {Event} event The change event.\n\t\t * @return {void}\n\t\t */\n\t\tonUploadFilesSelected(event) {\n\t\t\tconst files = Array.from((event.target && event.target.files) || [])\n\t\t\tif (files.length === 0 || !this.dropZoneAction) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$emit('files-dropped', files)\n\t\t\tthis.dispatch(this.dropZoneAction, [files], { files })\n\t\t\tevent.target.value = ''\n\t\t},\n\n\t\t/**\n\t\t * CnDataTable's `select` handler — replaces the whole selected-ids\n\t\t * array (it already computed the add/remove/select-all arithmetic).\n\t\t *\n\t\t * @param {Array<string>} ids The new selection.\n\t\t * @return {void}\n\t\t */\n\t\tonSelect(ids) {\n\t\t\tthis.selectedIds = Array.isArray(ids) ? ids : []\n\t\t},\n\n\t\t/**\n\t\t * Clear the current selection. Called after a bulk action fires, and\n\t\t * from the bulk bar's own \"Clear selection\" button.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tclearSelection() {\n\t\t\tthis.selectedIds = []\n\t\t},\n\n\t\t/**\n\t\t * Dispatch a declared bulk action against the current selection, then\n\t\t * clear it — the action owns its own success/error feedback and page\n\t\t * refresh (same convention as a row action), this widget only owns the\n\t\t * checkbox state.\n\t\t *\n\t\t * @param {object} action The declared bulk action.\n\t\t * @return {void}\n\t\t */\n\t\trunBulkAction(action) {\n\t\t\tthis.dispatch(action, [this.selectedRows], { selectedIds: [...this.selectedIds] })\n\t\t\tthis.clearSelection()\n\t\t},\n\n\t\t/**\n\t\t * CnDataTable's `sort` handler for an interactively-sortable column\n\t\t * (`content.sortable`). Overwrites `localSort`, which both the fetch\n\t\t * params and the table's own sort-indicator props read — a cleared\n\t\t * sort (`key: null`, a third click on a two-state header) goes back to\n\t\t * the unordered default rather than sticking on the last field.\n\t\t *\n\t\t * @param {{key: string|null, order: string|null}} payload The new sort.\n\t\t * @return {void}\n\t\t */\n\t\tonSort({ key, order }) {\n\t\t\tthis.localSort = key ? { field: key, dir: order || 'asc' } : {}\n\t\t},\n\n\t\t/**\n\t\t * Toggle one facet value on/off (`content.facet`).\n\t\t *\n\t\t * @param {string} value The facet value clicked.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleFacetValue(value) {\n\t\t\tconst index = this.facetSelected.indexOf(value)\n\t\t\tif (index === -1) {\n\t\t\t\tthis.facetSelected = [...this.facetSelected, value]\n\t\t\t} else {\n\t\t\t\tthis.facetSelected = this.facetSelected.filter((v) => v !== value)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Clear the facet filter, so every loaded row shows again.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tclearFacet() {\n\t\t\tthis.facetSelected = []\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n/* The widget already lives inside CnWidgetWrapper's padded card chrome. The\n table is rendered `borderless` so CnDataTable drops its own border/shadow/\n background AND its bottom margin (the `.cn-table-container--borderless`\n modifier) — otherwise it reads as a card-in-a-card with dead space below.\n Horizontal overflow is owned by `.cn-table-container` (overflow-x: auto); a\n second scroll container here would produce a nested scrollbar, so this host\n stays plain. */\n.cn-object-list-widget {\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-height: 0;\n}\n\n/* The overlay covers the widget while a file drag is over it. `position:\n relative` is set only in the dropping state so a widget without a drop zone\n keeps the containing block it had — an unconditional rule here would\n re-parent any absolutely-positioned descendant a host has placed. */\n.cn-object-list-widget--dropping {\n\tposition: relative;\n}\n\n.cn-object-list-widget__drop-overlay {\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 2;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttext-align: center;\n\tpadding: var(--cn-spacing-m, 12px);\n\tborder: 2px dashed var(--color-primary-element);\n\tborder-radius: var(--border-radius-large, 12px);\n\tbackground-color: var(--color-primary-element-light);\n\tcolor: var(--color-main-text);\n\t/* The overlay is a painted state, not a target: letting it swallow the\n\t pointer would fire dragleave the instant it appeared under the cursor,\n\t and the drop would land on nothing. */\n\tpointer-events: none;\n}\n\n.cn-object-list-widget__table {\n\tflex: 1 1 auto;\n\tmin-height: 0;\n\toverflow: hidden;\n}\n\n/* The empty state is CnWidgetEmptyState now — it brings its own layout, so\n all this rule still owns is letting it claim the cell's leftover height\n (ADR-062: it fits the cell, it never forces one). */\n.cn-object-list-widget__empty {\n\tflex: 1 1 auto;\n\tmin-height: 0;\n}\n\n/* The pager sits flush at the bottom of the card, above \"View all\". */\n.cn-object-list-widget__pager {\n\tflex-shrink: 0;\n}\n\n.cn-object-list-widget__view-all {\n\talign-self: flex-start;\n\tbackground: none;\n\tborder: none;\n\tcolor: var(--color-primary-element);\n\tcursor: pointer;\n\tfont: inherit;\n\tmargin-top: 4px;\n\tpadding: 4px;\n\ttext-decoration: none;\n}\n\n.cn-object-list-widget__view-all:hover,\n.cn-object-list-widget__view-all:focus-visible {\n\ttext-decoration: underline;\n}\n\n.cn-object-list-widget__more {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tmargin: 4px 0 0;\n\tpadding: 4px;\n}\n\n/* Footer Add — same pattern as the integration leaves' footer action\n (\"Open in Calendar\"): full-width, centered, divider-topped, pinned to\n the card bottom. */\n.cn-object-list-widget__add {\n\talign-self: stretch;\n\tborder-top: 1px solid var(--color-border);\n\t/* Bleed through the host card's 16px content padding so the divider\n\t spans edge-to-edge, exactly like the integration leaves' footer. */\n\tmargin: auto -16px -16px;\n\tpadding: 4px;\n}\n\n.cn-object-list-widget__error {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tmargin: 4px 0 0;\n}\n\n.cn-object-list-widget__prompt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-style: italic;\n\tpadding: 16px 4px;\n\tmargin: 0;\n\ttext-align: center;\n}\n\n.cn-object-list-widget__facet {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: 6px;\n\tpadding: 0 4px 8px;\n}\n\n.cn-object-list-widget__facet-label {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tfont-weight: 600;\n}\n\n.cn-object-list-widget__facet-chip {\n\tbackground-color: var(--color-background-hover);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-pill, 16px);\n\tcolor: var(--color-main-text);\n\tcursor: pointer;\n\tfont: inherit;\n\tfont-size: 0.85em;\n\tpadding: 2px 10px;\n}\n\n.cn-object-list-widget__facet-chip--active {\n\tbackground-color: var(--color-primary-element-light);\n\tborder-color: var(--color-primary-element);\n\tcolor: var(--color-primary-element-text, var(--color-main-text));\n}\n\n.cn-object-list-widget__facet-clear,\n.cn-object-list-widget__bulk-clear {\n\tbackground: none;\n\tborder: none;\n\tcolor: var(--color-primary-element);\n\tcursor: pointer;\n\tfont: inherit;\n\tfont-size: 0.85em;\n\tpadding: 2px 4px;\n}\n\n.cn-object-list-widget__facet-clear:hover,\n.cn-object-list-widget__bulk-clear:hover {\n\ttext-decoration: underline;\n}\n\n.cn-object-list-widget__bulk-bar {\n\talign-items: center;\n\tbackground-color: var(--color-primary-element-light);\n\tborder-radius: var(--border-radius, 8px);\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n\tmargin: 0 0 8px;\n\tpadding: 6px 10px;\n}\n\n.cn-object-list-widget__bulk-count {\n\tfont-weight: 600;\n}\n\n.cn-object-list-widget__bulk-action {\n\tbackground-color: var(--color-main-background);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius, 8px);\n\tcursor: pointer;\n\tfont: inherit;\n\tpadding: 4px 10px;\n}\n\n.cn-object-list-widget__bulk-action--destructive {\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n\n.cn-object-list-widget__groups {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n\tmin-height: 0;\n\toverflow: auto;\n}\n\n.cn-object-list-widget__group-heading {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tfont-weight: 600;\n\tmargin: 0 0 4px;\n\ttext-transform: uppercase;\n}\n\n.cn-object-list-widget__upload {\n\tbackground-color: var(--color-main-background);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius, 8px);\n\tcursor: pointer;\n\tfont: inherit;\n\tmargin: 8px 0 0;\n\tpadding: 6px 12px;\n}\n\n.cn-object-list-widget__upload-input {\n\tdisplay: none;\n}\n</style>\n"],"names":["CnDataTable","CnFormDialog","CnPagination","CnWidgetEmptyState","CnRowActions","CnFkResolveCell","t"],"mappings":";;;;;;;;;;;;;;;;AAuSA;AACC;AACA;AACA;;AAED,MAAM,oBAAqB,GAAE,kBAAgB;;AAE7C;AACC;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAED,aAAe;CACd,IAAI,EAAE,oBAAoB;;CAE1B,UAAU,EAAE,eAAEA,UAAW,gBAAEC,YAAY,gBAAEC,YAAY,sBAAEC,YAAkB,gBAAEC,YAAY,mBAAEC,YAAe,EAAE,QAAQ,EAAE,IAAG,EAAG;;AAE1H,CAAA,MAAM,EAAE;AACP;;;;;;AAMA,EAAA,eAAe,EAAE,EAAE,OAAO,EAAE,IAAG,EAAG;AAClC;;;;;;AAMC;;AAED,EAAA,kBAAkB,EAAE,EAAE,OAAO,EAAE,MAAM;AACrC;AACC;;;AAGA;AACA;;AAED,EAAA,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,KAAK,KAAK;AAC5C;;;;;;;AAOA,EAAA,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM;EACnC;;AAED,CAAA,KAAK,EAAE;AACN;;;;AAIC;AACA;;;;;;;;AAQA;;;;;;;;;AASA;;;;;;;;;;AAUA;;;;;;;AAOA;;;;AAIA;;;;;AAKA;AACA;;;AAGD,EAAA,OAAO,EAAE;GACR,IAAI,EAAE,MAAM;AACZ,GAAA,OAAO,EAAE,OAAO,EAAE,CAAC;GACnB;EACD;;CAED,KAAK,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,CAAC;;AAE5D,CAAA,IAAI,GAAG;AACN,EAAA,OAAO;AACN,GAAA,IAAI,EAAE,EAAE;GACR,OAAO,EAAE,KAAK;AACd,GAAA,KAAK,EAAE,EAAE;;AAET,GAAA,KAAK,EAAE,CAAC;;AAER,GAAA,IAAI,EAAE,CAAC;;GAEP,OAAO,EAAE,IAAI;AACb;AACA,GAAA,UAAU,EAAE,KAAK;AACjB;AACC;AACA;;;AAGA;;AAED,GAAA,YAAY,EAAE,IAAI;AAClB;;;;;;GAMA,SAAS,EAAE,CAAC;;AAEZ,GAAA,WAAW,EAAE,EAAE;AACf;;;;;;AAMA,GAAA,SAAS,EAAE,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG;;AAE3C,GAAA,aAAa,EAAE,EAAE;AAClB,GAAA;EACA;;AAED,CAAA,QAAQ,EAAE;AACT;;AAEC;AACA;AACA;;EAED,SAAS,GAAG;GACX,MAAM,CAAA,GAAI,IAAI,CAAC,gBAAc;AAC7B,GAAA,IAAI,CAAC,CAAC,EAAE;AACP,IAAA,OAAO,IAAG;AACX,IAAA;GACA,OAAO,CAAC,OAAO,CAAA,KAAM,QAAS,IAAG,OAAQ,IAAG,CAAC,IAAI,CAAC,CAAC,KAAI,GAAI,CAAA;GAC3D;;AAED;;;;AAIC;AACA;;AAED,EAAA,YAAY,GAAG;GACd,MAAM,CAAA,GAAI,IAAI,CAAC,mBAAiB;AAChC,GAAA,IAAI,CAAC,CAAC,EAAE;AACP,IAAA,OAAO,IAAG;AACX,IAAA;GACA,OAAO,CAAC,OAAO,CAAA,KAAM,QAAS,IAAG,OAAQ,IAAG,CAAC,IAAI,CAAC,CAAC,KAAI,GAAI,CAAA;GAC3D;;AAED;;;AAGC;AACA;;EAED,QAAQ,GAAG;GACV,MAAM,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAU,EAAA,GAAI,GAAC;AACvD,GAAA,IAAI,CAAC,SAAQ,GAAI,IAAI,CAAC,YAAa,IAAG,GAAC;AACvC,GAAA,OAAO,IAAG;GACV;;AAED;;;;AAIC;AACA;AACA;AACA;;AAED,EAAA,cAAc,GAAG;AAChB,GAAA,OAAO,sBAAsB,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;GAC3F;;AAED;AACC;;;AAGA;AACA;;AAED,EAAA,iBAAiB,GAAG;AACnB,GAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAA;GAC9C;;AAED;;;;;;;AAOC;AACA;;EAED,UAAU,GAAG;GACZ,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACxB,IAAA,MAAM,EAAC,GAAI,OAAO,IAAI,CAAC,WAAU,KAAM,UAAS,GAAI,IAAI,CAAC,WAAU,GAAI,CAAC,CAAC,KAAK,EAAA;IAC9E,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;AAC9B,IAAA;AACA,GAAA,OAAO,IAAI,CAAC,SAAQ;AACnB,MAAEC,SAAC,CAAC,eAAe,EAAE,kBAAkB,CAAA;MACrCA,SAAC,CAAC,eAAe,EAAE,uCAAuC,CAAA;GAC7D;;AAED;;;AAGC;AACA;;AAED,EAAA,cAAc,GAAG;AAChB,GAAA,OAAO,IAAI,CAAC,OAAO,CAAC,SAAU,IAAGA,SAAC,CAAC,eAAe,EAAE,8BAA8B,CAAA;GAClF;;AAED;AACC;;;;;;;AAOA;;;AAGA;;AAEA;;;;;;;;AAQD,EAAA,eAAe,GAAG;AACjB,GAAA,MAAM,IAAG,GAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAE,GAAE,IAAI,CAAC,OAAO,CAAC,OAAM,GAAI,GAAC;AAC3E,GAAA,MAAM,cAAe,GAAE,IAAI,CAAC,OAAO,CAAC,SAAO;;;;;;;AAO3C,GAAA,MAAM,KAAM,GAAE,CAAC,IAAI,CAAC,YAAW,IAAK,IAAI,CAAC,YAAY,CAAC,UAAU,KAAK,GAAC;GACtE,MAAM,aAAa,CAAC,GAAG,KAAK;AAC3B,IAAA,MAAM,IAAG,GAAI,KAAK,CAAC,GAAG,EAAA;AACtB,IAAA,MAAM,KAAM,GAAE,IAAG,IAAK,OAAO,IAAI,CAAC,KAAM,KAAI,QAAO,GAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAC,GAAI,GAAC;IAC5E,OAAO,KAAM,KAAI,EAAG,GAAE,KAAI,GAAI,GAAE;AACjC,KAAA;GACA,MAAM,MAAK,GAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;IAC9B,IAAI,OAAO,CAAE,KAAI,QAAQ,EAAE;AAC1B,KAAA,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAE,EAAA;AACvC,KAAA;IACA,MAAM,GAAE,GAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,GAAG,CAAE,GAAA;IAC9D,KAAK,MAAM,CAAE,IAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE;AAC7H,KAAA,IAAI,CAAC,CAAC,CAAC,CAAA,KAAM,SAAS,EAAE;MACvB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAA;AACb,MAAA;AACD,KAAA;;;;;;IAMA,IAAI,GAAG,CAAC,QAAS,KAAI,SAAU,IAAG,mBAAmB,SAAS,EAAE;AAC/D,KAAA,GAAG,CAAC,QAAS,GAAE,cAAa,KAAM,IAAG;AACpC,UAAI,KAAK,CAAC,OAAO,CAAC,cAAc,CAAE,IAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAA;AACvE,KAAA;AACA,IAAA,OAAO,GAAE;IACT,EAAA;;AAED;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,GAAA,IAAI,IAAI,CAAC,IAAI,CAAC,MAAK,GAAI,CAAA,IAAK,MAAM,CAAC,MAAO,GAAE,CAAC,EAAE;AAC9C,IAAA,MAAM,WAAW,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,SAAS,CAAC,EAAA;AACnG,IAAA,IAAI,QAAS,KAAI,KAAK,EAAE;KACvB,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,MAAM,CAAA,EAAG,CAAA;AAC3D,KAAA;AACD,IAAA;GACA,OAAO,MAAK;GACZ;;AAED;;;;;;AAMC;;;AAGD,EAAA,gBAAgB,GAAG;AAClB,GAAA,MAAM,QAAS,GAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,UAAS,GAAI,GAAC;GACrF,OAAO,QAAO;AACb,KAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA,IAAK,OAAO,CAAA,KAAM,QAAQ,CAAA;AACzC,KAAC,GAAG,CAAC,CAAC,MAAM,MAAM;AACjB,KAAA,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,KAAA,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,KAAA,WAAW,EAAE,MAAM,CAAC,WAAU,KAAM,IAAI;;KAExC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC7B,KAAA,OAAO,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC;AACjD,KAAC,CAAC,CAAA;GACH;;AAED;;;AAGC;AACA;;AAED,EAAA,cAAc,GAAG;GAChB,MAAM,EAAG,GAAE,IAAI,CAAC,OAAO,CAAC,SAAO;AAC/B,GAAA,OAAO,CAAC,EAAC,IAAK,OAAO,EAAC,KAAM,QAAQ,IAAI,EAAC,GAAI,IAAG;GAChD;;;EAGD,QAAQ,GAAG;GACV,OAAO,IAAI,CAAC,mBAAmB,IAAK,IAAG,IAAI,CAAC,SAAQ,GAAI,CAAA;GACxD;;AAED;EACA,SAAS,GAAG;GACX,OAAO,CAAC,IAAI,CAAC,cAAa,IAAK,IAAI,CAAC,cAAc,CAAC,KAAK;AACvD,OAAGA,SAAC,CAAC,eAAe,EAAE,iBAAiB,CAAA;GACxC;;AAED;;;AAGC;AACA;;AAED,EAAA,gBAAgB,GAAG;GAClB,OAAO,IAAI,CAAC,cAAe,KAAI,IAAK,IAAG,IAAI,CAAC,OAAO,CAAC,MAAK,KAAM,KAAI;GACnE;;AAED;EACA,WAAW,GAAG;GACb,OAAO,IAAI,CAAC,OAAO,CAAC,eAAeA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAA;GAC9D;;AAED;;;;;;AAMC;;;AAGD,EAAA,iBAAiB,GAAG;AACnB,GAAA,MAAM,QAAS,GAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,WAAU,GAAI,GAAC;GACvF,OAAO,QAAO;AACb,KAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA,IAAK,OAAO,CAAA,KAAM,QAAQ,CAAA;AACzC,KAAC,GAAG,CAAC,CAAC,MAAM,MAAM;AACjB,KAAA,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,KAAA,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,KAAA,WAAW,EAAE,MAAM,CAAC,WAAU,KAAM,IAAI;AACxC,KAAA,OAAO,EAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1C,KAAC,CAAC,CAAA;GACH;;AAED;;;;AAIC;;;AAGD,EAAA,YAAY,GAAG;AACd,GAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;GAClE;;AAED;;;;AAIC;AACA;;;AAGD,EAAA,YAAY,GAAG;GACd,MAAM,KAAI,GAAI,IAAI,CAAC,OAAO,CAAC,MAAI;GAC/B,IAAI,CAAC,KAAM,IAAG,CAAC,KAAK,CAAC,KAAK,EAAE;AAC3B,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,MAAM,MAAK,GAAI,IAAI,GAAG,GAAC;AACvB,GAAA,KAAK,MAAM,GAAI,IAAG,IAAI,CAAC,WAAW,EAAE;AACnC,IAAA,MAAM,GAAI,GAAE,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAA;AAC7C,IAAA,MAAM,IAAG,GAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAE,GAAE,OAAO,GAAE,KAAM,SAAU,IAAG,GAAI,KAAI,IAAK,IAAG,GAAI,KAAI,EAAG,GAAE,CAAC,GAAG,CAAE,GAAE,EAAE,EAAA;AACrG,IAAA,KAAK,MAAM,CAAA,IAAK,IAAI,EAAE;AACrB,KAAA,IAAI,CAAE,KAAI,SAAU,IAAG,CAAA,KAAM,IAAG,IAAK,MAAM,EAAE,EAAE;MAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAA;AACb,MAAA;AACD,KAAA;AACD,IAAA;AACA,GAAA,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAC;GAC/B;;AAED;EACA,UAAU,GAAG;GACZ,MAAM,KAAI,GAAI,IAAI,CAAC,OAAO,CAAC,MAAI;GAC/B,OAAO,CAAC,KAAM,IAAG,KAAK,CAAC,KAAK,KAAKA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAA;GAC5D;;AAED;;;;AAIC;;;EAGD,WAAW,GAAG;GACb,MAAM,KAAI,GAAI,IAAI,CAAC,OAAO,CAAC,MAAI;GAC/B,IAAI,CAAC,KAAI,IAAK,CAAC,KAAK,CAAC,KAAI,IAAK,IAAI,CAAC,aAAa,CAAC,MAAK,KAAM,CAAC,EAAE;AAC9D,IAAA,OAAO,IAAI,CAAC,WAAU;AACvB,IAAA;AACA,GAAA,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;AACvC,IAAA,MAAM,GAAI,GAAE,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,EAAA;AAC7C,IAAA,MAAM,IAAK,GAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAA,GAAI,GAAE,IAAK,GAAE,KAAM,SAAU,IAAG,GAAI,KAAI,IAAK,GAAE,CAAC,GAAG,CAAE,GAAE,EAAE,EAAA;IACvF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IACtD,CAAA;GACD;;AAED;;;;AAIC;AACA;;EAED,qBAAqB,GAAG;GACvB,OAAO,CAAC,IAAI,CAAC,OAAQ,IAAG,IAAI,CAAC,IAAI,CAAC,MAAO,GAAE,KAAK,IAAI,CAAC,aAAa,CAAC,MAAK,GAAI,CAAE,IAAG,IAAI,CAAC,WAAW,CAAC,MAAK,KAAM,CAAA;GAC7G;;AAED;EACA,SAAS,GAAG;AACX,GAAA,OAAO,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,QAAO,IAAK,IAAI,CAAC,OAAO,CAAC,OAAM,KAAM,EAAC;GAC7E;;AAED;AACC;;;;;;AAMA;AACA;;EAED,uBAAuB,GAAG;AACzB,GAAA,MAAM,GAAI,GAAE,IAAI,CAAC,OAAO,CAAC,kBAAgB;AACzC,GAAA,OAAO,CAAC,GAAI,IAAG,OAAO,GAAI,KAAI,QAAS,IAAG,GAAG,CAAC,QAAS,IAAG,GAAG,CAAC,MAAM,IAAI,GAAE,GAAI,IAAG;GACjF;;AAED;;;;;;;AAOC;;;EAGD,WAAW,GAAG;AACb,GAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;AACpB,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,OAAO,CAAC,QAAM;AACjC,GAAA,MAAM,UAAW,GAAE,IAAI,CAAC,OAAO,CAAC,UAAW,IAAG,MAAI;GAClD,MAAM,KAAM,GAAE,GAAC;AACf,GAAA,MAAM,KAAM,GAAE,IAAI,GAAG,GAAC;AACtB,GAAA,KAAK,MAAM,GAAI,IAAG,IAAI,CAAC,WAAW,EAAE;AACnC,IAAA,MAAM,MAAK,GAAI,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAA;AAC1C,IAAA,MAAM,GAAI,GAAE,CAAC,MAAO,IAAG,OAAO,MAAO,KAAI,QAAQ;AAChD,QAAG,MAAM,CAAC,EAAG,IAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;AACtC,OAAE,MAAM,CAAC,MAAK,IAAK,EAAE,EAAA;AACtB,IAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACpB,KAAA,MAAM,QAAO,GAAI,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAA;KACjD,MAAM,KAAM,GAAE,CAAC,QAAO,IAAK,OAAO,aAAa,QAAQ;AACtD,SAAG,QAAQ,CAAC,SAAS,QAAQ,CAAC,IAAK,IAAG,GAAG;SACtC,QAAS,IAAG,OAAOA,SAAC,CAAC,eAAe,EAAE,WAAW,CAAC,EAAA;AACtD,KAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAA;AACvC,KAAA,KAAK,CAAC,IAAI,CAAC,GAAG,EAAA;AACf,KAAA;IACA,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAA;AAC7B,IAAA;AACA,GAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;GACxC;;;EAGD,SAAS,GAAG;GACX,OAAO,IAAI,CAAC,OAAO,CAAC,SAAQ,IAAKA,SAAC,CAAC,eAAe,EAAE,UAAU,CAAA;GAC9D;;AAED;;;;AAIC;AACA;AACA;;AAED,EAAA,iBAAiB,GAAG;AACnB,GAAA,MAAM,EAAC,GAAI,OAAO,IAAI,CAAC,WAAU,KAAM,UAAS,GAAI,IAAI,CAAC,WAAU,GAAI,CAAC,CAAC,KAAK,EAAA;GAC9E,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,SAAS,CAAE,GAAE,IAAI,CAAC,SAAQ;GAC1D;;AAED;;;;;AAKC;;;EAGD,WAAW,GAAG;GACb,OAAO,IAAI,CAAC,OAAQ,GAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA,GAAI,IAAI,CAAC,IAAG;GACjE;;AAED;;;;;AAKC;AACA;AACA;;EAED,QAAQ,GAAG;AACV,GAAA,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,CAAE,IAAG,EAAC;GAC9C;;AAED;;AAEC;AACA;;EAED,UAAU,GAAG;GACZ,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAM,IAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;GAC/D;;AAED;AACC;AACA;;;;;;;AAOA;AACA;;EAED,SAAS,GAAG;GACX,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE;IACzB,OAAO,KAAI;AACZ,IAAA;GACA,OAAO,IAAI,CAAC,OAAM,KAAM,IAAK,IAAG,IAAI,CAAC,OAAQ,IAAG,IAAI,CAAC,IAAI,CAAC,MAAK;GAC/D;;;AAGD,EAAA,iBAAiB,GAAG;AACnB,GAAA,OAAO,CAAC,IAAI,CAAC,iBAAgB,IAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAO,KAAI,CAAA;GACvF;;AAED;;AAEC;AACA;AACA;;EAED,WAAW,GAAG;AACb,GAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAI,IAAK,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;GAC7E;;AAED;AACA,EAAA,YAAY,GAAG;AACd,GAAA,OAAOA,SAAC,CAAC,eAAe,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAM,IAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;GACzF;;AAED;;;AAGC;AACA;;AAED,EAAA,eAAe,GAAG;AACjB,GAAA,MAAM,KAAI,GAAI,IAAI,CAAC,OAAO,CAAC,aAAW;GACtC,IAAI,CAAC,KAAK,EAAE;AACX,IAAA,OAAO,IAAG;AACX,IAAA;AACA,GAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAE,EAAA;GACjG;;AAED;;AAEC;AACA;AACA;;EAED,WAAW,GAAG;GACb,OAAO,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAA;GACrD;;AAED;EACA,SAAS,GAAG;AACX,GAAA,OAAOA,SAAC,CAAC,eAAe,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAA;GACtE;;AAED;EACA,WAAW,GAAG;GACb,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;AAC3B,GAAA,OAAO,CAAC,CAAC,WAAY,KAAI,KAAM,IAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;GACzE;;AAED;;AAEC;;;;;;;;EAQD,QAAQ,GAAG;GACV,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;GAC3B,OAAO,CAAC,CAAC,QAAS,IAAG,QAAO;GAC5B;;AAED;EACA,WAAW,GAAG;GACb,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;GAC3B,OAAO,CAAC,CAAC,WAAY,KAAI,CAAA,GAAI,CAAA,GAAI,CAAA;GACjC;;AAED;AACA,EAAA,iBAAiB,GAAG;GACnB,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;AAC3B,GAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAA,GAAI,CAAC,CAAC,iBAAgB,GAAI,IAAG;GACrE;;AAED;AACA,EAAA,iBAAiB,GAAG;GACnB,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;AAC3B,GAAA,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAE,GAAE,CAAC,CAAC,iBAAkB,GAAE,EAAC;GACnE;;AAED;AACA,EAAA,kBAAkB,GAAG;GACpB,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;AAC3B,GAAA,OAAO,CAAC,CAAC,CAAC,kBAAiB,IAAK,OAAO,CAAC,CAAC,kBAAmB,KAAI,QAAQ,IAAI,CAAC,CAAC,kBAAiB,GAAI,EAAC;GACpG;;;EAGD,QAAQ,GAAG;GACV,OAAO,IAAI,CAAC,OAAO,CAAC,YAAYA,SAAC,CAAC,eAAe,EAAE,KAAK,CAAA;GACxD;;AAED;EACA,SAAS,GAAG;GACX,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;AAC3B,GAAA,OAAO,IAAI,CAAC,SAAS,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,QAAS,IAAG,EAAE;AAC1B,IAAA,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE;;;IAGtB,MAAM,EAAE,IAAI,CAAC,cAAc;;;;IAI3B,IAAI,EAAE,IAAI,CAAC,SAAU,IAAG,EAAE;AAC1B,IAAA,KAAK,EAAE,CAAC,CAAC,KAAI,IAAK,EAAE;IACpB,QAAQ,EAAE,IAAI,CAAC,SAAU,GAAE,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI;IACzD,CAAA;GACD;EACD;;AAED,CAAA,KAAK,EAAE;EACN,SAAS,GAAG;;;;GAIX,IAAI,CAAC,OAAO,EAAA;AACZ,GAAA,IAAI,CAAC,SAAS,GAAC;GACf;;;;;;;;;;;;EAYD,kBAAkB,EAAE,WAAW;GAC9B,IAAI,CAAC,kBAAkB,GAAC;GACxB,IAAI,CAAC,oBAAoB,GAAC;GAC1B;;EAED,gBAAgB,EAAE,WAAW;GAC5B,IAAI,CAAC,kBAAkB,GAAC;GACxB,IAAI,CAAC,oBAAoB,GAAC;GAC1B;EACD;;AAED,CAAA,OAAO,GAAG;AACT,EAAA,IAAI,CAAC,SAAS,GAAC;EACf,IAAI,CAAC,oBAAoB,GAAC;;;;;;;;;;;;AAY1B,EAAA,IAAI,CAAC,cAAa,GAAI,CAAC,OAAO,KAAK;AAClC,GAAA,IAAI,IAAI,CAAC,OAAO,EAAE;IACjB,MAAK;AACN,IAAA;GACA,MAAM,IAAK,GAAE,IAAI,CAAC,SAAS,GAAC;GAC5B,OAAO,EAAE,SAAS,GAAG,IAAI,EAAA;AAC1B,IAAA;EACA,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,cAAc,EAAA;;;;AAInD,EAAA,MAAM,IAAK,GAAE,IAAI,CAAC,GAAG,CAAC,OAAM,IAAK,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAA;AAC5E,EAAA,IAAI,IAAG,IAAK,OAAO,cAAe,KAAI,WAAW,EAAE;GAClD,IAAI,CAAC,YAAa,GAAE,IAAI,cAAc,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAA;AAC9D,GAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAA;AAC/B,GAAA;AACA,EAAA,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAA;EACtC;;AAED,CAAA,aAAa,GAAG;EACf,IAAI,IAAI,CAAC,cAAc,EAAE;GACxB,WAAW,CAAC,oBAAoB,EAAE,IAAI,CAAC,cAAc,EAAA;GACrD,IAAI,CAAC,cAAe,GAAE,KAAG;AAC1B,GAAA;AACA,EAAA,IAAI,IAAI,CAAC,YAAY,EAAE;GACtB,IAAI,CAAC,YAAY,CAAC,UAAU,GAAC;AAC9B,GAAA;EACA;;AAED,CAAA,OAAO,EAAE;AACR;;;;AAIC;;;AAGD,EAAA,MAAM,SAAS,GAAG;GACjB,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;GAC3B,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE;IAC7B,IAAI,CAAC,IAAK,GAAE,GAAC;IACb,IAAI,CAAC,KAAM,GAAE,GAAC;IACd,MAAK;AACN,IAAA;AACA;;GAEA,IAAI,IAAI,CAAC,iBAAiB,EAAE;IAC3B,IAAI,CAAC,IAAK,GAAE,GAAC;IACb,IAAI,CAAC,KAAM,GAAE,GAAC;IACd,MAAK;AACN,IAAA;AACA,GAAA,IAAI,CAAC,OAAM,GAAI,KAAG;GAClB,IAAI,CAAC,KAAM,GAAE,GAAC;AACd,GAAA,IAAI;IACH,MAAM,CAAC,EAAE,OAAO,EAAE,KAAI,EAAG,EAAE,EAAE,WAAU,EAAG,CAAE,GAAE,MAAM,OAAO,CAAC,GAAG,CAAC;KAC/D,OAAO,kBAAkB,CAAC;KAC1B,OAAO,mBAAmB,CAAC;KAC3B,EAAA;AACD,IAAA,MAAM,MAAM,WAAW;KACtB,oDAAoD;AACpD,KAAA,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ;AAC3C,MAAA;;;;;AAKA;IACA,MAAM,MAAK,GAAI,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAK,GAAA;AACzD,IAAA,IAAI,IAAI,CAAC,SAAQ,IAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AAC3C,KAAA,MAAM,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,IAAK,IAAI,CAAC,SAAS,CAAC,GAAI,KAAI,MAAK,GAAI,MAAO,GAAE,KAAK,EAAA;AAC5F,KAAA;;;;;;;IAOA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE;KAC5B,MAAM,MAAO,GAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAA,KAAM,QAAS,IAAG,CAAA,KAAM,EAAE,EAAA;AACvE,KAAA,IAAI,MAAM,CAAC,MAAO,GAAE,CAAC,EAAE;AACtB,MAAA,MAAM,CAAC,OAAQ,GAAE,OAAK;AACvB,MAAA;AACD,KAAA;;;;AAIA,IAAA,MAAM,MAAK,GAAI,IAAI,CAAC,eAAa;AACjC,IAAA,IAAI,MAAO,IAAG,OAAO,MAAK,KAAM,QAAQ,EAAE;AACzC,KAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA,IAAK,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;MAC5C,IAAI,CAAE,IAAG,OAAO,MAAM,QAAQ,EAAE;AAC/B,OAAA,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACzC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAE,GAAE,GAAC;AAC1B,QAAA;AACD,OAAA,MAAO,IAAI,CAAA,KAAM,EAAC,IAAK,CAAA,KAAM,IAAK,IAAG,CAAA,KAAM,SAAS,EAAE;OACrD,MAAM,CAAC,CAAC,IAAI,EAAA;AACb,OAAA;AACD,MAAA;AACD,KAAA;AACA,IAAA,MAAM,GAAE,GAAI,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAA;IAC3C,IAAI,CAAC,OAAO,CAAC,GAAE,IAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,GAAC;AACtD,IAAA,IAAI,CAAC,KAAI,GAAI,CAAC,GAAI,IAAG,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,IAAI,CAAC,KAAI,KAAM,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAK;AACvG,IAAA,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,EAAA;AACvC,IAAA,CAAE,OAAO,CAAC,EAAE;AACX;;AAEA;IACA,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,CAAC,EAAA;AAC9D,IAAA,IAAI,CAAC,KAAM,GAAE,CAAC,CAAA,IAAK,CAAC,CAAC,OAAO,KAAK,QAAM;IACvC,IAAI,CAAC,IAAK,GAAE,GAAC;IACb,IAAI,CAAC,KAAI,GAAI,EAAA;AACd,IAAA,SAAU;AACT,IAAA,IAAI,CAAC,OAAQ,GAAE,MAAI;AACpB,IAAA;GACA;;AAED;;;;;;AAMC;;;EAGD,UAAU,GAAG;;;;;;;;AAQZ;AACA,GAAA,IAAI,IAAI,CAAC,OAAM,IAAK,IAAI,CAAC,OAAO,CAAC,GAAI,KAAI,KAAK,EAAE;AAC/C,IAAA,IAAI,CAAC,OAAM,GAAI,KAAG;IAClB,MAAK;AACN,IAAA;AACA,GAAA,MAAM,IAAG,GAAI,IAAI,CAAC,GAAI,IAAG,IAAI,CAAC,GAAG,CAAC,OAAQ,IAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,0BAA0B,EAAA;AACxF,GAAA,IAAI,CAAC,IAAI,EAAE;AACV,IAAA,IAAI,CAAC,OAAM,GAAI,KAAG;IAClB,MAAK;AACN,IAAA;AACA,GAAA,MAAM,KAAI,GAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,qCAAqC,EAAA;GAC1E,IAAI,CAAC,KAAK,EAAE;IACX,MAAK;AACN,IAAA;AACA,GAAA,MAAM,QAAS,GAAE,IAAI,CAAC,qBAAqB,GAAC;AAC5C,GAAA,MAAM,SAAU,GAAE,KAAK,CAAC,qBAAqB,GAAC;AAC9C,GAAA,MAAM,WAAW,KAAK,CAAC,aAAa,CAAC,UAAU,EAAA;AAC/C,GAAA,MAAM,IAAG,GAAI,CAAC,QAAO,IAAK,QAAQ,CAAC,qBAAqB,EAAE,CAAC,MAAM,KAAK,GAAC;AACvE,GAAA,MAAM,IAAK,GAAE,KAAK,CAAC,aAAa,CAAC,OAAO,EAAA;GACxC,MAAM,KAAM,GAAE,CAAC,IAAG,IAAK,IAAI,CAAC,qBAAqB,EAAE,CAAC,MAAM,KAAK,GAAC;;AAEhE,GAAA,MAAM,aAAY,GAAI,GAAC;GACvB,MAAM,YAAY,QAAQ,CAAC,MAAO,GAAE,SAAS,CAAC,MAAM,cAAY;AAChE,GAAA,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,IAAI,IAAI,EAAA;GACjD,IAAI,CAAC,OAAQ,GAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAA;GAC9B;;AAED;;;AAGC;;;AAGD,EAAA,kBAAkB,GAAG;AACpB,GAAA,IAAI,CAAC,eAAe,KAAG;AACvB,GAAA,IAAI,CAAC,UAAS,GAAI,MAAI;GACtB;;AAED;;;;;AAKC;;;AAGD,EAAA,MAAM,UAAU,GAAG;GAClB,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;GAC3B,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;IACd,MAAK;AACN,IAAA;AACA,GAAA,IAAI;IACH,MAAM,IAAI,CAAC,YAAY,GAAC;AACxB,IAAA,IAAI,CAAC,aAAa,KAAG;AACtB,IAAA,CAAE,OAAO,CAAC,EAAE;AACX,IAAA,IAAI,CAAC,KAAM,GAAE,CAAC,CAAA,IAAK,CAAC,CAAC,OAAO,KAAK,QAAM;AACxC,IAAA;GACA;;AAED;AACC;AACA;;;AAGA;AACA;;;AAGD,EAAA,MAAM,YAAY,GAAG;GACpB,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;AAC3B,GAAA,IAAI,IAAI,CAAC,YAAW,IAAK,CAAC,CAAC,CAAC,MAAM,EAAE;IACnC,MAAK;AACN,IAAA;;GAEA,MAAM,CAAC,EAAE,OAAO,EAAE,KAAI,EAAG,EAAE,EAAE,WAAU,EAAG,CAAE,GAAE,MAAM,OAAO,CAAC,GAAG,CAAC;IAC/D,OAAO,kBAAkB,CAAC;IAC1B,OAAO,mBAAmB,CAAC;IAC3B,EAAA;;;;;;;;;AASD,GAAA,MAAM,GAAE,GAAI,WAAW,CAAC,sCAAsC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAA;GACjF,MAAM,MAAO,GAAE,CAAC,CAAC,QAAO,GAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAO,EAAI,GAAE,UAAQ;GAC/D,MAAM,GAAE,GAAI,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,MAAO,EAAA,GAAI,SAAS,EAAA;AAChE,GAAA,IAAI,CAAC,eAAe,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,KAAG;GAC5C;;AAED;;AAEC;;;;AAIA;;;AAGA;AACA;;;EAGD,MAAM,oBAAoB,GAAG;AAC5B,GAAA,MAAM,IAAG,GAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAE,GAAE,IAAI,CAAC,OAAO,CAAC,OAAM,GAAI,GAAC;AAC3E,GAAA,MAAM,aAAc,GAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA,KAAM,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,EAAA;GAC1E,IAAI,aAAc,KAAI,KAAK,EAAE;IAC5B,MAAK;AACN,IAAA;;AAEA,GAAA,IAAI;IACH,MAAM,IAAI,CAAC,YAAY,GAAC;AACzB,IAAA,CAAE,MAAM;;AAER,IAAA;GACA;;AAED;;;;AAIC;AACA;;;AAGD,EAAA,MAAM,eAAe,CAAC,QAAQ,EAAE;GAC/B,MAAM,IAAI,IAAI,CAAC,OAAQ,IAAG,GAAC;AAC3B,GAAA,IAAI;IACH,MAAM,CAAC,EAAE,OAAO,EAAE,KAAI,EAAG,EAAE,EAAE,WAAU,EAAG,CAAE,GAAE,MAAM,OAAO,CAAC,GAAG,CAAC;KAC/D,OAAO,kBAAkB,CAAC;KAC1B,OAAO,mBAAmB,CAAC;KAC3B,EAAA;IACD,MAAM,OAAM,GAAI,EAAE,GAAG,QAAS,GAAA;AAC9B,IAAA,MAAM,MAAO,GAAE,IAAI,CAAC,cAAe,IAAG,GAAC;AACvC,IAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA,IAAK,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC5C,KAAA,IAAI,CAAA,IAAK,OAAO,MAAM,aAAa,OAAO,CAAC,CAAC,CAAA,KAAM,aAAa,OAAO,CAAC,CAAC,CAAE,KAAI,QAAQ,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;MACzG,OAAO,CAAC,CAAC,CAAA,GAAI,EAAA;AACd,MAAA;AACD,KAAA;IACA,MAAM,GAAI,GAAE,WAAW,CAAC,oDAAoD,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAK,EAAG,EAAA;IACxH,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,EAAA;IAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;KAC5B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAG,EAAG,EAAA;AACpD,KAAA;AACA;;;;IAIA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAA;AAC7B,IAAA,IAAI,CAAC,SAAS,GAAC;AAChB,IAAA,CAAE,OAAO,CAAC,EAAE;IACX,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;AAC5B,KAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAE,IAAG,CAAC,CAAC,OAAO,KAAK,SAAS,EAAA;AACzE,KAAA;AACD,IAAA;GACA;;AAED;;;;;AAKC;AACA;;;AAGD,EAAA,YAAY,CAAC,IAAI,EAAE;AAClB,GAAA,MAAM,MAAK,GAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAA,IAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAA;GACvE,IAAI,WAAW,IAAI,CAAC,IAAI,EAAE;IACzB,MAAK;AACN,IAAA;AACA,GAAA,IAAI,CAAC,IAAG,GAAI,OAAK;AACjB,GAAA,IAAI,CAAC,SAAS,GAAC;GACf;;AAED;;;;;;AAMC;AACA;;;AAGD,EAAA,SAAS,CAAC,KAAK,EAAE;AAChB;;AAEC;;AAED,GAAA,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAA;GAC5C,IAAI,IAAI,CAAC,eAAe,EAAE;IACzB,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,EAAA;AAC1D,IAAA;GACA;;AAED;;;AAGC;AACA;AACA;;;;AAID,EAAA,UAAU,CAAC,GAAG,EAAE,KAAK,EAAE;AACtB,GAAA,MAAM,KAAM,GAAE,IAAI,CAAC,OAAO,CAAC,SAAO;GAClC,MAAM,EAAG,GAAE,GAAI,KAAI,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,CAAE,IAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAA;GAC9D,IAAI,KAAM,IAAG,EAAG,IAAG,IAAI,CAAC,OAAO,EAAE;AAChC,IAAA,iBAAiB,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAG,EAAA,EAAG,EAAE,IAAI,CAAC,OAAO,CAAC,EAAA;AAC7F,IAAA;AACA;;;;AAIC;;;AAGD,GAAA,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,EAAA;GAClC;;AAED;;AAEC;;;;;;;;AAQA;AACA;;;;EAID,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE;AACzB,GAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAA;GACpC;;AAED;;;AAGC;AACA;AACA;;;AAGD,EAAA,aAAa,CAAC,MAAM,EAAE;GACrB,MAAM,MAAO,GAAE,OAAO,MAAM,CAAC,MAAO,KAAI,QAAO,GAAI,MAAM,CAAC,MAAO,GAAE,GAAC;GACpE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACxB,IAAA,OAAO,EAAC;AACT,IAAA;GACA,MAAM,IAAG,GAAI,UAAU,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAM,IAAK,IAAG,EAAG,EAAA;AAChE,GAAA,IAAI,CAAC,IAAI,EAAE;AACV,IAAA,OAAO,EAAC;AACT,IAAA;AACA,GAAA,OAAO,IAAI,CAAC,QAAS,GAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,QAAO,EAAI,GAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAG,EAAA;GACjF;;AAED;;;;AAIC;;;;;AAKA;AACA;;;;;AAKD,EAAA,QAAQ,CAAC,MAAM,EAAE,SAAU,GAAE,EAAE,EAAE,aAAa,EAAE,EAAE;AACjD,GAAA,IAAI,CAAC,MAAK,IAAK,OAAO,MAAK,KAAM,QAAQ,EAAE;IAC1C,MAAK;AACN,IAAA;AACA,GAAA,MAAM,IAAG,GAAI,MAAM,CAAC,IAAG,IAAK,UAAQ;AACpC,GAAA,IAAI,OAAM,GAAI,OAAK;AACnB,GAAA,IAAI,IAAG,KAAM,SAAS,EAAE;IACvB,OAAQ,GAAE,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,IAAG,IAAK,EAAE,CAAC,EAAE,GAAG,SAAS,CAAE,GAAA;AACrE,IAAA,MAAO,IAAI,IAAK,KAAI,YAAW,IAAK,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAK,GAAI,CAAC,EAAE;AACvE,IAAA,OAAM,GAAI,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,MAAM,CAAC,KAAM,IAAG,EAAE,CAAC,EAAE,GAAG,UAAS,EAAI,GAAA;AAC1E,IAAA;AACA,GAAA,IAAI,OAAO,IAAI,CAAC,gBAAe,KAAM,UAAU,EAAE;IAChD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAA;IAC5B,MAAK;IACN,cAAc,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAQ,IAAG,IAAG,EAAG,EAAA;AACzD,IAAA;GACA;;AAED;;;;AAIC;AACA;AACA;AACA;;AAED,EAAA,YAAY,CAAC,KAAK,EAAE;GACnB,MAAM,KAAI,GAAI,KAAI,IAAK,KAAK,CAAC,YAAW,IAAK,KAAK,CAAC,YAAY,CAAC,MAAI;GACpE,IAAI,CAAC,KAAK,EAAE;IACX,OAAO,KAAI;AACZ,IAAA;GACA,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAE,KAAI,CAAC,CAAA;GACzD;;AAED;AACC;;;AAGD,EAAA,WAAW,CAAC,KAAK,EAAE;GAClB,IAAI,CAAC,IAAI,CAAC,cAAa,IAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;IACtD,MAAK;AACN,IAAA;AACA,GAAA,KAAK,CAAC,cAAc,GAAC;AACrB,GAAA,IAAI,CAAC,SAAQ,IAAK,EAAA;GAClB;;AAED;;;AAGC;AACA;;;AAGD,EAAA,UAAU,CAAC,KAAK,EAAE;GACjB,IAAI,CAAC,IAAI,CAAC,cAAa,IAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;IACtD,MAAK;AACN,IAAA;AACA,GAAA,KAAK,CAAC,cAAc,GAAC;GACrB;;AAED;;;;AAIC;;;EAGD,WAAW,GAAG;GACb,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;IACzB,MAAK;AACN,IAAA;AACA,GAAA,IAAI,CAAC,SAAU,GAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAQ,GAAI,CAAC,EAAA;GAC/C;;AAED;;;;AAIC;AACA;AACA;;;EAGD,MAAM,CAAC,KAAK,EAAE;GACb,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;IACzB,MAAK;AACN,IAAA;GACA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE;AAC9B,IAAA,IAAI,CAAC,YAAY,EAAA;IACjB,MAAK;AACN,IAAA;AACA,GAAA,KAAK,CAAC,cAAc,GAAC;AACrB,GAAA,IAAI,CAAC,YAAY,EAAA;AACjB,GAAA,MAAM,KAAI,GAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,YAAa,IAAG,KAAK,CAAC,YAAY,CAAC,KAAK,KAAK,EAAE,EAAA;AAC/E,GAAA,IAAI,KAAK,CAAC,MAAK,KAAM,CAAC,EAAE;IACvB,MAAK;AACN,IAAA;AACA;;;AAGC;;AAED,GAAA,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,EAAA;GACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,KAAI,EAAG,EAAA;GACrD;;AAED;;;AAGC;AACA;;;AAGD,EAAA,aAAa,GAAG;GACf,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;IAC3B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,GAAC;AAC9B,IAAA;GACA;;AAED;;AAEC;AACA;;;EAGD,qBAAqB,CAAC,KAAK,EAAE;GAC5B,MAAM,KAAI,GAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAK,IAAK,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,EAAA;AACnE,GAAA,IAAI,KAAK,CAAC,MAAK,KAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE;IAC/C,MAAK;AACN,IAAA;AACA,GAAA,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,EAAA;GACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,KAAI,EAAG,EAAA;AACrD,GAAA,KAAK,CAAC,MAAM,CAAC,KAAI,GAAI,GAAC;GACtB;;AAED;;;AAGC;AACA;;;EAGD,QAAQ,CAAC,GAAG,EAAE;AACb,GAAA,IAAI,CAAC,WAAY,GAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAE,GAAE,GAAE,GAAI,GAAC;GAC/C;;AAED;;AAEC;AACA;;;AAGD,EAAA,cAAc,GAAG;AAChB,GAAA,IAAI,CAAC,WAAU,GAAI,GAAC;GACpB;;AAED;;;;AAIC;AACA;AACA;;;AAGD,EAAA,aAAa,CAAC,MAAM,EAAE;AACrB,GAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,EAAA;AACjF,GAAA,IAAI,CAAC,cAAc,GAAC;GACpB;;AAED;;;;;;AAMC;;;;AAID,EAAA,MAAM,CAAC,EAAE,GAAG,EAAE,KAAI,EAAG,EAAE;GACtB,IAAI,CAAC,SAAQ,GAAI,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,KAAM,IAAG,KAAI,EAAI,GAAE,GAAC;GAC9D;;AAED;AACC;AACA;AACA;;;EAGD,gBAAgB,CAAC,KAAK,EAAE;AACvB,GAAA,MAAM,KAAI,GAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,EAAA;AAC9C,GAAA,IAAI,KAAM,KAAI,CAAC,CAAC,EAAE;IACjB,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,EAAA;IACjD,MAAK;IACN,IAAI,CAAC,aAAc,GAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAE,KAAI,KAAK,EAAA;AAClE,IAAA;GACA;;AAED;;AAEC;;;EAGD,UAAU,GAAG;AACZ,GAAA,IAAI,CAAC,aAAY,GAAI,GAAC;GACtB;EACD;AACF;;;;"}
1
+ {"version":3,"file":"CnObjectListWidget.vue2.js","sources":["../../../../src/components/CnObjectListWidget/CnObjectListWidget.vue"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div\n\t\tclass=\"cn-object-list-widget\"\n\t\t:class=\"{ 'cn-object-list-widget--dropping': dropping }\"\n\t\t@dragenter=\"onDragEnter\"\n\t\t@dragover=\"onDragOver\"\n\t\t@dragleave=\"onDragLeave\"\n\t\t@drop=\"onDrop\">\n\t\t<!-- Drop overlay. Rendered only while a drag carrying files is over a\n\t\t widget that declares `content.dropZone`; without the key the drag\n\t\t handlers below all return before touching any state, so a widget\n\t\t that did not ask for a drop zone behaves exactly as before. -->\n\t\t<div v-if=\"dropping\" class=\"cn-object-list-widget__drop-overlay\">\n\t\t\t{{ dropLabel }}\n\t\t</div>\n\t\t<p v-if=\"waitingForContext\" class=\"cn-object-list-widget__prompt\">\n\t\t\t{{ promptText }}\n\t\t</p>\n\t\t<!-- A fetch failed: show ONE quiet line WITHOUT the raw axios status\n\t\t text (\"Request failed with status code 404\") — the real error is\n\t\t logged to the console (ADR-062: an error surface is never a leaked\n\t\t stack). Takes precedence over the empty state so the two never\n\t\t stack. -->\n\t\t<p v-else-if=\"error\" class=\"cn-object-list-widget__error\">\n\t\t\t{{ loadErrorLabel }}\n\t\t</p>\n\t\t<!-- Designed empty state. This used to be a bare CnDataTable with no\n\t\t rows, which paints its <thead> — a full-width grey strip floating\n\t\t in the middle of an otherwise blank card, the \"strange grey bar\"\n\t\t from the review. CnWidgetEmptyState replaces it with something\n\t\t deliberate, and stays `compact` inside a fit-measured cell so it\n\t\t cannot outgrow a short tile (ADR-062). -->\n\t\t<CnWidgetEmptyState\n\t\t\tv-else-if=\"!loading && rows.length === 0\"\n\t\t\t:name=\"resolvedEmptyText\"\n\t\t\t:compact=\"fitRows !== null && fitRows < 3\"\n\t\t\tclass=\"cn-object-list-widget__empty\">\n\t\t\t<template v-if=\"allowCreate && !waitingForContext\" #action>\n\t\t\t\t<NcButton @click=\"openCreate\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ addLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</CnWidgetEmptyState>\n\t\t<!-- The fetch came back with rows, but the active facet selection\n\t\t matches none of them (all loaded rows have that filter row set\n\t\t empty of a facet-clearable state). Distinct from the \"no items at\n\t\t all\" state above: an Add button is not the fix here, clearing the\n\t\t filter is. -->\n\t\t<CnWidgetEmptyState\n\t\t\tv-else-if=\"showNoFacetMatchState\"\n\t\t\t:name=\"t('nextcloud-vue', 'No items match this filter')\"\n\t\t\t:compact=\"fitRows !== null && fitRows < 3\"\n\t\t\tclass=\"cn-object-list-widget__empty\">\n\t\t\t<template #action>\n\t\t\t\t<button type=\"button\" class=\"cn-object-list-widget__facet-clear\" @click=\"clearFacet\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear filter') }}\n\t\t\t\t</button>\n\t\t\t</template>\n\t\t</CnWidgetEmptyState>\n\t\t<template v-else>\n\t\t\t<!-- Facet filter (`content.facet`). Chips built from the values\n\t\t\t actually present on the loaded rows, matching the \"keyword\n\t\t\t filter\" pattern this seam was measured against — narrows the\n\t\t\t rendered rows client-side, no refetch. Absent facet config\n\t\t\t renders nothing, so an ungrouped/unfiltered widget is unchanged. -->\n\t\t\t<div v-if=\"facetOptions.length > 0\" class=\"cn-object-list-widget__facet\" data-testid=\"object-list-facet\">\n\t\t\t\t<span class=\"cn-object-list-widget__facet-label\">{{ facetLabel }}</span>\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"value in facetOptions\"\n\t\t\t\t\t:key=\"value\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-object-list-widget__facet-chip\"\n\t\t\t\t\t:class=\"{ 'cn-object-list-widget__facet-chip--active': facetSelected.includes(value) }\"\n\t\t\t\t\t:aria-pressed=\"facetSelected.includes(value)\"\n\t\t\t\t\tdata-testid=\"object-list-facet-chip\"\n\t\t\t\t\t@click=\"toggleFacetValue(value)\">\n\t\t\t\t\t{{ value }}\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"facetSelected.length > 0\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-object-list-widget__facet-clear\"\n\t\t\t\t\t@click=\"clearFacet\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear filter') }}\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<!-- Bulk-actions bar (`content.selectable` + `content.bulkActions`).\n\t\t\t Renders only once something is selected, so a selectable widget\n\t\t\t with nothing picked looks exactly like a non-selectable one. -->\n\t\t\t<div\n\t\t\t\tv-if=\"content.selectable && mappedBulkActions.length > 0 && selectedIds.length > 0\"\n\t\t\t\tclass=\"cn-object-list-widget__bulk-bar\"\n\t\t\t\tdata-testid=\"object-list-bulk-bar\">\n\t\t\t\t<span class=\"cn-object-list-widget__bulk-count\">\n\t\t\t\t\t{{ t('nextcloud-vue', '{count} selected', { count: selectedIds.length }) }}\n\t\t\t\t</span>\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"(action, index) in mappedBulkActions\"\n\t\t\t\t\t:key=\"index\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-object-list-widget__bulk-action\"\n\t\t\t\t\t:class=\"{ 'cn-object-list-widget__bulk-action--destructive': action.destructive }\"\n\t\t\t\t\tdata-testid=\"object-list-bulk-action\"\n\t\t\t\t\t@click=\"action.handler\">\n\t\t\t\t\t{{ action.label }}\n\t\t\t\t</button>\n\t\t\t\t<button type=\"button\" class=\"cn-object-list-widget__bulk-clear\" @click=\"clearSelection\">\n\t\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"isGrouped\" class=\"cn-object-list-widget__groups\">\n\t\t\t\t<div v-for=\"group in groupedRows\"\n\t\t\t\t\t:key=\"group.key\"\n\t\t\t\t\tclass=\"cn-object-list-widget__group\"\n\t\t\t\t\tdata-testid=\"object-list-group\">\n\t\t\t\t\t<h4 class=\"cn-object-list-widget__group-heading\">\n\t\t\t\t\t\t<!-- `groupLabelResolve` reuses the fkResolve cell for the\n\t\t\t\t\t\t heading itself: `groupBy` may bucket by a uuid that is\n\t\t\t\t\t\t ONE MORE hop past what `extend` inlined (e.g. a\n\t\t\t\t\t\t reference's own reference), which `objectFieldValue`\n\t\t\t\t\t\t cannot read off the row at all. The live object-store\n\t\t\t\t\t\t lookup CnDataTable columns already use for a `$ref`\n\t\t\t\t\t\t column is the same answer for a `$ref` GROUP. -->\n\t\t\t\t\t\t<CnFkResolveCell\n\t\t\t\t\t\t\tv-if=\"groupLabelResolveConfig\"\n\t\t\t\t\t\t\t:value=\"group.key\"\n\t\t\t\t\t\t\t:register=\"groupLabelResolveConfig.register\"\n\t\t\t\t\t\t\t:schema=\"groupLabelResolveConfig.schema\"\n\t\t\t\t\t\t\t:labelField=\"groupLabelResolveConfig.labelField || 'name'\" />\n\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t{{ group.label }}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t({{ group.rows.length }})\n\t\t\t\t\t</h4>\n\t\t\t\t\t<CnDataTable\n\t\t\t\t\t\t:columns=\"resolvedColumns\"\n\t\t\t\t\t\t:rows=\"group.rows\"\n\t\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t\t:emptyText=\"emptyText\"\n\t\t\t\t\t\t:selectable=\"content.selectable === true\"\n\t\t\t\t\t\t:selectedIds=\"selectedIds\"\n\t\t\t\t\t\t:sortKey=\"localSort.field || null\"\n\t\t\t\t\t\t:sortOrder=\"localSort.dir || 'asc'\"\n\t\t\t\t\t\tborderless\n\t\t\t\t\t\t@rowClick=\"onRowClick\"\n\t\t\t\t\t\t@rowAuxClick=\"onRowAuxClick\"\n\t\t\t\t\t\t@select=\"onSelect\"\n\t\t\t\t\t\t@sort=\"onSort\">\n\t\t\t\t\t\t<template v-if=\"mappedRowActions.length > 0\" #row-actions=\"{ row }\">\n\t\t\t\t\t\t\t<CnRowActions :actions=\"mappedRowActions\" :row=\"row\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</CnDataTable>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-object-list-widget__table\">\n\t\t\t\t<CnDataTable\n\t\t\t\t\t:columns=\"resolvedColumns\"\n\t\t\t\t\t:rows=\"facetedRows\"\n\t\t\t\t\t:loading=\"loading\"\n\t\t\t\t\t:emptyText=\"emptyText\"\n\t\t\t\t\t:selectable=\"content.selectable === true\"\n\t\t\t\t\t:selectedIds=\"selectedIds\"\n\t\t\t\t\t:sortKey=\"localSort.field || null\"\n\t\t\t\t\t:sortOrder=\"localSort.dir || 'asc'\"\n\t\t\t\t\tborderless\n\t\t\t\t\t@rowClick=\"onRowClick\"\n\t\t\t\t\t@rowAuxClick=\"onRowAuxClick\"\n\t\t\t\t\t@select=\"onSelect\"\n\t\t\t\t\t@sort=\"onSort\">\n\t\t\t\t\t<!-- Declarative per-row actions (`content.rowActions`).\n\t\t\t\t\t CnDataTable only paints the trailing actions column\n\t\t\t\t\t when this slot is supplied, so a widget without\n\t\t\t\t\t `rowActions` keeps the column count it had. -->\n\t\t\t\t\t<template v-if=\"mappedRowActions.length > 0\" #row-actions=\"{ row }\">\n\t\t\t\t\t\t<CnRowActions :actions=\"mappedRowActions\" :row=\"row\" />\n\t\t\t\t\t</template>\n\t\t\t\t</CnDataTable>\n\t\t\t</div>\n\t\t\t<!--\n\t\t\t Footer. Two affordances, and they answer different questions.\n\n\t\t\t The PAGER walks the rest of the matching objects in place —\n\t\t\t server-side (`_page`), so \"1–5 of 137\" is the truth and not a\n\t\t\t count of what happened to be fetched. It renders only when a\n\t\t\t whole page fits the cell; on a cell too short for one page the\n\t\t\t fit-to-cell path below is all there is, because a pager under\n\t\t\t rows that are themselves clipped would page a lie.\n\n\t\t\t VIEW ALL leaves for the full index. It shows whenever there is\n\t\t\t more than the widget is showing, pager or no pager — a widget is\n\t\t\t a summary, and the index is where the list actually lives.\n\t\t\t-->\n\t\t\t<CnPagination\n\t\t\t\tv-if=\"showPager\"\n\t\t\t\tcompact\n\t\t\t\tclass=\"cn-object-list-widget__pager\"\n\t\t\t\t:currentPage=\"page\"\n\t\t\t\t:totalPages=\"totalPages\"\n\t\t\t\t:totalItems=\"total\"\n\t\t\t\t:currentPageSize=\"pageSize\"\n\t\t\t\t:minItemsToShow=\"0\"\n\t\t\t\t@pageChanged=\"onPageChange\" />\n\t\t\t<a\n\t\t\t\tv-if=\"hiddenCount > 0 && content.viewAllRoute && viewAllHref\"\n\t\t\t\tclass=\"cn-object-list-widget__view-all\"\n\t\t\t\t:href=\"viewAllHref\"\n\t\t\t\t@click=\"onViewAll\">\n\t\t\t\t{{ viewAllLabel }}\n\t\t\t</a>\n\t\t\t<button\n\t\t\t\tv-else-if=\"hiddenCount > 0 && content.viewAllRoute\"\n\t\t\t\ttype=\"button\"\n\t\t\t\tclass=\"cn-object-list-widget__view-all\"\n\t\t\t\t@click=\"onViewAll\">\n\t\t\t\t{{ viewAllLabel }}\n\t\t\t</button>\n\t\t\t<p v-else-if=\"hiddenCount > 0 && !showPager\" class=\"cn-object-list-widget__more\">\n\t\t\t\t{{ moreLabel }}\n\t\t\t</p>\n\t\t</template>\n\t\t<!-- Create affordance (ADR-062): every collection carries its Add at\n\t\t the bottom of the widget; the host card's Actions menu calls the\n\t\t same openCreate() through the public method. Suppressed while the\n\t\t empty state is showing — that renders its own copy in its #action\n\t\t slot, and two Add buttons on one empty card read as a bug. -->\n\t\t<div\n\t\t\tv-if=\"allowCreate && !waitingForContext && !showingEmptyState\"\n\t\t\tclass=\"cn-object-list-widget__add\">\n\t\t\t<NcButton variant=\"tertiary\" wide @click=\"openCreate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\t\t<!-- Upload affordance. A `dropZone` action already accepts a dropped\n\t\t `File[]`; this is the click-to-pick equivalent of the same drop,\n\t\t for the reader who never drags a file. `content.upload: false`\n\t\t opts a drop-only widget out of the button. -->\n\t\t<button\n\t\t\tv-if=\"showUploadButton\"\n\t\t\ttype=\"button\"\n\t\t\tclass=\"cn-object-list-widget__upload\"\n\t\t\tdata-testid=\"object-list-upload\"\n\t\t\t@click=\"triggerUpload\">\n\t\t\t{{ uploadLabel }}\n\t\t</button>\n\t\t<input\n\t\t\tv-if=\"showUploadButton\"\n\t\t\tref=\"uploadInput\"\n\t\t\ttype=\"file\"\n\t\t\tmultiple\n\t\t\t:aria-label=\"uploadLabel\"\n\t\t\tclass=\"cn-object-list-widget__upload-input\"\n\t\t\tdata-testid=\"object-list-upload-input\"\n\t\t\t@change=\"onUploadFilesSelected\">\n\t\t<CnFormDialog\n\t\t\tv-if=\"showCreate && createSchema\"\n\t\t\tref=\"createDialog\"\n\t\t\t:schema=\"createSchema\"\n\t\t\t:item=\"null\"\n\t\t\t:size=\"formSize\"\n\t\t\t:columns=\"formColumns\"\n\t\t\t:includeFields=\"formIncludeFields\"\n\t\t\t:excludeFields=\"formExcludeFields\"\n\t\t\t:fieldOverrides=\"formFieldOverrides\"\n\t\t\t@confirm=\"onCreateConfirm\"\n\t\t\t@close=\"showCreate = false\" />\n\t</div>\n</template>\n\n<script>\nimport { subscribe, unsubscribe } from '@nextcloud/event-bus'\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcButton } from '@nextcloud/vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnDataTable from '../CnDataTable/CnDataTable.vue'\nimport CnFkResolveCell from '../CnFkResolveCell/CnFkResolveCell.vue'\nimport CnFormDialog from '../CnFormDialog/CnFormDialog.vue'\nimport CnPagination from '../CnPagination/CnPagination.vue'\nimport CnWidgetEmptyState from '../CnWidgetEmptyState/CnWidgetEmptyState.vue'\nimport { actionLink, dispatchAction, hasActionTargetTokens } from '../../utils/actionsDispatcher.js'\nimport { followLinkClick, openRowTarget, resolveHref } from '../../utils/linkNavigation.js'\nimport { objectFieldValue } from '../../utils/objectName.js'\nimport { dropOptionalUnresolved, hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'\nimport { markNewTabHandled } from '../../utils/rowAuxClick.js'\nimport { CnRowActions } from '../CnRowActions/index.js'\n\n/**\n * Event-bus channel a page-level refresh is announced on. The page's Actions\n * menu emits it, the manifest `refresh` / `api-call` actions bump it, and an\n * app's own dialog emits it after a successful write.\n */\nconst PAGE_REFRESH_CHANNEL = 'cn:page:refresh'\n\n/**\n * CnObjectListWidget — an abstract, manifest-configured object list / table.\n *\n * Queries OpenRegister objects for a `register` + `schema` with a `filter`,\n * `sort`, and `limit`, then renders the chosen `columns` in a `CnDataTable`.\n * Replaces per-app coded list widgets (closing-soon, recently-won-lost,\n * renewals-due, …) — the data, columns, filter and ordering are all editable\n * through the cog modal (ADR-041). Resolved by its registry type key\n * `object-list`; configured via `CnObjectListWidgetForm`.\n *\n * Example content blob:\n * ```js\n * content: {\n * register: 'pipelinq', schema: 'lead',\n * filter: { status: 'open' },\n * sort: { field: 'expectedCloseDate', dir: 'asc' },\n * limit: 5,\n * columns: [{ key: 'title', label: 'Deal' }, { key: 'value', label: 'Value' }],\n * rowRoute: 'leads-detail',\n * }\n * ```\n */\nexport default {\n\tname: 'CnObjectListWidget',\n\n\tcomponents: { CnDataTable, CnFormDialog, CnPagination, CnWidgetEmptyState, CnRowActions, CnFkResolveCell, NcButton, Plus },\n\n\tinject: {\n\t\t/**\n\t\t * Detail-page object context (`{ objectId, object, register, schema }`)\n\t\t * provided by CnDetailPage. Enables `@objectId` / `@object.<field>`\n\t\t * filter tokens so a detail-page list can be scoped to the current\n\t\t * object. Null on dashboards (tokens then pass through unresolved).\n\t\t */\n\t\tcnObjectContext: { default: null },\n\t\t/**\n\t\t * Page-level workspace context (reactive `ref({})`) provided by\n\t\t * CnDashboardPage. Lets `@workspace.<key>` filter tokens resolve so a\n\t\t * list can react to state another widget on the page wrote (e.g. a\n\t\t * client-overview list scoped to the selected client). Null on pages\n\t\t * that don't provide it (tokens then stay unresolved and the list shows\n\t\t * its `promptText`).\n\t\t */\n\t\tcnWorkspaceContext: { default: null },\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored `content.emptyText` is run through it for this\n\t\t * component's OWN empty state, and so is `content.prompt`. Defaults to an identity function so\n\t\t * an untranslated key renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t\t/**\n\t\t * Pre-bound `dispatchAction` provided by CnPageRenderer (router,\n\t\t * registry, handlers and openModal already wired). `rowActions` and\n\t\t * `dropZone` dispatch through it; outside a CnPageRenderer tree the\n\t\t * component falls back to a bare `dispatchAction` call, which reaches\n\t\t * the router-backed types and warns on the registry-backed ones.\n\t\t */\n\t\tcnDispatchAction: { default: null },\n\t},\n\n\tprops: {\n\t\t/**\n\t\t * The widget's persisted configuration blob. `limit` is a fetch cap\n\t\t * (default 25) — the rendered row count fits the host cell (ADR-062).\n\t\t * `viewAllRoute` / `viewAllQuery` configure the \"View all (N)\" footer\n\t\t * navigation; `viewAllQuery` values are token-resolved (`@objectId`).\n\t\t *\n\t\t * `extend` is the OpenRegister `_extend[]` list forwarded on the fetch.\n\t\t * It is what makes a DOTTED column key work: `CnDataTable` reads\n\t\t * `informatieobject.title` as a path into the row, and without\n\t\t * `extend: ['informatieobject']` the row holds a uuid string at that\n\t\t * key, so six columns off one referenced object render as six copies\n\t\t * of the same uuid. `fkResolve` is the one-label answer; `extend` is\n\t\t * the several-fields-off-the-same-reference answer.\n\t\t *\n\t\t * `rowActions` is an array in the unified manifest action shape\n\t\t * (`handler` | `open-modal` | `open-page` | `navigate` | …), rendered\n\t\t * per row through CnRowActions. `dropZone` is one action of that same\n\t\t * shape, dispatched when files are dropped on the widget, with the\n\t\t * dropped `File[]` handed to it. `content.upload: false` hides the\n\t\t * click-to-pick button that otherwise renders alongside a `dropZone`.\n\t\t * Neither carries authorization: OpenRegister RBAC is the only\n\t\t * authority over what a write may do.\n\t\t *\n\t\t * `groupBy` (a row field path, dotted paths read the `extend`-inlined\n\t\t * reference the same way a column does) buckets the fetched rows into\n\t\t * one heading + table per distinct value, in first-seen order.\n\t\t * `groupLabel` is the field path used for the heading text; it\n\t\t * defaults to the raw `groupBy` value when absent. `groupLabelResolve`\n\t\t * (`{register, schema, labelField?}`) is for a `groupBy` whose human\n\t\t * label sits a hop further than `extend` reaches (a reference's own\n\t\t * reference): the heading resolves the raw group key through the\n\t\t * shared object store, the same `fkResolve` cell widget a column uses.\n\t\t *\n\t\t * `selectable` turns on CnDataTable's checkbox column; `bulkActions`\n\t\t * (same action shape as `rowActions`) render as buttons in a bar that\n\t\t * appears once something is selected. A `handler` bulk action receives\n\t\t * the array of selected row objects appended to its `args`; an\n\t\t * `open-modal` bulk action receives them as `props.selectedIds`\n\t\t * (mirroring how a drop hands `props.files` to a modal).\n\t\t *\n\t\t * `sortable` (`true`, or an array of column keys) makes the matching\n\t\t * `CnDataTable` headers clickable; clicking re-fetches with that\n\t\t * field's `_order`, same as the fixed `sort` key but user-driven.\n\t\t *\n\t\t * `facet` (`{ field, label? }`) renders one filter chip per distinct\n\t\t * value of that field across the currently loaded rows (an array\n\t\t * field's entries are flattened) and narrows the rendered rows to\n\t\t * those carrying a selected value. Client-side over the fetched page,\n\t\t * like the rest of this widget's row set.\n\t\t *\n\t\t * @type {{register?: string, schema?: string, filter?: object, sort?: {field?: string, dir?: string}, limit?: number, extend?: Array<string>, columns?: Array, rowActions?: Array<object>, dropZone?: object, upload?: boolean, groupBy?: string, groupLabel?: string, groupLabelResolve?: {register: string, schema: string, labelField?: string}, selectable?: boolean, bulkActions?: Array<object>, sortable?: boolean, facet?: {field: string, label?: string}, rowRoute?: string, prompt?: string, emptyText?: string, viewAllRoute?: string, viewAllQuery?: object}}\n\t\t */\n\t\tcontent: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\t},\n\n\temits: ['created', 'row-click', 'row-aux-click', 'view-all', 'files-dropped'],\n\n\tdata() {\n\t\treturn {\n\t\t\trows: [],\n\t\t\tloading: false,\n\t\t\terror: '',\n\t\t\t/** Server-side total for the resolved filter (drives \"View all (N)\"). */\n\t\t\ttotal: 0,\n\t\t\t/** Current 1-based page. Paging is SERVER-side (`_page`). */\n\t\t\tpage: 1,\n\t\t\t/** Rows that fit the host cell; null = unconstrained (dashboards). */\n\t\t\tfitRows: null,\n\t\t\t/** Whether the create dialog is open. */\n\t\t\tshowCreate: false,\n\t\t\t/**\n\t\t\t * The list's own schema definition, once fetched.\n\t\t\t *\n\t\t\t * Shared by two readers: the create dialog renders its form from it,\n\t\t\t * and `resolvedColumns` takes a column's HEADING from the matching\n\t\t\t * property's `title` when the manifest gave only a key.\n\t\t\t */\n\t\t\tcreateSchema: null,\n\t\t\t/**\n\t\t\t * Depth of nested dragenter/dragleave pairs over the widget.\n\t\t\t * A single counter, because `dragleave` fires when the pointer\n\t\t\t * crosses into a CHILD element: tracking a boolean instead makes\n\t\t\t * the overlay flicker off the moment the drag reaches the table.\n\t\t\t */\n\t\t\tdragDepth: 0,\n\t\t\t/** Selected row ids (`content.selectable`). Shared across groups. */\n\t\t\tselectedIds: [],\n\t\t\t/**\n\t\t\t * The active sort, seeded from `content.sort` and overwritten by an\n\t\t\t * interactive header click (`content.sortable`). Kept as component\n\t\t\t * state rather than read from `content` directly so a click can\n\t\t\t * override the manifest-declared default without mutating a prop.\n\t\t\t */\n\t\t\tlocalSort: { ...(this.content.sort || {}) },\n\t\t\t/** Facet values currently toggled on (`content.facet`). */\n\t\t\tfacetSelected: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * The unwrapped detail-page object context for token resolution, or null\n\t\t * on surfaces (dashboards) that don't provide one.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tobjectCtx() {\n\t\t\tconst c = this.cnObjectContext\n\t\t\tif (!c) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn (typeof c === 'object' && 'value' in c) ? c.value : c\n\t\t},\n\n\t\t/**\n\t\t * The unwrapped workspace context bag (or null). Vue 2.7 `setup`/inject\n\t\t * may hand back a raw ref; unwrap `.value` so token resolution reads the\n\t\t * plain object.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tworkspaceCtx() {\n\t\t\tconst c = this.cnWorkspaceContext\n\t\t\tif (!c) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn (typeof c === 'object' && 'value' in c) ? c.value : c\n\t\t},\n\n\t\t/**\n\t\t * Token-resolution context merged from the detail-page object context\n\t\t * and the page-level workspace bag (`@workspace.<key>`).\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\ttokenCtx() {\n\t\t\tconst base = this.objectCtx ? { ...this.objectCtx } : {}\n\t\t\tbase.workspace = this.workspaceCtx || {}\n\t\t\treturn base\n\t\t},\n\n\t\t/**\n\t\t * The filter with every `@`-token resolved against `tokenCtx`, then with\n\t\t * any UNRESOLVED OPTIONAL token (`@workspace.<key>?`) dropped — so an\n\t\t * optional queue filter simply shows all rows until a queue is picked,\n\t\t * while a REQUIRED token (`@workspace.selectedClient`) stays to trigger the\n\t\t * prompt.\n\t\t *\n\t\t * @return {object}\n\t\t */\n\t\tresolvedFilter() {\n\t\t\treturn dropOptionalUnresolved(resolveFilterTokens(this.content.filter || {}, this.tokenCtx))\n\t\t},\n\n\t\t/**\n\t\t * Whether a context-dependent filter token (e.g. `@workspace.selectedClient`)\n\t\t * is still unresolved — the page state this list depends on isn't set yet,\n\t\t * so the list renders a prompt instead of fetching the whole register.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\twaitingForContext() {\n\t\t\treturn hasUnresolvedTokens(this.resolvedFilter)\n\t\t},\n\n\t\t/**\n\t\t * Prompt shown while a context-bound list has an unresolved REQUIRED\n\t\t * token. A `content.prompt` override always wins. Otherwise the default\n\t\t * is context-aware: the \"Select an item to see related records\"\n\t\t * master-detail copy only fits a DASHBOARD list waiting on a selection —\n\t\t * on a detail page (an object context is present) that copy is wrong, so\n\t\t * fall back to the neutral \"Nothing here yet\" (ADR-062).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tpromptText() {\n\t\t\tif (this.content.prompt) {\n\t\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\t\treturn fn(this.content.prompt)\n\t\t\t}\n\t\t\treturn this.objectCtx\n\t\t\t\t? t('nextcloud-vue', 'Nothing here yet')\n\t\t\t\t: t('nextcloud-vue', 'Select an item to see related records')\n\t\t},\n\n\t\t/**\n\t\t * Quiet, status-code-free label shown when a fetch fails. The real\n\t\t * axios error is logged to the console, never rendered (ADR-062).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tloadErrorLabel() {\n\t\t\treturn this.content.errorText || t('nextcloud-vue', 'Could not load these records')\n\t\t},\n\n\t\t/**\n\t\t * Column definitions normalised for CnDataTable. A string column becomes\n\t\t * `{ key, label }`; an object column keeps its key/label AND carries the\n\t\t * presentation hints CnDataTable forwards to CnCellRenderer — `format`\n\t\t * (currency / duration / number / percent / date / date-time), `widget`\n\t\t * (badge / link / swatch), `widgetProps`, `formatter`, `align`, and\n\t\t * `width`. Without this pass-through a `relatedCollections` column's\n\t\t * `format: 'currency'` / `'date'` would silently render as plain text.\n\t\t *\n\t\t * `enumLabels` travels alongside `enum` for the same reason `enum`\n\t\t * itself is here: a list column often addresses a DOTTED path into an\n\t\t * `extend`-inlined reference (e.g. `informatieobject.direction`), and\n\t\t * this widget never fetches that reference's own schema to feed\n\t\t * CnDataTable's live `:schema` prop — only `openCreate()`'s create-form\n\t\t * schema is ever fetched. A column that needs its raw enum code\n\t\t * (`\"incoming\"`) to render as a human label (`\"Incoming\"`) has to carry\n\t\t * that mapping itself, the same way it already carries `enum`. This is\n\t\t * the same generic mechanism CnCellRenderer already applies to a real\n\t\t * schema property's `x-enum-labels`, completed here for the\n\t\t * manifest-column path rather than special-cased per column.\n\t\t */\n\t\tresolvedColumns() {\n\t\t\tconst cols = Array.isArray(this.content.columns) ? this.content.columns : []\n\t\t\tconst sortableConfig = this.content.sortable\n\t\t\t// A column may arrive as a bare key. Falling back to that key as the\n\t\t\t// HEADING is what printed `customerName` and `dateReceived` at users\n\t\t\t// on a dashboard, while the index page beside it said \"Customer name\"\n\t\t\t// and \"Date received\" — the same data, labelled twice, differently.\n\t\t\t// The schema already holds the answer, so ask it, and keep the key\n\t\t\t// only when it has nothing to say.\n\t\t\tconst props = (this.createSchema && this.createSchema.properties) || {}\n\t\t\tconst headingFor = (key) => {\n\t\t\t\tconst prop = props[key]\n\t\t\t\tconst title = prop && typeof prop.title === 'string' ? prop.title.trim() : ''\n\t\t\t\treturn title !== '' ? title : key\n\t\t\t}\n\t\t\tconst mapped = cols.map((c) => {\n\t\t\t\tif (typeof c === 'string') {\n\t\t\t\t\treturn { key: c, label: headingFor(c) }\n\t\t\t\t}\n\t\t\t\tconst out = { key: c.key, label: c.label || headingFor(c.key) }\n\t\t\t\tfor (const k of ['format', 'widget', 'widgetProps', 'formatter', 'align', 'width', 'type', 'enum', 'enumLabels', 'sortable']) {\n\t\t\t\t\tif (c[k] !== undefined) {\n\t\t\t\t\t\tout[k] = c[k]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// `content.sortable` (bool = every column, array = the listed\n\t\t\t\t// keys) fills in `sortable` for a column that did not already\n\t\t\t\t// say so on its own definition — an explicit `sortable: false`\n\t\t\t\t// on the column still wins, so one header can opt out of an\n\t\t\t\t// otherwise sortable list.\n\t\t\t\tif (out.sortable === undefined && sortableConfig !== undefined) {\n\t\t\t\t\tout.sortable = sortableConfig === true\n\t\t\t\t\t\t|| (Array.isArray(sortableConfig) && sortableConfig.includes(out.key))\n\t\t\t\t}\n\t\t\t\treturn out\n\t\t\t})\n\n\t\t\t// The registry used to default to `[{ key: 'title' }]`, but plenty of schemas\n\t\t\t// have no `title` — a Barn has `name`. Such a widget rendered a table of\n\t\t\t// em-dashes forever, and nothing told the user why.\n\t\t\t//\n\t\t\t// Don't guess the right key from the data: OpenRegister already guessed, and\n\t\t\t// published the answer as `@self.name`. When NOT ONE configured column\n\t\t\t// resolves on any loaded row, fall back to that single display-name column.\n\t\t\t//\n\t\t\t// Only when none resolve: a partly-matching column set is a deliberate choice\n\t\t\t// (a column can be legitimately empty across the current page of rows), and\n\t\t\t// silently replacing it would override the user.\n\t\t\tif (this.rows.length > 0 && mapped.length > 0) {\n\t\t\t\tconst resolves = mapped.some((c) => this.rows.some((r) => objectFieldValue(r, c.key) !== undefined))\n\t\t\t\tif (resolves === false) {\n\t\t\t\t\treturn [{ key: 'name', label: t('nextcloud-vue', 'Name') }]\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mapped\n\t\t},\n\n\t\t/**\n\t\t * Declared per-row actions mapped onto the CnRowActions shape. Every\n\t\t * entry keeps its label, icon and `destructive` flag and routes its\n\t\t * click back through `runRowAction`, so the dispatcher decides what a\n\t\t * type means and this component does not grow a second action\n\t\t * vocabulary.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tmappedRowActions() {\n\t\t\tconst declared = Array.isArray(this.content.rowActions) ? this.content.rowActions : []\n\t\t\treturn declared\n\t\t\t\t.filter((a) => a && typeof a === 'object')\n\t\t\t\t.map((action) => ({\n\t\t\t\t\tlabel: action.label,\n\t\t\t\t\ticon: action.icon,\n\t\t\t\t\tdestructive: action.destructive === true,\n\t\t\t\t\t// CnRowActions renders a link when these are set and skips the handler.\n\t\t\t\t\t...this.rowActionLink(action),\n\t\t\t\t\thandler: (row) => this.runRowAction(action, row),\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * The declared drop-zone action, or null. A widget without the key\n\t\t * takes no part in a drag at all.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tdropZoneAction() {\n\t\t\tconst dz = this.content.dropZone\n\t\t\treturn (dz && typeof dz === 'object') ? dz : null\n\t\t},\n\n\t\t/** Whether a file drag is currently over a drop-enabled widget. */\n\t\tdropping() {\n\t\t\treturn this.dropZoneAction !== null && this.dragDepth > 0\n\t\t},\n\n\t\t/** Copy shown on the drop overlay (overridable via `dropZone.label`). */\n\t\tdropLabel() {\n\t\t\treturn (this.dropZoneAction && this.dropZoneAction.label)\n\t\t\t\t|| t('nextcloud-vue', 'Drop files here')\n\t\t},\n\n\t\t/**\n\t\t * Whether the click-to-pick upload button renders: a `dropZone` is\n\t\t * declared and the host has not opted out with `content.upload: false`.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshowUploadButton() {\n\t\t\treturn this.dropZoneAction !== null && this.content.upload !== false\n\t\t},\n\n\t\t/** Pre-translated Upload label (overridable via `content.uploadLabel`). */\n\t\tuploadLabel() {\n\t\t\treturn this.content.uploadLabel || t('nextcloud-vue', 'Upload')\n\t\t},\n\n\t\t/**\n\t\t * Declared bulk actions mapped onto the same `{label, icon, destructive,\n\t\t * handler}` shape `mappedRowActions` uses, so CnRowActions and the bulk\n\t\t * bar render identically — the only difference is what `handler` does:\n\t\t * a row action dispatches with one row, a bulk action with the whole\n\t\t * selection.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tmappedBulkActions() {\n\t\t\tconst declared = Array.isArray(this.content.bulkActions) ? this.content.bulkActions : []\n\t\t\treturn declared\n\t\t\t\t.filter((a) => a && typeof a === 'object')\n\t\t\t\t.map((action) => ({\n\t\t\t\t\tlabel: action.label,\n\t\t\t\t\ticon: action.icon,\n\t\t\t\t\tdestructive: action.destructive === true,\n\t\t\t\t\thandler: () => this.runBulkAction(action),\n\t\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * The currently selected row objects, resolved from `rows` (not just\n\t\t * the visible/faceted slice) so a selection made before a facet filter\n\t\t * narrows the view is not silently dropped from a bulk action.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tselectedRows() {\n\t\t\treturn this.rows.filter((row) => this.selectedIds.includes(row.id))\n\t\t},\n\n\t\t/**\n\t\t * Distinct values of `content.facet.field` across the currently loaded\n\t\t * rows, flattening an array-valued field (the \"keywords across the\n\t\t * dossier\" shape this seam was measured against). Sorted for a stable\n\t\t * chip order run to run.\n\t\t *\n\t\t * @return {Array<string>}\n\t\t */\n\t\tfacetOptions() {\n\t\t\tconst facet = this.content.facet\n\t\t\tif (!facet || !facet.field) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst values = new Set()\n\t\t\tfor (const row of this.visibleRows) {\n\t\t\t\tconst raw = objectFieldValue(row, facet.field)\n\t\t\t\tconst list = Array.isArray(raw) ? raw : (raw !== undefined && raw !== null && raw !== '' ? [raw] : [])\n\t\t\t\tfor (const v of list) {\n\t\t\t\t\tif (v !== undefined && v !== null && v !== '') {\n\t\t\t\t\t\tvalues.add(v)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn Array.from(values).sort()\n\t\t},\n\n\t\t/** Pre-translated facet label (`content.facet.label`, falls back to a generic \"Filter\"). */\n\t\tfacetLabel() {\n\t\t\tconst facet = this.content.facet\n\t\t\treturn (facet && facet.label) || t('nextcloud-vue', 'Filter')\n\t\t},\n\n\t\t/**\n\t\t * Rows narrowed by the selected facet values. A row matches when at\n\t\t * least one of its (possibly array) values at `facet.field` is among\n\t\t * `facetSelected` — no selection means no narrowing at all.\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tfacetedRows() {\n\t\t\tconst facet = this.content.facet\n\t\t\tif (!facet || !facet.field || this.facetSelected.length === 0) {\n\t\t\t\treturn this.visibleRows\n\t\t\t}\n\t\t\treturn this.visibleRows.filter((row) => {\n\t\t\t\tconst raw = objectFieldValue(row, facet.field)\n\t\t\t\tconst list = Array.isArray(raw) ? raw : (raw !== undefined && raw !== null ? [raw] : [])\n\t\t\t\treturn list.some((v) => this.facetSelected.includes(v))\n\t\t\t})\n\t\t},\n\n\t\t/**\n\t\t * Whether the fetch returned rows but the active facet selection\n\t\t * matches none of them — the \"clear filter\" empty state, distinct\n\t\t * from \"there are no items at all\".\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshowNoFacetMatchState() {\n\t\t\treturn !this.loading && this.rows.length > 0 && this.facetSelected.length > 0 && this.facetedRows.length === 0\n\t\t},\n\n\t\t/** Whether `content.groupBy` is declared, so the template picks the grouped render path. */\n\t\tisGrouped() {\n\t\t\treturn typeof this.content.groupBy === 'string' && this.content.groupBy !== ''\n\t\t},\n\n\t\t/**\n\t\t * `content.groupLabelResolve` (`{register, schema, labelField?}`), or\n\t\t * null. When set, the group heading resolves `group.key` through the\n\t\t * shared object store instead of reading a plain field off the row —\n\t\t * for a `groupBy` whose human label lives a hop further than `extend`\n\t\t * inlined (a reference's own reference, e.g. grouping documents by\n\t\t * type when only the document itself, not its type, was extended).\n\t\t *\n\t\t * @return {{register: string, schema: string, labelField?: string}|null}\n\t\t */\n\t\tgroupLabelResolveConfig() {\n\t\t\tconst cfg = this.content.groupLabelResolve\n\t\t\treturn (cfg && typeof cfg === 'object' && cfg.register && cfg.schema) ? cfg : null\n\t\t},\n\n\t\t/**\n\t\t * The faceted rows bucketed by `content.groupBy`, one entry per\n\t\t * distinct value in first-seen order (matching how the rows already\n\t\t * arrived — server-sorted). A `$ref` group key that resolves to an\n\t\t * object (an `extend`-inlined reference) groups by its `id`, so\n\t\t * `groupBy: 'informatieobjecttype'` groups the actual referenced\n\t\t * objects rather than one group per string-ified object.\n\t\t *\n\t\t * @return {Array<{key: string, label: string, rows: Array<object>}>}\n\t\t */\n\t\tgroupedRows() {\n\t\t\tif (!this.isGrouped) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst field = this.content.groupBy\n\t\t\tconst labelField = this.content.groupLabel || field\n\t\t\tconst order = []\n\t\t\tconst byKey = new Map()\n\t\t\tfor (const row of this.facetedRows) {\n\t\t\t\tconst rawKey = objectFieldValue(row, field)\n\t\t\t\tconst key = (rawKey && typeof rawKey === 'object')\n\t\t\t\t\t? (rawKey.id || JSON.stringify(rawKey))\n\t\t\t\t\t: String(rawKey ?? '')\n\t\t\t\tif (!byKey.has(key)) {\n\t\t\t\t\tconst rawLabel = objectFieldValue(row, labelField)\n\t\t\t\t\tconst label = (rawLabel && typeof rawLabel === 'object')\n\t\t\t\t\t\t? (rawLabel.title || rawLabel.name || key)\n\t\t\t\t\t\t: (rawLabel || key || t('nextcloud-vue', 'Ungrouped'))\n\t\t\t\t\tbyKey.set(key, { key, label, rows: [] })\n\t\t\t\t\torder.push(key)\n\t\t\t\t}\n\t\t\t\tbyKey.get(key).rows.push(row)\n\t\t\t}\n\t\t\treturn order.map((key) => byKey.get(key))\n\t\t},\n\n\t\t/** Empty-state text (overridable via `content.emptyText`). */\n\t\temptyText() {\n\t\t\treturn this.content.emptyText || t('nextcloud-vue', 'No items')\n\t\t},\n\n\t\t/**\n\t\t * The empty-state text run through the host translate function. Used\n\t\t * only by this component's OWN empty state — the raw `emptyText`\n\t\t * still goes to CnDataTable, which translates at its own render\n\t\t * boundary, so the string is never translated twice.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tresolvedEmptyText() {\n\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\treturn this.emptyText ? fn(this.emptyText) : this.emptyText\n\t\t},\n\n\t\t/**\n\t\t * The rows actually rendered: capped to what fits the host grid cell\n\t\t * (ADR-062 — content adapts to the cell, never a nested scrollbar).\n\t\t * Unconstrained on surfaces without a fixed-height cell (dashboards\n\t\t * measure null and render every fetched row, as before).\n\t\t *\n\t\t * @return {Array<object>}\n\t\t */\n\t\tvisibleRows() {\n\t\t\treturn this.fitRows ? this.rows.slice(0, this.fitRows) : this.rows\n\t\t},\n\n\t\t/**\n\t\t * Rows per page. This is `content.limit` (the fetch cap) — a FIXED\n\t\t * number, deliberately not the measured `fitRows`: a page size derived\n\t\t * from a post-render measurement would change the pagination under the\n\t\t * reader every time the tile resized, and would need a refetch to\n\t\t * settle.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\tpageSize() {\n\t\t\treturn Number((this.content || {}).limit) || 25\n\t\t},\n\n\t\t/**\n\t\t * Total pages for the resolved filter, from the SERVER's total.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\ttotalPages() {\n\t\t\treturn Math.max(Math.ceil((this.total || 0) / this.pageSize), 1)\n\t\t},\n\n\t\t/**\n\t\t * Whether the compact pager renders.\n\t\t *\n\t\t * Two conditions, and the second is the load-bearing one. There must\n\t\t * be more than one page (otherwise there is nothing to page), AND the\n\t\t * cell must be able to show a whole page — because `visibleRows` clips\n\t\t * the page to what fits, and a pager over clipped rows would claim to\n\t\t * be showing \"1–25 of 137\" while five rows are on screen. On a cell\n\t\t * that short the existing fit-to-cell \"View all\" is the honest answer.\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tshowPager() {\n\t\t\tif (this.totalPages <= 1) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn this.fitRows === null || this.fitRows >= this.rows.length\n\t\t},\n\n\t\t/** Whether the designed empty state is what the widget is showing. */\n\t\tshowingEmptyState() {\n\t\t\treturn !this.waitingForContext && !this.error && !this.loading && this.rows.length === 0\n\t\t},\n\n\t\t/**\n\t\t * How many matching objects are NOT rendered (server total minus the\n\t\t * visible slice). Drives the \"View all (N)\" footer.\n\t\t *\n\t\t * @return {number}\n\t\t */\n\t\thiddenCount() {\n\t\t\treturn Math.max((this.total || this.rows.length) - this.visibleRows.length, 0)\n\t\t},\n\n\t\t/** Pre-translated \"View all (N)\" footer label. */\n\t\tviewAllLabel() {\n\t\t\treturn t('nextcloud-vue', 'View all ({total})', { total: this.total || this.rows.length })\n\t\t},\n\n\t\t/**\n\t\t * The \"View all (N)\" router location: `viewAllRoute` with its\n\t\t * token-resolved `viewAllQuery`, or null without a route.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\tviewAllLocation() {\n\t\t\tconst route = this.content.viewAllRoute\n\t\t\tif (!route) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { name: route, query: resolveFilterTokens(this.content.viewAllQuery || {}, this.tokenCtx) }\n\t\t},\n\n\t\t/**\n\t\t * The href \"View all (N)\" links to, or '' when there is no router to\n\t\t * resolve it (the footer then renders as a button).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tviewAllHref() {\n\t\t\treturn resolveHref(this.viewAllLocation, this.$router)\n\t\t},\n\n\t\t/** Pre-translated \"+N more\" footer label (no viewAllRoute configured). */\n\t\tmoreLabel() {\n\t\t\treturn t('nextcloud-vue', '+{count} more', { count: this.hiddenCount })\n\t\t},\n\n\t\t/** Whether the create affordance renders (on by default; `content.allowCreate: false` opts out). */\n\t\tallowCreate() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn c.allowCreate !== false && Boolean(c.register) && Boolean(c.schema)\n\t\t},\n\n\t\t/**\n\t\t * NcDialog size for the create dialog (`content.formSize`).\n\t\t *\n\t\t * The widget fetches the WHOLE schema to build this form, so a list\n\t\t * scoped to a handful of columns still opened a create dialog asking\n\t\t * every property the schema declares — at `normal` width, in one\n\t\t * column. A case schema with thirty visible properties is unusable\n\t\t * that way, and every consumer that hit it worked around it by\n\t\t * turning the create button off.\n\t\t */\n\t\tformSize() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn c.formSize || 'normal'\n\t\t},\n\n\t\t/** How many columns the create dialog flows its fields into (`content.formColumns`). */\n\t\tformColumns() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn c.formColumns === 2 ? 2 : 1\n\t\t},\n\n\t\t/** Whitelist of fields the create dialog asks for (`content.formIncludeFields`). Null means all. */\n\t\tformIncludeFields() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn Array.isArray(c.formIncludeFields) ? c.formIncludeFields : null\n\t\t},\n\n\t\t/** Fields the create dialog leaves out (`content.formExcludeFields`). */\n\t\tformExcludeFields() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn Array.isArray(c.formExcludeFields) ? c.formExcludeFields : []\n\t\t},\n\n\t\t/** Per-field overrides for the create dialog (`content.formFieldOverrides`). */\n\t\tformFieldOverrides() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn (c.formFieldOverrides && typeof c.formFieldOverrides === 'object') ? c.formFieldOverrides : {}\n\t\t},\n\n\t\t/** Pre-translated Add label (overridable via `content.addLabel`). */\n\t\taddLabel() {\n\t\t\treturn this.content.addLabel || t('nextcloud-vue', 'Add')\n\t\t},\n\n\t\t/** Stable signature of the query so the watcher only refetches on real change. */\n\t\tsourceKey() {\n\t\t\tconst c = this.content || {}\n\t\t\treturn JSON.stringify({\n\t\t\t\tregister: c.register || '',\n\t\t\t\tschema: c.schema || '',\n\t\t\t\t// The RESOLVED filter (workspace + object tokens applied) so the\n\t\t\t\t// watcher refetches when page-level state a token reads changes.\n\t\t\t\tfilter: this.resolvedFilter,\n\t\t\t\t// `localSort`, not `c.sort` — an interactive header click\n\t\t\t\t// (`content.sortable`) overrides the manifest default without\n\t\t\t\t// touching the prop, and the fetch must follow that override.\n\t\t\t\tsort: this.localSort || {},\n\t\t\t\tlimit: c.limit || 25,\n\t\t\t\tobjectId: this.objectCtx ? this.objectCtx.objectId : null,\n\t\t\t})\n\t\t},\n\t},\n\n\twatch: {\n\t\tsourceKey() {\n\t\t\t// The query changed, so page 3 of the OLD result set means nothing\n\t\t\t// against the new one — and an out-of-range `_page` returns an empty\n\t\t\t// list, which would read as \"no matches\" rather than \"wrong page\".\n\t\t\tthis.page = 1\n\t\t\tthis.fetchRows()\n\t\t},\n\n\t\t// The create-dialog schema is cached per instance, and an instance can\n\t\t// be retargeted (CnRelatedCollections keys its children by index, so a\n\t\t// reordered entry reuses the component). A schema resolved for the OLD\n\t\t// register is exactly the wrong-app schema the register scoping above\n\t\t// exists to prevent — drop it so the next open resolves it again.\n\t\t//\n\t\t// The headings read the same cache, and unlike the dialog they have no\n\t\t// later moment that reloads it: without the second call a retargeted\n\t\t// widget goes back to printing `customerName` at the user until\n\t\t// somebody happens to open Add.\n\t\t'content.register': function() {\n\t\t\tthis.forgetCreateSchema()\n\t\t\tthis.loadHeadingsIfNeeded()\n\t\t},\n\n\t\t'content.schema': function() {\n\t\t\tthis.forgetCreateSchema()\n\t\t\tthis.loadHeadingsIfNeeded()\n\t\t},\n\t},\n\n\tmounted() {\n\t\tthis.fetchRows()\n\t\tthis.loadHeadingsIfNeeded()\n\t\t// Re-read on a page-level refresh. This list fetches its own rows from\n\t\t// OpenRegister and subscribed to nothing, so after a write elsewhere on\n\t\t// the page it went on rendering the result set it fetched on mount —\n\t\t// values the backend had already changed. The endpoint-bound widgets\n\t\t// have answered this channel since Wave 2 (useEndpointSource); the\n\t\t// store-backed ones did not.\n\t\t//\n\t\t// Guarded on `loading`: the channel is a broadcast, and a page whose\n\t\t// action fires it more than once (or a dialog that emits alongside the\n\t\t// page's own Refresh) must not turn one write into a queue of\n\t\t// overlapping reads for one list.\n\t\tthis._onPageRefresh = (payload) => {\n\t\t\tif (this.loading) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst done = this.fetchRows()\n\t\t\tpayload?.waitUntil?.(done)\n\t\t}\n\t\tsubscribe(PAGE_REFRESH_CHANNEL, this._onPageRefresh)\n\t\t// Observe the host grid cell so the visible row count re-fits on\n\t\t// resize/layout changes. Only detail-grid cells constrain height;\n\t\t// on dashboards the closest() lookup misses and fitRows stays null.\n\t\tconst cell = this.$el.closest && this.$el.closest('.grid-stack-item-content')\n\t\tif (cell && typeof ResizeObserver !== 'undefined') {\n\t\t\tthis._fitObserver = new ResizeObserver(() => this.measureFit())\n\t\t\tthis._fitObserver.observe(cell)\n\t\t}\n\t\tthis.$nextTick(() => this.measureFit())\n\t},\n\n\tbeforeUnmount() {\n\t\tif (this._onPageRefresh) {\n\t\t\tunsubscribe(PAGE_REFRESH_CHANNEL, this._onPageRefresh)\n\t\t\tthis._onPageRefresh = null\n\t\t}\n\t\tif (this._fitObserver) {\n\t\t\tthis._fitObserver.disconnect()\n\t\t}\n\t},\n\n\tmethods: {\n\t\t/**\n\t\t * Fetch the object rows from OpenRegister. Lazily imports the\n\t\t * axios/router helpers (the library never hard-depends on them at module\n\t\t * load — same pattern as CnStatWidget / CnFilesWidget).\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync fetchRows() {\n\t\t\tconst c = this.content || {}\n\t\t\tif (!c.register || !c.schema) {\n\t\t\t\tthis.rows = []\n\t\t\t\tthis.error = ''\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// A context token this list depends on (e.g. @workspace.selectedClient)\n\t\t\t// isn't set yet — don't fetch the whole register; the prompt shows.\n\t\t\tif (this.waitingForContext) {\n\t\t\t\tthis.rows = []\n\t\t\t\tthis.error = ''\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.error = ''\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst url = generateUrl(\n\t\t\t\t\t'/apps/openregister/api/objects/{register}/{schema}',\n\t\t\t\t\t{ register: c.register, schema: c.schema },\n\t\t\t\t)\n\t\t\t\t// `limit` is a FETCH CAP (ADR-062), not a render promise — the\n\t\t\t\t// visible count fits the cell; fetch enough to fill big cells.\n\t\t\t\t// It doubles as the PAGE SIZE: one fetch is exactly one page, so\n\t\t\t\t// the pager's \"1–25 of 137\" is the server's arithmetic and not a\n\t\t\t\t// client-side count of an already-capped window.\n\t\t\t\tconst params = { _limit: this.pageSize, _page: this.page }\n\t\t\t\tif (this.localSort && this.localSort.field) {\n\t\t\t\t\tparams[`_order[${this.localSort.field}]`] = (this.localSort.dir === 'desc' ? 'desc' : 'asc')\n\t\t\t\t}\n\t\t\t\t// `content.extend` → OpenRegister's repeated `_extend[]`. axios\n\t\t\t\t// serializes an array value as `_extend[]=a&_extend[]=b`, which\n\t\t\t\t// is the wire form OR reads. This is what turns a dotted column\n\t\t\t\t// key into a real value: the referenced object is inlined on the\n\t\t\t\t// row, so `informatieobject.title` resolves instead of reading a\n\t\t\t\t// uuid string as an object path.\n\t\t\t\tif (Array.isArray(c.extend)) {\n\t\t\t\t\tconst extend = c.extend.filter((e) => typeof e === 'string' && e !== '')\n\t\t\t\t\tif (extend.length > 0) {\n\t\t\t\t\t\tparams._extend = extend\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// The OpenRegister OBJECT-SEARCH endpoint filters on DIRECT field\n\t\t\t\t// params (`status=open`, `value[gt]=30000`) — unlike the\n\t\t\t\t// aggregation endpoints which use the nested `filter[...]` shape.\n\t\t\t\tconst filter = this.resolvedFilter\n\t\t\t\tif (filter && typeof filter === 'object') {\n\t\t\t\t\tfor (const [k, v] of Object.entries(filter)) {\n\t\t\t\t\t\tif (v && typeof v === 'object') {\n\t\t\t\t\t\t\tfor (const [op, ov] of Object.entries(v)) {\n\t\t\t\t\t\t\t\tparams[`${k}[${op}]`] = ov\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (v !== '' && v !== null && v !== undefined) {\n\t\t\t\t\t\t\tparams[k] = v\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst res = await axios.get(url, { params })\n\t\t\t\tthis.rows = (res && res.data && res.data.results) || []\n\t\t\t\tthis.total = (res && res.data && typeof res.data.total === 'number') ? res.data.total : this.rows.length\n\t\t\t\tthis.$nextTick(() => this.measureFit())\n\t\t\t} catch (e) {\n\t\t\t\t// Keep the raw message OUT of the template — log it for\n\t\t\t\t// debugging, surface only the quiet `loadErrorLabel` line.\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.warn('[CnObjectListWidget] failed to load objects:', e)\n\t\t\t\tthis.error = (e && e.message) || 'error'\n\t\t\t\tthis.rows = []\n\t\t\t\tthis.total = 0\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fit the visible row count to the host grid cell (ADR-062 — the cell\n\t\t * is the budget). Measures the cell's remaining height below the table\n\t\t * top, reserves room for the \"View all\" footer, and derives the row\n\t\t * budget from the first rendered row's height. No-ops (fitRows null =\n\t\t * render all fetched rows) outside a fixed-height cell.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tmeasureFit() {\n\t\t\t// `content.fit: false` opts out of the cell budget: render every row\n\t\t\t// fetched and let the container scroll. The budget below assumes the\n\t\t\t// list OWNS its cell, measuring from where the table starts to the\n\t\t\t// cell's bottom. That is wrong for a list stacked below other content\n\t\t\t// in the same cell (a section of a tabbed panel, say): it starts near\n\t\t\t// the bottom, the budget floors to one row, and the rest are clipped.\n\t\t\t// Only an explicit `false` opts out, so a manifest that never sets the\n\t\t\t// key keeps the ADR-062 behaviour unchanged.\n\t\t\tif (this.content && this.content.fit === false) {\n\t\t\t\tthis.fitRows = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst cell = this.$el && this.$el.closest && this.$el.closest('.grid-stack-item-content')\n\t\t\tif (!cell) {\n\t\t\t\tthis.fitRows = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst table = this.$el.querySelector('.cn-object-list-widget__table table')\n\t\t\tif (!table) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst cellRect = cell.getBoundingClientRect()\n\t\t\tconst tableRect = table.getBoundingClientRect()\n\t\t\tconst firstRow = table.querySelector('tbody tr')\n\t\t\tconst rowH = (firstRow && firstRow.getBoundingClientRect().height) || 44\n\t\t\tconst head = table.querySelector('thead')\n\t\t\tconst headH = (head && head.getBoundingClientRect().height) || 40\n\t\t\t// Room for the \"View all\" footer AND the Add button (ADR-062).\n\t\t\tconst footerReserve = 68\n\t\t\tconst available = cellRect.bottom - tableRect.top - footerReserve\n\t\t\tconst fit = Math.floor((available - headH) / rowH)\n\t\t\tthis.fitRows = Math.max(fit, 1)\n\t\t},\n\n\t\t/**\n\t\t * Drop the cached create-dialog schema (and close the dialog if it is\n\t\t * open) when the list points at another register or schema.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tforgetCreateSchema() {\n\t\t\tthis.createSchema = null\n\t\t\tthis.showCreate = false\n\t\t},\n\n\t\t/**\n\t\t * Open the create dialog for the list's target schema. PUBLIC — the\n\t\t * host card's Actions-menu \"Add\" entry calls this through a ref, the\n\t\t * widget's own footer button calls it directly (ADR-062: both\n\t\t * affordances, one dialog).\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync openCreate() {\n\t\t\tconst c = this.content || {}\n\t\t\tif (!c.schema) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.ensureSchema()\n\t\t\t\tthis.showCreate = true\n\t\t\t} catch (e) {\n\t\t\t\tthis.error = (e && e.message) || 'error'\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fetch this list's schema once, for whoever needs it.\n\t\t *\n\t\t * Two readers share it: the create dialog builds its form from the\n\t\t * properties, and `resolvedColumns` reads each property's `title` to\n\t\t * label a column the manifest gave only a key for.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync ensureSchema() {\n\t\t\tconst c = this.content || {}\n\t\t\tif (this.createSchema || !c.schema) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\timport('@nextcloud/router'),\n\t\t\t])\n\t\t\t// A slug is NOT a namespace (same rule as useObjectStore.fetchSchema,\n\t\t\t// #725): on an instance where two apps both own a `page` schema the\n\t\t\t// bare endpoint resolves instance-wide and serves the OTHER app's\n\t\t\t// schema into this form — the dialog then asks for fields the\n\t\t\t// register-scoped POST does not know and refuses the ones it\n\t\t\t// requires (portaliq + opencatalogi, WOO-564: a 400 on every\n\t\t\t// \"Add page\"/\"Add menu\"). Name the list's own register whenever it\n\t\t\t// has one; a backend that does not know the parameter ignores it.\n\t\t\tconst url = generateUrl('/apps/openregister/api/schemas/{sch}', { sch: c.schema })\n\t\t\tconst params = c.register ? { register: c.register } : undefined\n\t\t\tconst res = await axios.get(url, params ? { params } : undefined)\n\t\t\tthis.createSchema = (res && res.data) || null\n\t\t},\n\n\t\t/**\n\t\t * Load the schema when, and only when, a column heading needs it.\n\t\t *\n\t\t * A widget whose every column carries its own `label` never makes this\n\t\t * request. One that gave bare keys does, because the alternative is\n\t\t * printing the key at the user.\n\t\t *\n\t\t * Failure is deliberately silent: an unreachable schema costs the nicer\n\t\t * heading, and the column still renders under its key. It must never\n\t\t * cost the list itself.\n\t\t *\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync loadHeadingsIfNeeded() {\n\t\t\tconst cols = Array.isArray(this.content.columns) ? this.content.columns : []\n\t\t\tconst needsHeadings = cols.some((c) => (typeof c === 'string') || !c.label)\n\t\t\tif (needsHeadings === false) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.ensureSchema()\n\t\t\t} catch {\n\t\t\t\t// Headings only. Swallowed on purpose; see the docblock.\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Persist the create-dialog form: the resolved scalar filter values\n\t\t * are merged in as defaults (an FK-scoped list creates PRE-LINKED\n\t\t * children — a task added on a case detail already carries the case).\n\t\t *\n\t\t * @param {object} formData Confirmed form values.\n\t\t * @return {Promise<void>}\n\t\t */\n\t\tasync onCreateConfirm(formData) {\n\t\t\tconst c = this.content || {}\n\t\t\ttry {\n\t\t\t\tconst [{ default: axios }, { generateUrl }] = await Promise.all([\n\t\t\t\t\timport('@nextcloud/axios'),\n\t\t\t\t\timport('@nextcloud/router'),\n\t\t\t\t])\n\t\t\t\tconst payload = { ...formData }\n\t\t\t\tconst filter = this.resolvedFilter || {}\n\t\t\t\tfor (const [k, v] of Object.entries(filter)) {\n\t\t\t\t\tif (v && typeof v !== 'object' && (payload[k] === undefined || payload[k] === null || payload[k] === '')) {\n\t\t\t\t\t\tpayload[k] = v\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst url = generateUrl('/apps/openregister/api/objects/{register}/{schema}', { register: c.register, schema: c.schema })\n\t\t\t\tawait axios.post(url, payload)\n\t\t\t\tif (this.$refs.createDialog) {\n\t\t\t\t\tthis.$refs.createDialog.setResult({ success: true })\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\t * @event created Emitted after a successful create with the sent payload.\n\t\t\t\t * @type {object}\n\t\t\t\t */\n\t\t\t\tthis.$emit('created', payload)\n\t\t\t\tthis.fetchRows()\n\t\t\t} catch (e) {\n\t\t\t\tif (this.$refs.createDialog) {\n\t\t\t\t\tthis.$refs.createDialog.setResult({ error: (e && e.message) || 'error' })\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Pager click — refetch that page from the server. Paging is never\n\t\t * client-side over an already-capped window: that would silently drop\n\t\t * every row past the cap while still displaying a total that counted\n\t\t * them.\n\t\t *\n\t\t * @param {number} next The 1-based page to load.\n\t\t * @return {void}\n\t\t */\n\t\tonPageChange(next) {\n\t\t\tconst target = Math.min(Math.max(Number(next) || 1, 1), this.totalPages)\n\t\t\tif (target === this.page) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.page = target\n\t\t\tthis.fetchRows()\n\t\t},\n\n\t\t/**\n\t\t * \"View all (N)\" footer click: emits `view-all` and, when the content\n\t\t * blob names a `viewAllRoute`, navigates there with `viewAllQuery`\n\t\t * (its values token-resolved, so `{\"case\": \"@objectId\"}` carries the\n\t\t * current object scope into the target index page). A modified click\n\t\t * on the link is left to the browser.\n\t\t *\n\t\t * @param {MouseEvent} [event] The click event.\n\t\t * @return {void}\n\t\t */\n\t\tonViewAll(event) {\n\t\t\t/**\n\t\t\t * @event view-all Emitted when the \"View all (N)\" footer is clicked.\n\t\t\t * @type {{ total: number }}\n\t\t\t */\n\t\t\tthis.$emit('view-all', { total: this.total })\n\t\t\tif (this.viewAllLocation) {\n\t\t\t\tfollowLinkClick(event, this.viewAllLocation, this.$router)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Navigate to a configured detail route on row click (when `rowRoute`\n\t\t * is set and a router is available); a ctrl/cmd/shift click opens it\n\t\t * in a new tab.\n\t\t *\n\t\t * @param {object} row The clicked object row.\n\t\t * @param {MouseEvent} [event] The originating click event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowClick(row, event) {\n\t\t\tthis.openRowRoute(row, event)\n\t\t\t/**\n\t\t\t * @event row-click Emitted with the clicked object (for hosts that\n\t\t\t * want to handle navigation themselves). Payload: `(row, event)`, the\n\t\t\t * second being the native click event. A middle click emits\n\t\t\t * `row-aux-click` instead.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('row-click', row, event)\n\t\t},\n\n\t\t/**\n\t\t * A row middle click: opens the configured detail route in a new tab\n\t\t * and emits `row-aux-click`, not `row-click`.\n\t\t *\n\t\t * @param {object} row The clicked object row.\n\t\t * @param {MouseEvent} event The originating auxclick event.\n\t\t * @return {void}\n\t\t */\n\t\tonRowAuxClick(row, event) {\n\t\t\tthis.openRowRoute(row, event)\n\t\t\t/**\n\t\t\t * @event row-aux-click Emitted with the middle-clicked object, for\n\t\t\t * opening it in a new tab. Payload: `(row, event)`, the second being\n\t\t\t * the native auxclick event.\n\t\t\t * @type {object}\n\t\t\t */\n\t\t\tthis.$emit('row-aux-click', row, event)\n\t\t},\n\n\t\t/**\n\t\t * Open `content.rowRoute` for a row: in place, or in a new tab on a\n\t\t * ctrl/cmd/shift or middle click.\n\t\t *\n\t\t * @param {object} row The clicked object row.\n\t\t * @param {MouseEvent} [event] The originating event.\n\t\t * @return {void}\n\t\t */\n\t\topenRowRoute(row, event) {\n\t\t\tconst route = this.content.rowRoute\n\t\t\tconst id = row && (row.id || (row['@self'] && row['@self'].id))\n\t\t\tif (route && id && this.$router) {\n\t\t\t\tmarkNewTabHandled(event, openRowTarget(event, { name: route, params: { id } }, this.$router))\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Dispatch one declared row action. A `handler` action gets the row\n\t\t * appended as its last argument, the same convention CnWidgetObjectTable\n\t\t * uses, so a registry function reads its row from where it already\n\t\t * expects one. An `open-modal` action gets the row merged onto its\n\t\t * `props` as `row` — mirroring how a drop hands a modal `props.files`\n\t\t * and a bulk action hands it `props.selectedIds` — because a \"Versions\"\n\t\t * or \"Delete\" row action is meaningless without knowing WHICH row it\n\t\t * was clicked on, and `open-modal`'s `action.props` is forwarded\n\t\t * verbatim otherwise (it carries no per-click information at all).\n\t\t *\n\t\t * @param {object} action The declared action.\n\t\t * @param {object|null} row The row the action was triggered on.\n\t\t * @return {void}\n\t\t */\n\t\trunRowAction(action, row) {\n\t\t\tthis.dispatch(action, [row], { row })\n\t\t},\n\n\t\t/**\n\t\t * Link fields for a declared row action that only navigates, so\n\t\t * CnRowActions renders it as a link. A target with tokens is left to\n\t\t * dispatch, which resolves them against the page.\n\t\t *\n\t\t * @param {object} action The declared row action.\n\t\t * @return {object} `{ href, linkTarget }`, `{ to }`, or `{}`.\n\t\t */\n\t\trowActionLink(action) {\n\t\t\tif (hasActionTargetTokens(action.target)) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\tconst link = actionLink(action, { router: this.$router || null })\n\t\t\tif (!link) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn link.external ? { href: link.href, linkTarget: '_blank' } : { to: link.to }\n\t\t},\n\n\t\t/**\n\t\t * Dispatch a declared action through the page's pre-bound dispatcher,\n\t\t * falling back to a bare `dispatchAction` when this widget is mounted\n\t\t * outside a CnPageRenderer tree.\n\t\t *\n\t\t * `extraArgs` is appended to a `handler` action's `args`; it is NOT\n\t\t * merged into any other type, because only `handler` has an argument\n\t\t * list. A drop's `File[]` additionally rides an `open-modal` action's\n\t\t * `props.files`, since that is how a modal receives anything at all.\n\t\t *\n\t\t * @param {object} action The declared action.\n\t\t * @param {Array} extraArgs Arguments appended for a `handler` action.\n\t\t * @param {object} extraProps Props merged for an `open-modal` action.\n\t\t * @return {void}\n\t\t */\n\t\tdispatch(action, extraArgs = [], extraProps = {}) {\n\t\t\tif (!action || typeof action !== 'object') {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst type = action.type || 'handler'\n\t\t\tlet wrapped = action\n\t\t\tif (type === 'handler') {\n\t\t\t\twrapped = { ...action, args: [...(action.args || []), ...extraArgs] }\n\t\t\t} else if (type === 'open-modal' && Object.keys(extraProps).length > 0) {\n\t\t\t\twrapped = { ...action, props: { ...(action.props || {}), ...extraProps } }\n\t\t\t}\n\t\t\tif (typeof this.cnDispatchAction === 'function') {\n\t\t\t\tthis.cnDispatchAction(wrapped)\n\t\t\t} else {\n\t\t\t\tdispatchAction(wrapped, { router: this.$router || null })\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Whether a drag event is carrying files. A drag of text or of a row\n\t\t * from another table is not a file drop and must not paint the\n\t\t * overlay; `dataTransfer.types` is the only thing readable during a\n\t\t * dragover (the items themselves are not).\n\t\t *\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {boolean}\n\t\t */\n\t\tdragHasFiles(event) {\n\t\t\tconst types = event && event.dataTransfer && event.dataTransfer.types\n\t\t\tif (!types) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn Array.prototype.indexOf.call(types, 'Files') !== -1\n\t\t},\n\n\t\t/**\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonDragEnter(event) {\n\t\t\tif (!this.dropZoneAction || !this.dragHasFiles(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.dragDepth += 1\n\t\t},\n\n\t\t/**\n\t\t * `dragover` must preventDefault or the browser refuses the drop and\n\t\t * navigates to the file instead.\n\t\t *\n\t\t * @param {DragEvent} event The drag event.\n\t\t * @return {void}\n\t\t */\n\t\tonDragOver(event) {\n\t\t\tif (!this.dropZoneAction || !this.dragHasFiles(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t},\n\n\t\t/**\n\t\t * Leaving one element of the widget. The event is not read: a\n\t\t * `dragleave` fires for the widget AND for every child crossed, so the\n\t\t * counter — not this event — decides whether the drag is still over us.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tonDragLeave() {\n\t\t\tif (!this.dropZoneAction) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.dragDepth = Math.max(0, this.dragDepth - 1)\n\t\t},\n\n\t\t/**\n\t\t * Hand the dropped files to the declared `dropZone` action. Nothing is\n\t\t * uploaded here: this component reads no file content and calls no\n\t\t * write endpoint, so whoever receives the files decides where they go\n\t\t * — the same split the form file field keeps.\n\t\t *\n\t\t * @param {DragEvent} event The drop event.\n\t\t * @return {void}\n\t\t */\n\t\tonDrop(event) {\n\t\t\tif (!this.dropZoneAction) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this.dragHasFiles(event)) {\n\t\t\t\tthis.dragDepth = 0\n\t\t\t\treturn\n\t\t\t}\n\t\t\tevent.preventDefault()\n\t\t\tthis.dragDepth = 0\n\t\t\tconst files = Array.from((event.dataTransfer && event.dataTransfer.files) || [])\n\t\t\tif (files.length === 0) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event files-dropped Emitted with the dropped files, for a host\n\t\t\t * that wants to handle the drop itself rather than declare an action.\n\t\t\t * @type {Array<File>}\n\t\t\t */\n\t\t\tthis.$emit('files-dropped', files)\n\t\t\tthis.dispatch(this.dropZoneAction, [files], { files })\n\t\t},\n\n\t\t/**\n\t\t * Open the native file picker for the click-to-upload button — the\n\t\t * same `dropZoneAction` a drop dispatches, so a reader who never drags\n\t\t * a file reaches the identical outcome.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\ttriggerUpload() {\n\t\t\tif (this.$refs.uploadInput) {\n\t\t\t\tthis.$refs.uploadInput.click()\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle files chosen via the upload button's file picker.\n\t\t *\n\t\t * @param {Event} event The change event.\n\t\t * @return {void}\n\t\t */\n\t\tonUploadFilesSelected(event) {\n\t\t\tconst files = Array.from((event.target && event.target.files) || [])\n\t\t\tif (files.length === 0 || !this.dropZoneAction) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.$emit('files-dropped', files)\n\t\t\tthis.dispatch(this.dropZoneAction, [files], { files })\n\t\t\tevent.target.value = ''\n\t\t},\n\n\t\t/**\n\t\t * CnDataTable's `select` handler — replaces the whole selected-ids\n\t\t * array (it already computed the add/remove/select-all arithmetic).\n\t\t *\n\t\t * @param {Array<string>} ids The new selection.\n\t\t * @return {void}\n\t\t */\n\t\tonSelect(ids) {\n\t\t\tthis.selectedIds = Array.isArray(ids) ? ids : []\n\t\t},\n\n\t\t/**\n\t\t * Clear the current selection. Called after a bulk action fires, and\n\t\t * from the bulk bar's own \"Clear selection\" button.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tclearSelection() {\n\t\t\tthis.selectedIds = []\n\t\t},\n\n\t\t/**\n\t\t * Dispatch a declared bulk action against the current selection, then\n\t\t * clear it — the action owns its own success/error feedback and page\n\t\t * refresh (same convention as a row action), this widget only owns the\n\t\t * checkbox state.\n\t\t *\n\t\t * @param {object} action The declared bulk action.\n\t\t * @return {void}\n\t\t */\n\t\trunBulkAction(action) {\n\t\t\tthis.dispatch(action, [this.selectedRows], { selectedIds: [...this.selectedIds] })\n\t\t\tthis.clearSelection()\n\t\t},\n\n\t\t/**\n\t\t * CnDataTable's `sort` handler for an interactively-sortable column\n\t\t * (`content.sortable`). Overwrites `localSort`, which both the fetch\n\t\t * params and the table's own sort-indicator props read — a cleared\n\t\t * sort (`key: null`, a third click on a two-state header) goes back to\n\t\t * the unordered default rather than sticking on the last field.\n\t\t *\n\t\t * @param {{key: string|null, order: string|null}} payload The new sort.\n\t\t * @return {void}\n\t\t */\n\t\tonSort({ key, order }) {\n\t\t\tthis.localSort = key ? { field: key, dir: order || 'asc' } : {}\n\t\t},\n\n\t\t/**\n\t\t * Toggle one facet value on/off (`content.facet`).\n\t\t *\n\t\t * @param {string} value The facet value clicked.\n\t\t * @return {void}\n\t\t */\n\t\ttoggleFacetValue(value) {\n\t\t\tconst index = this.facetSelected.indexOf(value)\n\t\t\tif (index === -1) {\n\t\t\t\tthis.facetSelected = [...this.facetSelected, value]\n\t\t\t} else {\n\t\t\t\tthis.facetSelected = this.facetSelected.filter((v) => v !== value)\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Clear the facet filter, so every loaded row shows again.\n\t\t *\n\t\t * @return {void}\n\t\t */\n\t\tclearFacet() {\n\t\t\tthis.facetSelected = []\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n/* The widget already lives inside CnWidgetWrapper's padded card chrome. The\n table is rendered `borderless` so CnDataTable drops its own border/shadow/\n background AND its bottom margin (the `.cn-table-container--borderless`\n modifier) — otherwise it reads as a card-in-a-card with dead space below.\n Horizontal overflow is owned by `.cn-table-container` (overflow-x: auto); a\n second scroll container here would produce a nested scrollbar, so this host\n stays plain. */\n.cn-object-list-widget {\n\twidth: 100%;\n\theight: 100%;\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-height: 0;\n}\n\n/* The overlay covers the widget while a file drag is over it. `position:\n relative` is set only in the dropping state so a widget without a drop zone\n keeps the containing block it had — an unconditional rule here would\n re-parent any absolutely-positioned descendant a host has placed. */\n.cn-object-list-widget--dropping {\n\tposition: relative;\n}\n\n.cn-object-list-widget__drop-overlay {\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 2;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\ttext-align: center;\n\tpadding: var(--cn-spacing-m, 12px);\n\tborder: 2px dashed var(--color-primary-element);\n\tborder-radius: var(--border-radius-large, 12px);\n\tbackground-color: var(--color-primary-element-light);\n\tcolor: var(--color-main-text);\n\t/* The overlay is a painted state, not a target: letting it swallow the\n\t pointer would fire dragleave the instant it appeared under the cursor,\n\t and the drop would land on nothing. */\n\tpointer-events: none;\n}\n\n.cn-object-list-widget__table {\n\tflex: 1 1 auto;\n\tmin-height: 0;\n\toverflow: hidden;\n}\n\n/* The empty state is CnWidgetEmptyState now — it brings its own layout, so\n all this rule still owns is letting it claim the cell's leftover height\n (ADR-062: it fits the cell, it never forces one). */\n.cn-object-list-widget__empty {\n\tflex: 1 1 auto;\n\tmin-height: 0;\n}\n\n/* The pager sits flush at the bottom of the card, above \"View all\". */\n.cn-object-list-widget__pager {\n\tflex-shrink: 0;\n}\n\n.cn-object-list-widget__view-all {\n\talign-self: flex-start;\n\tbackground: none;\n\tborder: none;\n\tcolor: var(--color-primary-element);\n\tcursor: pointer;\n\tfont: inherit;\n\tmargin-top: 4px;\n\tpadding: 4px;\n\ttext-decoration: none;\n}\n\n.cn-object-list-widget__view-all:hover,\n.cn-object-list-widget__view-all:focus-visible {\n\ttext-decoration: underline;\n}\n\n.cn-object-list-widget__more {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tmargin: 4px 0 0;\n\tpadding: 4px;\n}\n\n/* Footer Add — same pattern as the integration leaves' footer action\n (\"Open in Calendar\"): full-width, centered, divider-topped, pinned to\n the card bottom. */\n.cn-object-list-widget__add {\n\talign-self: stretch;\n\tborder-top: 1px solid var(--color-border);\n\t/* Bleed through the host card's 16px content padding so the divider\n\t spans edge-to-edge, exactly like the integration leaves' footer. */\n\tmargin: auto -16px -16px;\n\tpadding: 4px;\n}\n\n.cn-object-list-widget__error {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tmargin: 4px 0 0;\n}\n\n.cn-object-list-widget__prompt {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-style: italic;\n\tpadding: 16px 4px;\n\tmargin: 0;\n\ttext-align: center;\n}\n\n.cn-object-list-widget__facet {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n\tgap: 6px;\n\tpadding: 0 4px 8px;\n}\n\n.cn-object-list-widget__facet-label {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tfont-weight: 600;\n}\n\n.cn-object-list-widget__facet-chip {\n\tbackground-color: var(--color-background-hover);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius-pill, 16px);\n\tcolor: var(--color-main-text);\n\tcursor: pointer;\n\tfont: inherit;\n\tfont-size: 0.85em;\n\tpadding: 2px 10px;\n}\n\n.cn-object-list-widget__facet-chip--active {\n\tbackground-color: var(--color-primary-element-light);\n\tborder-color: var(--color-primary-element);\n\tcolor: var(--color-primary-element-text, var(--color-main-text));\n}\n\n.cn-object-list-widget__facet-clear,\n.cn-object-list-widget__bulk-clear {\n\tbackground: none;\n\tborder: none;\n\tcolor: var(--color-primary-element);\n\tcursor: pointer;\n\tfont: inherit;\n\tfont-size: 0.85em;\n\tpadding: 2px 4px;\n}\n\n.cn-object-list-widget__facet-clear:hover,\n.cn-object-list-widget__bulk-clear:hover {\n\ttext-decoration: underline;\n}\n\n.cn-object-list-widget__bulk-bar {\n\talign-items: center;\n\tbackground-color: var(--color-primary-element-light);\n\tborder-radius: var(--border-radius, 8px);\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 8px;\n\tmargin: 0 0 8px;\n\tpadding: 6px 10px;\n}\n\n.cn-object-list-widget__bulk-count {\n\tfont-weight: 600;\n}\n\n.cn-object-list-widget__bulk-action {\n\tbackground-color: var(--color-main-background);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius, 8px);\n\tcursor: pointer;\n\tfont: inherit;\n\tpadding: 4px 10px;\n}\n\n.cn-object-list-widget__bulk-action--destructive {\n\tborder-color: var(--color-error);\n\tcolor: var(--color-error);\n}\n\n.cn-object-list-widget__groups {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 16px;\n\tmin-height: 0;\n\toverflow: auto;\n}\n\n.cn-object-list-widget__group-heading {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.85em;\n\tfont-weight: 600;\n\tmargin: 0 0 4px;\n\ttext-transform: uppercase;\n}\n\n.cn-object-list-widget__upload {\n\tbackground-color: var(--color-main-background);\n\tborder: 1px solid var(--color-border);\n\tborder-radius: var(--border-radius, 8px);\n\tcursor: pointer;\n\tfont: inherit;\n\tmargin: 8px 0 0;\n\tpadding: 6px 12px;\n}\n\n.cn-object-list-widget__upload-input {\n\tdisplay: none;\n}\n</style>\n"],"names":["CnDataTable","CnFormDialog","CnPagination","CnWidgetEmptyState","CnRowActions","CnFkResolveCell","t"],"mappings":"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"}
@@ -187,6 +187,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
187
187
  sortOrder: $data.localSort.dir || 'asc',
188
188
  borderless: "",
189
189
  onRowClick: $options.onRowClick,
190
+ onRowAuxClick: $options.onRowAuxClick,
190
191
  onSelect: $options.onSelect,
191
192
  onSort: $options.onSort
192
193
  }, createSlots({ _: 2 /* DYNAMIC */ }, [
@@ -202,7 +203,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
202
203
  key: "0"
203
204
  }
204
205
  : undefined
205
- ]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["columns", "rows", "loading", "emptyText", "selectable", "selectedIds", "sortKey", "sortOrder", "onRowClick", "onSelect", "onSort"])
206
+ ]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["columns", "rows", "loading", "emptyText", "selectable", "selectedIds", "sortKey", "sortOrder", "onRowClick", "onRowAuxClick", "onSelect", "onSort"])
206
207
  ]))
207
208
  }), 128 /* KEYED_FRAGMENT */))
208
209
  ]))
@@ -218,6 +219,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
218
219
  sortOrder: $data.localSort.dir || 'asc',
219
220
  borderless: "",
220
221
  onRowClick: $options.onRowClick,
222
+ onRowAuxClick: $options.onRowAuxClick,
221
223
  onSelect: $options.onSelect,
222
224
  onSort: $options.onSort
223
225
  }, createSlots({ _: 2 /* DYNAMIC */ }, [
@@ -233,7 +235,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
233
235
  key: "0"
234
236
  }
235
237
  : undefined
236
- ]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["columns", "rows", "loading", "emptyText", "selectable", "selectedIds", "sortKey", "sortOrder", "onRowClick", "onSelect", "onSort"])
238
+ ]), 1032 /* PROPS, DYNAMIC_SLOTS */, ["columns", "rows", "loading", "emptyText", "selectable", "selectedIds", "sortKey", "sortOrder", "onRowClick", "onRowAuxClick", "onSelect", "onSort"])
237
239
  ])),
238
240
  ($options.showPager)
239
241
  ? (openBlock(), createBlock(_component_CnPagination, {