@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
@@ -17,6 +17,7 @@ import ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue';
17
17
  import ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue';
18
18
  import __sfc_main from '../CnBuildiqEditButton/CnBuildiqEditButton.vue.js';
19
19
  import { resolveItemActionLink, followItemActionLink } from '../../utils/actionLink.js';
20
+ import { isModifiedClick } from '../../utils/linkNavigation.js';
20
21
  import __sfc_main$1 from '../CnIcon/CnIcon.vue.js';
21
22
 
22
23
  /**
@@ -568,12 +569,17 @@ var script = {
568
569
 
569
570
  /**
570
571
  * Add button click: a plain click on an in-app link routes in place,
571
- * anything else on a link is the browser's. Emits `add` either way.
572
+ * anything else on a link is the browser's. Emits `add`, except for a
573
+ * modified click on a link, which opens in a new tab: a host `@add`
574
+ * would otherwise run in the tab the user is leaving.
572
575
  *
573
576
  * @param {MouseEvent} event The click event.
574
577
  */
575
578
  onAddClick(event) {
576
579
  if (this.addLink) {
580
+ if (isModifiedClick(event)) {
581
+ return
582
+ }
577
583
  followItemActionLink(event, this.addLink, this.$router);
578
584
  }
579
585
  this.$emit('add');
@@ -581,13 +587,17 @@ var script = {
581
587
 
582
588
  /**
583
589
  * A header link entry was clicked: route a plain in-app click and emit
584
- * `header-action` as the button would.
590
+ * `header-action` as the button would. A modified click is the
591
+ * browser's alone (a new tab), so nothing is emitted for it.
585
592
  *
586
593
  * @param {object} entry The header action.
587
594
  * @param {object} link The resolved link.
588
595
  * @param {MouseEvent} event The click event.
589
596
  */
590
597
  onHeaderLinkClick(entry, link, event) {
598
+ if (isModifiedClick(event)) {
599
+ return
600
+ }
591
601
  followItemActionLink(event, link, this.$router);
592
602
  this.$emit('header-action', { action: entry.id, id: entry.id });
593
603
  },
@@ -1 +1 @@
1
- {"version":3,"file":"CnActionsBar.vue2.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue"],"sourcesContent":["<template>\n\t<div class=\"cn-actions-bar\" data-testid=\"cn-actions-bar\">\n\t\t<div class=\"cn-actions-bar__info\">\n\t\t\t<!-- Inline search field (opt-in) -->\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"pagination && pagination.total > 0\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->\n\t\t\t<slot name=\"after-search\" />\n\n\t\t\t<!-- View mode toggle (Cards / Table / List) — segmented control with\n\t\t\t a sliding thumb that animates between the N segments. Lives in\n\t\t\t the LEFT info group: switching view is a visual control like\n\t\t\t search and filters, it adds nothing — so it groups with them at\n\t\t\t every width instead of riding with the act buttons. -->\n\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\trole=\"group\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'View mode')\">\n\t\t\t\t<!-- Sliding pill that sits behind the active segment. Width and\n\t\t\t\t offset are driven by the segment count so the same markup\n\t\t\t\t works for 2–4 segments (cards / table / list / map). -->\n\t\t\t\t<span\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-thumb\"\n\t\t\t\t\t:style=\"thumbStyle\"\n\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t<!--\n\t\t\t\t\t@event view-mode-change\n\t\t\t\t\t@description User clicked one of the view-mode toggle buttons (Cards / Table / List / Map). Payload is the selected mode string.\n\t\t\t\t\t@type {'cards' | 'table' | 'list' | 'map'}\n\t\t\t\t-->\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<span class=\"cn-actions-bar__view-toggle-label\">{{ seg.label }}</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cn-actions-bar__actions\">\n\t\t\t<!-- Sort select (opt-in). A standalone sort control for card/list\n\t\t\t views, which — unlike the table — have no sortable column\n\t\t\t headers. A leading sort icon replaces a visible \"Sort by\"\n\t\t\t label so the control stays on one line; the label is kept as\n\t\t\t the combobox's accessible name. -->\n\t\t\t<div v-if=\"showSortSelect && sortOptions.length\" class=\"cn-actions-bar__sort\">\n\t\t\t\t<SortVariant :size=\"20\" class=\"cn-actions-bar__sort-icon\" :aria-label=\"sortLabel\" />\n\t\t\t\t<NcSelect\n\t\t\t\t\tclass=\"cn-actions-bar__sort-select\"\n\t\t\t\t\t:modelValue=\"selectedSortOption\"\n\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t:reduce=\"opt => opt.value\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t:aria-label-combobox=\"sortLabel\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"onSortChange\" />\n\t\t\t</div>\n\n\t\t\t<!-- @slot filters Inline filter controls rendered inside the action bar, between the view toggle and the add/actions (e.g. a CnQuickFilterBar segmented toggle). -->\n\t\t\t<slot name=\"filters\" />\n\n\t\t\t<!-- Search / Columns sidebar toggle (opt-in). Icon-only; reflects the\n\t\t\t open state via aria-pressed so the index sidebar can default\n\t\t\t closed and be opened on demand. -->\n\t\t\t<!--\n\t\t\t\t@event toggle-sidebar\n\t\t\t\t@description User clicked the Search/Columns sidebar toggle. No payload — the host flips the sidebar open state.\n\t\t\t-->\n\t\t\t<NcButton v-if=\"showSidebarToggle\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:title=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Tune :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions\n\t\t\t\t@description Custom buttons rendered between the sidebar toggle and the primary Add button.\n\t\t\t-->\n\t\t\t<slot name=\"actions\" />\n\n\t\t\t<!--\n\t\t\t\t@event add\n\t\t\t\t@description User clicked the primary Add button. No payload.\n\t\t\t-->\n\t\t\t<!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`. -->\n\t\t\t<NcButton v-if=\"showAdd\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"addDisabled\"\n\t\t\t\t:href=\"addLink ? addLink.href : undefined\"\n\t\t\t\tdata-testid=\"cn-cta-primary\"\n\t\t\t\tdata-walkthrough-id=\"index-add\"\n\t\t\t\t@click=\"onAddClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Custom buttons (e.g. CnIndexPage's saved-views control) rendered AFTER the primary Add button, immediately before the overflow menu — for content that belongs grouped with \"browse/manage\" controls rather than with the app-specific buttons in `#actions`.\n\t\t\t-->\n\t\t\t<slot name=\"actions-end\" />\n\n\t\t\t<!-- In-app edit button (ADR-041): icon-only, self-wires from CnAppRoot. -->\n\t\t\t<CnBuildiqEditButton />\n\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\n\t\t\t<NcActions\n\t\t\t\t:forceName=\"true\"\n\t\t\t\t:inline=\"inlineActionCount\"\n\t\t\t\t:menuName=\"actionsMenuName\"\n\t\t\t\tdata-testid=\"cn-actions\">\n\t\t\t\t<!--\n\t\t\t\t\t@event refresh\n\t\t\t\t\t@description User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton :disabled=\"refreshing || refreshDisabled\" @click=\"$emit('refresh')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"refreshing\" :size=\"20\" />\n\t\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ refreshing ? t('nextcloud-vue', 'Refreshing…') : t('nextcloud-vue', 'Refresh') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<NcActionLink v-if=\"documentationUrl\"\n\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<BookOpenVariantOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ documentationLabel }}\n\t\t\t\t</NcActionLink>\n\n\t\t\t\t<!-- Manifest-declared page-level header actions (overflow); an entry with `href` / `to` is a real link. -->\n\t\t\t\t<template v-for=\"{ entry, link } in renderedHeaderActions\" :key=\"entry.id\">\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"link\"\n\t\t\t\t\t\t:href=\"link.href\"\n\t\t\t\t\t\t:target=\"link.target\"\n\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t@click=\"onHeaderLinkClick(entry, link, $event)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:disabled=\"Boolean(entry.disabled)\"\n\t\t\t\t\t\t@click=\"$emit('header-action', { action: entry.id, id: entry.id })\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot action-items\n\t\t\t\t\t@description Additional NcActionButton-family items rendered inside the overflow menu, between the built-in Refresh entry and the mass-actions separator. Use for app-level page actions.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"action-items\" />\n\n\t\t\t\t<!-- Separator between primary and mass actions. Hidden when the\n\t\t\t\t inline-action-count hoists every pre-separator item out of the\n\t\t\t\t overflow, which would otherwise leave the separator orphaned. -->\n\t\t\t\t<NcActionSeparator v-if=\"showActionsSeparator\" />\n\n\t\t\t\t<!-- Mass actions (overflow) -->\n\t\t\t\t<!--\n\t\t\t\t\t@event show-import\n\t\t\t\t\t@description User clicked the Import mass action. Host should open the import modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassImport\"\n\t\t\t\t\t@click=\"$emit('show-import')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Import :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Import') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-export\n\t\t\t\t\t@description User clicked the Export mass action. Host should open the export modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassExport\"\n\t\t\t\t\t@click=\"$emit('show-export')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Export :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Export') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-copy\n\t\t\t\t\t@description User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to copy') : ''\"\n\t\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-delete\n\t\t\t\t\t@description User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to delete') : ''\"\n\t\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot mass-actions\n\t\t\t\t\t@description Additional mass-action NcActionButtons rendered at the bottom of the overflow menu. Scope receives the current selection count and ids so the host can disable / label per selection.\n\t\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selectedIds=\"selectedIds\" />\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- Always-present live region for the selection count (WCAG 2.1\n\t\t SC 4.1.3 Status Messages): a `role=\"status\"` element must exist\n\t\t BEFORE its content changes for assistive tech to announce it, so\n\t\t it cannot live inside the v-if'd strip below. -->\n\t\t<span class=\"cn-actions-bar__sr-status\" role=\"status\">\n\t\t\t{{ selectable && selectedIds.length > 0 ? selectionCountText : '' }}\n\t\t</span>\n\n\t\t<!-- Contextual selection strip (the Proton Pass / Gmail / Files\n\t\t pattern): appears while a selection is active, carrying the\n\t\t visible count, the built-in selection-scoped mass actions, the\n\t\t host's own bulk buttons (#selection-actions) and a Clear control.\n\t\t This strip is the discoverable surface for bulk actions; the\n\t\t BUILT-IN Copy/Delete-selected also stay listed in the overflow\n\t\t menu above, while a host decides for its own actions (strip-only\n\t\t is fine — keepiq does exactly that). -->\n\t\t<div\n\t\t\tv-if=\"selectable && selectedIds.length > 0\"\n\t\t\tclass=\"cn-actions-bar__selection\"\n\t\t\tdata-testid=\"cn-selection-strip\">\n\t\t\t<span class=\"cn-actions-bar__selection-count\" aria-hidden=\"true\">\n\t\t\t\t{{ selectionCountText }}\n\t\t\t</span>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\tDeclarative bulk actions, from `bulkActions`. They render in the\n\t\t\t\tSAME strip as a host's slot buttons and before them, so a page\n\t\t\t\tthat declares some in its manifest and hand-writes others gets\n\t\t\t\tone row of buttons rather than two groups in different places.\n\t\t\t\t@event bulk-action\n\t\t\t\t@description User clicked a declarative bulk action. Payload carries the action id AND the selection, because a bulk action without its selection is not a bulk action.\n\t\t\t-->\n\t\t\t<NcButton\n\t\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t{{ entry.label }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\t@slot selection-actions The host app's bulk-action buttons (NcButton family), rendered inside the contextual selection strip that appears while a selection is active. This strip is the primary bulk-actions surface; #mass-actions remains available for hosts that ALSO want the actions listed in the overflow menu (optional — strip-only is fine).\n\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t-->\n\t\t\t<slot\n\t\t\t\tname=\"selection-actions\"\n\t\t\t\t:count=\"selectedIds.length\"\n\t\t\t\t:selectedIds=\"selectedIds\" />\n\t\t\t<!--\n\t\t\t\t@event clear-selection\n\t\t\t\t@description User clicked the selection strip's Clear control. The host should empty its selection (CnIndexPage does this for you and re-emits `select` with an empty array).\n\t\t\t-->\n\t\t\t<!-- No aria-label: the visible \"Clear selection\" text IS the\n\t\t\t accessible name (review: an override here is redundant). -->\n\t\t\t<NcButton\n\t\t\t\tclass=\"cn-actions-bar__selection-clear\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcActionSeparator, NcButton, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Export from 'vue-material-design-icons/Export.vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport Import from 'vue-material-design-icons/Import.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport SortVariant from 'vue-material-design-icons/SortVariant.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Tune from 'vue-material-design-icons/Tune.vue'\nimport ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'\nimport ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\n *\n * ```vue\n * <CnActionsBar\n * :pagination=\"pagination\"\n * :object-count=\"items.length\"\n * add-label=\"Add Client\"\n * add-icon=\"AccountGroup\"\n * @add=\"createNew\"\n * @refresh=\"reload\" />\n * ```\n */\nexport default {\n\tname: 'CnActionsBar',\n\n\tcomponents: {\n\t\tCnBuildiqEditButton,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tCnIcon,\n\t\tSortVariant,\n\t\tBookOpenVariantOutline,\n\t\tClose,\n\t\tPlus,\n\t\tRefresh,\n\t\tContentCopy,\n\t\tTrashCanOutline,\n\t\tImport,\n\t\tExport,\n\t\tMagnify,\n\t\tTune,\n\t\tViewGridOutline,\n\t\tFormatListBulletedSquare,\n\t\tMapMarkerOutline,\n\t},\n\n\tinject: {\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 `headerActions[].label` is run through it — the\n\t\t * entry is keyed and emitted by `id`, so only the visible text\n\t\t * changes. Defaults to an identity function so an untranslated key\n\t\t * renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Pagination state: { total, page, pages, limit } */\n\t\tpagination: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\n\t\tobjectCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether rows/cards can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Currently selected IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Label for the Add button */\n\t\taddLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Add'),\n\t\t},\n\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\n\t\taddIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * URL the Add button links to. Makes the button a real link (middle-click,\n\t\t * open in new tab) that still emits `add` on click. `addTo` is ignored when set.\n\t\t *\n\t\t * @type {string|null}\n\t\t */\n\t\taddHref: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * vue-router location (path or `{ name, params }`) the Add button links to.\n\t\t * The button becomes a real link whose plain click routes in place and still\n\t\t * emits `add`; the host must then not navigate on `add` itself. Ignored when\n\t\t * the router cannot resolve it.\n\t\t *\n\t\t * @type {string|object|null}\n\t\t */\n\t\taddTo: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\n\t\tinlineActionCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Import action */\n\t\tshowMassImport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Export action */\n\t\tshowMassExport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Copy action */\n\t\tshowMassCopy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Delete action */\n\t\tshowMassDelete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current view mode: 'table', 'cards', 'list', or 'map' */\n\t\tviewMode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (v) => ['table', 'cards', 'list', 'map'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Which view-mode segments to render, in order. Defaults to the\n\t\t * historical two-segment control; add `'list'` to expose the list view.\n\t\t *\n\t\t * @type {Array<'cards' | 'table' | 'list'>}\n\t\t */\n\t\tavailableViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ['cards', 'table'],\n\t\t\tvalidator: (modes) => modes.every((m) => ['cards', 'table', 'list'].includes(m)),\n\t\t},\n\n\t\t/** Whether to show the view-mode toggle */\n\t\tshowViewToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Label for the cards/grid view-toggle option (defaults to \"Cards\") */\n\t\tcardsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the table/list view-toggle option (defaults to \"Table\") */\n\t\ttableLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the cards option (defaults to the built-in grid icon). Resolved via CnIcon. */\n\t\tcardsIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the table option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\ttableIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether to render the \"Map\" segment in the view toggle (back-compat bridge; equivalent to adding 'map' to `availableViewModes`). */\n\t\tshowMap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Label for the map view-toggle option (defaults to \"Map\"). */\n\t\tmapLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via CnIcon. */\n\t\tmapIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the list view-toggle option (defaults to \"List\") */\n\t\tlistLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the list option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\tlistIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show a standalone sort dropdown (useful in card/list views). */\n\t\tshowSortSelect: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Options for the sort dropdown.\n\t\t *\n\t\t * @type {Array<{ value: string, label: string }>}\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The currently selected sort option value (controlled). */\n\t\tsortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Accessible label for the sort dropdown. */\n\t\tsortLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Sort by'),\n\t\t},\n\n\t\t/** Whether to show the inline search field on the left of the bar */\n\t\tshowSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current value of the inline search field (controlled) */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder / accessible label for the inline search field */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether the refresh action is currently in progress */\n\t\trefreshing: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is disabled (e.g. when required selections are missing) */\n\t\trefreshDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the Add button is disabled (e.g. when required selections are missing) */\n\t\taddDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether to show the Add button */\n\t\tshowAdd: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the Search/Columns sidebar toggle button. Lets the\n\t\t * index sidebar default to closed and be opened on demand.\n\t\t */\n\t\tshowSidebarToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current open state of the sidebar (controls the toggle's pressed state). */\n\t\tsidebarOpen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Manifest-declared page-level actions rendered in the overflow\n\t\t * dropdown between Refresh and the `#action-items` slot. Each\n\t\t * entry is `{ id, label, icon?, disabled? }`. The bar emits\n\t\t * `@header-action({ action: id, id })` on click; handler\n\t\t * resolution happens upstream (CnIndexPage). An entry with `href`\n\t\t * (URL) or `to` (vue-router location) renders as a real link, with\n\t\t * `linkTarget` as its `target`; it still emits `header-action`, so the\n\t\t * host must not navigate for it again.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, href?: string, to?: string|object, linkTarget?: string }>}\n\t\t */\n\t\theaderActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Declarative bulk actions, rendered in the contextual selection strip\n\t\t * that appears while a selection is active.\n\t\t *\n\t\t * The strip already had a `#selection-actions` slot, which only a\n\t\t * hand-written host component can fill — so a page declared in an app\n\t\t * manifest could carry row actions and header actions but never a bulk\n\t\t * one. This prop is that missing vocabulary; the slot stays, and both\n\t\t * render side by side in one row.\n\t\t *\n\t\t * Clicking emits `bulk-action` with the id AND the current selection.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean }>}\n\t\t */\n\t\tbulkActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * When set, adds a Documentation entry to the overflow menu (after\n\t\t * Refresh, before headerActions). Opens the URL in a new tab.\n\t\t * Empty string hides the entry.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Documentation overflow entry. */\n\t\tdocumentationLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Documentation'),\n\t\t},\n\t},\n\n\temits: [\n\t\t'add',\n\t\t'bulk-action',\n\t\t'clear-selection',\n\t\t'header-action',\n\t\t'refresh',\n\t\t'search',\n\t\t'show-copy',\n\t\t'show-delete',\n\t\t'show-export',\n\t\t'show-import',\n\t\t'sort-change',\n\t\t'toggle-sidebar',\n\t\t'view-mode-change',\n\t],\n\n\tcomputed: {\n\t\t/**\n\t\t * Name of the overflow Actions menu. Library chrome, so it resolves\n\t\t * against the LIBRARY catalogue — it was a bare `menu-name=\"Actions\"`\n\t\t * literal, which rendered \"Actions\" in a Dutch session next to an\n\t\t * otherwise fully translated toolbar even though the catalogue has\n\t\t * carried \"Acties\" all along.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsMenuName() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * The selection strip's count text — also fed to the always-present\n\t\t * `role=\"status\"` live region (WCAG 2.1 SC 4.1.3), so assistive tech\n\t\t * announces selection changes without focus moving.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselectionCountText() {\n\t\t\treturn t('nextcloud-vue', '{count} selected', { count: this.selectedIds.length })\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the injected `cnTranslate` (the host\n\t\t * app's bound `t()`), identity by default.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\teffectiveTranslate() {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate : (key) => key\n\t\t},\n\n\t\t/**\n\t\t * The link the Add button renders as, or null for a plain button.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\taddLink() {\n\t\t\tif (this.addDisabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn resolveItemActionLink({ href: this.addHref, to: this.addTo }, null, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * Header actions paired with the link each renders as (null for a button).\n\t\t *\n\t\t * @return {Array<{entry: object, link: object|null}>}\n\t\t */\n\t\trenderedHeaderActions() {\n\t\t\treturn (this.headerActions || []).map((entry) => ({\n\t\t\t\tentry,\n\t\t\t\tlink: entry.disabled ? null : resolveItemActionLink(entry, null, this.$router),\n\t\t\t}))\n\t\t},\n\n\t\tcountText() {\n\t\t\tif (!this.pagination) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Showing {count} of {total}', { count: this.objectCount, total: this.pagination.total })\n\t\t},\n\n\t\t/**\n\t\t * The view-toggle segments (label + icon) derived from `availableViewModes`,\n\t\t * with a back-compat bridge that appends the map segment when the beta-era\n\t\t * `showMap` prop is set. `icon` is a CnIcon name (empty → the built-in\n\t\t * `fallback` component).\n\t\t */\n\t\tviewSegments() {\n\t\t\tconst defs = {\n\t\t\t\tcards: { label: this.cardsLabel || t('nextcloud-vue', 'Cards'), icon: this.cardsIcon, fallback: ViewGridOutline },\n\t\t\t\ttable: { label: this.tableLabel || t('nextcloud-vue', 'Table'), icon: this.tableIcon, fallback: FormatListBulletedSquare },\n\t\t\t\tlist: { label: this.listLabel || t('nextcloud-vue', 'List'), icon: this.listIcon, fallback: ViewListOutline },\n\t\t\t\tmap: { label: this.mapLabel || t('nextcloud-vue', 'Map'), icon: this.mapIcon, fallback: MapMarkerOutline },\n\t\t\t}\n\t\t\tconst modes = [...this.availableViewModes]\n\t\t\tif (this.showMap && !modes.includes('map')) {\n\t\t\t\tmodes.push('map')\n\t\t\t}\n\t\t\treturn modes\n\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t},\n\n\t\t/** The full sort option object matching `sortValue` (for NcSelect). */\n\t\tselectedSortOption() {\n\t\t\treturn this.sortOptions.find((o) => o.value === this.sortValue) || null\n\t\t},\n\n\t\t/** Sliding-thumb width + offset, driven by the active segment index. */\n\t\tthumbStyle() {\n\t\t\tconst count = this.viewSegments.length || 1\n\t\t\tconst activeIndex = Math.max(0, this.viewSegments.findIndex((s) => s.mode === this.viewMode))\n\t\t\treturn {\n\t\t\t\twidth: `calc((100% - 8px) / ${count})`,\n\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t}\n\t\t},\n\n\t\thasMassActions() {\n\t\t\treturn this.showMassImport || this.showMassExport || this.showMassCopy || this.showMassDelete\n\t\t},\n\n\t\t/**\n\t\t * Count meaningful VNodes in the `#action-items` slot (excludes whitespace\n\t\t * text nodes and comments). Used to decide whether the mass-actions\n\t\t * separator would be orphaned by `inlineActionCount`.\n\t\t */\n\t\tactionItemsCount() {\n\t\t\tconst slot = this.$slots['action-items']\n\t\t\tif (!slot) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst vnodes = slot() || []\n\t\t\treturn vnodes.filter((n) => n && (n.tag !== undefined || n.componentOptions !== undefined)).length\n\t\t},\n\n\t\t/**\n\t\t * The separator is meaningful only when at least one pre-separator action\n\t\t * button (Refresh + #action-items) still ends up inside the overflow\n\t\t * dropdown after NcActions hoists the first `inlineActionCount` buttons\n\t\t * inline. Pre-separator items: 1 (Refresh) + actionItemsCount.\n\t\t */\n\t\tshowActionsSeparator() {\n\t\t\tif (!this.hasMassActions) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!this.$slots['action-items']) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst preSeparatorOverflow = 1 + this.actionItemsCount - this.inlineActionCount\n\t\t\treturn preSeparatorOverflow > 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t\t/**\n\t\t * Forward the inline search field's input to the host.\n\t\t *\n\t\t * @param {Event} event The native input event.\n\t\t * @return {void}\n\t\t */\n\t\tonSearchInput(event) {\n\t\t\t/**\n\t\t\t * @event search Emitted when the user types in the inline search field.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('search', event.target.value)\n\t\t},\n\n\t\t/**\n\t\t * Forward the standalone sort dropdown's selection to the host.\n\t\t *\n\t\t * @param {string} value The chosen option's `value`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortChange(value) {\n\t\t\t/**\n\t\t\t * @event sort-change Emitted when the user picks an option from the standalone sort dropdown.\n\t\t\t * @type {string} The chosen option's `value`.\n\t\t\t */\n\t\t\tthis.$emit('sort-change', value)\n\t\t},\n\n\t\t/**\n\t\t * Add button click: a plain click on an in-app link routes in place,\n\t\t * anything else on a link is the browser's. Emits `add` either way.\n\t\t *\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonAddClick(event) {\n\t\t\tif (this.addLink) {\n\t\t\t\tfollowItemActionLink(event, this.addLink, this.$router)\n\t\t\t}\n\t\t\tthis.$emit('add')\n\t\t},\n\n\t\t/**\n\t\t * A header link entry was clicked: route a plain in-app click and emit\n\t\t * `header-action` as the button would.\n\t\t *\n\t\t * @param {object} entry The header action.\n\t\t * @param {object} link The resolved link.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonHeaderLinkClick(entry, link, event) {\n\t\t\tfollowItemActionLink(event, link, this.$router)\n\t\t\tthis.$emit('header-action', { action: entry.id, id: entry.id })\n\t\t},\n\n\t\t/**\n\t\t * Heuristic: a \"plain\" name like `History` is an MDI Vue\n\t\t * component name (rendered via `CnIcon`). A name like\n\t\t * `icon-history` or any string starting with `icon-` is a\n\t\t * Nextcloud core CSS icon class (rendered as a `<span>`).\n\t\t *\n\t\t * @param {string} name Icon string from a headerActions entry.\n\t\t * @return {boolean} `true` when `name` should be passed to\n\t\t * `CnIcon` as `:name`; `false` for CSS-class icons or empty.\n\t\t */\n\t\tisMdiIconName(name) {\n\t\t\tif (!name || typeof name !== 'string') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (name.startsWith('icon-')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\n\t\t/**\n\t\t * Emit declarations — invoked via the template `$emit(...)` sites.\n\t\t * Listed here so vue-docgen-api picks up the events for the\n\t\t * generated docs.\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_emitDocs() {\n\t\t\t/**\n\t\t\t * @event view-mode-change User clicked one of the view-mode toggle buttons (Cards / Table). Payload is the selected mode string.\n\t\t\t * @type {'cards' | 'table'}\n\t\t\t */\n\t\t\tthis.$emit('view-mode-change')\n\t\t\t/**\n\t\t\t * @event add User clicked the primary Add button. No payload.\n\t\t\t */\n\t\t\tthis.$emit('add')\n\t\t\t/**\n\t\t\t * @event refresh User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t */\n\t\t\tthis.$emit('refresh')\n\t\t\t/**\n\t\t\t * @event show-import User clicked the Import mass action. Host should open the import modal.\n\t\t\t */\n\t\t\tthis.$emit('show-import')\n\t\t\t/**\n\t\t\t * @event show-export User clicked the Export mass action. Host should open the export modal.\n\t\t\t */\n\t\t\tthis.$emit('show-export')\n\t\t\t/**\n\t\t\t * @event show-copy User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-copy')\n\t\t\t/**\n\t\t\t * @event show-delete User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-delete')\n\t\t\t/**\n\t\t\t * @event header-action User clicked a manifest-declared page-level header action. Payload: `{ action: id, id }`.\n\t\t\t */\n\t\t\tthis.$emit('header-action')\n\t\t\t/**\n\t\t\t * @event toggle-sidebar User clicked the Search/Columns sidebar toggle. No payload.\n\t\t\t */\n\t\t\tthis.$emit('toggle-sidebar')\n\t\t\t/**\n\t\t\t * @event clear-selection User clicked the selection strip's Clear control. No payload — the host should empty its selection (CnIndexPage does this and re-emits `select` with an empty array).\n\t\t\t */\n\t\t\tthis.$emit('clear-selection')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/actions-bar.css -->\n"],"names":["CnBuildiqEditButton","CnIcon","BookOpenVariantOutline","t"],"mappings":"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"}
1
+ {"version":3,"file":"CnActionsBar.vue2.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue"],"sourcesContent":["<template>\n\t<div class=\"cn-actions-bar\" data-testid=\"cn-actions-bar\">\n\t\t<div class=\"cn-actions-bar__info\">\n\t\t\t<!-- Inline search field (opt-in) -->\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"pagination && pagination.total > 0\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->\n\t\t\t<slot name=\"after-search\" />\n\n\t\t\t<!-- View mode toggle (Cards / Table / List) — segmented control with\n\t\t\t a sliding thumb that animates between the N segments. Lives in\n\t\t\t the LEFT info group: switching view is a visual control like\n\t\t\t search and filters, it adds nothing — so it groups with them at\n\t\t\t every width instead of riding with the act buttons. -->\n\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\trole=\"group\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'View mode')\">\n\t\t\t\t<!-- Sliding pill that sits behind the active segment. Width and\n\t\t\t\t offset are driven by the segment count so the same markup\n\t\t\t\t works for 2–4 segments (cards / table / list / map). -->\n\t\t\t\t<span\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-thumb\"\n\t\t\t\t\t:style=\"thumbStyle\"\n\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t<!--\n\t\t\t\t\t@event view-mode-change\n\t\t\t\t\t@description User clicked one of the view-mode toggle buttons (Cards / Table / List / Map). Payload is the selected mode string.\n\t\t\t\t\t@type {'cards' | 'table' | 'list' | 'map'}\n\t\t\t\t-->\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<span class=\"cn-actions-bar__view-toggle-label\">{{ seg.label }}</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cn-actions-bar__actions\">\n\t\t\t<!-- Sort select (opt-in). A standalone sort control for card/list\n\t\t\t views, which — unlike the table — have no sortable column\n\t\t\t headers. A leading sort icon replaces a visible \"Sort by\"\n\t\t\t label so the control stays on one line; the label is kept as\n\t\t\t the combobox's accessible name. -->\n\t\t\t<div v-if=\"showSortSelect && sortOptions.length\" class=\"cn-actions-bar__sort\">\n\t\t\t\t<SortVariant :size=\"20\" class=\"cn-actions-bar__sort-icon\" :aria-label=\"sortLabel\" />\n\t\t\t\t<NcSelect\n\t\t\t\t\tclass=\"cn-actions-bar__sort-select\"\n\t\t\t\t\t:modelValue=\"selectedSortOption\"\n\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t:reduce=\"opt => opt.value\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t:aria-label-combobox=\"sortLabel\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"onSortChange\" />\n\t\t\t</div>\n\n\t\t\t<!-- @slot filters Inline filter controls rendered inside the action bar, between the view toggle and the add/actions (e.g. a CnQuickFilterBar segmented toggle). -->\n\t\t\t<slot name=\"filters\" />\n\n\t\t\t<!-- Search / Columns sidebar toggle (opt-in). Icon-only; reflects the\n\t\t\t open state via aria-pressed so the index sidebar can default\n\t\t\t closed and be opened on demand. -->\n\t\t\t<!--\n\t\t\t\t@event toggle-sidebar\n\t\t\t\t@description User clicked the Search/Columns sidebar toggle. No payload — the host flips the sidebar open state.\n\t\t\t-->\n\t\t\t<NcButton v-if=\"showSidebarToggle\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:title=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Tune :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions\n\t\t\t\t@description Custom buttons rendered between the sidebar toggle and the primary Add button.\n\t\t\t-->\n\t\t\t<slot name=\"actions\" />\n\n\t\t\t<!--\n\t\t\t\t@event add\n\t\t\t\t@description User clicked the primary Add button. No payload.\n\t\t\t-->\n\t\t\t<!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`, except on a modified click, which opens a new tab. -->\n\t\t\t<NcButton v-if=\"showAdd\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"addDisabled\"\n\t\t\t\t:href=\"addLink ? addLink.href : undefined\"\n\t\t\t\tdata-testid=\"cn-cta-primary\"\n\t\t\t\tdata-walkthrough-id=\"index-add\"\n\t\t\t\t@click=\"onAddClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Custom buttons (e.g. CnIndexPage's saved-views control) rendered AFTER the primary Add button, immediately before the overflow menu — for content that belongs grouped with \"browse/manage\" controls rather than with the app-specific buttons in `#actions`.\n\t\t\t-->\n\t\t\t<slot name=\"actions-end\" />\n\n\t\t\t<!-- In-app edit button (ADR-041): icon-only, self-wires from CnAppRoot. -->\n\t\t\t<CnBuildiqEditButton />\n\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\n\t\t\t<NcActions\n\t\t\t\t:forceName=\"true\"\n\t\t\t\t:inline=\"inlineActionCount\"\n\t\t\t\t:menuName=\"actionsMenuName\"\n\t\t\t\tdata-testid=\"cn-actions\">\n\t\t\t\t<!--\n\t\t\t\t\t@event refresh\n\t\t\t\t\t@description User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton :disabled=\"refreshing || refreshDisabled\" @click=\"$emit('refresh')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"refreshing\" :size=\"20\" />\n\t\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ refreshing ? t('nextcloud-vue', 'Refreshing…') : t('nextcloud-vue', 'Refresh') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<NcActionLink v-if=\"documentationUrl\"\n\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<BookOpenVariantOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ documentationLabel }}\n\t\t\t\t</NcActionLink>\n\n\t\t\t\t<!-- Manifest-declared page-level header actions (overflow); an entry with `href` / `to` is a real link. -->\n\t\t\t\t<template v-for=\"{ entry, link } in renderedHeaderActions\" :key=\"entry.id\">\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"link\"\n\t\t\t\t\t\t:href=\"link.href\"\n\t\t\t\t\t\t:target=\"link.target\"\n\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t@click=\"onHeaderLinkClick(entry, link, $event)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:disabled=\"Boolean(entry.disabled)\"\n\t\t\t\t\t\t@click=\"$emit('header-action', { action: entry.id, id: entry.id })\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot action-items\n\t\t\t\t\t@description Additional NcActionButton-family items rendered inside the overflow menu, between the built-in Refresh entry and the mass-actions separator. Use for app-level page actions.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"action-items\" />\n\n\t\t\t\t<!-- Separator between primary and mass actions. Hidden when the\n\t\t\t\t inline-action-count hoists every pre-separator item out of the\n\t\t\t\t overflow, which would otherwise leave the separator orphaned. -->\n\t\t\t\t<NcActionSeparator v-if=\"showActionsSeparator\" />\n\n\t\t\t\t<!-- Mass actions (overflow) -->\n\t\t\t\t<!--\n\t\t\t\t\t@event show-import\n\t\t\t\t\t@description User clicked the Import mass action. Host should open the import modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassImport\"\n\t\t\t\t\t@click=\"$emit('show-import')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Import :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Import') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-export\n\t\t\t\t\t@description User clicked the Export mass action. Host should open the export modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassExport\"\n\t\t\t\t\t@click=\"$emit('show-export')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Export :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Export') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-copy\n\t\t\t\t\t@description User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to copy') : ''\"\n\t\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-delete\n\t\t\t\t\t@description User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to delete') : ''\"\n\t\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot mass-actions\n\t\t\t\t\t@description Additional mass-action NcActionButtons rendered at the bottom of the overflow menu. Scope receives the current selection count and ids so the host can disable / label per selection.\n\t\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selectedIds=\"selectedIds\" />\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- Always-present live region for the selection count (WCAG 2.1\n\t\t SC 4.1.3 Status Messages): a `role=\"status\"` element must exist\n\t\t BEFORE its content changes for assistive tech to announce it, so\n\t\t it cannot live inside the v-if'd strip below. -->\n\t\t<span class=\"cn-actions-bar__sr-status\" role=\"status\">\n\t\t\t{{ selectable && selectedIds.length > 0 ? selectionCountText : '' }}\n\t\t</span>\n\n\t\t<!-- Contextual selection strip (the Proton Pass / Gmail / Files\n\t\t pattern): appears while a selection is active, carrying the\n\t\t visible count, the built-in selection-scoped mass actions, the\n\t\t host's own bulk buttons (#selection-actions) and a Clear control.\n\t\t This strip is the discoverable surface for bulk actions; the\n\t\t BUILT-IN Copy/Delete-selected also stay listed in the overflow\n\t\t menu above, while a host decides for its own actions (strip-only\n\t\t is fine — keepiq does exactly that). -->\n\t\t<div\n\t\t\tv-if=\"selectable && selectedIds.length > 0\"\n\t\t\tclass=\"cn-actions-bar__selection\"\n\t\t\tdata-testid=\"cn-selection-strip\">\n\t\t\t<span class=\"cn-actions-bar__selection-count\" aria-hidden=\"true\">\n\t\t\t\t{{ selectionCountText }}\n\t\t\t</span>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\tDeclarative bulk actions, from `bulkActions`. They render in the\n\t\t\t\tSAME strip as a host's slot buttons and before them, so a page\n\t\t\t\tthat declares some in its manifest and hand-writes others gets\n\t\t\t\tone row of buttons rather than two groups in different places.\n\t\t\t\t@event bulk-action\n\t\t\t\t@description User clicked a declarative bulk action. Payload carries the action id AND the selection, because a bulk action without its selection is not a bulk action.\n\t\t\t-->\n\t\t\t<NcButton\n\t\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t{{ entry.label }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\t@slot selection-actions The host app's bulk-action buttons (NcButton family), rendered inside the contextual selection strip that appears while a selection is active. This strip is the primary bulk-actions surface; #mass-actions remains available for hosts that ALSO want the actions listed in the overflow menu (optional — strip-only is fine).\n\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t-->\n\t\t\t<slot\n\t\t\t\tname=\"selection-actions\"\n\t\t\t\t:count=\"selectedIds.length\"\n\t\t\t\t:selectedIds=\"selectedIds\" />\n\t\t\t<!--\n\t\t\t\t@event clear-selection\n\t\t\t\t@description User clicked the selection strip's Clear control. The host should empty its selection (CnIndexPage does this for you and re-emits `select` with an empty array).\n\t\t\t-->\n\t\t\t<!-- No aria-label: the visible \"Clear selection\" text IS the\n\t\t\t accessible name (review: an override here is redundant). -->\n\t\t\t<NcButton\n\t\t\t\tclass=\"cn-actions-bar__selection-clear\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcActionSeparator, NcButton, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Export from 'vue-material-design-icons/Export.vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport Import from 'vue-material-design-icons/Import.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport SortVariant from 'vue-material-design-icons/SortVariant.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Tune from 'vue-material-design-icons/Tune.vue'\nimport ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'\nimport ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'\nimport { isModifiedClick } from '../../utils/linkNavigation.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\n *\n * ```vue\n * <CnActionsBar\n * :pagination=\"pagination\"\n * :object-count=\"items.length\"\n * add-label=\"Add Client\"\n * add-icon=\"AccountGroup\"\n * @add=\"createNew\"\n * @refresh=\"reload\" />\n * ```\n */\nexport default {\n\tname: 'CnActionsBar',\n\n\tcomponents: {\n\t\tCnBuildiqEditButton,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tCnIcon,\n\t\tSortVariant,\n\t\tBookOpenVariantOutline,\n\t\tClose,\n\t\tPlus,\n\t\tRefresh,\n\t\tContentCopy,\n\t\tTrashCanOutline,\n\t\tImport,\n\t\tExport,\n\t\tMagnify,\n\t\tTune,\n\t\tViewGridOutline,\n\t\tFormatListBulletedSquare,\n\t\tMapMarkerOutline,\n\t},\n\n\tinject: {\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 `headerActions[].label` is run through it — the\n\t\t * entry is keyed and emitted by `id`, so only the visible text\n\t\t * changes. Defaults to an identity function so an untranslated key\n\t\t * renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Pagination state: { total, page, pages, limit } */\n\t\tpagination: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\n\t\tobjectCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether rows/cards can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Currently selected IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Label for the Add button */\n\t\taddLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Add'),\n\t\t},\n\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\n\t\taddIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * URL the Add button links to. Makes the button a real link (middle-click,\n\t\t * open in new tab) that still emits `add` on click. `addTo` is ignored when set.\n\t\t *\n\t\t * @type {string|null}\n\t\t */\n\t\taddHref: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * vue-router location (path or `{ name, params }`) the Add button links to.\n\t\t * The button becomes a real link whose plain click routes in place and still\n\t\t * emits `add`; the host must then not navigate on `add` itself. Ignored when\n\t\t * the router cannot resolve it.\n\t\t *\n\t\t * @type {string|object|null}\n\t\t */\n\t\taddTo: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\n\t\tinlineActionCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Import action */\n\t\tshowMassImport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Export action */\n\t\tshowMassExport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Copy action */\n\t\tshowMassCopy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Delete action */\n\t\tshowMassDelete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current view mode: 'table', 'cards', 'list', or 'map' */\n\t\tviewMode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (v) => ['table', 'cards', 'list', 'map'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Which view-mode segments to render, in order. Defaults to the\n\t\t * historical two-segment control; add `'list'` to expose the list view.\n\t\t *\n\t\t * @type {Array<'cards' | 'table' | 'list'>}\n\t\t */\n\t\tavailableViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ['cards', 'table'],\n\t\t\tvalidator: (modes) => modes.every((m) => ['cards', 'table', 'list'].includes(m)),\n\t\t},\n\n\t\t/** Whether to show the view-mode toggle */\n\t\tshowViewToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Label for the cards/grid view-toggle option (defaults to \"Cards\") */\n\t\tcardsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the table/list view-toggle option (defaults to \"Table\") */\n\t\ttableLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the cards option (defaults to the built-in grid icon). Resolved via CnIcon. */\n\t\tcardsIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the table option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\ttableIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether to render the \"Map\" segment in the view toggle (back-compat bridge; equivalent to adding 'map' to `availableViewModes`). */\n\t\tshowMap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Label for the map view-toggle option (defaults to \"Map\"). */\n\t\tmapLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via CnIcon. */\n\t\tmapIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the list view-toggle option (defaults to \"List\") */\n\t\tlistLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the list option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\tlistIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show a standalone sort dropdown (useful in card/list views). */\n\t\tshowSortSelect: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Options for the sort dropdown.\n\t\t *\n\t\t * @type {Array<{ value: string, label: string }>}\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The currently selected sort option value (controlled). */\n\t\tsortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Accessible label for the sort dropdown. */\n\t\tsortLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Sort by'),\n\t\t},\n\n\t\t/** Whether to show the inline search field on the left of the bar */\n\t\tshowSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current value of the inline search field (controlled) */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder / accessible label for the inline search field */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether the refresh action is currently in progress */\n\t\trefreshing: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is disabled (e.g. when required selections are missing) */\n\t\trefreshDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the Add button is disabled (e.g. when required selections are missing) */\n\t\taddDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether to show the Add button */\n\t\tshowAdd: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the Search/Columns sidebar toggle button. Lets the\n\t\t * index sidebar default to closed and be opened on demand.\n\t\t */\n\t\tshowSidebarToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current open state of the sidebar (controls the toggle's pressed state). */\n\t\tsidebarOpen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Manifest-declared page-level actions rendered in the overflow\n\t\t * dropdown between Refresh and the `#action-items` slot. Each\n\t\t * entry is `{ id, label, icon?, disabled? }`. The bar emits\n\t\t * `@header-action({ action: id, id })` on click; handler\n\t\t * resolution happens upstream (CnIndexPage). An entry with `href`\n\t\t * (URL) or `to` (vue-router location) renders as a real link, with\n\t\t * `linkTarget` as its `target`; it still emits `header-action`, so the\n\t\t * host must not navigate for it again.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, href?: string, to?: string|object, linkTarget?: string }>}\n\t\t */\n\t\theaderActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Declarative bulk actions, rendered in the contextual selection strip\n\t\t * that appears while a selection is active.\n\t\t *\n\t\t * The strip already had a `#selection-actions` slot, which only a\n\t\t * hand-written host component can fill — so a page declared in an app\n\t\t * manifest could carry row actions and header actions but never a bulk\n\t\t * one. This prop is that missing vocabulary; the slot stays, and both\n\t\t * render side by side in one row.\n\t\t *\n\t\t * Clicking emits `bulk-action` with the id AND the current selection.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean }>}\n\t\t */\n\t\tbulkActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * When set, adds a Documentation entry to the overflow menu (after\n\t\t * Refresh, before headerActions). Opens the URL in a new tab.\n\t\t * Empty string hides the entry.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Documentation overflow entry. */\n\t\tdocumentationLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Documentation'),\n\t\t},\n\t},\n\n\temits: [\n\t\t'add',\n\t\t'bulk-action',\n\t\t'clear-selection',\n\t\t'header-action',\n\t\t'refresh',\n\t\t'search',\n\t\t'show-copy',\n\t\t'show-delete',\n\t\t'show-export',\n\t\t'show-import',\n\t\t'sort-change',\n\t\t'toggle-sidebar',\n\t\t'view-mode-change',\n\t],\n\n\tcomputed: {\n\t\t/**\n\t\t * Name of the overflow Actions menu. Library chrome, so it resolves\n\t\t * against the LIBRARY catalogue — it was a bare `menu-name=\"Actions\"`\n\t\t * literal, which rendered \"Actions\" in a Dutch session next to an\n\t\t * otherwise fully translated toolbar even though the catalogue has\n\t\t * carried \"Acties\" all along.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsMenuName() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * The selection strip's count text — also fed to the always-present\n\t\t * `role=\"status\"` live region (WCAG 2.1 SC 4.1.3), so assistive tech\n\t\t * announces selection changes without focus moving.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselectionCountText() {\n\t\t\treturn t('nextcloud-vue', '{count} selected', { count: this.selectedIds.length })\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the injected `cnTranslate` (the host\n\t\t * app's bound `t()`), identity by default.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\teffectiveTranslate() {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate : (key) => key\n\t\t},\n\n\t\t/**\n\t\t * The link the Add button renders as, or null for a plain button.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\taddLink() {\n\t\t\tif (this.addDisabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn resolveItemActionLink({ href: this.addHref, to: this.addTo }, null, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * Header actions paired with the link each renders as (null for a button).\n\t\t *\n\t\t * @return {Array<{entry: object, link: object|null}>}\n\t\t */\n\t\trenderedHeaderActions() {\n\t\t\treturn (this.headerActions || []).map((entry) => ({\n\t\t\t\tentry,\n\t\t\t\tlink: entry.disabled ? null : resolveItemActionLink(entry, null, this.$router),\n\t\t\t}))\n\t\t},\n\n\t\tcountText() {\n\t\t\tif (!this.pagination) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Showing {count} of {total}', { count: this.objectCount, total: this.pagination.total })\n\t\t},\n\n\t\t/**\n\t\t * The view-toggle segments (label + icon) derived from `availableViewModes`,\n\t\t * with a back-compat bridge that appends the map segment when the beta-era\n\t\t * `showMap` prop is set. `icon` is a CnIcon name (empty → the built-in\n\t\t * `fallback` component).\n\t\t */\n\t\tviewSegments() {\n\t\t\tconst defs = {\n\t\t\t\tcards: { label: this.cardsLabel || t('nextcloud-vue', 'Cards'), icon: this.cardsIcon, fallback: ViewGridOutline },\n\t\t\t\ttable: { label: this.tableLabel || t('nextcloud-vue', 'Table'), icon: this.tableIcon, fallback: FormatListBulletedSquare },\n\t\t\t\tlist: { label: this.listLabel || t('nextcloud-vue', 'List'), icon: this.listIcon, fallback: ViewListOutline },\n\t\t\t\tmap: { label: this.mapLabel || t('nextcloud-vue', 'Map'), icon: this.mapIcon, fallback: MapMarkerOutline },\n\t\t\t}\n\t\t\tconst modes = [...this.availableViewModes]\n\t\t\tif (this.showMap && !modes.includes('map')) {\n\t\t\t\tmodes.push('map')\n\t\t\t}\n\t\t\treturn modes\n\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t},\n\n\t\t/** The full sort option object matching `sortValue` (for NcSelect). */\n\t\tselectedSortOption() {\n\t\t\treturn this.sortOptions.find((o) => o.value === this.sortValue) || null\n\t\t},\n\n\t\t/** Sliding-thumb width + offset, driven by the active segment index. */\n\t\tthumbStyle() {\n\t\t\tconst count = this.viewSegments.length || 1\n\t\t\tconst activeIndex = Math.max(0, this.viewSegments.findIndex((s) => s.mode === this.viewMode))\n\t\t\treturn {\n\t\t\t\twidth: `calc((100% - 8px) / ${count})`,\n\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t}\n\t\t},\n\n\t\thasMassActions() {\n\t\t\treturn this.showMassImport || this.showMassExport || this.showMassCopy || this.showMassDelete\n\t\t},\n\n\t\t/**\n\t\t * Count meaningful VNodes in the `#action-items` slot (excludes whitespace\n\t\t * text nodes and comments). Used to decide whether the mass-actions\n\t\t * separator would be orphaned by `inlineActionCount`.\n\t\t */\n\t\tactionItemsCount() {\n\t\t\tconst slot = this.$slots['action-items']\n\t\t\tif (!slot) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst vnodes = slot() || []\n\t\t\treturn vnodes.filter((n) => n && (n.tag !== undefined || n.componentOptions !== undefined)).length\n\t\t},\n\n\t\t/**\n\t\t * The separator is meaningful only when at least one pre-separator action\n\t\t * button (Refresh + #action-items) still ends up inside the overflow\n\t\t * dropdown after NcActions hoists the first `inlineActionCount` buttons\n\t\t * inline. Pre-separator items: 1 (Refresh) + actionItemsCount.\n\t\t */\n\t\tshowActionsSeparator() {\n\t\t\tif (!this.hasMassActions) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!this.$slots['action-items']) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst preSeparatorOverflow = 1 + this.actionItemsCount - this.inlineActionCount\n\t\t\treturn preSeparatorOverflow > 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t\t/**\n\t\t * Forward the inline search field's input to the host.\n\t\t *\n\t\t * @param {Event} event The native input event.\n\t\t * @return {void}\n\t\t */\n\t\tonSearchInput(event) {\n\t\t\t/**\n\t\t\t * @event search Emitted when the user types in the inline search field.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('search', event.target.value)\n\t\t},\n\n\t\t/**\n\t\t * Forward the standalone sort dropdown's selection to the host.\n\t\t *\n\t\t * @param {string} value The chosen option's `value`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortChange(value) {\n\t\t\t/**\n\t\t\t * @event sort-change Emitted when the user picks an option from the standalone sort dropdown.\n\t\t\t * @type {string} The chosen option's `value`.\n\t\t\t */\n\t\t\tthis.$emit('sort-change', value)\n\t\t},\n\n\t\t/**\n\t\t * Add button click: a plain click on an in-app link routes in place,\n\t\t * anything else on a link is the browser's. Emits `add`, except for a\n\t\t * modified click on a link, which opens in a new tab: a host `@add`\n\t\t * would otherwise run in the tab the user is leaving.\n\t\t *\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonAddClick(event) {\n\t\t\tif (this.addLink) {\n\t\t\t\tif (isModifiedClick(event)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfollowItemActionLink(event, this.addLink, this.$router)\n\t\t\t}\n\t\t\tthis.$emit('add')\n\t\t},\n\n\t\t/**\n\t\t * A header link entry was clicked: route a plain in-app click and emit\n\t\t * `header-action` as the button would. A modified click is the\n\t\t * browser's alone (a new tab), so nothing is emitted for it.\n\t\t *\n\t\t * @param {object} entry The header action.\n\t\t * @param {object} link The resolved link.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonHeaderLinkClick(entry, link, event) {\n\t\t\tif (isModifiedClick(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowItemActionLink(event, link, this.$router)\n\t\t\tthis.$emit('header-action', { action: entry.id, id: entry.id })\n\t\t},\n\n\t\t/**\n\t\t * Heuristic: a \"plain\" name like `History` is an MDI Vue\n\t\t * component name (rendered via `CnIcon`). A name like\n\t\t * `icon-history` or any string starting with `icon-` is a\n\t\t * Nextcloud core CSS icon class (rendered as a `<span>`).\n\t\t *\n\t\t * @param {string} name Icon string from a headerActions entry.\n\t\t * @return {boolean} `true` when `name` should be passed to\n\t\t * `CnIcon` as `:name`; `false` for CSS-class icons or empty.\n\t\t */\n\t\tisMdiIconName(name) {\n\t\t\tif (!name || typeof name !== 'string') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (name.startsWith('icon-')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\n\t\t/**\n\t\t * Emit declarations — invoked via the template `$emit(...)` sites.\n\t\t * Listed here so vue-docgen-api picks up the events for the\n\t\t * generated docs.\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_emitDocs() {\n\t\t\t/**\n\t\t\t * @event view-mode-change User clicked one of the view-mode toggle buttons (Cards / Table). Payload is the selected mode string.\n\t\t\t * @type {'cards' | 'table'}\n\t\t\t */\n\t\t\tthis.$emit('view-mode-change')\n\t\t\t/**\n\t\t\t * @event add User clicked the primary Add button. No payload.\n\t\t\t */\n\t\t\tthis.$emit('add')\n\t\t\t/**\n\t\t\t * @event refresh User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t */\n\t\t\tthis.$emit('refresh')\n\t\t\t/**\n\t\t\t * @event show-import User clicked the Import mass action. Host should open the import modal.\n\t\t\t */\n\t\t\tthis.$emit('show-import')\n\t\t\t/**\n\t\t\t * @event show-export User clicked the Export mass action. Host should open the export modal.\n\t\t\t */\n\t\t\tthis.$emit('show-export')\n\t\t\t/**\n\t\t\t * @event show-copy User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-copy')\n\t\t\t/**\n\t\t\t * @event show-delete User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-delete')\n\t\t\t/**\n\t\t\t * @event header-action User clicked a manifest-declared page-level header action. Payload: `{ action: id, id }`.\n\t\t\t */\n\t\t\tthis.$emit('header-action')\n\t\t\t/**\n\t\t\t * @event toggle-sidebar User clicked the Search/Columns sidebar toggle. No payload.\n\t\t\t */\n\t\t\tthis.$emit('toggle-sidebar')\n\t\t\t/**\n\t\t\t * @event clear-selection User clicked the selection strip's Clear control. No payload — the host should empty its selection (CnIndexPage does this and re-emits `select` with an empty array).\n\t\t\t */\n\t\t\tthis.$emit('clear-selection')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/actions-bar.css -->\n"],"names":["CnBuildiqEditButton","CnIcon","BookOpenVariantOutline","t"],"mappings":"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"}
@@ -215,8 +215,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
215
215
  ? (openBlock(), createBlock(_component_NcActionLink, {
216
216
  key: 0,
217
217
  href: $props.documentationUrl,
218
- target: "_blank",
219
- rel: "noopener noreferrer"
218
+ target: "_blank"
220
219
  }, {
221
220
  icon: withCtx(() => [
222
221
  createVNode(_component_BookOpenVariantOutline, { size: 20 })
@@ -1 +1 @@
1
- {"version":3,"file":"CnActionsBar.vue3.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue?vue&type=template&id=4880abef&lang.js"],"sourcesContent":["<template>\n\t<div class=\"cn-actions-bar\" data-testid=\"cn-actions-bar\">\n\t\t<div class=\"cn-actions-bar__info\">\n\t\t\t<!-- Inline search field (opt-in) -->\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"pagination && pagination.total > 0\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->\n\t\t\t<slot name=\"after-search\" />\n\n\t\t\t<!-- View mode toggle (Cards / Table / List) — segmented control with\n\t\t\t a sliding thumb that animates between the N segments. Lives in\n\t\t\t the LEFT info group: switching view is a visual control like\n\t\t\t search and filters, it adds nothing — so it groups with them at\n\t\t\t every width instead of riding with the act buttons. -->\n\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\trole=\"group\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'View mode')\">\n\t\t\t\t<!-- Sliding pill that sits behind the active segment. Width and\n\t\t\t\t offset are driven by the segment count so the same markup\n\t\t\t\t works for 2–4 segments (cards / table / list / map). -->\n\t\t\t\t<span\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-thumb\"\n\t\t\t\t\t:style=\"thumbStyle\"\n\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t<!--\n\t\t\t\t\t@event view-mode-change\n\t\t\t\t\t@description User clicked one of the view-mode toggle buttons (Cards / Table / List / Map). Payload is the selected mode string.\n\t\t\t\t\t@type {'cards' | 'table' | 'list' | 'map'}\n\t\t\t\t-->\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<span class=\"cn-actions-bar__view-toggle-label\">{{ seg.label }}</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cn-actions-bar__actions\">\n\t\t\t<!-- Sort select (opt-in). A standalone sort control for card/list\n\t\t\t views, which — unlike the table — have no sortable column\n\t\t\t headers. A leading sort icon replaces a visible \"Sort by\"\n\t\t\t label so the control stays on one line; the label is kept as\n\t\t\t the combobox's accessible name. -->\n\t\t\t<div v-if=\"showSortSelect && sortOptions.length\" class=\"cn-actions-bar__sort\">\n\t\t\t\t<SortVariant :size=\"20\" class=\"cn-actions-bar__sort-icon\" :aria-label=\"sortLabel\" />\n\t\t\t\t<NcSelect\n\t\t\t\t\tclass=\"cn-actions-bar__sort-select\"\n\t\t\t\t\t:modelValue=\"selectedSortOption\"\n\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t:reduce=\"opt => opt.value\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t:aria-label-combobox=\"sortLabel\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"onSortChange\" />\n\t\t\t</div>\n\n\t\t\t<!-- @slot filters Inline filter controls rendered inside the action bar, between the view toggle and the add/actions (e.g. a CnQuickFilterBar segmented toggle). -->\n\t\t\t<slot name=\"filters\" />\n\n\t\t\t<!-- Search / Columns sidebar toggle (opt-in). Icon-only; reflects the\n\t\t\t open state via aria-pressed so the index sidebar can default\n\t\t\t closed and be opened on demand. -->\n\t\t\t<!--\n\t\t\t\t@event toggle-sidebar\n\t\t\t\t@description User clicked the Search/Columns sidebar toggle. No payload — the host flips the sidebar open state.\n\t\t\t-->\n\t\t\t<NcButton v-if=\"showSidebarToggle\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:title=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Tune :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions\n\t\t\t\t@description Custom buttons rendered between the sidebar toggle and the primary Add button.\n\t\t\t-->\n\t\t\t<slot name=\"actions\" />\n\n\t\t\t<!--\n\t\t\t\t@event add\n\t\t\t\t@description User clicked the primary Add button. No payload.\n\t\t\t-->\n\t\t\t<!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`. -->\n\t\t\t<NcButton v-if=\"showAdd\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"addDisabled\"\n\t\t\t\t:href=\"addLink ? addLink.href : undefined\"\n\t\t\t\tdata-testid=\"cn-cta-primary\"\n\t\t\t\tdata-walkthrough-id=\"index-add\"\n\t\t\t\t@click=\"onAddClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Custom buttons (e.g. CnIndexPage's saved-views control) rendered AFTER the primary Add button, immediately before the overflow menu — for content that belongs grouped with \"browse/manage\" controls rather than with the app-specific buttons in `#actions`.\n\t\t\t-->\n\t\t\t<slot name=\"actions-end\" />\n\n\t\t\t<!-- In-app edit button (ADR-041): icon-only, self-wires from CnAppRoot. -->\n\t\t\t<CnBuildiqEditButton />\n\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\n\t\t\t<NcActions\n\t\t\t\t:forceName=\"true\"\n\t\t\t\t:inline=\"inlineActionCount\"\n\t\t\t\t:menuName=\"actionsMenuName\"\n\t\t\t\tdata-testid=\"cn-actions\">\n\t\t\t\t<!--\n\t\t\t\t\t@event refresh\n\t\t\t\t\t@description User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton :disabled=\"refreshing || refreshDisabled\" @click=\"$emit('refresh')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"refreshing\" :size=\"20\" />\n\t\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ refreshing ? t('nextcloud-vue', 'Refreshing…') : t('nextcloud-vue', 'Refresh') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<NcActionLink v-if=\"documentationUrl\"\n\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<BookOpenVariantOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ documentationLabel }}\n\t\t\t\t</NcActionLink>\n\n\t\t\t\t<!-- Manifest-declared page-level header actions (overflow); an entry with `href` / `to` is a real link. -->\n\t\t\t\t<template v-for=\"{ entry, link } in renderedHeaderActions\" :key=\"entry.id\">\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"link\"\n\t\t\t\t\t\t:href=\"link.href\"\n\t\t\t\t\t\t:target=\"link.target\"\n\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t@click=\"onHeaderLinkClick(entry, link, $event)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:disabled=\"Boolean(entry.disabled)\"\n\t\t\t\t\t\t@click=\"$emit('header-action', { action: entry.id, id: entry.id })\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot action-items\n\t\t\t\t\t@description Additional NcActionButton-family items rendered inside the overflow menu, between the built-in Refresh entry and the mass-actions separator. Use for app-level page actions.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"action-items\" />\n\n\t\t\t\t<!-- Separator between primary and mass actions. Hidden when the\n\t\t\t\t inline-action-count hoists every pre-separator item out of the\n\t\t\t\t overflow, which would otherwise leave the separator orphaned. -->\n\t\t\t\t<NcActionSeparator v-if=\"showActionsSeparator\" />\n\n\t\t\t\t<!-- Mass actions (overflow) -->\n\t\t\t\t<!--\n\t\t\t\t\t@event show-import\n\t\t\t\t\t@description User clicked the Import mass action. Host should open the import modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassImport\"\n\t\t\t\t\t@click=\"$emit('show-import')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Import :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Import') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-export\n\t\t\t\t\t@description User clicked the Export mass action. Host should open the export modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassExport\"\n\t\t\t\t\t@click=\"$emit('show-export')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Export :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Export') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-copy\n\t\t\t\t\t@description User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to copy') : ''\"\n\t\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-delete\n\t\t\t\t\t@description User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to delete') : ''\"\n\t\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot mass-actions\n\t\t\t\t\t@description Additional mass-action NcActionButtons rendered at the bottom of the overflow menu. Scope receives the current selection count and ids so the host can disable / label per selection.\n\t\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selectedIds=\"selectedIds\" />\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- Always-present live region for the selection count (WCAG 2.1\n\t\t SC 4.1.3 Status Messages): a `role=\"status\"` element must exist\n\t\t BEFORE its content changes for assistive tech to announce it, so\n\t\t it cannot live inside the v-if'd strip below. -->\n\t\t<span class=\"cn-actions-bar__sr-status\" role=\"status\">\n\t\t\t{{ selectable && selectedIds.length > 0 ? selectionCountText : '' }}\n\t\t</span>\n\n\t\t<!-- Contextual selection strip (the Proton Pass / Gmail / Files\n\t\t pattern): appears while a selection is active, carrying the\n\t\t visible count, the built-in selection-scoped mass actions, the\n\t\t host's own bulk buttons (#selection-actions) and a Clear control.\n\t\t This strip is the discoverable surface for bulk actions; the\n\t\t BUILT-IN Copy/Delete-selected also stay listed in the overflow\n\t\t menu above, while a host decides for its own actions (strip-only\n\t\t is fine — keepiq does exactly that). -->\n\t\t<div\n\t\t\tv-if=\"selectable && selectedIds.length > 0\"\n\t\t\tclass=\"cn-actions-bar__selection\"\n\t\t\tdata-testid=\"cn-selection-strip\">\n\t\t\t<span class=\"cn-actions-bar__selection-count\" aria-hidden=\"true\">\n\t\t\t\t{{ selectionCountText }}\n\t\t\t</span>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\tDeclarative bulk actions, from `bulkActions`. They render in the\n\t\t\t\tSAME strip as a host's slot buttons and before them, so a page\n\t\t\t\tthat declares some in its manifest and hand-writes others gets\n\t\t\t\tone row of buttons rather than two groups in different places.\n\t\t\t\t@event bulk-action\n\t\t\t\t@description User clicked a declarative bulk action. Payload carries the action id AND the selection, because a bulk action without its selection is not a bulk action.\n\t\t\t-->\n\t\t\t<NcButton\n\t\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t{{ entry.label }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\t@slot selection-actions The host app's bulk-action buttons (NcButton family), rendered inside the contextual selection strip that appears while a selection is active. This strip is the primary bulk-actions surface; #mass-actions remains available for hosts that ALSO want the actions listed in the overflow menu (optional — strip-only is fine).\n\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t-->\n\t\t\t<slot\n\t\t\t\tname=\"selection-actions\"\n\t\t\t\t:count=\"selectedIds.length\"\n\t\t\t\t:selectedIds=\"selectedIds\" />\n\t\t\t<!--\n\t\t\t\t@event clear-selection\n\t\t\t\t@description User clicked the selection strip's Clear control. The host should empty its selection (CnIndexPage does this for you and re-emits `select` with an empty array).\n\t\t\t-->\n\t\t\t<!-- No aria-label: the visible \"Clear selection\" text IS the\n\t\t\t accessible name (review: an override here is redundant). -->\n\t\t\t<NcButton\n\t\t\t\tclass=\"cn-actions-bar__selection-clear\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcActionSeparator, NcButton, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Export from 'vue-material-design-icons/Export.vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport Import from 'vue-material-design-icons/Import.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport SortVariant from 'vue-material-design-icons/SortVariant.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Tune from 'vue-material-design-icons/Tune.vue'\nimport ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'\nimport ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\n *\n * ```vue\n * <CnActionsBar\n * :pagination=\"pagination\"\n * :object-count=\"items.length\"\n * add-label=\"Add Client\"\n * add-icon=\"AccountGroup\"\n * @add=\"createNew\"\n * @refresh=\"reload\" />\n * ```\n */\nexport default {\n\tname: 'CnActionsBar',\n\n\tcomponents: {\n\t\tCnBuildiqEditButton,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tCnIcon,\n\t\tSortVariant,\n\t\tBookOpenVariantOutline,\n\t\tClose,\n\t\tPlus,\n\t\tRefresh,\n\t\tContentCopy,\n\t\tTrashCanOutline,\n\t\tImport,\n\t\tExport,\n\t\tMagnify,\n\t\tTune,\n\t\tViewGridOutline,\n\t\tFormatListBulletedSquare,\n\t\tMapMarkerOutline,\n\t},\n\n\tinject: {\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 `headerActions[].label` is run through it — the\n\t\t * entry is keyed and emitted by `id`, so only the visible text\n\t\t * changes. Defaults to an identity function so an untranslated key\n\t\t * renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Pagination state: { total, page, pages, limit } */\n\t\tpagination: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\n\t\tobjectCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether rows/cards can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Currently selected IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Label for the Add button */\n\t\taddLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Add'),\n\t\t},\n\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\n\t\taddIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * URL the Add button links to. Makes the button a real link (middle-click,\n\t\t * open in new tab) that still emits `add` on click. `addTo` is ignored when set.\n\t\t *\n\t\t * @type {string|null}\n\t\t */\n\t\taddHref: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * vue-router location (path or `{ name, params }`) the Add button links to.\n\t\t * The button becomes a real link whose plain click routes in place and still\n\t\t * emits `add`; the host must then not navigate on `add` itself. Ignored when\n\t\t * the router cannot resolve it.\n\t\t *\n\t\t * @type {string|object|null}\n\t\t */\n\t\taddTo: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\n\t\tinlineActionCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Import action */\n\t\tshowMassImport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Export action */\n\t\tshowMassExport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Copy action */\n\t\tshowMassCopy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Delete action */\n\t\tshowMassDelete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current view mode: 'table', 'cards', 'list', or 'map' */\n\t\tviewMode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (v) => ['table', 'cards', 'list', 'map'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Which view-mode segments to render, in order. Defaults to the\n\t\t * historical two-segment control; add `'list'` to expose the list view.\n\t\t *\n\t\t * @type {Array<'cards' | 'table' | 'list'>}\n\t\t */\n\t\tavailableViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ['cards', 'table'],\n\t\t\tvalidator: (modes) => modes.every((m) => ['cards', 'table', 'list'].includes(m)),\n\t\t},\n\n\t\t/** Whether to show the view-mode toggle */\n\t\tshowViewToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Label for the cards/grid view-toggle option (defaults to \"Cards\") */\n\t\tcardsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the table/list view-toggle option (defaults to \"Table\") */\n\t\ttableLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the cards option (defaults to the built-in grid icon). Resolved via CnIcon. */\n\t\tcardsIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the table option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\ttableIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether to render the \"Map\" segment in the view toggle (back-compat bridge; equivalent to adding 'map' to `availableViewModes`). */\n\t\tshowMap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Label for the map view-toggle option (defaults to \"Map\"). */\n\t\tmapLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via CnIcon. */\n\t\tmapIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the list view-toggle option (defaults to \"List\") */\n\t\tlistLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the list option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\tlistIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show a standalone sort dropdown (useful in card/list views). */\n\t\tshowSortSelect: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Options for the sort dropdown.\n\t\t *\n\t\t * @type {Array<{ value: string, label: string }>}\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The currently selected sort option value (controlled). */\n\t\tsortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Accessible label for the sort dropdown. */\n\t\tsortLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Sort by'),\n\t\t},\n\n\t\t/** Whether to show the inline search field on the left of the bar */\n\t\tshowSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current value of the inline search field (controlled) */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder / accessible label for the inline search field */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether the refresh action is currently in progress */\n\t\trefreshing: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is disabled (e.g. when required selections are missing) */\n\t\trefreshDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the Add button is disabled (e.g. when required selections are missing) */\n\t\taddDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether to show the Add button */\n\t\tshowAdd: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the Search/Columns sidebar toggle button. Lets the\n\t\t * index sidebar default to closed and be opened on demand.\n\t\t */\n\t\tshowSidebarToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current open state of the sidebar (controls the toggle's pressed state). */\n\t\tsidebarOpen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Manifest-declared page-level actions rendered in the overflow\n\t\t * dropdown between Refresh and the `#action-items` slot. Each\n\t\t * entry is `{ id, label, icon?, disabled? }`. The bar emits\n\t\t * `@header-action({ action: id, id })` on click; handler\n\t\t * resolution happens upstream (CnIndexPage). An entry with `href`\n\t\t * (URL) or `to` (vue-router location) renders as a real link, with\n\t\t * `linkTarget` as its `target`; it still emits `header-action`, so the\n\t\t * host must not navigate for it again.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, href?: string, to?: string|object, linkTarget?: string }>}\n\t\t */\n\t\theaderActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Declarative bulk actions, rendered in the contextual selection strip\n\t\t * that appears while a selection is active.\n\t\t *\n\t\t * The strip already had a `#selection-actions` slot, which only a\n\t\t * hand-written host component can fill — so a page declared in an app\n\t\t * manifest could carry row actions and header actions but never a bulk\n\t\t * one. This prop is that missing vocabulary; the slot stays, and both\n\t\t * render side by side in one row.\n\t\t *\n\t\t * Clicking emits `bulk-action` with the id AND the current selection.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean }>}\n\t\t */\n\t\tbulkActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * When set, adds a Documentation entry to the overflow menu (after\n\t\t * Refresh, before headerActions). Opens the URL in a new tab.\n\t\t * Empty string hides the entry.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Documentation overflow entry. */\n\t\tdocumentationLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Documentation'),\n\t\t},\n\t},\n\n\temits: [\n\t\t'add',\n\t\t'bulk-action',\n\t\t'clear-selection',\n\t\t'header-action',\n\t\t'refresh',\n\t\t'search',\n\t\t'show-copy',\n\t\t'show-delete',\n\t\t'show-export',\n\t\t'show-import',\n\t\t'sort-change',\n\t\t'toggle-sidebar',\n\t\t'view-mode-change',\n\t],\n\n\tcomputed: {\n\t\t/**\n\t\t * Name of the overflow Actions menu. Library chrome, so it resolves\n\t\t * against the LIBRARY catalogue — it was a bare `menu-name=\"Actions\"`\n\t\t * literal, which rendered \"Actions\" in a Dutch session next to an\n\t\t * otherwise fully translated toolbar even though the catalogue has\n\t\t * carried \"Acties\" all along.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsMenuName() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * The selection strip's count text — also fed to the always-present\n\t\t * `role=\"status\"` live region (WCAG 2.1 SC 4.1.3), so assistive tech\n\t\t * announces selection changes without focus moving.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselectionCountText() {\n\t\t\treturn t('nextcloud-vue', '{count} selected', { count: this.selectedIds.length })\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the injected `cnTranslate` (the host\n\t\t * app's bound `t()`), identity by default.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\teffectiveTranslate() {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate : (key) => key\n\t\t},\n\n\t\t/**\n\t\t * The link the Add button renders as, or null for a plain button.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\taddLink() {\n\t\t\tif (this.addDisabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn resolveItemActionLink({ href: this.addHref, to: this.addTo }, null, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * Header actions paired with the link each renders as (null for a button).\n\t\t *\n\t\t * @return {Array<{entry: object, link: object|null}>}\n\t\t */\n\t\trenderedHeaderActions() {\n\t\t\treturn (this.headerActions || []).map((entry) => ({\n\t\t\t\tentry,\n\t\t\t\tlink: entry.disabled ? null : resolveItemActionLink(entry, null, this.$router),\n\t\t\t}))\n\t\t},\n\n\t\tcountText() {\n\t\t\tif (!this.pagination) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Showing {count} of {total}', { count: this.objectCount, total: this.pagination.total })\n\t\t},\n\n\t\t/**\n\t\t * The view-toggle segments (label + icon) derived from `availableViewModes`,\n\t\t * with a back-compat bridge that appends the map segment when the beta-era\n\t\t * `showMap` prop is set. `icon` is a CnIcon name (empty → the built-in\n\t\t * `fallback` component).\n\t\t */\n\t\tviewSegments() {\n\t\t\tconst defs = {\n\t\t\t\tcards: { label: this.cardsLabel || t('nextcloud-vue', 'Cards'), icon: this.cardsIcon, fallback: ViewGridOutline },\n\t\t\t\ttable: { label: this.tableLabel || t('nextcloud-vue', 'Table'), icon: this.tableIcon, fallback: FormatListBulletedSquare },\n\t\t\t\tlist: { label: this.listLabel || t('nextcloud-vue', 'List'), icon: this.listIcon, fallback: ViewListOutline },\n\t\t\t\tmap: { label: this.mapLabel || t('nextcloud-vue', 'Map'), icon: this.mapIcon, fallback: MapMarkerOutline },\n\t\t\t}\n\t\t\tconst modes = [...this.availableViewModes]\n\t\t\tif (this.showMap && !modes.includes('map')) {\n\t\t\t\tmodes.push('map')\n\t\t\t}\n\t\t\treturn modes\n\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t},\n\n\t\t/** The full sort option object matching `sortValue` (for NcSelect). */\n\t\tselectedSortOption() {\n\t\t\treturn this.sortOptions.find((o) => o.value === this.sortValue) || null\n\t\t},\n\n\t\t/** Sliding-thumb width + offset, driven by the active segment index. */\n\t\tthumbStyle() {\n\t\t\tconst count = this.viewSegments.length || 1\n\t\t\tconst activeIndex = Math.max(0, this.viewSegments.findIndex((s) => s.mode === this.viewMode))\n\t\t\treturn {\n\t\t\t\twidth: `calc((100% - 8px) / ${count})`,\n\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t}\n\t\t},\n\n\t\thasMassActions() {\n\t\t\treturn this.showMassImport || this.showMassExport || this.showMassCopy || this.showMassDelete\n\t\t},\n\n\t\t/**\n\t\t * Count meaningful VNodes in the `#action-items` slot (excludes whitespace\n\t\t * text nodes and comments). Used to decide whether the mass-actions\n\t\t * separator would be orphaned by `inlineActionCount`.\n\t\t */\n\t\tactionItemsCount() {\n\t\t\tconst slot = this.$slots['action-items']\n\t\t\tif (!slot) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst vnodes = slot() || []\n\t\t\treturn vnodes.filter((n) => n && (n.tag !== undefined || n.componentOptions !== undefined)).length\n\t\t},\n\n\t\t/**\n\t\t * The separator is meaningful only when at least one pre-separator action\n\t\t * button (Refresh + #action-items) still ends up inside the overflow\n\t\t * dropdown after NcActions hoists the first `inlineActionCount` buttons\n\t\t * inline. Pre-separator items: 1 (Refresh) + actionItemsCount.\n\t\t */\n\t\tshowActionsSeparator() {\n\t\t\tif (!this.hasMassActions) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!this.$slots['action-items']) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst preSeparatorOverflow = 1 + this.actionItemsCount - this.inlineActionCount\n\t\t\treturn preSeparatorOverflow > 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t\t/**\n\t\t * Forward the inline search field's input to the host.\n\t\t *\n\t\t * @param {Event} event The native input event.\n\t\t * @return {void}\n\t\t */\n\t\tonSearchInput(event) {\n\t\t\t/**\n\t\t\t * @event search Emitted when the user types in the inline search field.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('search', event.target.value)\n\t\t},\n\n\t\t/**\n\t\t * Forward the standalone sort dropdown's selection to the host.\n\t\t *\n\t\t * @param {string} value The chosen option's `value`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortChange(value) {\n\t\t\t/**\n\t\t\t * @event sort-change Emitted when the user picks an option from the standalone sort dropdown.\n\t\t\t * @type {string} The chosen option's `value`.\n\t\t\t */\n\t\t\tthis.$emit('sort-change', value)\n\t\t},\n\n\t\t/**\n\t\t * Add button click: a plain click on an in-app link routes in place,\n\t\t * anything else on a link is the browser's. Emits `add` either way.\n\t\t *\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonAddClick(event) {\n\t\t\tif (this.addLink) {\n\t\t\t\tfollowItemActionLink(event, this.addLink, this.$router)\n\t\t\t}\n\t\t\tthis.$emit('add')\n\t\t},\n\n\t\t/**\n\t\t * A header link entry was clicked: route a plain in-app click and emit\n\t\t * `header-action` as the button would.\n\t\t *\n\t\t * @param {object} entry The header action.\n\t\t * @param {object} link The resolved link.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonHeaderLinkClick(entry, link, event) {\n\t\t\tfollowItemActionLink(event, link, this.$router)\n\t\t\tthis.$emit('header-action', { action: entry.id, id: entry.id })\n\t\t},\n\n\t\t/**\n\t\t * Heuristic: a \"plain\" name like `History` is an MDI Vue\n\t\t * component name (rendered via `CnIcon`). A name like\n\t\t * `icon-history` or any string starting with `icon-` is a\n\t\t * Nextcloud core CSS icon class (rendered as a `<span>`).\n\t\t *\n\t\t * @param {string} name Icon string from a headerActions entry.\n\t\t * @return {boolean} `true` when `name` should be passed to\n\t\t * `CnIcon` as `:name`; `false` for CSS-class icons or empty.\n\t\t */\n\t\tisMdiIconName(name) {\n\t\t\tif (!name || typeof name !== 'string') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (name.startsWith('icon-')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\n\t\t/**\n\t\t * Emit declarations — invoked via the template `$emit(...)` sites.\n\t\t * Listed here so vue-docgen-api picks up the events for the\n\t\t * generated docs.\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_emitDocs() {\n\t\t\t/**\n\t\t\t * @event view-mode-change User clicked one of the view-mode toggle buttons (Cards / Table). Payload is the selected mode string.\n\t\t\t * @type {'cards' | 'table'}\n\t\t\t */\n\t\t\tthis.$emit('view-mode-change')\n\t\t\t/**\n\t\t\t * @event add User clicked the primary Add button. No payload.\n\t\t\t */\n\t\t\tthis.$emit('add')\n\t\t\t/**\n\t\t\t * @event refresh User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t */\n\t\t\tthis.$emit('refresh')\n\t\t\t/**\n\t\t\t * @event show-import User clicked the Import mass action. Host should open the import modal.\n\t\t\t */\n\t\t\tthis.$emit('show-import')\n\t\t\t/**\n\t\t\t * @event show-export User clicked the Export mass action. Host should open the export modal.\n\t\t\t */\n\t\t\tthis.$emit('show-export')\n\t\t\t/**\n\t\t\t * @event show-copy User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-copy')\n\t\t\t/**\n\t\t\t * @event show-delete User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-delete')\n\t\t\t/**\n\t\t\t * @event header-action User clicked a manifest-declared page-level header action. Payload: `{ action: id, id }`.\n\t\t\t */\n\t\t\tthis.$emit('header-action')\n\t\t\t/**\n\t\t\t * @event toggle-sidebar User clicked the Search/Columns sidebar toggle. No payload.\n\t\t\t */\n\t\t\tthis.$emit('toggle-sidebar')\n\t\t\t/**\n\t\t\t * @event clear-selection User clicked the selection strip's Clear control. No payload — the host should empty its selection (CnIndexPage does this and re-emits `select` with an empty array).\n\t\t\t */\n\t\t\tthis.$emit('clear-selection')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/actions-bar.css -->\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_createVNode","_toDisplayString","_renderSlot","_Fragment","_renderList","_createBlock","_resolveDynamicComponent","_createTextVNode","_normalizeClass"],"mappings":";;;AACM,EAAA,KAAK,EAAC,gBAAiB;AAAA,EAAA,aAAW,EAAC,gBAAgB;;AAClD,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,sBAAsB,GAAA;;;AAET,EAAA,KAAK,EAAC,wBAAwB;;;;;AAUA,EAAA,KAAK,EAAC,uBAAuB;;;;AA2C1E,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,mCAAmC,GAAA;AAI7C,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,yBAAyB,GAAA;;;AAMc,EAAA,KAAK,EAAC,sBAAsB;;;AA6MxE,EAAA,KAAK,EAAC,2BAA0B;AAAE,EAAA,IAAI,EAAC,QAAQ;;;;AAcpD,EAAA,KAAK,EAAC,2BAA0B;AAChC,EAAA,aAAW,EAAC,oBAAoB;;;AAC1B,EAAA,KAAK,EAAC,iCAAkC;AAAA,EAAA,aAAW,EAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;AA/RlE,EAAA,QAAAA,SAAA,EAAA,EAAAC,kBAAA,CA8VK,OA9VL,UA8VK,EAAA;AA7VJ,IAAAC,kBAAA,CA0DK,OA1DL,UA0DK,EAAA;OAxDO,MAAU,CAAA,UAAA;AAArB,WAAAF,SAAA,EAAA,EAAAC,kBAAA,CASK,OATL,UASK,EAAA;YARJE,WAAyD,CAAA,kBAAA,EAAA;AAA/C,cAAA,IAAI,EAAE,EAAE;AAAE,cAAA,KAAK,EAAC,6BAA4B;;YACtDD,kBAMuB,CAAA,OAAA,EAAA;AALtB,cAAA,IAAI,EAAC,QAAO;AACZ,cAAA,KAAK,EAAC,8BAA6B;cAClC,WAAW,EAAE,MAAkB,CAAA,iBAAA,IAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,SAAA,CAAA;AACnC,cAAA,KAAK,EAAE,MAAW,CAAA,WAAA;cAClB,YAAU,EAAE,4BAAqB,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,QAAA,CAAA;AAClC,cAAA,OAAK,0CAAE,QAAa,CAAA,aAAA,IAAA,QAAA,CAAA,aAAA,CAAA,GAAA,IAAA,CAAA,CAAA,CAAA;;;WAEN,qBAAc,MAAU,CAAA,UAAA,CAAC,KAAI,GAAA,CAAA;0BAA9CD,kBAEM,CAAA,MAAA,EAFN,UAEM,EAAAG,eAAA,CADF,QAAQ,CAAA,SAAA,CAAA,EAAA,CAAA,YAAA;;MAGZC,UAA2B,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,CAAA;OAOhB,yBAAkB,QAAY,CAAA,YAAA,CAAC,MAAO,GAAA,CAAA;wBAAjDJ,kBAkCK,CAAA,KAAA,EAAA;;AAjCJ,YAAA,KAAK,EAAC,6BAA4B;AAClC,YAAA,IAAI,EAAC,OAAM;AACV,YAAA,YAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,WAAA,CAAA;;YAIdC,kBAGqB,CAAA,MAAA,EAAA;AAFpB,cAAA,KAAK,EAAC,mCAAkC;AACvC,cAAA,KAAK,iBAAE,QAAU,CAAA,UAAA,CAAA;AAClB,cAAA,aAAW,EAAC;;8BAMbD,kBAiBQ,CAAAK,QAAA,EAAA,IAAA,EAAAC,UAAA,CAhBO,QAAY,CAAA,YAAA,EAAA,CAAnB,GAAE,KAAA;mCADVN,kBAiBQ,CAAA,QAAA,EAAA;gBAfN,GAAG,EAAE,GAAG,CAAC,IAAI;AACd,gBAAA,IAAI,EAAC,QAAO;AACZ,gBAAA,KAAK,kBAAC,iCAAgC,EAAA,EAAA,yCAAA,EACe,eAAO,KAAM,GAAG,CAAC;AACrE,gBAAA,cAAY,EAAE,MAAA,CAAA,QAAO,KAAM,GAAG,CAAC,IAAI;AACnC,gBAAA,OAAK,EAAE,MAAA,KAAA,IAAA,CAAA,KAAK,CAAqB,kBAAA,EAAA,GAAG,CAAC,IAAI,CAAA,CAAA;;AAC5B,gBAAA,CAAA,GAAG,CAAC,IAAI;kCAAtBO,WAG2C,CAAA,iBAAA,EAAA;;sBAFzC,IAAI,EAAE,GAAG,CAAC,IAAI;AACd,sBAAA,IAAI,EAAE,EAAE;AACT,sBAAA,KAAK,EAAC;;kCACPA,WAG2C,CAAAC,uBAAA,CAH3B,GAAG,CAAC,QAAQ,CAAA,EAAA;;AAE1B,sBAAA,IAAI,EAAE,EAAE;AACT,sBAAA,KAAK,EAAC;;AACP,gBAAAP,kBAAA,CAAqE,MAArE,EAAA,UAAqE,EAAlBE,eAAA,CAAA,GAAG,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;;;AAI9D,IAAAF,kBAAA,CA6MK,OA7ML,UA6MK,EAAA;OAvMO,yBAAkB,MAAW,CAAA,WAAA,CAAC,MAAM;AAA/C,WAAAF,SAAA,EAAA,EAAAC,kBAAA,CAWK,OAXL,WAWK,EAAA;YAVJE,WAAmF,CAAA,sBAAA,EAAA;AAArE,cAAA,IAAI,EAAE,EAAE;AAAE,cAAA,KAAK,EAAC,2BAA4B;AAAC,cAAA,YAAU,EAAE,MAAS,CAAA,SAAA;;YAChFA,WAQoC,CAAA,mBAAA,EAAA;AAPnC,cAAA,KAAK,EAAC,6BAA4B;AACjC,cAAA,UAAU,EAAE,QAAkB,CAAA,kBAAA;AAC9B,cAAA,OAAO,EAAE,MAAW,CAAA,WAAA;AACpB,cAAA,MAAM,EAAE,OAAO,GAAG,CAAC,KAAK;AACxB,cAAA,SAAS,EAAE,KAAK;AAChB,cAAA,qBAAmB,EAAE,MAAS,CAAA,SAAA;AAC/B,cAAA,KAAK,EAAC,OAAM;AACX,cAAA,qBAAiB,EAAE,QAAY,CAAA,YAAA;;;;MAIlCE,UAAsB,CAAA,IAAA,CAAA,MAAA,EAAA,SAAA,CAAA;OASN,MAAiB,CAAA,iBAAA;wBAAjCG,WASU,CAAA,mBAAA,EAAA;;AART,YAAA,OAAO,EAAC,UAAS;AAChB,YAAA,YAAU,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,oBAAA,CAAA;AACb,YAAA,KAAK,EAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,oBAAA,CAAA;AACR,YAAA,OAAO,EAAE,MAAW,CAAA,WAAA;AACpB,YAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,gBAAA,CAAA,CAAA,CAAA;;AACF,YAAA,IAAI,UACd,MAAkB;cAAlBL,WAAkB,CAAA,eAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;;;;MAQjBE,UAAsB,CAAA,IAAA,CAAA,MAAA,EAAA,SAAA,CAAA;OAON,MAAO,CAAA,OAAA;wBAAvBG,WAYU,CAAA,mBAAA,EAAA;;AAXT,YAAA,OAAO,EAAC,SAAQ;AACf,YAAA,QAAQ,EAAE,MAAW,CAAA,WAAA;AACrB,YAAA,IAAI,EAAE,QAAQ,CAAA,OAAA,GAAE,gBAAO,CAAC,IAAK,GAAE,SAAS;AACzC,YAAA,aAAW,EAAC,gBAAe;AAC3B,YAAA,qBAAmB,EAAC,WAAU;AAC7B,YAAA,OAAK,EAAE,QAAU,CAAA,UAAA;;AACP,YAAA,IAAI,UACd,MAAmD;eAArC,MAAO,CAAA,OAAA;gCAArBA,WAAmD,CAAA,iBAAA,EAAA;;AAA3B,oBAAA,IAAI,EAAE,MAAO,CAAA,OAAA;AAAG,oBAAA,IAAI,EAAE,EAAE;;gCAChDA,WAAyB,CAAA,eAAA,EAAA;;AAAX,oBAAA,IAAI,EAAE,EAAE;;;6BACb,MACV;AADU,cAAAE,eAAA,CAAA,GACV,mBAAG,MAAO,CAAA,QAAA,CAAA,EAAA,CAAA,YAAA;;;;;MAOXL,UAA0B,CAAA,IAAA,CAAA,MAAA,EAAA,aAAA,CAAA;MAG1BF,WAAsB,CAAA,8BAAA,CAAA;MAGtBA,WAiIW,CAAA,oBAAA,EAAA;AAhIT,QAAA,SAAS,EAAE,IAAI;AACf,QAAA,MAAM,EAAE,MAAiB,CAAA,iBAAA;AACzB,QAAA,QAAQ,EAAE,QAAe,CAAA,eAAA;AAC1B,QAAA,aAAW,EAAC,YAAY;;yBAKxB,MAMgB;UANhBA,WAMgB,CAAA,yBAAA,EAAA;YANC,QAAQ,EAAE,MAAS,CAAA,UAAA,IAAK,MAAe,CAAA,eAAA;AAAG,YAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,SAAA,CAAA,CAAA,CAAA;;AAC3D,YAAA,IAAI,UACd,MAA6C;eAAxB,MAAU,CAAA,UAAA;gCAA/BK,WAA6C,CAAA,wBAAA,EAAA;;AAAX,oBAAA,IAAI,EAAE,EAAE;;gCAC1CA,WAA4B,CAAA,kBAAA,EAAA;;AAAX,oBAAA,IAAI,EAAE,EAAE;;;6BAChB,MACV;AADU,cAAAE,eAAA,CAAA,GACV,GAAGN,eAAA,CAAA,MAAA,CAAA,UAAW,GAAE,QAAA,CAAA,CAAC,mCAAmC,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,SAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;WAGlC,MAAgB,CAAA,gBAAA;4BAApCI,WAQc,CAAA,uBAAA,EAAA;;AAPZ,gBAAA,IAAI,EAAE,MAAgB,CAAA,gBAAA;AACvB,gBAAA,MAAM,EAAC,QAAO;AACd,gBAAA,GAAG,EAAC,qBAAqB;;AACd,gBAAA,IAAI,UACd,MAAoC;kBAApCL,WAAoC,CAAA,iCAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;iCACxB,MACV;AADU,kBAAAO,eAAA,CAAA,GACV,mBAAG;;;;;AAIJ,WAAAV,SAAA,CAAA,IAAA,CAAA,EAAAC,kBAAA,CA2BUK,QA3B0B,EAAA,IAAA,EAAAC,UAAA,CAAA,QAAA,CAAA,qBAAqB,EAAtC,CAAA,EAAA,KAAK,EAAE,IAAK,EAAA,KAAA;;AAAkC,cAAA,GAAA,EAAA,KAAK,CAAC,EAAE;;cAEjE,IAAI;gCADXC,WAac,CAAA,uBAAA,EAAA;;oBAXZ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,oBAAA,eAAc,EAAd,EAAc;AACb,oBAAA,OAAK,aAAE,QAAiB,CAAA,iBAAA,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAA,CAAA;;AAClC,oBAAA,IAAI,UACd,MAAsF;AAAxE,sBAAA,CAAA,KAAK,CAAC,IAAK,IAAG,sBAAa,CAAC,KAAK,CAAC,IAAI,CAAA;wCAApDA,WAAsF,CAAA,iBAAA,EAAA;;4BAA9B,IAAI,EAAE,KAAK,CAAC,IAAI;AAAG,4BAAA,IAAI,EAAE,EAAE;;AAClE,0BAAA,CAAA,KAAK,CAAC,IAAI;0CAA3BP,kBAEwB,CAAA,MAAA,EAAA;;AADvB,8BAAA,KAAK,EAACU,cAAA,CAAA,CAAA,oCAAmC,EAChC,CAAA,KAAK,CAAC,IAAI,CAAA,CAAA,CAAA;;;;qCACX,MACV;AADU,sBAAAD,eAAA,CAAA,GACV,GAAGN,eAAA,CAAA,KAAK,CAAC,KAAM,GAAE,QAAA,CAAA,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAI,GAAA,KAAK,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;gCAE9DI,WAWgB,CAAA,yBAAA,EAAA;;AATd,oBAAA,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAA;oBAChC,OAAK,EAAA,MAAA,KAAE,UAAK,CAA4B,eAAA,EAAA,EAAA,MAAA,EAAA,KAAK,CAAC,EAAE,EAAA,EAAA,EAAM,KAAK,CAAC,EAAC,EAAA,CAAA,CAAA;;AACnD,oBAAA,IAAI,UACd,MAAsF;AAAxE,sBAAA,CAAA,KAAK,CAAC,IAAK,IAAG,sBAAa,CAAC,KAAK,CAAC,IAAI,CAAA;wCAApDA,WAAsF,CAAA,iBAAA,EAAA;;4BAA9B,IAAI,EAAE,KAAK,CAAC,IAAI;AAAG,4BAAA,IAAI,EAAE,EAAE;;AAClE,0BAAA,CAAA,KAAK,CAAC,IAAI;0CAA3BP,kBAEwB,CAAA,MAAA,EAAA;;AADvB,8BAAA,KAAK,EAACU,cAAA,CAAA,CAAA,oCAAmC,EAChC,CAAA,KAAK,CAAC,IAAI,CAAA,CAAA,CAAA;;;;qCACX,MACV;AADU,sBAAAD,eAAA,CAAA,GACV,GAAGN,eAAA,CAAA,KAAK,CAAC,KAAM,GAAE,QAAA,CAAA,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAI,GAAA,KAAK,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;;;UAQ/DC,UAA2B,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,CAAA;WAKF,QAAoB,CAAA,oBAAA;4BAA7CG,WAAgD,CAAA,4BAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA;;WAQzC,MAAc,CAAA,cAAA;4BADrBA,WAOgB,CAAA,yBAAA,EAAA;;AALd,gBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;AACF,gBAAA,IAAI,UACd,MAAoB;kBAApBL,WAAoB,CAAA,iBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;iCACR,MACV;AADU,kBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,QAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;WAOE,MAAc,CAAA,cAAA;4BADrBF,WAOgB,CAAA,yBAAA,EAAA;;AALd,gBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;AACF,gBAAA,IAAI,UACd,MAAoB;kBAApBL,WAAoB,CAAA,iBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;iCACR,MACV;AADU,kBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,QAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;WAOE,MAAY,CAAA,YAAA;4BADnBF,WASgB,CAAA,yBAAA,EAAA;;gBAPd,QAAQ,EAAE,MAAW,CAAA,WAAA,CAAC,MAAK,GAAA,CAAA;AAC3B,gBAAA,KAAK,EAAE,MAAA,CAAA,WAAW,CAAC,aAAa,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,gCAAA,CAAA,GAAA,EAAA;AACjC,gBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA,CAAA;;AACF,gBAAA,IAAI,UACd,MAAyB;kBAAzBL,WAAyB,CAAA,sBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;iCACb,MACV;AADU,kBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,eAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;WAOE,MAAc,CAAA,cAAA;4BADrBF,WASgB,CAAA,yBAAA,EAAA;;gBAPd,QAAQ,EAAE,MAAW,CAAA,WAAA,CAAC,MAAK,GAAA,CAAA;AAC3B,gBAAA,KAAK,EAAE,MAAA,CAAA,WAAW,CAAC,MAAK,OAAQ,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,kCAAA,CAAA,GAAA,EAAA;AACjC,gBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;AACF,gBAAA,IAAI,UACd,MAA6B;kBAA7BL,WAA6B,CAAA,0BAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;iCACjB,MACV;AADU,kBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;UASLL,UAAkF,CAAA,IAAA,CAAA,MAAA,EAAA,cAAA,EAAA;YAAvD,KAAK,EAAE,MAAW,CAAA,WAAA,CAAC,MAAM;AAAG,YAAA,WAAW,EAAE,MAAW,CAAA,WAAA;;;;;;IAQjFH,kBAEM,CAAA,MAAA,EAFN,WAEM,EADFE,eAAA,CAAA,MAAA,CAAA,UAAW,IAAG,MAAW,CAAA,WAAA,CAAC,MAAO,GAAA,CAAA,GAAM,QAAmB,CAAA,kBAAA,GAAA,EAAA,CAAA,EAAA,CAAA,YAAA;KAYvD,MAAS,CAAA,UAAA,IAAK,MAAW,CAAA,WAAA,CAAC,MAAK,GAAA,CAAA;AADtC,SAAAJ,SAAA,EAAA,EAAAC,kBAAA,CAkEK,OAlEL,WAkEK,EAAA;UA9DJC,kBAEM,CAAA,MAAA,EAFN,WAEM,EAAAE,eAAA,CADF;WAGG,MAAY,CAAA,YAAA;4BADnBI,WAQU,CAAA,mBAAA,EAAA;;AANT,gBAAA,OAAO,EAAC,WAAU;AACjB,gBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,WAAA,CAAA,CAAA,CAAA;;AACF,gBAAA,IAAI,UACd,MAAyB;kBAAzBL,WAAyB,CAAA,sBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;iCACb,MACV;AADU,kBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,eAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;WAGE,MAAc,CAAA,cAAA;4BADrBF,WAQU,CAAA,mBAAA,EAAA;;AANT,gBAAA,OAAO,EAAC,WAAU;AACjB,gBAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,aAAA,CAAA,CAAA,CAAA;;AACF,gBAAA,IAAI,UACd,MAA6B;kBAA7BL,WAA6B,CAAA,0BAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;iCACjB,MACV;AADU,kBAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;4BAULT,kBAQU,CAAAK,QAAA,EAAA,IAAA,EAAAC,UAAA,CAPO,MAAW,CAAA,WAAA,EAAA,CAApB,KAAI,KAAA;iCADZC,WAQU,CAAA,mBAAA,EAAA;cANR,GAAG,EAAE,KAAK,CAAC,EAAE;AACd,cAAA,OAAO,EAAC,WAAU;cACjB,QAAQ,EAAE,KAAK,CAAC,QAAS,KAAA,IAAA;cACzB,aAAW,EAAA,CAAA,eAAA,EAAoB,KAAK,CAAC,EAAE,CAAA,CAAA;AACvC,cAAA,OAAK,EAAE,MAAA,KAAA,IAAA,CAAA,KAAK,CAAsB,aAAA,EAAA,EAAA,EAAA,EAAA,KAAK,CAAC,EAAE,EAAA,MAAA,EAAU,KAAK,CAAC,EAAE,EAAE,WAAA,EAAA,MAAA,CAAA,WAAW,EAAS,KAAA,EAAA,MAAA,CAAA,WAAW,CAAC,MAAK,EAAA,CAAA,CAAA;;+BACpG,MAAgB;AAAb,gBAAAE,eAAA,CAAAN,eAAA,CAAA,KAAK,CAAC,KAAI,CAAA,EAAA,CAAA,YAAA;;;;;UAOdC,UAG6B,CAAA,IAAA,CAAA,MAAA,EAAA,mBAAA,EAAA;YAD3B,KAAK,EAAE,MAAW,CAAA,WAAA,CAAC,MAAM;AACzB,YAAA,WAAW,EAAE,MAAW,CAAA,WAAA;;UAO1BF,WAQU,CAAA,mBAAA,EAAA;AAPT,YAAA,KAAK,EAAC,iCAAgC;AACtC,YAAA,OAAO,EAAC,UAAS;AAChB,YAAA,OAAK,uCAAE,IAAK,CAAA,KAAA,CAAA,iBAAA,CAAA,CAAA,CAAA;;AACF,YAAA,IAAI,UACd,MAAmB;cAAnBA,WAAmB,CAAA,gBAAA,EAAA,EAAX,IAAI,EAAE,EAAE,EAAA,CAAA;;6BACP,MACV;AADU,cAAAO,eAAA,CAAA,GACV,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,iBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;;;;;;;"}
1
+ {"version":3,"file":"CnActionsBar.vue3.js","sources":["../../../../src/components/CnActionsBar/CnActionsBar.vue?vue&type=template&id=4880abef&lang.js"],"sourcesContent":["<template>\n\t<div class=\"cn-actions-bar\" data-testid=\"cn-actions-bar\">\n\t\t<div class=\"cn-actions-bar__info\">\n\t\t\t<!-- Inline search field (opt-in) -->\n\t\t\t<div v-if=\"showSearch\" class=\"cn-actions-bar__search\">\n\t\t\t\t<Magnify :size=\"18\" class=\"cn-actions-bar__search-icon\" />\n\t\t\t\t<input\n\t\t\t\t\ttype=\"search\"\n\t\t\t\t\tclass=\"cn-actions-bar__search-input\"\n\t\t\t\t\t:placeholder=\"searchPlaceholder || t('nextcloud-vue', 'Search…')\"\n\t\t\t\t\t:value=\"searchValue\"\n\t\t\t\t\t:aria-label=\"searchPlaceholder || t('nextcloud-vue', 'Search')\"\n\t\t\t\t\t@input=\"onSearchInput\">\n\t\t\t</div>\n\t\t\t<span v-else-if=\"pagination && pagination.total > 0\" class=\"cn-actions-bar__count\">\n\t\t\t\t{{ countText }}\n\t\t\t</span>\n\t\t\t<!-- @slot after-search Refinement controls rendered beside the search field on the LEFT side of the bar (e.g. a filter menu button). Convention: the left side groups the VISUAL controls — search, filters, view toggle — while the right cluster holds the ACT controls (add, overflow); the standalone sort select is a display control too but keeps its legacy right-side placement. -->\n\t\t\t<slot name=\"after-search\" />\n\n\t\t\t<!-- View mode toggle (Cards / Table / List) — segmented control with\n\t\t\t a sliding thumb that animates between the N segments. Lives in\n\t\t\t the LEFT info group: switching view is a visual control like\n\t\t\t search and filters, it adds nothing — so it groups with them at\n\t\t\t every width instead of riding with the act buttons. -->\n\t\t\t<div v-if=\"showViewToggle && viewSegments.length > 1\"\n\t\t\t\tclass=\"cn-actions-bar__view-toggle\"\n\t\t\t\trole=\"group\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'View mode')\">\n\t\t\t\t<!-- Sliding pill that sits behind the active segment. Width and\n\t\t\t\t offset are driven by the segment count so the same markup\n\t\t\t\t works for 2–4 segments (cards / table / list / map). -->\n\t\t\t\t<span\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-thumb\"\n\t\t\t\t\t:style=\"thumbStyle\"\n\t\t\t\t\taria-hidden=\"true\" />\n\t\t\t\t<!--\n\t\t\t\t\t@event view-mode-change\n\t\t\t\t\t@description User clicked one of the view-mode toggle buttons (Cards / Table / List / Map). Payload is the selected mode string.\n\t\t\t\t\t@type {'cards' | 'table' | 'list' | 'map'}\n\t\t\t\t-->\n\t\t\t\t<button\n\t\t\t\t\tv-for=\"seg in viewSegments\"\n\t\t\t\t\t:key=\"seg.mode\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-btn\"\n\t\t\t\t\t:class=\"{ 'cn-actions-bar__view-toggle-btn--active': viewMode === seg.mode }\"\n\t\t\t\t\t:aria-pressed=\"viewMode === seg.mode\"\n\t\t\t\t\t@click=\"$emit('view-mode-change', seg.mode)\">\n\t\t\t\t\t<CnIcon v-if=\"seg.icon\"\n\t\t\t\t\t\t:name=\"seg.icon\"\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<component :is=\"seg.fallback\"\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:size=\"24\"\n\t\t\t\t\t\tclass=\"cn-actions-bar__view-toggle-icon\" />\n\t\t\t\t\t<span class=\"cn-actions-bar__view-toggle-label\">{{ seg.label }}</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cn-actions-bar__actions\">\n\t\t\t<!-- Sort select (opt-in). A standalone sort control for card/list\n\t\t\t views, which — unlike the table — have no sortable column\n\t\t\t headers. A leading sort icon replaces a visible \"Sort by\"\n\t\t\t label so the control stays on one line; the label is kept as\n\t\t\t the combobox's accessible name. -->\n\t\t\t<div v-if=\"showSortSelect && sortOptions.length\" class=\"cn-actions-bar__sort\">\n\t\t\t\t<SortVariant :size=\"20\" class=\"cn-actions-bar__sort-icon\" :aria-label=\"sortLabel\" />\n\t\t\t\t<NcSelect\n\t\t\t\t\tclass=\"cn-actions-bar__sort-select\"\n\t\t\t\t\t:modelValue=\"selectedSortOption\"\n\t\t\t\t\t:options=\"sortOptions\"\n\t\t\t\t\t:reduce=\"opt => opt.value\"\n\t\t\t\t\t:clearable=\"false\"\n\t\t\t\t\t:aria-label-combobox=\"sortLabel\"\n\t\t\t\t\tlabel=\"label\"\n\t\t\t\t\t@update:modelValue=\"onSortChange\" />\n\t\t\t</div>\n\n\t\t\t<!-- @slot filters Inline filter controls rendered inside the action bar, between the view toggle and the add/actions (e.g. a CnQuickFilterBar segmented toggle). -->\n\t\t\t<slot name=\"filters\" />\n\n\t\t\t<!-- Search / Columns sidebar toggle (opt-in). Icon-only; reflects the\n\t\t\t open state via aria-pressed so the index sidebar can default\n\t\t\t closed and be opened on demand. -->\n\t\t\t<!--\n\t\t\t\t@event toggle-sidebar\n\t\t\t\t@description User clicked the Search/Columns sidebar toggle. No payload — the host flips the sidebar open state.\n\t\t\t-->\n\t\t\t<NcButton v-if=\"showSidebarToggle\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:title=\"t('nextcloud-vue', 'Search and columns')\"\n\t\t\t\t:pressed=\"sidebarOpen\"\n\t\t\t\t@click=\"$emit('toggle-sidebar')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Tune :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions\n\t\t\t\t@description Custom buttons rendered between the sidebar toggle and the primary Add button.\n\t\t\t-->\n\t\t\t<slot name=\"actions\" />\n\n\t\t\t<!--\n\t\t\t\t@event add\n\t\t\t\t@description User clicked the primary Add button. No payload.\n\t\t\t-->\n\t\t\t<!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`, except on a modified click, which opens a new tab. -->\n\t\t\t<NcButton v-if=\"showAdd\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:disabled=\"addDisabled\"\n\t\t\t\t:href=\"addLink ? addLink.href : undefined\"\n\t\t\t\tdata-testid=\"cn-cta-primary\"\n\t\t\t\tdata-walkthrough-id=\"index-add\"\n\t\t\t\t@click=\"onAddClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<CnIcon v-if=\"addIcon\" :name=\"addIcon\" :size=\"20\" />\n\t\t\t\t\t<Plus v-else :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addLabel }}\n\t\t\t</NcButton>\n\n\t\t\t<!--\n\t\t\t\t@slot actions-end\n\t\t\t\t@description Custom buttons (e.g. CnIndexPage's saved-views control) rendered AFTER the primary Add button, immediately before the overflow menu — for content that belongs grouped with \"browse/manage\" controls rather than with the app-specific buttons in `#actions`.\n\t\t\t-->\n\t\t\t<slot name=\"actions-end\" />\n\n\t\t\t<!-- In-app edit button (ADR-041): icon-only, self-wires from CnAppRoot. -->\n\t\t\t<CnBuildiqEditButton />\n\n\t\t\t<!-- Actions menu (Refresh, Import, Export, mass actions) -->\n\t\t\t<NcActions\n\t\t\t\t:forceName=\"true\"\n\t\t\t\t:inline=\"inlineActionCount\"\n\t\t\t\t:menuName=\"actionsMenuName\"\n\t\t\t\tdata-testid=\"cn-actions\">\n\t\t\t\t<!--\n\t\t\t\t\t@event refresh\n\t\t\t\t\t@description User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton :disabled=\"refreshing || refreshDisabled\" @click=\"$emit('refresh')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<NcLoadingIcon v-if=\"refreshing\" :size=\"20\" />\n\t\t\t\t\t\t<Refresh v-else :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ refreshing ? t('nextcloud-vue', 'Refreshing…') : t('nextcloud-vue', 'Refresh') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<NcActionLink v-if=\"documentationUrl\"\n\t\t\t\t\t:href=\"documentationUrl\"\n\t\t\t\t\ttarget=\"_blank\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<BookOpenVariantOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ documentationLabel }}\n\t\t\t\t</NcActionLink>\n\n\t\t\t\t<!-- Manifest-declared page-level header actions (overflow); an entry with `href` / `to` is a real link. -->\n\t\t\t\t<template v-for=\"{ entry, link } in renderedHeaderActions\" :key=\"entry.id\">\n\t\t\t\t\t<NcActionLink\n\t\t\t\t\t\tv-if=\"link\"\n\t\t\t\t\t\t:href=\"link.href\"\n\t\t\t\t\t\t:target=\"link.target\"\n\t\t\t\t\t\tcloseAfterClick\n\t\t\t\t\t\t@click=\"onHeaderLinkClick(entry, link, $event)\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionLink>\n\t\t\t\t\t<NcActionButton\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:disabled=\"Boolean(entry.disabled)\"\n\t\t\t\t\t\t@click=\"$emit('header-action', { action: entry.id, id: entry.id })\">\n\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t<CnIcon v-if=\"entry.icon && isMdiIconName(entry.icon)\" :name=\"entry.icon\" :size=\"20\" />\n\t\t\t\t\t\t\t<span v-else-if=\"entry.icon\"\n\t\t\t\t\t\t\t\tclass=\"cn-actions-bar__header-action-icon\"\n\t\t\t\t\t\t\t\t:class=\"[entry.icon]\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t{{ entry.label ? effectiveTranslate(entry.label) : entry.label }}\n\t\t\t\t\t</NcActionButton>\n\t\t\t\t</template>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot action-items\n\t\t\t\t\t@description Additional NcActionButton-family items rendered inside the overflow menu, between the built-in Refresh entry and the mass-actions separator. Use for app-level page actions.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"action-items\" />\n\n\t\t\t\t<!-- Separator between primary and mass actions. Hidden when the\n\t\t\t\t inline-action-count hoists every pre-separator item out of the\n\t\t\t\t overflow, which would otherwise leave the separator orphaned. -->\n\t\t\t\t<NcActionSeparator v-if=\"showActionsSeparator\" />\n\n\t\t\t\t<!-- Mass actions (overflow) -->\n\t\t\t\t<!--\n\t\t\t\t\t@event show-import\n\t\t\t\t\t@description User clicked the Import mass action. Host should open the import modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassImport\"\n\t\t\t\t\t@click=\"$emit('show-import')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Import :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Import') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-export\n\t\t\t\t\t@description User clicked the Export mass action. Host should open the export modal.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassExport\"\n\t\t\t\t\t@click=\"$emit('show-export')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Export :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Export') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-copy\n\t\t\t\t\t@description User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to copy') : ''\"\n\t\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t\t</NcActionButton>\n\t\t\t\t<!--\n\t\t\t\t\t@event show-delete\n\t\t\t\t\t@description User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t\t-->\n\t\t\t\t<NcActionButton\n\t\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\t\t:disabled=\"selectedIds.length < 1\"\n\t\t\t\t\t:title=\"selectedIds.length < 1 ? t('nextcloud-vue', 'Select 1 or more items to delete') : ''\"\n\t\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t\t</NcActionButton>\n\n\t\t\t\t<!--\n\t\t\t\t\t@slot mass-actions\n\t\t\t\t\t@description Additional mass-action NcActionButtons rendered at the bottom of the overflow menu. Scope receives the current selection count and ids so the host can disable / label per selection.\n\t\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t\t-->\n\t\t\t\t<slot name=\"mass-actions\" :count=\"selectedIds.length\" :selectedIds=\"selectedIds\" />\n\t\t\t</NcActions>\n\t\t</div>\n\n\t\t<!-- Always-present live region for the selection count (WCAG 2.1\n\t\t SC 4.1.3 Status Messages): a `role=\"status\"` element must exist\n\t\t BEFORE its content changes for assistive tech to announce it, so\n\t\t it cannot live inside the v-if'd strip below. -->\n\t\t<span class=\"cn-actions-bar__sr-status\" role=\"status\">\n\t\t\t{{ selectable && selectedIds.length > 0 ? selectionCountText : '' }}\n\t\t</span>\n\n\t\t<!-- Contextual selection strip (the Proton Pass / Gmail / Files\n\t\t pattern): appears while a selection is active, carrying the\n\t\t visible count, the built-in selection-scoped mass actions, the\n\t\t host's own bulk buttons (#selection-actions) and a Clear control.\n\t\t This strip is the discoverable surface for bulk actions; the\n\t\t BUILT-IN Copy/Delete-selected also stay listed in the overflow\n\t\t menu above, while a host decides for its own actions (strip-only\n\t\t is fine — keepiq does exactly that). -->\n\t\t<div\n\t\t\tv-if=\"selectable && selectedIds.length > 0\"\n\t\t\tclass=\"cn-actions-bar__selection\"\n\t\t\tdata-testid=\"cn-selection-strip\">\n\t\t\t<span class=\"cn-actions-bar__selection-count\" aria-hidden=\"true\">\n\t\t\t\t{{ selectionCountText }}\n\t\t\t</span>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassCopy\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-copy')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ContentCopy :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Copy selected') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\tv-if=\"showMassDelete\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t@click=\"$emit('show-delete')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Delete selected') }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\tDeclarative bulk actions, from `bulkActions`. They render in the\n\t\t\t\tSAME strip as a host's slot buttons and before them, so a page\n\t\t\t\tthat declares some in its manifest and hand-writes others gets\n\t\t\t\tone row of buttons rather than two groups in different places.\n\t\t\t\t@event bulk-action\n\t\t\t\t@description User clicked a declarative bulk action. Payload carries the action id AND the selection, because a bulk action without its selection is not a bulk action.\n\t\t\t-->\n\t\t\t<NcButton\n\t\t\t\tv-for=\"entry in bulkActions\"\n\t\t\t\t:key=\"entry.id\"\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\t:disabled=\"entry.disabled === true\"\n\t\t\t\t:data-testid=\"`cn-bulk-action-${entry.id}`\"\n\t\t\t\t@click=\"$emit('bulk-action', { id: entry.id, action: entry.id, selectedIds, count: selectedIds.length })\">\n\t\t\t\t{{ entry.label }}\n\t\t\t</NcButton>\n\t\t\t<!--\n\t\t\t\t@slot selection-actions The host app's bulk-action buttons (NcButton family), rendered inside the contextual selection strip that appears while a selection is active. This strip is the primary bulk-actions surface; #mass-actions remains available for hosts that ALSO want the actions listed in the overflow menu (optional — strip-only is fine).\n\t\t\t\t@binding {number} count Length of the current selection.\n\t\t\t\t@binding {Array<string|number>} selected-ids The selected row ids.\n\t\t\t-->\n\t\t\t<slot\n\t\t\t\tname=\"selection-actions\"\n\t\t\t\t:count=\"selectedIds.length\"\n\t\t\t\t:selectedIds=\"selectedIds\" />\n\t\t\t<!--\n\t\t\t\t@event clear-selection\n\t\t\t\t@description User clicked the selection strip's Clear control. The host should empty its selection (CnIndexPage does this for you and re-emits `select` with an empty array).\n\t\t\t-->\n\t\t\t<!-- No aria-label: the visible \"Clear selection\" text IS the\n\t\t\t accessible name (review: an override here is redundant). -->\n\t\t\t<NcButton\n\t\t\t\tclass=\"cn-actions-bar__selection-clear\"\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"$emit('clear-selection')\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Close :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Clear selection') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcActionButton, NcActionLink, NcActions, NcActionSeparator, NcButton, NcLoadingIcon, NcSelect } from '@nextcloud/vue'\nimport BookOpenVariantOutline from 'vue-material-design-icons/BookOpenVariantOutline.vue'\nimport Close from 'vue-material-design-icons/Close.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport Export from 'vue-material-design-icons/Export.vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport Import from 'vue-material-design-icons/Import.vue'\nimport Magnify from 'vue-material-design-icons/Magnify.vue'\nimport MapMarkerOutline from 'vue-material-design-icons/MapMarkerOutline.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport Refresh from 'vue-material-design-icons/Refresh.vue'\nimport SortVariant from 'vue-material-design-icons/SortVariant.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Tune from 'vue-material-design-icons/Tune.vue'\nimport ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'\nimport ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'\nimport CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'\nimport { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'\nimport { isModifiedClick } from '../../utils/linkNavigation.js'\nimport { CnIcon } from '../CnIcon/index.js'\n\n/**\n * CnActionsBar — Reusable actions toolbar with count, mass actions, and primary actions.\n *\n * ```vue\n * <CnActionsBar\n * :pagination=\"pagination\"\n * :object-count=\"items.length\"\n * add-label=\"Add Client\"\n * add-icon=\"AccountGroup\"\n * @add=\"createNew\"\n * @refresh=\"reload\" />\n * ```\n */\nexport default {\n\tname: 'CnActionsBar',\n\n\tcomponents: {\n\t\tCnBuildiqEditButton,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tNcSelect,\n\t\tCnIcon,\n\t\tSortVariant,\n\t\tBookOpenVariantOutline,\n\t\tClose,\n\t\tPlus,\n\t\tRefresh,\n\t\tContentCopy,\n\t\tTrashCanOutline,\n\t\tImport,\n\t\tExport,\n\t\tMagnify,\n\t\tTune,\n\t\tViewGridOutline,\n\t\tFormatListBulletedSquare,\n\t\tMapMarkerOutline,\n\t},\n\n\tinject: {\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 `headerActions[].label` is run through it — the\n\t\t * entry is keyed and emitted by `id`, so only the visible text\n\t\t * changes. Defaults to an identity function so an untranslated key\n\t\t * renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Pagination state: { total, page, pages, limit } */\n\t\tpagination: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** Number of currently visible objects (for \"Showing X of Y\") */\n\t\tobjectCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether rows/cards can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Currently selected IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Label for the Add button */\n\t\taddLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Add'),\n\t\t},\n\n\t\t/** MDI icon name for the Add button (e.g. 'AccountGroup'). Falls back to Plus icon. */\n\t\taddIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/**\n\t\t * URL the Add button links to. Makes the button a real link (middle-click,\n\t\t * open in new tab) that still emits `add` on click. `addTo` is ignored when set.\n\t\t *\n\t\t * @type {string|null}\n\t\t */\n\t\taddHref: {\n\t\t\ttype: String,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * vue-router location (path or `{ name, params }`) the Add button links to.\n\t\t * The button becomes a real link whose plain click routes in place and still\n\t\t * emits `add`; the host must then not navigate on `add` itself. Ignored when\n\t\t * the router cannot resolve it.\n\t\t *\n\t\t * @type {string|object|null}\n\t\t */\n\t\taddTo: {\n\t\t\ttype: [String, Object],\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/** How many action buttons to show inline (rest go in overflow dropdown) */\n\t\tinlineActionCount: {\n\t\t\ttype: Number,\n\t\t\tdefault: 0,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Import action */\n\t\tshowMassImport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Export action */\n\t\tshowMassExport: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Copy action */\n\t\tshowMassCopy: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Whether to show the built-in mass Delete action */\n\t\tshowMassDelete: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Current view mode: 'table', 'cards', 'list', or 'map' */\n\t\tviewMode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'table',\n\t\t\tvalidator: (v) => ['table', 'cards', 'list', 'map'].includes(v),\n\t\t},\n\n\t\t/**\n\t\t * Which view-mode segments to render, in order. Defaults to the\n\t\t * historical two-segment control; add `'list'` to expose the list view.\n\t\t *\n\t\t * @type {Array<'cards' | 'table' | 'list'>}\n\t\t */\n\t\tavailableViewModes: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => ['cards', 'table'],\n\t\t\tvalidator: (modes) => modes.every((m) => ['cards', 'table', 'list'].includes(m)),\n\t\t},\n\n\t\t/** Whether to show the view-mode toggle */\n\t\tshowViewToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Label for the cards/grid view-toggle option (defaults to \"Cards\") */\n\t\tcardsLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the table/list view-toggle option (defaults to \"Table\") */\n\t\ttableLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the cards option (defaults to the built-in grid icon). Resolved via CnIcon. */\n\t\tcardsIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the table option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\ttableIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether to render the \"Map\" segment in the view toggle (back-compat bridge; equivalent to adding 'map' to `availableViewModes`). */\n\t\tshowMap: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Label for the map view-toggle option (defaults to \"Map\"). */\n\t\tmapLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the map option (defaults to the built-in map-marker icon). Resolved via CnIcon. */\n\t\tmapIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the list view-toggle option (defaults to \"List\") */\n\t\tlistLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** MDI icon name for the list option (defaults to the built-in list icon). Resolved via CnIcon. */\n\t\tlistIcon: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Show a standalone sort dropdown (useful in card/list views). */\n\t\tshowSortSelect: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Options for the sort dropdown.\n\t\t *\n\t\t * @type {Array<{ value: string, label: string }>}\n\t\t */\n\t\tsortOptions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** The currently selected sort option value (controlled). */\n\t\tsortValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Accessible label for the sort dropdown. */\n\t\tsortLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Sort by'),\n\t\t},\n\n\t\t/** Whether to show the inline search field on the left of the bar */\n\t\tshowSearch: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current value of the inline search field (controlled) */\n\t\tsearchValue: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder / accessible label for the inline search field */\n\t\tsearchPlaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether the refresh action is currently in progress */\n\t\trefreshing: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the refresh action is disabled (e.g. when required selections are missing) */\n\t\trefreshDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether the Add button is disabled (e.g. when required selections are missing) */\n\t\taddDisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether to show the Add button */\n\t\tshowAdd: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/**\n\t\t * Whether to show the Search/Columns sidebar toggle button. Lets the\n\t\t * index sidebar default to closed and be opened on demand.\n\t\t */\n\t\tshowSidebarToggle: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Current open state of the sidebar (controls the toggle's pressed state). */\n\t\tsidebarOpen: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/**\n\t\t * Manifest-declared page-level actions rendered in the overflow\n\t\t * dropdown between Refresh and the `#action-items` slot. Each\n\t\t * entry is `{ id, label, icon?, disabled? }`. The bar emits\n\t\t * `@header-action({ action: id, id })` on click; handler\n\t\t * resolution happens upstream (CnIndexPage). An entry with `href`\n\t\t * (URL) or `to` (vue-router location) renders as a real link, with\n\t\t * `linkTarget` as its `target`; it still emits `header-action`, so the\n\t\t * host must not navigate for it again.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean, href?: string, to?: string|object, linkTarget?: string }>}\n\t\t */\n\t\theaderActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * Declarative bulk actions, rendered in the contextual selection strip\n\t\t * that appears while a selection is active.\n\t\t *\n\t\t * The strip already had a `#selection-actions` slot, which only a\n\t\t * hand-written host component can fill — so a page declared in an app\n\t\t * manifest could carry row actions and header actions but never a bulk\n\t\t * one. This prop is that missing vocabulary; the slot stays, and both\n\t\t * render side by side in one row.\n\t\t *\n\t\t * Clicking emits `bulk-action` with the id AND the current selection.\n\t\t *\n\t\t * @type {Array<{ id: string, label: string, icon?: string, disabled?: boolean }>}\n\t\t */\n\t\tbulkActions: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/**\n\t\t * When set, adds a Documentation entry to the overflow menu (after\n\t\t * Refresh, before headerActions). Opens the URL in a new tab.\n\t\t * Empty string hides the entry.\n\t\t */\n\t\tdocumentationUrl: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Label for the Documentation overflow entry. */\n\t\tdocumentationLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'Documentation'),\n\t\t},\n\t},\n\n\temits: [\n\t\t'add',\n\t\t'bulk-action',\n\t\t'clear-selection',\n\t\t'header-action',\n\t\t'refresh',\n\t\t'search',\n\t\t'show-copy',\n\t\t'show-delete',\n\t\t'show-export',\n\t\t'show-import',\n\t\t'sort-change',\n\t\t'toggle-sidebar',\n\t\t'view-mode-change',\n\t],\n\n\tcomputed: {\n\t\t/**\n\t\t * Name of the overflow Actions menu. Library chrome, so it resolves\n\t\t * against the LIBRARY catalogue — it was a bare `menu-name=\"Actions\"`\n\t\t * literal, which rendered \"Actions\" in a Dutch session next to an\n\t\t * otherwise fully translated toolbar even though the catalogue has\n\t\t * carried \"Acties\" all along.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tactionsMenuName() {\n\t\t\treturn t('nextcloud-vue', 'Actions')\n\t\t},\n\n\t\t/**\n\t\t * The selection strip's count text — also fed to the always-present\n\t\t * `role=\"status\"` live region (WCAG 2.1 SC 4.1.3), so assistive tech\n\t\t * announces selection changes without focus moving.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tselectionCountText() {\n\t\t\treturn t('nextcloud-vue', '{count} selected', { count: this.selectedIds.length })\n\t\t},\n\n\t\t/**\n\t\t * Effective translate function: the injected `cnTranslate` (the host\n\t\t * app's bound `t()`), identity by default.\n\t\t *\n\t\t * @return {(key: string) => string}\n\t\t */\n\t\teffectiveTranslate() {\n\t\t\treturn typeof this.cnTranslate === 'function' ? this.cnTranslate : (key) => key\n\t\t},\n\n\t\t/**\n\t\t * The link the Add button renders as, or null for a plain button.\n\t\t *\n\t\t * @return {object|null}\n\t\t */\n\t\taddLink() {\n\t\t\tif (this.addDisabled) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn resolveItemActionLink({ href: this.addHref, to: this.addTo }, null, this.$router)\n\t\t},\n\n\t\t/**\n\t\t * Header actions paired with the link each renders as (null for a button).\n\t\t *\n\t\t * @return {Array<{entry: object, link: object|null}>}\n\t\t */\n\t\trenderedHeaderActions() {\n\t\t\treturn (this.headerActions || []).map((entry) => ({\n\t\t\t\tentry,\n\t\t\t\tlink: entry.disabled ? null : resolveItemActionLink(entry, null, this.$router),\n\t\t\t}))\n\t\t},\n\n\t\tcountText() {\n\t\t\tif (!this.pagination) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', 'Showing {count} of {total}', { count: this.objectCount, total: this.pagination.total })\n\t\t},\n\n\t\t/**\n\t\t * The view-toggle segments (label + icon) derived from `availableViewModes`,\n\t\t * with a back-compat bridge that appends the map segment when the beta-era\n\t\t * `showMap` prop is set. `icon` is a CnIcon name (empty → the built-in\n\t\t * `fallback` component).\n\t\t */\n\t\tviewSegments() {\n\t\t\tconst defs = {\n\t\t\t\tcards: { label: this.cardsLabel || t('nextcloud-vue', 'Cards'), icon: this.cardsIcon, fallback: ViewGridOutline },\n\t\t\t\ttable: { label: this.tableLabel || t('nextcloud-vue', 'Table'), icon: this.tableIcon, fallback: FormatListBulletedSquare },\n\t\t\t\tlist: { label: this.listLabel || t('nextcloud-vue', 'List'), icon: this.listIcon, fallback: ViewListOutline },\n\t\t\t\tmap: { label: this.mapLabel || t('nextcloud-vue', 'Map'), icon: this.mapIcon, fallback: MapMarkerOutline },\n\t\t\t}\n\t\t\tconst modes = [...this.availableViewModes]\n\t\t\tif (this.showMap && !modes.includes('map')) {\n\t\t\t\tmodes.push('map')\n\t\t\t}\n\t\t\treturn modes\n\t\t\t\t.filter((mode) => defs[mode])\n\t\t\t\t.map((mode) => ({ mode, ...defs[mode] }))\n\t\t},\n\n\t\t/** The full sort option object matching `sortValue` (for NcSelect). */\n\t\tselectedSortOption() {\n\t\t\treturn this.sortOptions.find((o) => o.value === this.sortValue) || null\n\t\t},\n\n\t\t/** Sliding-thumb width + offset, driven by the active segment index. */\n\t\tthumbStyle() {\n\t\t\tconst count = this.viewSegments.length || 1\n\t\t\tconst activeIndex = Math.max(0, this.viewSegments.findIndex((s) => s.mode === this.viewMode))\n\t\t\treturn {\n\t\t\t\twidth: `calc((100% - 8px) / ${count})`,\n\t\t\t\ttransform: `translateX(${activeIndex * 100}%)`,\n\t\t\t}\n\t\t},\n\n\t\thasMassActions() {\n\t\t\treturn this.showMassImport || this.showMassExport || this.showMassCopy || this.showMassDelete\n\t\t},\n\n\t\t/**\n\t\t * Count meaningful VNodes in the `#action-items` slot (excludes whitespace\n\t\t * text nodes and comments). Used to decide whether the mass-actions\n\t\t * separator would be orphaned by `inlineActionCount`.\n\t\t */\n\t\tactionItemsCount() {\n\t\t\tconst slot = this.$slots['action-items']\n\t\t\tif (!slot) {\n\t\t\t\treturn 0\n\t\t\t}\n\t\t\tconst vnodes = slot() || []\n\t\t\treturn vnodes.filter((n) => n && (n.tag !== undefined || n.componentOptions !== undefined)).length\n\t\t},\n\n\t\t/**\n\t\t * The separator is meaningful only when at least one pre-separator action\n\t\t * button (Refresh + #action-items) still ends up inside the overflow\n\t\t * dropdown after NcActions hoists the first `inlineActionCount` buttons\n\t\t * inline. Pre-separator items: 1 (Refresh) + actionItemsCount.\n\t\t */\n\t\tshowActionsSeparator() {\n\t\t\tif (!this.hasMassActions) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (!this.$slots['action-items']) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tconst preSeparatorOverflow = 1 + this.actionItemsCount - this.inlineActionCount\n\t\t\treturn preSeparatorOverflow > 0\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t\t/**\n\t\t * Forward the inline search field's input to the host.\n\t\t *\n\t\t * @param {Event} event The native input event.\n\t\t * @return {void}\n\t\t */\n\t\tonSearchInput(event) {\n\t\t\t/**\n\t\t\t * @event search Emitted when the user types in the inline search field.\n\t\t\t * @type {string}\n\t\t\t */\n\t\t\tthis.$emit('search', event.target.value)\n\t\t},\n\n\t\t/**\n\t\t * Forward the standalone sort dropdown's selection to the host.\n\t\t *\n\t\t * @param {string} value The chosen option's `value`.\n\t\t * @return {void}\n\t\t */\n\t\tonSortChange(value) {\n\t\t\t/**\n\t\t\t * @event sort-change Emitted when the user picks an option from the standalone sort dropdown.\n\t\t\t * @type {string} The chosen option's `value`.\n\t\t\t */\n\t\t\tthis.$emit('sort-change', value)\n\t\t},\n\n\t\t/**\n\t\t * Add button click: a plain click on an in-app link routes in place,\n\t\t * anything else on a link is the browser's. Emits `add`, except for a\n\t\t * modified click on a link, which opens in a new tab: a host `@add`\n\t\t * would otherwise run in the tab the user is leaving.\n\t\t *\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonAddClick(event) {\n\t\t\tif (this.addLink) {\n\t\t\t\tif (isModifiedClick(event)) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tfollowItemActionLink(event, this.addLink, this.$router)\n\t\t\t}\n\t\t\tthis.$emit('add')\n\t\t},\n\n\t\t/**\n\t\t * A header link entry was clicked: route a plain in-app click and emit\n\t\t * `header-action` as the button would. A modified click is the\n\t\t * browser's alone (a new tab), so nothing is emitted for it.\n\t\t *\n\t\t * @param {object} entry The header action.\n\t\t * @param {object} link The resolved link.\n\t\t * @param {MouseEvent} event The click event.\n\t\t */\n\t\tonHeaderLinkClick(entry, link, event) {\n\t\t\tif (isModifiedClick(event)) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tfollowItemActionLink(event, link, this.$router)\n\t\t\tthis.$emit('header-action', { action: entry.id, id: entry.id })\n\t\t},\n\n\t\t/**\n\t\t * Heuristic: a \"plain\" name like `History` is an MDI Vue\n\t\t * component name (rendered via `CnIcon`). A name like\n\t\t * `icon-history` or any string starting with `icon-` is a\n\t\t * Nextcloud core CSS icon class (rendered as a `<span>`).\n\t\t *\n\t\t * @param {string} name Icon string from a headerActions entry.\n\t\t * @return {boolean} `true` when `name` should be passed to\n\t\t * `CnIcon` as `:name`; `false` for CSS-class icons or empty.\n\t\t */\n\t\tisMdiIconName(name) {\n\t\t\tif (!name || typeof name !== 'string') {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tif (name.startsWith('icon-')) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\treturn true\n\t\t},\n\n\t\t/**\n\t\t * Emit declarations — invoked via the template `$emit(...)` sites.\n\t\t * Listed here so vue-docgen-api picks up the events for the\n\t\t * generated docs.\n\t\t *\n\t\t * @private\n\t\t */\n\t\t_emitDocs() {\n\t\t\t/**\n\t\t\t * @event view-mode-change User clicked one of the view-mode toggle buttons (Cards / Table). Payload is the selected mode string.\n\t\t\t * @type {'cards' | 'table'}\n\t\t\t */\n\t\t\tthis.$emit('view-mode-change')\n\t\t\t/**\n\t\t\t * @event add User clicked the primary Add button. No payload.\n\t\t\t */\n\t\t\tthis.$emit('add')\n\t\t\t/**\n\t\t\t * @event refresh User clicked the Refresh entry in the overflow Actions menu. The host should re-fetch the underlying list.\n\t\t\t */\n\t\t\tthis.$emit('refresh')\n\t\t\t/**\n\t\t\t * @event show-import User clicked the Import mass action. Host should open the import modal.\n\t\t\t */\n\t\t\tthis.$emit('show-import')\n\t\t\t/**\n\t\t\t * @event show-export User clicked the Export mass action. Host should open the export modal.\n\t\t\t */\n\t\t\tthis.$emit('show-export')\n\t\t\t/**\n\t\t\t * @event show-copy User clicked the Copy-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-copy')\n\t\t\t/**\n\t\t\t * @event show-delete User clicked the Delete-selected mass action. Disabled while no row is selected.\n\t\t\t */\n\t\t\tthis.$emit('show-delete')\n\t\t\t/**\n\t\t\t * @event header-action User clicked a manifest-declared page-level header action. Payload: `{ action: id, id }`.\n\t\t\t */\n\t\t\tthis.$emit('header-action')\n\t\t\t/**\n\t\t\t * @event toggle-sidebar User clicked the Search/Columns sidebar toggle. No payload.\n\t\t\t */\n\t\t\tthis.$emit('toggle-sidebar')\n\t\t\t/**\n\t\t\t * @event clear-selection User clicked the selection strip's Clear control. No payload — the host should empty its selection (CnIndexPage does this and re-emits `select` with an empty array).\n\t\t\t */\n\t\t\tthis.$emit('clear-selection')\n\t\t},\n\t},\n}\n</script>\n\n<!-- Styles in css/actions-bar.css -->\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_createVNode","_toDisplayString","_renderSlot","_Fragment","_renderList","_createBlock","_resolveDynamicComponent","_createTextVNode","_normalizeClass"],"mappings":"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"}