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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +12 -2
  2. package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
  3. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +1 -2
  4. package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
  5. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
  6. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +0 -3
  7. package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
  8. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
  9. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -2
  10. package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
  11. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +21 -1
  12. package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
  13. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +1 -1
  14. package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
  15. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +12 -5
  16. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  17. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +2 -1
  18. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  19. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +9 -1
  20. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  21. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  22. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +6 -1
  23. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
  24. package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
  25. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +116 -15
  26. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  27. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +27 -14
  28. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  29. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js +13 -6
  30. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js.map +1 -1
  31. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js +2 -0
  32. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js.map +1 -1
  33. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +29 -1
  34. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  35. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  36. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  37. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +1 -2
  38. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  39. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +3 -1
  40. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  41. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +17 -17
  42. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  43. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js +4 -21
  44. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js.map +1 -1
  45. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue3.js.map +1 -1
  46. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +0 -13
  47. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  48. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +8 -8
  49. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  50. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue2.js.map +1 -1
  51. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js +3 -2
  52. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js.map +1 -1
  53. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +67 -13
  54. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  55. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +15 -8
  56. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  57. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js +31 -11
  58. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js.map +1 -1
  59. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue2.js.map +1 -1
  60. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js +1 -2
  61. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js.map +1 -1
  62. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js +0 -1
  64. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  65. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js +2 -17
  66. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js.map +1 -1
  67. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue3.js.map +1 -1
  68. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js +35 -11
  69. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js.map +1 -1
  70. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js +3 -2
  71. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js.map +1 -1
  72. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +23 -5
  73. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  74. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +1 -1
  75. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  76. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js +19 -3
  77. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js.map +1 -1
  78. package/dist/esm/components/CnObjectList/CnObjectList.vue3.js.map +1 -1
  79. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +45 -15
  80. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  81. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
  82. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  83. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js +24 -6
  84. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js.map +1 -1
  85. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js +1 -1
  86. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js.map +1 -1
  87. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  88. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +0 -1
  89. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  90. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  91. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +4 -2
  92. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  93. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +7 -2
  94. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
  95. package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
  96. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +49 -5
  97. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
  98. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +1 -1
  99. package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
  100. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js +5 -3
  101. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js.map +1 -1
  102. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue3.js.map +1 -1
  103. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  104. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  105. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +3 -1
  106. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
  107. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +1 -0
  108. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
  109. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js +3 -1
  110. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js.map +1 -1
  111. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue3.js.map +1 -1
  112. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -1
  113. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
  114. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js +2 -4
  115. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
  116. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js +6 -0
  117. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js.map +1 -1
  118. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js +68 -53
  119. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js.map +1 -1
  120. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js +17 -0
  121. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js.map +1 -1
  122. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js +21 -19
  123. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js.map +1 -1
  124. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js +3 -1
  125. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js.map +1 -1
  126. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue3.js.map +1 -1
  127. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js +3 -1
  128. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js.map +1 -1
  129. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js +2 -4
  130. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js.map +1 -1
  131. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js +2 -1
  132. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js.map +1 -1
  133. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue3.js.map +1 -1
  134. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
  135. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
  136. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js +1 -2
  137. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
  138. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +2 -1
  139. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
  140. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
  141. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
  142. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
  143. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js +1 -2
  144. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
  145. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
  146. package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
  147. package/dist/esm/integrations/builtin/email/CnEmailTab.vue2.js.map +1 -1
  148. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js +1 -2
  149. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js.map +1 -1
  150. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js +2 -1
  151. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js.map +1 -1
  152. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue3.js.map +1 -1
  153. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js +2 -1
  154. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js.map +1 -1
  155. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js +1 -2
  156. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js.map +1 -1
  157. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js +3 -1
  158. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js.map +1 -1
  159. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue3.js.map +1 -1
  160. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js +3 -1
  161. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js.map +1 -1
  162. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js +2 -4
  163. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js.map +1 -1
  164. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js +3 -1
  165. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js.map +1 -1
  166. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue3.js.map +1 -1
  167. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js +3 -1
  168. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js.map +1 -1
  169. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js +2 -4
  170. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js.map +1 -1
  171. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js +3 -1
  172. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js.map +1 -1
  173. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue3.js.map +1 -1
  174. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js +3 -1
  175. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js.map +1 -1
  176. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js +2 -4
  177. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js.map +1 -1
  178. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js +2 -1
  179. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js.map +1 -1
  180. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue3.js.map +1 -1
  181. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
  182. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
  183. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js +1 -2
  184. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
  185. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js +2 -1
  186. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js.map +1 -1
  187. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue3.js.map +1 -1
  188. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js +2 -1
  189. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js.map +1 -1
  190. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js +1 -2
  191. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js.map +1 -1
  192. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue2.js.map +1 -1
  193. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js +3 -6
  194. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js.map +1 -1
  195. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js +3 -1
  196. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js.map +1 -1
  197. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue3.js.map +1 -1
  198. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js +3 -1
  199. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js.map +1 -1
  200. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js +2 -4
  201. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js.map +1 -1
  202. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js +2 -1
  203. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js.map +1 -1
  204. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue3.js.map +1 -1
  205. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js +2 -1
  206. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js.map +1 -1
  207. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js +1 -2
  208. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js.map +1 -1
  209. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js +4 -1
  210. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js.map +1 -1
  211. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue3.js.map +1 -1
  212. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js +6 -3
  213. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js.map +1 -1
  214. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js +2 -4
  215. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js.map +1 -1
  216. package/dist/esm/l10n/en.json.js +2 -0
  217. package/dist/esm/l10n/en.json.js.map +1 -1
  218. package/dist/esm/l10n/nl.json.js +2 -0
  219. package/dist/esm/l10n/nl.json.js.map +1 -1
  220. package/dist/esm/nextcloud-vue.css +78 -7
  221. package/dist/esm/utils/actionLink.js +5 -0
  222. package/dist/esm/utils/actionLink.js.map +1 -1
  223. package/dist/esm/utils/actionsDispatcher.js +16 -1
  224. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  225. package/dist/esm/utils/linkNavigation.js +6 -3
  226. package/dist/esm/utils/linkNavigation.js.map +1 -1
  227. package/dist/esm/utils/rowAuxClick.js +30 -5
  228. package/dist/esm/utils/rowAuxClick.js.map +1 -1
  229. package/dist/esm/utils/safeHref.js +18 -3
  230. package/dist/esm/utils/safeHref.js.map +1 -1
  231. package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
  232. package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
  233. package/dist/nextcloud-vue.cjs.js +885 -393
  234. package/dist/nextcloud-vue.cjs.js.map +2 -2
  235. package/dist/nextcloud-vue.css +78 -7
  236. package/l10n/en.json +2 -0
  237. package/l10n/nl.json +2 -0
  238. package/package.json +1 -1
  239. package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
  240. package/src/components/CnActionsMenu/CnActionsMenu.vue +0 -3
  241. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
  242. package/src/components/CnAppRoot/CnAppRoot.vue +31 -2
  243. package/src/components/CnBoardView/CnBoardView.vue +13 -5
  244. package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
  245. package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
  246. package/src/components/CnDataTable/CnDataTable.md +1 -1
  247. package/src/components/CnDataTable/CnDataTable.vue +131 -17
  248. package/src/components/CnDateAxisView/CnDateAxisView.vue +15 -6
  249. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  250. package/src/components/CnDetailPage/CnDetailPage.vue +29 -1
  251. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -2
  252. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +5 -3
  253. package/src/components/CnFilesWidget/CnFilesWidget.vue +4 -21
  254. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +8 -21
  255. package/src/components/CnFlowsPage/CnFlowsPage.vue +2 -1
  256. package/src/components/CnIndexPage/CnIndexPage.vue +75 -14
  257. package/src/components/CnIndexPage/manifestActionDispatch.js +31 -11
  258. package/src/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue +1 -2
  259. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +0 -1
  260. package/src/components/CnLinkButtonWidget/CnLinkButtonWidget.vue +2 -17
  261. package/src/components/CnLogsPage/CnLogsPage.vue +37 -12
  262. package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
  263. package/src/components/CnObjectList/CnObjectList.vue +19 -3
  264. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +47 -15
  265. package/src/components/CnObjectRow/CnObjectRow.vue +25 -7
  266. package/src/components/CnObjectSidebar/CnFilesTab.vue +0 -1
  267. package/src/components/CnPageRenderer/CnPageRenderer.vue +2 -0
  268. package/src/components/CnRowActions/CnRowActions.vue +7 -2
  269. package/src/components/CnSetupWizard/CnSetupWizard.vue +57 -6
  270. package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
  271. package/src/components/CnTabs/CnTabs.vue +7 -3
  272. package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
  273. package/src/css/table.css +26 -0
  274. package/src/integrations/builtin/analytics/CnAnalyticsCard.vue +3 -2
  275. package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +5 -6
  276. package/src/integrations/builtin/bookmarks/CnBookmarksCard.vue +12 -1
  277. package/src/integrations/builtin/bookmarks/CnBookmarksTab.vue +23 -6
  278. package/src/integrations/builtin/bookmarks/__tests__/CnBookmarksTab.spec.js +7 -2
  279. package/src/integrations/builtin/collectives/CnCollectivesCard.vue +3 -2
  280. package/src/integrations/builtin/collectives/CnCollectivesTab.vue +5 -6
  281. package/src/integrations/builtin/cospend/CnCospendCard.vue +2 -2
  282. package/src/integrations/builtin/cospend/CnCospendTab.vue +3 -4
  283. package/src/integrations/builtin/deck/CnDeckCard.vue +2 -2
  284. package/src/integrations/builtin/deck/CnDeckTab.vue +3 -4
  285. package/src/integrations/builtin/email/CnEmailCard.vue +6 -2
  286. package/src/integrations/builtin/email/CnEmailTab.vue +7 -4
  287. package/src/integrations/builtin/flow/CnFlowCard.vue +2 -2
  288. package/src/integrations/builtin/flow/CnFlowTab.vue +3 -4
  289. package/src/integrations/builtin/forms/CnFormsCard.vue +3 -2
  290. package/src/integrations/builtin/forms/CnFormsTab.vue +5 -6
  291. package/src/integrations/builtin/maps/CnMapsCard.vue +3 -2
  292. package/src/integrations/builtin/maps/CnMapsTab.vue +5 -6
  293. package/src/integrations/builtin/maps/__tests__/CnMapsTab.spec.js +9 -0
  294. package/src/integrations/builtin/openproject/CnOpenprojectCard.vue +3 -2
  295. package/src/integrations/builtin/openproject/CnOpenprojectTab.vue +5 -6
  296. package/src/integrations/builtin/photos/CnPhotosCard.vue +2 -2
  297. package/src/integrations/builtin/photos/CnPhotosTab.vue +3 -4
  298. package/src/integrations/builtin/polls/CnPollsCard.vue +2 -2
  299. package/src/integrations/builtin/polls/CnPollsTab.vue +3 -4
  300. package/src/integrations/builtin/shares/CnSharesTab.vue +3 -6
  301. package/src/integrations/builtin/talk/CnTalkCard.vue +3 -2
  302. package/src/integrations/builtin/talk/CnTalkTab.vue +5 -6
  303. package/src/integrations/builtin/time-tracker/CnTimeTrackerCard.vue +2 -2
  304. package/src/integrations/builtin/time-tracker/CnTimeTrackerTab.vue +3 -4
  305. package/src/integrations/builtin/xwiki/CnXwikiCard.vue +4 -2
  306. package/src/integrations/builtin/xwiki/CnXwikiTab.vue +7 -7
  307. package/src/integrations/builtin/xwiki/__tests__/CnXwikiTab.spec.js +9 -0
  308. package/src/schemas/app-manifest-v2.schema.json +2 -1
  309. package/src/utils/actionLink.js +5 -0
  310. package/src/utils/actionsDispatcher.js +15 -0
  311. package/src/utils/linkNavigation.js +6 -3
  312. package/src/utils/rowAuxClick.js +29 -4
  313. package/src/utils/safeHref.js +18 -3
  314. package/src/utils/validateManifestV2.compiled.js +2 -2
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
2
  name: package/dist/nextcloud-vue.cjs.js.map
3
- size: 33667612 bytes
4
- sha256: 99d23a886ff7c0e30fbe0745ed20fa6399710f26529d6b8495de7aa1f01e40a1
3
+ size: 33724477 bytes
4
+ sha256: c593f3967574b3cc9859bbff81c44bf2dcc4e304406f11ca2a1267065ef51df2
@@ -364,6 +364,32 @@
364
364
  background-color: var(--color-primary-light);
365
365
  }
366
366
 
367
+ /* A row with a route is a real link (see CnDataTable's row link): the anchor
368
+ in its first cell is stretched over the whole row. The row's own controls
369
+ sit above it so they stay usable; keep the list in step with NESTED_CONTROL
370
+ in utils/rowAuxClick.js. */
371
+ .cn-table-row--linked {
372
+ position: relative;
373
+ }
374
+
375
+ .cn-table-row__link {
376
+ position: absolute;
377
+ inset: 0;
378
+ cursor: pointer;
379
+ }
380
+
381
+ .cn-table-row__link:focus-visible {
382
+ outline: 2px solid var(--color-main-text);
383
+ outline-offset: -2px;
384
+ }
385
+
386
+ .cn-table-row--linked .cn-table-col--checkbox,
387
+ .cn-table-row--linked .cn-table-col--actions,
388
+ .cn-table-row--linked td :is(a, button, input, select, textarea, label, summary, [role='button'], [role='checkbox'], [role='link'], [contenteditable='true']):not(.cn-table-row__link) {
389
+ position: relative;
390
+ z-index: 1;
391
+ }
392
+
367
393
  /* Column Types */
368
394
  .cn-table-col--checkbox {
369
395
  width: 50px;
@@ -5995,6 +6021,32 @@ svg.leaflet-image-layer.leaflet-interactive path {
5995
6021
  background-color: var(--color-primary-light);
5996
6022
  }
5997
6023
 
6024
+ /* A row with a route is a real link (see CnDataTable's row link): the anchor
6025
+ in its first cell is stretched over the whole row. The row's own controls
6026
+ sit above it so they stay usable; keep the list in step with NESTED_CONTROL
6027
+ in utils/rowAuxClick.js. */
6028
+ .cn-table-row--linked {
6029
+ position: relative;
6030
+ }
6031
+
6032
+ .cn-table-row__link {
6033
+ position: absolute;
6034
+ inset: 0;
6035
+ cursor: pointer;
6036
+ }
6037
+
6038
+ .cn-table-row__link:focus-visible {
6039
+ outline: 2px solid var(--color-main-text);
6040
+ outline-offset: -2px;
6041
+ }
6042
+
6043
+ .cn-table-row--linked .cn-table-col--checkbox,
6044
+ .cn-table-row--linked .cn-table-col--actions,
6045
+ .cn-table-row--linked td :is(a, button, input, select, textarea, label, summary, [role='button'], [role='checkbox'], [role='link'], [contenteditable='true']):not(.cn-table-row__link) {
6046
+ position: relative;
6047
+ z-index: 1;
6048
+ }
6049
+
5998
6050
  /* Column Types */
5999
6051
  .cn-table-col--checkbox {
6000
6052
  width: 50px;
@@ -9701,14 +9753,18 @@ a.cn-deck-tab__card-title[data-v-3501a864]:hover {
9701
9753
  background: none;
9702
9754
  border: none;
9703
9755
  padding: 6px 0;
9704
- cursor: pointer;
9705
9756
  text-align: left;
9706
9757
  color: inherit;
9707
9758
  font: inherit;
9708
9759
  text-decoration: none;
9709
9760
  box-sizing: border-box;
9710
9761
  }
9711
- .cn-email-card__open:hover .cn-email-card__subject[data-v-fda51a6a] {
9762
+
9763
+ /* Only a row with Mail ids is a link; the rest must not look clickable. */
9764
+ a.cn-email-card__open[data-v-fda51a6a] {
9765
+ cursor: pointer;
9766
+ }
9767
+ a.cn-email-card__open:hover .cn-email-card__subject[data-v-fda51a6a] {
9712
9768
  color: var(--color-primary-element);
9713
9769
  }
9714
9770
  .cn-email-card__avatar[data-v-fda51a6a] {
@@ -9949,10 +10005,14 @@ a.cn-deck-tab__card-title[data-v-3501a864]:hover {
9949
10005
  border-radius: var(--border-radius-large, 8px);
9950
10006
  color: inherit;
9951
10007
  text-decoration: none;
9952
- cursor: pointer;
9953
10008
  position: relative;
9954
10009
  }
9955
- .cn-email-tab__row[data-v-0bcebbac]:hover {
10010
+
10011
+ /* Only a row with Mail ids is a link; the rest must not look clickable. */
10012
+ a.cn-email-tab__row[data-v-0bcebbac] {
10013
+ cursor: pointer;
10014
+ }
10015
+ a.cn-email-tab__row[data-v-0bcebbac]:hover {
9956
10016
  background-color: var(--color-background-hover);
9957
10017
  }
9958
10018
  .cn-email-tab__unread-dot[data-v-0bcebbac] {
@@ -17677,7 +17737,11 @@ to { background-position: -200% 0;
17677
17737
  }
17678
17738
 
17679
17739
  /* A fade over the clipped edge, only on the side that hides tabs. Stops a
17680
- pixel above the bar's rule so the rule keeps its full colour. */
17740
+ pixel above the bar's rule so the rule keeps its full colour.
17741
+
17742
+ z-index 2 so the fades outrank a lifted tab: CnTabsWidget puts the open tab
17743
+ at 1, and a tie goes to DOM order, which would draw that tab over the start
17744
+ fade (it precedes the tabs) while the end fade still covered it. */
17681
17745
  .cn-tabs__strip[data-v-5c1a056f]::before,
17682
17746
  .cn-tabs__strip[data-v-5c1a056f]::after {
17683
17747
  content: '';
@@ -17686,7 +17750,7 @@ to { background-position: -200% 0;
17686
17750
  pointer-events: none;
17687
17751
  position: absolute;
17688
17752
  width: 56px;
17689
- z-index: 1;
17753
+ z-index: 2;
17690
17754
  }
17691
17755
  .cn-tabs__strip[data-v-5c1a056f]::before {
17692
17756
  background: linear-gradient(to right, var(--color-main-background) 30%, transparent);
@@ -17720,7 +17784,7 @@ to { background-position: -200% 0;
17720
17784
  padding: 0;
17721
17785
  position: absolute;
17722
17786
  width: 28px;
17723
- z-index: 2;
17787
+ z-index: 3;
17724
17788
  }
17725
17789
 
17726
17790
  /* Nextcloud's `button:hover` rule would otherwise fill the chevron. */
@@ -23058,6 +23122,13 @@ a.cn-flow-runs-widget__row-content:hover .cn-flow-runs-widget__name[data-v-75628
23058
23122
  color: var(--color-main-text);
23059
23123
  }
23060
23124
 
23125
+ /* An on-demand step that did not run says so quietly: it is a choice the
23126
+ user did not make, not a failure. */
23127
+ .cn-setup-summary__item--not-run .cn-setup-summary__value[data-v-75b2078b] {
23128
+ font-weight: normal;
23129
+ color: var(--color-text-maxcontrast);
23130
+ }
23131
+
23061
23132
 
23062
23133
  .cn-admin-settings-shell[data-v-260aa222] {
23063
23134
  max-width: 900px;
package/l10n/en.json CHANGED
@@ -354,6 +354,7 @@
354
354
  "No widgets configured": "No widgets configured",
355
355
  "Not configured": "Not configured",
356
356
  "Not set": "Not set",
357
+ "Not run": "Not run",
357
358
  "Notes": "Notes",
358
359
  "Number": "Number",
359
360
  "Number configuration": "Number configuration",
@@ -373,6 +374,7 @@
373
374
  "One of": "One of",
374
375
  "Open": "Open",
375
376
  "Open access:": "Open access:",
377
+ "Open row": "Open row",
376
378
  "Operator": "Operator",
377
379
  "Order": "Order",
378
380
  "Owner:": "Owner:",
package/l10n/nl.json CHANGED
@@ -354,6 +354,7 @@
354
354
  "No widgets configured": "Geen widgets geconfigureerd",
355
355
  "Not configured": "Niet geconfigureerd",
356
356
  "Not set": "Niet ingesteld",
357
+ "Not run": "Niet uitgevoerd",
357
358
  "Notes": "Notities",
358
359
  "Number": "Getal",
359
360
  "Number configuration": "Nummerconfiguratie",
@@ -371,6 +372,7 @@
371
372
  "One of": "Één van",
372
373
  "Open": "Openen",
373
374
  "Open access:": "Openbare toegang:",
375
+ "Open row": "Rij openen",
374
376
  "Operator": "Operator",
375
377
  "Order": "Volgorde",
376
378
  "Owner:": "Eigenaar:",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conduction/nextcloud-vue",
3
- "version": "2.56.0-beta.3",
3
+ "version": "2.56.0-beta.5",
4
4
  "description": "Shared Vue component library for Conduction Nextcloud apps — complements @nextcloud/vue with higher-level components, OpenRegister integration, and NL Design System support",
5
5
  "homepage": "https://github.com/ConductionNL/nextcloud-vue#readme",
6
6
  "bugs": {
@@ -109,7 +109,7 @@
109
109
  @event add
110
110
  @description User clicked the primary Add button. No payload.
111
111
  -->
112
- <!-- With `addHref` / `addTo` the button is a real link (middle-click, new tab), and still emits `add`. -->
112
+ <!-- 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. -->
113
113
  <NcButton v-if="showAdd"
114
114
  variant="primary"
115
115
  :disabled="addDisabled"
@@ -153,8 +153,7 @@
153
153
 
154
154
  <NcActionLink v-if="documentationUrl"
155
155
  :href="documentationUrl"
156
- target="_blank"
157
- rel="noopener noreferrer">
156
+ target="_blank">
158
157
  <template #icon>
159
158
  <BookOpenVariantOutline :size="20" />
160
159
  </template>
@@ -372,6 +371,7 @@ import ViewGridOutline from 'vue-material-design-icons/ViewGridOutline.vue'
372
371
  import ViewListOutline from 'vue-material-design-icons/ViewListOutline.vue'
373
372
  import CnBuildiqEditButton from '../CnBuildiqEditButton/CnBuildiqEditButton.vue'
374
373
  import { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'
374
+ import { isModifiedClick } from '../../utils/linkNavigation.js'
375
375
  import { CnIcon } from '../CnIcon/index.js'
376
376
 
377
377
  /**
@@ -923,12 +923,17 @@ export default {
923
923
 
924
924
  /**
925
925
  * Add button click: a plain click on an in-app link routes in place,
926
- * anything else on a link is the browser's. Emits `add` either way.
926
+ * anything else on a link is the browser's. Emits `add`, except for a
927
+ * modified click on a link, which opens in a new tab: a host `@add`
928
+ * would otherwise run in the tab the user is leaving.
927
929
  *
928
930
  * @param {MouseEvent} event The click event.
929
931
  */
930
932
  onAddClick(event) {
931
933
  if (this.addLink) {
934
+ if (isModifiedClick(event)) {
935
+ return
936
+ }
932
937
  followItemActionLink(event, this.addLink, this.$router)
933
938
  }
934
939
  this.$emit('add')
@@ -936,13 +941,17 @@ export default {
936
941
 
937
942
  /**
938
943
  * A header link entry was clicked: route a plain in-app click and emit
939
- * `header-action` as the button would.
944
+ * `header-action` as the button would. A modified click is the
945
+ * browser's alone (a new tab), so nothing is emitted for it.
940
946
  *
941
947
  * @param {object} entry The header action.
942
948
  * @param {object} link The resolved link.
943
949
  * @param {MouseEvent} event The click event.
944
950
  */
945
951
  onHeaderLinkClick(entry, link, event) {
952
+ if (isModifiedClick(event)) {
953
+ return
954
+ }
946
955
  followItemActionLink(event, link, this.$router)
947
956
  this.$emit('header-action', { action: entry.id, id: entry.id })
948
957
  },
@@ -69,7 +69,6 @@
69
69
  v-if="showRequestFeature && resolvedRequestFeatureUrl"
70
70
  :href="resolvedRequestFeatureUrl"
71
71
  target="_blank"
72
- rel="noopener noreferrer"
73
72
  :data-testid="`${testidBase}-action-request-feature`"
74
73
  :closeAfterClick="true"
75
74
  @click="onRequestFeatureClick">
@@ -92,7 +91,6 @@
92
91
  v-if="showReportBug && resolvedReportBugUrl"
93
92
  :href="resolvedReportBugUrl"
94
93
  target="_blank"
95
- rel="noopener noreferrer"
96
94
  :data-testid="`${testidBase}-action-report-bug`"
97
95
  :closeAfterClick="true">
98
96
  <template #icon>
@@ -104,7 +102,6 @@
104
102
  v-if="showDocumentation && resolvedDocumentationUrl"
105
103
  :href="resolvedDocumentationUrl"
106
104
  target="_blank"
107
- rel="noopener noreferrer"
108
105
  :data-testid="`${testidBase}-action-documentation`"
109
106
  :closeAfterClick="true">
110
107
  <template #icon>
@@ -47,8 +47,7 @@
47
47
  <NcButton
48
48
  v-if="showHelp && helpUrl"
49
49
  :href="helpUrl"
50
- target="_blank"
51
- rel="noopener noreferrer">
50
+ target="_blank">
52
51
  <template #icon>
53
52
  <HelpCircleOutline :size="20" />
54
53
  </template>
@@ -487,9 +487,18 @@
487
487
  dismissed the walkthrough remounts and the first-visit tour
488
488
  starts (or resumes) then. `!== true` keeps apps that opted out
489
489
  of the support note (`cnSupportVisible` undefined) unaffected.
490
+
491
+ Withheld the same way while the setup status is still loading
492
+ and while the non-gating setup wizard is open
493
+ (`walkthroughHeldForSetup`). On a first run the wizard and the
494
+ first-visit tour both qualify; the tour used to open behind the
495
+ wizard, and its window-level ESC listener meant closing the
496
+ wizard with ESC also dismissed the tour and recorded it as seen.
497
+ Held back, the tour is never mounted, so nothing is recorded; it
498
+ starts when the wizard is dismissed or finished.
490
499
  -->
491
500
  <!-- @slot walkthrough Override the gating-free walkthrough overlay. Scope: { manifest, seenVersion }. -->
492
- <slot v-if="walkthroughEnabled && walkthroughSeenResolved && cnSupportVisible !== true"
501
+ <slot v-if="walkthroughEnabled && walkthroughSeenResolved && cnSupportVisible !== true && !walkthroughHeldForSetup"
493
502
  name="walkthrough"
494
503
  :manifest="manifest"
495
504
  :seenVersion="walkthroughSeenVersion">
@@ -2376,6 +2385,10 @@ export default {
2376
2385
  * Neither guard subsumes the other — (1) is about steps the server never
2377
2386
  * reports, (2) about steps it can never mark done — so both are needed.
2378
2387
  *
2388
+ * 3. On-demand steps (`onDemand: true`) are excluded too: they run only
2389
+ * when the user asks (learniq's "Remove the example data"), so they
2390
+ * are never outstanding work.
2391
+ *
2379
2392
  * @return {boolean} True when an actionable optional step is genuinely outstanding.
2380
2393
  */
2381
2394
  optionalSetupPending() {
@@ -2395,7 +2408,9 @@ export default {
2395
2408
  const outstanding = s.completed.value === true
2396
2409
  ? (s.optionalUnmetReported ? s.optionalUnmetReported.value : [])
2397
2410
  : s.optionalUnmet.value
2398
- return outstanding.some((st) => st.type !== 'info' && st.type !== 'summary')
2411
+ // On-demand steps (`onDemand: true`) run only when the user asks,
2412
+ // so they are never outstanding and never reason to open the wizard.
2413
+ return outstanding.some((st) => st.type !== 'info' && st.type !== 'summary' && st.onDemand !== true)
2399
2414
  },
2400
2415
 
2401
2416
  /**
@@ -2478,6 +2493,20 @@ export default {
2478
2493
  return (w && typeof w.completionConfigKey === 'string' && w.completionConfigKey) || ''
2479
2494
  },
2480
2495
 
2496
+ /**
2497
+ * Whether the setup flow holds the walkthrough back: the setup status
2498
+ * has not settled yet (an outstanding optional step may still open the
2499
+ * wizard), or the non-gating setup wizard is open. The gating setup
2500
+ * phase needs no check here, it replaces the shell (and the tour with
2501
+ * it) outright. Apps without a `setup` block settle immediately, so
2502
+ * this is `false` for them from the first render.
2503
+ *
2504
+ * @return {boolean} True while the tour must wait for setup.
2505
+ */
2506
+ walkthroughHeldForSetup() {
2507
+ return !this.setupStatusSettled || this.setupWizardOpen
2508
+ },
2509
+
2481
2510
  /**
2482
2511
  * The user's last-seen app version for walkthrough composition. Resolved
2483
2512
  * from the per-user `completionConfigKey` preference (cross-device) with
@@ -108,6 +108,7 @@
108
108
  :data-card-id="cardKey(card)"
109
109
  :aria-label="cardLabel(card, column)"
110
110
  @click="openCard(card, $event)"
111
+ @mousedown="preventMiddleClickAutoscroll"
111
112
  @auxclick="onCardAuxClick(card, $event)">
112
113
  {{ openLabel }}
113
114
  </button>
@@ -161,7 +162,7 @@ import { translate as t } from '@nextcloud/l10n'
161
162
  import { buildBoardColumns } from '../../utils/boardColumns.js'
162
163
  import { buildSwimlanes } from '../../utils/boardSwimlanes.js'
163
164
  import { DROP_OUTCOMES, runBoardDrop } from '../../utils/boardTransition.js'
164
- import { isRowMiddleClick } from '../../utils/rowAuxClick.js'
165
+ import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
165
166
 
166
167
  /**
167
168
  * CnBoardView — the index page's rows as a board, one column per stage.
@@ -253,7 +254,7 @@ export default {
253
254
  },
254
255
  },
255
256
 
256
- emits: ['card-click', 'moved', 'refused', 'stale'],
257
+ emits: ['card-click', 'card-aux-click', 'moved', 'refused', 'stale'],
257
258
 
258
259
  data() {
259
260
  return {
@@ -333,6 +334,8 @@ export default {
333
334
  methods: {
334
335
  t,
335
336
 
337
+ preventMiddleClickAutoscroll,
338
+
336
339
  /**
337
340
  * Open one card. The pointer and the keyboard both come through here,
338
341
  * so a reader on Enter reaches the same record as a reader on click.
@@ -343,13 +346,15 @@ export default {
343
346
  */
344
347
  openCard(card, event) {
345
348
  /**
346
- * @event card-click Emitted when a reader opens a card, by click, Enter or middle click. Payload: `(card, event)` — the card row and the native event, so the host can open it in a new tab on a ctrl/cmd/shift or middle click.
349
+ * @event card-click Emitted when a reader opens a card, by click or Enter. Payload: `(card, event)` — the card row and the native event, so the host can open it in a new tab on a ctrl/cmd/shift click. A middle click emits `card-aux-click` instead.
347
350
  */
348
351
  this.$emit('card-click', card, event)
349
352
  },
350
353
 
351
354
  /**
352
- * Middle click on a card's open button: open it like a click would.
355
+ * Middle click on a card's open button: emits `card-aux-click`, not
356
+ * `card-click`, so an existing listener that navigates never moves the
357
+ * current tab away.
353
358
  *
354
359
  * @param {object} card The card the reader picked.
355
360
  * @param {MouseEvent} event The auxclick event.
@@ -357,7 +362,10 @@ export default {
357
362
  */
358
363
  onCardAuxClick(card, event) {
359
364
  if (isRowMiddleClick(event)) {
360
- this.openCard(card, event)
365
+ /**
366
+ * @event card-aux-click Emitted when a reader middle-clicks a card, for opening it in a new tab (see `openRowTarget`). Payload: `(card, event)` — the card row and the native auxclick event.
367
+ */
368
+ this.$emit('card-aux-click', card, event)
361
369
  }
362
370
  },
363
371
 
@@ -149,7 +149,7 @@ export default {
149
149
  },
150
150
  },
151
151
 
152
- emits: ['click', 'select'],
152
+ emits: ['click', 'select', 'aux-click'],
153
153
 
154
154
  computed: {
155
155
  /**
@@ -184,6 +184,14 @@ export default {
184
184
  const listeners = { select: () => this.toggleSelect(object) }
185
185
  if (!this.selectable || this.clickToView) {
186
186
  listeners.click = (_card, event) => this.$emit('click', object, event)
187
+ // A middle click, kept off `click` so a navigating listener stays put.
188
+ listeners['aux-click'] = (_card, event) => {
189
+ /**
190
+ * @event aux-click Emitted when a navigating 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.
191
+ * @type {object} The card's object.
192
+ */
193
+ this.$emit('aux-click', object, event)
194
+ }
187
195
  }
188
196
  return listeners
189
197
  },
@@ -94,6 +94,7 @@
94
94
  import { NcActionButton, NcActionLink, NcActions } from '@nextcloud/vue'
95
95
  import { CTX_MENU_DATA_ATTR, CTX_MENU_POPPER_ATTR } from '../../composables/useContextMenu.js'
96
96
  import { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'
97
+ import { isModifiedClick } from '../../utils/linkNavigation.js'
97
98
  import { CnIcon } from '../CnIcon/index.js'
98
99
 
99
100
  /**
@@ -493,13 +494,17 @@ export default {
493
494
  /**
494
495
  * A link entry was clicked: route a plain in-app click, leave the rest to
495
496
  * the browser, and emit `action` as a button would. The `handler` is not
496
- * called, since navigating is what the link already does.
497
+ * called, since navigating is what the link already does. A modified
498
+ * click opens a new tab, so nothing is emitted in this one.
497
499
  *
498
500
  * @param {object} action The action descriptor.
499
501
  * @param {object} link The resolved link.
500
502
  * @param {MouseEvent} event The click event.
501
503
  */
502
504
  onLinkAction(action, link, event) {
505
+ if (isModifiedClick(event)) {
506
+ return
507
+ }
503
508
  followItemActionLink(event, link, this.$router)
504
509
  this.$emit('action', { action: action.label, row: this.targetItem })
505
510
  },
@@ -229,7 +229,7 @@ features are folded in here as opt-in props (bare-table usage is unchanged):
229
229
  - `fetchParams` — extra query params for the self-fetch (a resolved filter map,
230
230
  `_order[field]` ordering, `_limit`); changing it re-triggers the fetch. Used by
231
231
  `CnWidgetObjectTable`'s declarative `source`.
232
- - `rowClickRoute` — a function mapping a clicked row to a vue-router route to push.
232
+ - `rowClickRoute` — a function mapping a row to a vue-router route. Each such row renders a real `<a href>` in its first cell, stretched over the row, so hovering shows the URL, a plain or alt click routes in place, a ctrl/cmd/shift or middle click opens a new tab, and the row is reachable with Tab. The link is named by the first cell's text ("Open row" when that is empty or not plain text). There is no link on a `selectable` table without `rowClickToView`, where a row click selects. `CnWidgetObjectTable` rows inherit it. Trade-offs: cell text cannot be selected by dragging on a linked row, and a right-click on it shows the browser's link menu only when no host listens to `row-context-menu`.
233
233
  - `hideHeader` — drop the column-label row for a compact list widget.
234
234
  - `#footer` slot — supply a custom footer link (e.g. "+ New" or an always-shown
235
235
  "View all") with its own handler; works outside a vue-router context.