@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
@@ -451,6 +451,7 @@
451
451
  @sort="onSortEvent"
452
452
  @select="onSelect"
453
453
  @rowClick="onRowClick"
454
+ @rowAuxClick="onRowAuxClick"
454
455
  @rowContextMenu="onRowContextMenu">
455
456
  <!-- Pass through column slots -->
456
457
  <template
@@ -548,6 +549,7 @@
548
549
  :runTransition="runTransition"
549
550
  :paged="isPaged"
550
551
  @cardClick="onRowClick"
552
+ @cardAuxClick="onRowAuxClick"
551
553
  @moved="onBoardMoved" />
552
554
 
553
555
  <!--
@@ -563,7 +565,8 @@
563
565
  :laneField="dateAxis.laneField || ''"
564
566
  :labelField="dateAxis.labelField || ''"
565
567
  :rowKey="rowKey"
566
- @rowClick="onRowClick" />
568
+ @rowClick="onRowClick"
569
+ @rowAuxClick="onRowAuxClick" />
567
570
 
568
571
  <!-- List view -->
569
572
  <CnObjectList
@@ -576,6 +579,7 @@
576
579
  :rowKey="rowKey"
577
580
  :emptyText="emptyText"
578
581
  @click="onRowClick"
582
+ @auxClick="onRowAuxClick"
579
583
  @select="onSelect">
580
584
  <!--
581
585
  List-item slot resolution priority (highest first):
@@ -596,6 +600,7 @@
596
600
  :register="register"
597
601
  :selected="selected"
598
602
  @click="(...args) => onRowClick(object, args.find(isDomEvent))"
603
+ @mousedown="onCustomItemMouseDown"
599
604
  @auxclick="onCustomItemAuxClick(object, $event)"
600
605
  @select="onSelect(toggleIdInArray(internalSelectedIds, object[rowKey]))" />
601
606
  </template>
@@ -629,6 +634,7 @@
629
634
  :rowKey="rowKey"
630
635
  :emptyText="emptyText"
631
636
  @click="onRowClick"
637
+ @auxClick="onRowAuxClick"
632
638
  @select="onSelect">
633
639
  <!--
634
640
  Card slot resolution priority (highest first):
@@ -649,6 +655,7 @@
649
655
  :register="register"
650
656
  :selected="selected"
651
657
  @click="(...args) => onRowClick(object, args.find(isDomEvent))"
658
+ @mousedown="onCustomItemMouseDown"
652
659
  @auxclick="onCustomItemAuxClick(object, $event)"
653
660
  @select="onSelect(toggleIdInArray(internalSelectedIds, object[rowKey]))" />
654
661
  </template>
@@ -781,7 +788,7 @@ import { LIST_SHORTCUTS, listPaletteCommands, shortcutFor } from '../../utils/li
781
788
  import { multiKeySort } from '../../utils/multiKeySort.js'
782
789
  import { resolveDeepTokens, resolveFilterValue } from '../../utils/resolveFilterTokens.js'
783
790
  import { availableRowActions, DEFAULT_ROW_ACTION_FIELD, refusalReasonFor, undeclaredRowActions } from '../../utils/rowActionAvailability.js'
784
- import { isNewTabClick, isRowMiddleClick, markNewTabHandled } from '../../utils/rowAuxClick.js'
791
+ import { isNewTabClick, isNewTabHandled, isRowMiddleClick, markNewTabHandled, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
785
792
  import { DEFAULT_ROW_INDICATOR_CAP } from '../../utils/rowIndicators.js'
786
793
  import { buildRouteQueryFromViewState, buildViewCreatePayload, extractViewState, extractViewStateFromRouteQuery, savedViewScope, viewMatchesScope } from '../../utils/savedViewHelpers.js'
787
794
  import { columnsFromSchema } from '../../utils/schema.js'
@@ -995,7 +1002,8 @@ function namedFilterToQuery(values) {
995
1002
  * @event {object} mass-export — Mass export confirmed. Payload: { ids, format }
996
1003
  * @event {object} mass-import — Mass import confirmed. Payload: import data
997
1004
  * @event {void} refresh — Refresh button clicked
998
- * @event {object} row-click — Table row or card clicked or middle-clicked. Payload: (row, event) — the row object and the native click/auxclick event
1005
+ * @event {object} row-click — Table row or card clicked. Payload: (row, event) — the row object and the native click event
1006
+ * @event {object} row-aux-click — Table row or card middle-clicked. Payload: (row, event) — the row object and the native auxclick event
999
1007
  * @event {{ key: string, order: string }} sort — Column sort changed
1000
1008
  * @event {number} page-changed — Pagination page changed
1001
1009
  * @event {number} page-size-changed — Pagination page size changed
@@ -2568,6 +2576,7 @@ export default {
2568
2576
  'quick-filter-change',
2569
2577
  'refresh',
2570
2578
  'row-click',
2579
+ 'row-aux-click',
2571
2580
  'search',
2572
2581
  'select',
2573
2582
  'sort',
@@ -2810,6 +2819,9 @@ export default {
2810
2819
  * that is what Add does (no host `@add` listener) and the router can
2811
2820
  * resolve it. The bar then renders Add as a real link; null otherwise.
2812
2821
  *
2822
+ * `$.vnode.props` is not reactive, so an `add` listener attached or
2823
+ * removed after mount does not re-evaluate this.
2824
+ *
2813
2825
  * @return {string|object|null}
2814
2826
  */
2815
2827
  addLinkTo() {
@@ -5565,21 +5577,60 @@ export default {
5565
5577
  /**
5566
5578
  * Row/card click: toggles selection when `selectable` (covers the custom
5567
5579
  * `cardComponent` path), otherwise emits `row-click` for navigation. A
5568
- * ctrl/cmd/shift or middle click opens a named source's row in a new tab.
5580
+ * ctrl/cmd/shift click opens a named source's row in a new tab.
5569
5581
  *
5570
5582
  * The `@event` block below sits directly against its `$emit`, and must
5571
5583
  * stay there. vue-docgen binds an event's description to the emit it
5572
5584
  * IMMEDIATELY precedes.
5573
5585
  *
5574
5586
  * @param {object} row The clicked row object
5575
- * @param {MouseEvent|KeyboardEvent} [event] The originating click/auxclick event.
5587
+ * @param {MouseEvent|KeyboardEvent} [event] The originating click event.
5576
5588
  */
5577
5589
  onRowClick(row, event) {
5590
+ if (!this.routeClickedRow(row, event)) {
5591
+ return
5592
+ }
5593
+ /**
5594
+ * @event row-click Emitted on a row/card click for navigation. Fires when `selectable` is false, OR when `rowClickToView` is set and something can open the row (selection then happens via the checkbox). Payload: `(row, event)` — the clicked row and the native click event (absent for a keyboard shortcut or map marker), so a host can open the row in a new tab on a ctrl/cmd/shift click with `openRowTarget`. A middle click emits `row-aux-click` instead.
5595
+ * @type {object} The clicked row object.
5596
+ */
5597
+ this.$emit('row-click', ...(event ? [row, event] : [row]))
5598
+ },
5599
+
5600
+ /**
5601
+ * Row/card middle click: opens a named source's row in a new tab and
5602
+ * emits `row-aux-click`, not `row-click`, so a host whose `row-click`
5603
+ * listener navigates never moves the current tab away.
5604
+ *
5605
+ * @param {object} row The clicked row object
5606
+ * @param {MouseEvent} event The originating auxclick event.
5607
+ */
5608
+ onRowAuxClick(row, event) {
5609
+ if (!this.routeClickedRow(row, event)) {
5610
+ return
5611
+ }
5612
+ /**
5613
+ * @event row-aux-click Emitted on a row/card middle click, under the same conditions as `row-click`, so a host can open the row in a new tab with `openRowTarget`. Payload: `(row, event)` — the clicked row and the native auxclick event.
5614
+ * @type {object} The clicked row object.
5615
+ */
5616
+ this.$emit('row-aux-click', row, event)
5617
+ },
5618
+
5619
+ /**
5620
+ * The shared part of a row click and a middle click: on a selectable
5621
+ * page a plain click toggles selection instead, and a named source opens
5622
+ * its own row.
5623
+ *
5624
+ * @param {object} row The clicked row object
5625
+ * @param {MouseEvent|KeyboardEvent} [event] The originating event.
5626
+ * @return {boolean} Whether the click navigates, so the caller emits.
5627
+ */
5628
+ routeClickedRow(row, event) {
5578
5629
  if (this.selectable && !this.rowClickOpens) {
5579
5630
  if (!event || event.button === undefined || event.button === 0) {
5580
5631
  this.onSelect(this.toggleIdInArray(this.internalSelectedIds, row[this.rowKey]))
5581
5632
  }
5582
- return
5633
+ return false
5583
5634
  }
5584
5635
  // A named source knows where its rows live. Emitting only would leave
5585
5636
  // the click inert on a manifest page, which has no listener to bind —
@@ -5626,11 +5677,7 @@ export default {
5626
5677
  }
5627
5678
  }
5628
5679
  }
5629
- /**
5630
- * @event row-click Emitted on a row/card click (or middle click) for navigation. Fires when `selectable` is false, OR when `rowClickToView` is set and something can open the row (selection then happens via the checkbox). Payload: `(row, event)` — the clicked row and the native click/auxclick event (absent for a keyboard shortcut or map marker), so a host can open the row in a new tab on a ctrl/cmd/shift or middle click with `openRowTarget`.
5631
- * @type {object} The clicked row object.
5632
- */
5633
- this.$emit('row-click', ...(event ? [row, event] : [row]))
5680
+ return true
5634
5681
  },
5635
5682
 
5636
5683
  /**
@@ -5644,17 +5691,31 @@ export default {
5644
5691
  return typeof Event !== 'undefined' && value instanceof Event
5645
5692
  },
5646
5693
 
5694
+ /**
5695
+ * Mousedown on a custom list/card component's root: when a middle click
5696
+ * opens the row, keep the browser from starting autoscroll.
5697
+ *
5698
+ * @param {MouseEvent} event The mousedown event.
5699
+ * @return {void}
5700
+ */
5701
+ onCustomItemMouseDown(event) {
5702
+ if (!this.selectable || this.rowClickOpens) {
5703
+ preventMiddleClickAutoscroll(event)
5704
+ }
5705
+ },
5706
+
5647
5707
  /**
5648
5708
  * Middle click on a custom list/card component's root: open the row
5649
- * like a click would.
5709
+ * like a middle click on a built-in card would. Skipped when something
5710
+ * inside the component already opened it in a new tab.
5650
5711
  *
5651
5712
  * @param {object} row The component's row.
5652
5713
  * @param {MouseEvent} event The auxclick event.
5653
5714
  * @return {void}
5654
5715
  */
5655
5716
  onCustomItemAuxClick(row, event) {
5656
- if (isRowMiddleClick(event)) {
5657
- this.onRowClick(row, event)
5717
+ if (isRowMiddleClick(event) && !isNewTabHandled(event)) {
5718
+ this.onRowAuxClick(row, event)
5658
5719
  }
5659
5720
  },
5660
5721
 
@@ -37,19 +37,39 @@ function resolveRowToken(value, row) {
37
37
  }
38
38
 
39
39
  /**
40
- * The route params a `handler: "navigate"` action pushes for a row: the row id,
41
- * overridden by the declared `params` after the `{field}` token grammar. A
42
- * token naming a field the row lacks is dropped.
40
+ * The implicit `{ id }` param for a row, only when the named route declares
41
+ * `:id`: vue-router warns about (and drops) a param its path does not take.
42
+ * Without a router to ask, or for a route it does not know, the id is kept.
43
43
  *
44
- * @param {object} action Manifest action descriptor.
44
+ * @param {object} [router] The app's router.
45
+ * @param {string} name The route name.
45
46
  * @param {object} row The row.
46
47
  * @param {string} rowKey The row's id field.
48
+ * @return {object} `{ id }`, or an empty object.
49
+ */
50
+ function rowIdParam(router, name, row, rowKey) {
51
+ const routes = typeof router?.getRoutes === 'function' ? router.getRoutes() : null
52
+ const route = routes ? routes.find((r) => r.name === name) : null
53
+ if (route && !/:id\b/.test(route.path)) {
54
+ return {}
55
+ }
56
+ return { id: row?.[rowKey] }
57
+ }
58
+
59
+ /**
60
+ * The route params a `handler: "navigate"` action pushes for a row: the row id
61
+ * (when the route takes one), overridden by the declared `params` after the
62
+ * `{field}` token grammar. A token naming a field the row lacks is dropped.
63
+ *
64
+ * @param {object} action Manifest action descriptor.
65
+ * @param {object} row The row.
66
+ * @param {object} ctx Dispatch context (`rowKey`, `router`).
47
67
  * @param {boolean} warn Whether to warn about a dropped param.
48
68
  * @return {object} The params.
49
69
  */
50
- function navigateParams(action, row, rowKey, warn) {
70
+ function navigateParams(action, row, ctx, warn) {
51
71
  const declaredParams = (action.params && typeof action.params === 'object') ? action.params : null
52
- const params = { id: row?.[rowKey] }
72
+ const params = rowIdParam(ctx.router, action.route, row, ctx.rowKey)
53
73
  for (const [key, declared] of Object.entries(declaredParams || {})) {
54
74
  const { resolved, value } = resolveRowToken(declared, row)
55
75
  if (resolved) {
@@ -88,7 +108,7 @@ export function resolveActionTarget(action, row, ctx, warn = false) {
88
108
  return null
89
109
  }
90
110
  if (type === 'open-page') {
91
- return { target: { name: target, params: { id: row?.[ctx.rowKey] } }, external: false }
111
+ return { target: { name: target, params: rowIdParam(ctx.router, target, row, ctx.rowKey) }, external: false }
92
112
  }
93
113
  return { target, external: isExternalActionTarget(target) }
94
114
  }
@@ -96,7 +116,7 @@ export function resolveActionTarget(action, row, ctx, warn = false) {
96
116
  if (typeof action.route !== 'string' || action.route.length === 0) {
97
117
  return null
98
118
  }
99
- return { target: { name: action.route, params: navigateParams(action, row, ctx.rowKey, warn) }, external: false }
119
+ return { target: { name: action.route, params: navigateParams(action, row, ctx, warn) }, external: false }
100
120
  }
101
121
  return null
102
122
  }
@@ -115,8 +135,8 @@ export function resolveActionTarget(action, row, ctx, warn = false) {
115
135
  * - `open-modal` → not wired for index actions; falls back to `@action`.
116
136
  *
117
137
  * Handler dispatch (`type: 'handler'`, the default) reads `action.handler`:
118
- * - `navigate` → $router.push to `action.route` with `{ id: row[rowKey] }`,
119
- * merged with the `action.params` map (declared params win — so a
138
+ * - `navigate` → $router.push to `action.route` with `{ id: row[rowKey] }`
139
+ * (when the route declares `:id`), merged with the `action.params` map (declared params win — so a
120
140
  * "New X" action can navigate to a detail route with `{ id: "new" }`).
121
141
  * Param strings run the `{field}` row-token grammar: `"{id}"` resolves to
122
142
  * `row.id` (type preserved), `"item-{id}"` interpolates, and a brace-less
@@ -187,7 +207,7 @@ export function resolveActionHandler(action, ctx) {
187
207
  // `{field}` row-token grammar first — an unresolved token is dropped
188
208
  // rather than pushed as a literal `%7Bid%7D` path segment.
189
209
  return (row) => {
190
- ctx.router.push({ name: route, params: navigateParams(action, row, ctx.rowKey, true) })
210
+ ctx.router.push({ name: route, params: navigateParams(action, row, ctx, true) })
191
211
  }
192
212
  }
193
213
 
@@ -25,8 +25,7 @@
25
25
  <NcButton
26
26
  variant="primary"
27
27
  :href="docsUrl"
28
- target="_blank"
29
- rel="noopener">
28
+ target="_blank">
30
29
  <template #icon>
31
30
  <OpenInNew :size="18" />
32
31
  </template>
@@ -38,7 +38,6 @@
38
38
  variant="tertiary"
39
39
  :href="savedHref"
40
40
  target="_blank"
41
- rel="noopener noreferrer"
42
41
  data-testid="cn-interaction-form-open">
43
42
  <template #icon>
44
43
  <OpenInNew :size="20" />
@@ -420,10 +420,9 @@ export default {
420
420
  * @return {void}
421
421
  */
422
422
  dispatchAction({ actionType, url, value }) {
423
+ // An `external` entry with a URL is a real link (see linkAttrsFor);
424
+ // one without a URL has nothing to open.
423
425
  switch (actionType) {
424
- case ACTION_TYPES.EXTERNAL:
425
- this.handleExternal(url)
426
- break
427
426
  case ACTION_TYPES.INTERNAL:
428
427
  this.$emit('internal-action', url)
429
428
  break
@@ -434,20 +433,6 @@ export default {
434
433
  break
435
434
  }
436
435
  },
437
-
438
- /**
439
- * Open an external URL in a new tab; `noopener,noreferrer` prevents
440
- * the opened page reaching back via `window.opener`.
441
- *
442
- * @param {string} url the URL to open.
443
- * @return {void}
444
- */
445
- handleExternal(url) {
446
- if (typeof url !== 'string' || url === '') {
447
- return
448
- }
449
- window.open(url, '_blank', 'noopener,noreferrer')
450
- },
451
436
  },
452
437
  }
453
438
  </script>
@@ -89,7 +89,8 @@
89
89
  :sortKeys="effectiveSortKeys"
90
90
  :emptyText="emptyText"
91
91
  @sort="onSort"
92
- @rowClick="onRowClick">
92
+ @rowClick="onRowClick"
93
+ @rowAuxClick="onRowAuxClick">
93
94
  <template
94
95
  v-for="col in slotColumns"
95
96
  #[`column-${col}`]="{ row, value }">
@@ -484,14 +485,21 @@ export default {
484
485
  */
485
486
  'action',
486
487
  /**
487
- * @event row-click Emitted when a log row's body is clicked or
488
- * middle-clicked, whether or not `rowDetail` opened the detail dialog —
489
- * so a host can navigate instead of (or as well as) showing the dialog.
490
- * Payload: `(row, event)`, the second being the native click/auxclick
491
- * event.
488
+ * @event row-click Emitted when a log row's body is clicked, whether or
489
+ * not `rowDetail` opened the detail dialog — so a host can navigate
490
+ * instead of (or as well as) showing the dialog. Payload: `(row, event)`,
491
+ * the second being the native click event. A middle click emits
492
+ * `row-aux-click` instead.
492
493
  * @type {object}
493
494
  */
494
495
  'row-click',
496
+ /**
497
+ * @event row-aux-click Emitted when a log row's body is middle-clicked,
498
+ * for opening it in a new tab. Payload: `(row, event)`, the second being
499
+ * the native auxclick event.
500
+ * @type {object}
501
+ */
502
+ 'row-aux-click',
495
503
  ],
496
504
 
497
505
  setup(props) {
@@ -994,26 +1002,43 @@ export default {
994
1002
  /**
995
1003
  * Handle a row-body click: navigate to `rowRoute` when one is declared,
996
1004
  * else open the detail dialog when `rowDetail` is set. Always re-emits
997
- * so a host can do its own thing regardless. A ctrl/cmd/shift or middle
998
- * click opens `rowRoute` in a new tab; a middle click never opens the
999
- * dialog.
1005
+ * so a host can do its own thing regardless. A ctrl/cmd/shift click
1006
+ * opens `rowRoute` in a new tab.
1000
1007
  *
1001
1008
  * @param {object} row The clicked log entry.
1002
- * @param {MouseEvent} [event] The originating click/auxclick event.
1009
+ * @param {MouseEvent} [event] The originating click event.
1003
1010
  */
1004
1011
  onRowClick(row, event) {
1005
1012
  if (this.rowRoute) {
1006
1013
  markNewTabHandled(event, openRowTarget(event, { name: this.rowRoute, params: { id: row?.[this.rowKey] } }, this.$router))
1007
- } else if (this.rowDetail && !(event && event.button === 1)) {
1014
+ } else if (this.rowDetail) {
1008
1015
  this.detailRow = row
1009
1016
  }
1010
1017
  /**
1011
- * @event row-click Emitted when a log row's body is clicked or middle-clicked. Payload: `(row, event)` — the log entry and the native click/auxclick event.
1018
+ * @event row-click Emitted when a log row's body is clicked. Payload: `(row, event)` — the log entry and the native click event.
1012
1019
  * @type {object}
1013
1020
  */
1014
1021
  this.$emit('row-click', row, event)
1015
1022
  },
1016
1023
 
1024
+ /**
1025
+ * Handle a row-body middle click: open `rowRoute` in a new tab, never
1026
+ * the detail dialog, and emit `row-aux-click` rather than `row-click`.
1027
+ *
1028
+ * @param {object} row The clicked log entry.
1029
+ * @param {MouseEvent} event The originating auxclick event.
1030
+ */
1031
+ onRowAuxClick(row, event) {
1032
+ if (this.rowRoute) {
1033
+ markNewTabHandled(event, openRowTarget(event, { name: this.rowRoute, params: { id: row?.[this.rowKey] } }, this.$router))
1034
+ }
1035
+ /**
1036
+ * @event row-aux-click Emitted when a log row's body is middle-clicked. Payload: `(row, event)` — the log entry and the native auxclick event.
1037
+ * @type {object}
1038
+ */
1039
+ this.$emit('row-aux-click', row, event)
1040
+ },
1041
+
1017
1042
  /** Close the row-detail dialog. */
1018
1043
  closeDetail() {
1019
1044
  this.detailRow = null
@@ -2,7 +2,7 @@
2
2
  <div
3
3
  class="cn-object-card"
4
4
  :class="{ 'cn-object-card--selected': selected }"
5
- @mousedown="onPointerDown"
5
+ @mousedown="onCardMouseDown"
6
6
  @click="onCardClick($event)"
7
7
  @auxclick="onCardAuxClick($event)">
8
8
  <!-- Selection checkbox -->
@@ -76,7 +76,7 @@
76
76
  import { NcCheckboxRadioSwitch } from '@nextcloud/vue'
77
77
  import { useClickDragGuard } from '../../composables/useClickDragGuard.js'
78
78
  import { resolveImageUrl } from '../../utils/resolveImageUrl.js'
79
- import { isRowMiddleClick } from '../../utils/rowAuxClick.js'
79
+ import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
80
80
  import { formatValue } from '../../utils/schema.js'
81
81
  import { CnCellRenderer } from '../CnCellRenderer/index.js'
82
82
  import { CnLockIndicator } from '../CnLockIndicator/index.js'
@@ -161,7 +161,7 @@ export default {
161
161
  },
162
162
  },
163
163
 
164
- emits: ['click', 'select'],
164
+ emits: ['click', 'select', 'aux-click'],
165
165
 
166
166
  setup() {
167
167
  // Tell a deliberate card click apart from a text-selection drag.
@@ -287,14 +287,28 @@ export default {
287
287
  return
288
288
  }
289
289
  /**
290
- * @event click Emitted when a non-selectable (or `clickToView`) card is clicked or middle-clicked. Payload: `(object, event)` — the card's object and the native click/auxclick event, for opening it in a new tab on a ctrl/cmd/shift or middle click. Selectable cards emit `select`; they also emit `click` (deprecated) when a `click` listener is present, so migrate selectable consumers to `@select`.
290
+ * @event click Emitted when a non-selectable (or `clickToView`) card is clicked. Payload: `(object, event)` — the card's object and the native click event, for opening it in a new tab on a ctrl/cmd/shift click. A middle click emits `aux-click` instead. Selectable cards emit `select`; they also emit `click` (deprecated) when a `click` listener is present, so migrate selectable consumers to `@select`.
291
291
  * @type {object} The card's object.
292
292
  */
293
293
  this.$emit('click', this.object, event)
294
294
  },
295
295
 
296
296
  /**
297
- * Card-body middle click: emits `click` like a navigating click.
297
+ * Card mousedown: record the press for the drag guard, and on a card a
298
+ * middle click opens, keep the browser from starting autoscroll.
299
+ *
300
+ * @param {MouseEvent} event The mousedown event.
301
+ */
302
+ onCardMouseDown(event) {
303
+ this.onPointerDown(event)
304
+ if (!this.selectable || this.clickToView) {
305
+ preventMiddleClickAutoscroll(event)
306
+ }
307
+ },
308
+
309
+ /**
310
+ * Card-body middle click: emits `aux-click`, not `click`, so an existing
311
+ * `click` listener that navigates never moves the current tab away.
298
312
  * Ignored on a select-on-click card, on nested controls and on drags.
299
313
  *
300
314
  * @param {MouseEvent} event The auxclick event.
@@ -306,7 +320,11 @@ export default {
306
320
  if (this.selectable && !this.clickToView) {
307
321
  return
308
322
  }
309
- this.$emit('click', this.object, event)
323
+ /**
324
+ * @event aux-click Emitted when a non-selectable (or `clickToView`) card is middle-clicked, for opening it in a new tab (see `openRowTarget`). Payload: `(object, event)` — the card's object and the native auxclick event.
325
+ * @type {object} The card's object.
326
+ */
327
+ this.$emit('aux-click', this.object, event)
310
328
  },
311
329
  },
312
330
  }
@@ -163,7 +163,7 @@ export default {
163
163
  },
164
164
  },
165
165
 
166
- emits: ['click', 'select'],
166
+ emits: ['click', 'select', 'aux-click'],
167
167
 
168
168
  computed: {
169
169
  /**
@@ -194,6 +194,7 @@ export default {
194
194
  const listeners = { select: () => this.toggleSelect(object) }
195
195
  if (!this.selectable) {
196
196
  listeners.click = (_row, event) => this.emitClick(object, event)
197
+ listeners['aux-click'] = (_row, event) => this.emitAuxClick(object, event)
197
198
  }
198
199
  return listeners
199
200
  },
@@ -202,16 +203,31 @@ export default {
202
203
  * Emit `click` for a non-selectable row (navigation).
203
204
  *
204
205
  * @param {object} object The clicked row's object.
205
- * @param {MouseEvent} [event] The native click/auxclick event.
206
+ * @param {MouseEvent} [event] The native click event.
206
207
  */
207
208
  emitClick(object, event) {
208
209
  /**
209
- * @event click Emitted when a non-selectable row is clicked or middle-clicked (navigation). Payload: `(object, event)` — the row's object and the native click/auxclick event, for opening it in a new tab on a ctrl/cmd/shift or middle click.
210
+ * @event click Emitted when a non-selectable row is clicked (navigation). Payload: `(object, event)` — the row's object and the native click event, for opening it in a new tab on a ctrl/cmd/shift click. A middle click emits `aux-click` instead.
210
211
  * @type {object} The clicked row's object.
211
212
  */
212
213
  this.$emit('click', object, event)
213
214
  },
214
215
 
216
+ /**
217
+ * Emit `aux-click` for a middle click on a non-selectable row, kept off
218
+ * `click` so a navigating listener never moves the current tab away.
219
+ *
220
+ * @param {object} object The clicked row's object.
221
+ * @param {MouseEvent} event The native auxclick event.
222
+ */
223
+ emitAuxClick(object, event) {
224
+ /**
225
+ * @event aux-click Emitted when a non-selectable row is middle-clicked, for opening it in a new tab (see `openRowTarget`). Payload: `(object, event)` — the row's object and the native auxclick event.
226
+ * @type {object} The clicked row's object.
227
+ */
228
+ this.$emit('aux-click', object, event)
229
+ },
230
+
215
231
  toggleSelect(object) {
216
232
  const id = object[this.rowKey]
217
233
  const newIds = this.isSelected(object)
@@ -152,6 +152,7 @@
152
152
  :sortOrder="localSort.dir || 'asc'"
153
153
  borderless
154
154
  @rowClick="onRowClick"
155
+ @rowAuxClick="onRowAuxClick"
155
156
  @select="onSelect"
156
157
  @sort="onSort">
157
158
  <template v-if="mappedRowActions.length > 0" #row-actions="{ row }">
@@ -172,6 +173,7 @@
172
173
  :sortOrder="localSort.dir || 'asc'"
173
174
  borderless
174
175
  @rowClick="onRowClick"
176
+ @rowAuxClick="onRowAuxClick"
175
177
  @select="onSelect"
176
178
  @sort="onSort">
177
179
  <!-- Declarative per-row actions (`content.rowActions`).
@@ -286,7 +288,7 @@ import CnFkResolveCell from '../CnFkResolveCell/CnFkResolveCell.vue'
286
288
  import CnFormDialog from '../CnFormDialog/CnFormDialog.vue'
287
289
  import CnPagination from '../CnPagination/CnPagination.vue'
288
290
  import CnWidgetEmptyState from '../CnWidgetEmptyState/CnWidgetEmptyState.vue'
289
- import { actionLink, dispatchAction } from '../../utils/actionsDispatcher.js'
291
+ import { actionLink, dispatchAction, hasActionTargetTokens } from '../../utils/actionsDispatcher.js'
290
292
  import { followLinkClick, openRowTarget, resolveHref } from '../../utils/linkNavigation.js'
291
293
  import { objectFieldValue } from '../../utils/objectName.js'
292
294
  import { dropOptionalUnresolved, hasUnresolvedTokens, resolveFilterTokens } from '../../utils/resolveFilterTokens.js'
@@ -421,7 +423,7 @@ export default {
421
423
  },
422
424
  },
423
425
 
424
- emits: ['created', 'row-click', 'view-all', 'files-dropped'],
426
+ emits: ['created', 'row-click', 'row-aux-click', 'view-all', 'files-dropped'],
425
427
 
426
428
  data() {
427
429
  return {
@@ -1414,29 +1416,60 @@ export default {
1414
1416
 
1415
1417
  /**
1416
1418
  * Navigate to a configured detail route on row click (when `rowRoute`
1417
- * is set and a router is available); a ctrl/cmd/shift or middle click
1418
- * opens it in a new tab.
1419
+ * is set and a router is available); a ctrl/cmd/shift click opens it
1420
+ * in a new tab.
1419
1421
  *
1420
1422
  * @param {object} row The clicked object row.
1421
- * @param {MouseEvent} [event] The originating click/auxclick event.
1423
+ * @param {MouseEvent} [event] The originating click event.
1422
1424
  * @return {void}
1423
1425
  */
1424
1426
  onRowClick(row, event) {
1425
- const route = this.content.rowRoute
1426
- const id = row && (row.id || (row['@self'] && row['@self'].id))
1427
- if (route && id && this.$router) {
1428
- markNewTabHandled(event, openRowTarget(event, { name: route, params: { id } }, this.$router))
1429
- }
1427
+ this.openRowRoute(row, event)
1430
1428
  /**
1431
1429
  * @event row-click Emitted with the clicked object (for hosts that
1432
- * want to handle navigation themselves), on a click or middle click.
1433
- * Payload: `(row, event)`, the second being the native click/auxclick
1434
- * event.
1430
+ * want to handle navigation themselves). Payload: `(row, event)`, the
1431
+ * second being the native click event. A middle click emits
1432
+ * `row-aux-click` instead.
1435
1433
  * @type {object}
1436
1434
  */
1437
1435
  this.$emit('row-click', row, event)
1438
1436
  },
1439
1437
 
1438
+ /**
1439
+ * A row middle click: opens the configured detail route in a new tab
1440
+ * and emits `row-aux-click`, not `row-click`.
1441
+ *
1442
+ * @param {object} row The clicked object row.
1443
+ * @param {MouseEvent} event The originating auxclick event.
1444
+ * @return {void}
1445
+ */
1446
+ onRowAuxClick(row, event) {
1447
+ this.openRowRoute(row, event)
1448
+ /**
1449
+ * @event row-aux-click Emitted with the middle-clicked object, for
1450
+ * opening it in a new tab. Payload: `(row, event)`, the second being
1451
+ * the native auxclick event.
1452
+ * @type {object}
1453
+ */
1454
+ this.$emit('row-aux-click', row, event)
1455
+ },
1456
+
1457
+ /**
1458
+ * Open `content.rowRoute` for a row: in place, or in a new tab on a
1459
+ * ctrl/cmd/shift or middle click.
1460
+ *
1461
+ * @param {object} row The clicked object row.
1462
+ * @param {MouseEvent} [event] The originating event.
1463
+ * @return {void}
1464
+ */
1465
+ openRowRoute(row, event) {
1466
+ const route = this.content.rowRoute
1467
+ const id = row && (row.id || (row['@self'] && row['@self'].id))
1468
+ if (route && id && this.$router) {
1469
+ markNewTabHandled(event, openRowTarget(event, { name: route, params: { id } }, this.$router))
1470
+ }
1471
+ },
1472
+
1440
1473
  /**
1441
1474
  * Dispatch one declared row action. A `handler` action gets the row
1442
1475
  * appended as its last argument, the same convention CnWidgetObjectTable
@@ -1465,8 +1498,7 @@ export default {
1465
1498
  * @return {object} `{ href, linkTarget }`, `{ to }`, or `{}`.
1466
1499
  */
1467
1500
  rowActionLink(action) {
1468
- const target = typeof action.target === 'string' ? action.target : ''
1469
- if (/[@{]/.test(target)) {
1501
+ if (hasActionTargetTokens(action.target)) {
1470
1502
  return {}
1471
1503
  }
1472
1504
  const link = actionLink(action, { router: this.$router || null })