@conduction/nextcloud-vue 2.56.0-beta.4 → 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 (300) 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/CnBoardView/CnBoardView.vue2.js +12 -5
  12. package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
  13. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +2 -1
  14. package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
  15. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +9 -1
  16. package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
  17. package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
  18. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +6 -1
  19. package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
  20. package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
  21. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +116 -15
  22. package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
  23. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +27 -14
  24. package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
  25. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js +13 -6
  26. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js.map +1 -1
  27. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js +2 -0
  28. package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js.map +1 -1
  29. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +29 -1
  30. package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
  31. package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
  32. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
  33. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +1 -2
  34. package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
  35. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +3 -1
  36. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
  37. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +17 -17
  38. package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
  39. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js +4 -21
  40. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js.map +1 -1
  41. package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue3.js.map +1 -1
  42. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +0 -13
  43. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
  44. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +8 -8
  45. package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
  46. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue2.js.map +1 -1
  47. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js +3 -2
  48. package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js.map +1 -1
  49. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +67 -13
  50. package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
  51. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +15 -8
  52. package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
  53. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js +31 -11
  54. package/dist/esm/components/CnIndexPage/manifestActionDispatch.js.map +1 -1
  55. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue2.js.map +1 -1
  56. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js +1 -2
  57. package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js.map +1 -1
  58. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
  59. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js +0 -1
  60. package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
  61. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js +2 -17
  62. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js.map +1 -1
  63. package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue3.js.map +1 -1
  64. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js +35 -11
  65. package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js.map +1 -1
  66. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js +3 -2
  67. package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js.map +1 -1
  68. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +23 -5
  69. package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
  70. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +1 -1
  71. package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
  72. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js +19 -3
  73. package/dist/esm/components/CnObjectList/CnObjectList.vue2.js.map +1 -1
  74. package/dist/esm/components/CnObjectList/CnObjectList.vue3.js.map +1 -1
  75. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +45 -15
  76. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
  77. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
  78. package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
  79. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js +24 -6
  80. package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js.map +1 -1
  81. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js +1 -1
  82. package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js.map +1 -1
  83. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
  84. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +0 -1
  85. package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
  86. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
  87. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +4 -2
  88. package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
  89. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +7 -2
  90. package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
  91. package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
  92. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js +5 -3
  93. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js.map +1 -1
  94. package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue3.js.map +1 -1
  95. package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
  96. package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
  97. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +3 -1
  98. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
  99. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +1 -0
  100. package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
  101. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js +3 -1
  102. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js.map +1 -1
  103. package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue3.js.map +1 -1
  104. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -1
  105. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
  106. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js +2 -4
  107. package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
  108. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js +6 -0
  109. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js.map +1 -1
  110. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js +68 -53
  111. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js.map +1 -1
  112. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js +17 -0
  113. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js.map +1 -1
  114. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js +21 -19
  115. package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js.map +1 -1
  116. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js +3 -1
  117. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js.map +1 -1
  118. package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue3.js.map +1 -1
  119. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js +3 -1
  120. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js.map +1 -1
  121. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js +2 -4
  122. package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js.map +1 -1
  123. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js +2 -1
  124. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js.map +1 -1
  125. package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue3.js.map +1 -1
  126. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
  127. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
  128. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js +1 -2
  129. package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
  130. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +2 -1
  131. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
  132. package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
  133. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
  134. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
  135. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js +1 -2
  136. package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
  137. package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
  138. package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
  139. package/dist/esm/integrations/builtin/email/CnEmailTab.vue2.js.map +1 -1
  140. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js +1 -2
  141. package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js.map +1 -1
  142. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js +2 -1
  143. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js.map +1 -1
  144. package/dist/esm/integrations/builtin/flow/CnFlowCard.vue3.js.map +1 -1
  145. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js +2 -1
  146. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js.map +1 -1
  147. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js +1 -2
  148. package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js.map +1 -1
  149. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js +3 -1
  150. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js.map +1 -1
  151. package/dist/esm/integrations/builtin/forms/CnFormsCard.vue3.js.map +1 -1
  152. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js +3 -1
  153. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js.map +1 -1
  154. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js +2 -4
  155. package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js.map +1 -1
  156. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js +3 -1
  157. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js.map +1 -1
  158. package/dist/esm/integrations/builtin/maps/CnMapsCard.vue3.js.map +1 -1
  159. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js +3 -1
  160. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js.map +1 -1
  161. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js +2 -4
  162. package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js.map +1 -1
  163. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js +3 -1
  164. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js.map +1 -1
  165. package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue3.js.map +1 -1
  166. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js +3 -1
  167. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js.map +1 -1
  168. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js +2 -4
  169. package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js.map +1 -1
  170. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js +2 -1
  171. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js.map +1 -1
  172. package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue3.js.map +1 -1
  173. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
  174. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
  175. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js +1 -2
  176. package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
  177. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js +2 -1
  178. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js.map +1 -1
  179. package/dist/esm/integrations/builtin/polls/CnPollsCard.vue3.js.map +1 -1
  180. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js +2 -1
  181. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js.map +1 -1
  182. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js +1 -2
  183. package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js.map +1 -1
  184. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue2.js.map +1 -1
  185. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js +3 -6
  186. package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js.map +1 -1
  187. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js +3 -1
  188. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js.map +1 -1
  189. package/dist/esm/integrations/builtin/talk/CnTalkCard.vue3.js.map +1 -1
  190. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js +3 -1
  191. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js.map +1 -1
  192. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js +2 -4
  193. package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js.map +1 -1
  194. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js +2 -1
  195. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js.map +1 -1
  196. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue3.js.map +1 -1
  197. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js +2 -1
  198. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js.map +1 -1
  199. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js +1 -2
  200. package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js.map +1 -1
  201. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js +4 -1
  202. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js.map +1 -1
  203. package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue3.js.map +1 -1
  204. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js +6 -3
  205. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js.map +1 -1
  206. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js +2 -4
  207. package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js.map +1 -1
  208. package/dist/esm/l10n/en.json.js +1 -0
  209. package/dist/esm/l10n/en.json.js.map +1 -1
  210. package/dist/esm/l10n/nl.json.js +1 -0
  211. package/dist/esm/l10n/nl.json.js.map +1 -1
  212. package/dist/esm/nextcloud-vue.css +71 -7
  213. package/dist/esm/utils/actionLink.js +5 -0
  214. package/dist/esm/utils/actionLink.js.map +1 -1
  215. package/dist/esm/utils/actionsDispatcher.js +16 -1
  216. package/dist/esm/utils/actionsDispatcher.js.map +1 -1
  217. package/dist/esm/utils/linkNavigation.js +6 -3
  218. package/dist/esm/utils/linkNavigation.js.map +1 -1
  219. package/dist/esm/utils/rowAuxClick.js +30 -5
  220. package/dist/esm/utils/rowAuxClick.js.map +1 -1
  221. package/dist/esm/utils/safeHref.js +18 -3
  222. package/dist/esm/utils/safeHref.js.map +1 -1
  223. package/dist/nextcloud-vue.cjs.js +809 -383
  224. package/dist/nextcloud-vue.cjs.js.map +2 -2
  225. package/dist/nextcloud-vue.css +71 -7
  226. package/l10n/en.json +1 -0
  227. package/l10n/nl.json +1 -0
  228. package/package.json +1 -1
  229. package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
  230. package/src/components/CnActionsMenu/CnActionsMenu.vue +0 -3
  231. package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
  232. package/src/components/CnBoardView/CnBoardView.vue +13 -5
  233. package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
  234. package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
  235. package/src/components/CnDataTable/CnDataTable.md +1 -1
  236. package/src/components/CnDataTable/CnDataTable.vue +131 -17
  237. package/src/components/CnDateAxisView/CnDateAxisView.vue +15 -6
  238. package/src/components/CnDetailPage/CnDetailPage.md +1 -1
  239. package/src/components/CnDetailPage/CnDetailPage.vue +29 -1
  240. package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -2
  241. package/src/components/CnFilesBrowser/CnFilesBrowser.vue +5 -3
  242. package/src/components/CnFilesWidget/CnFilesWidget.vue +4 -21
  243. package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +8 -21
  244. package/src/components/CnFlowsPage/CnFlowsPage.vue +2 -1
  245. package/src/components/CnIndexPage/CnIndexPage.vue +75 -14
  246. package/src/components/CnIndexPage/manifestActionDispatch.js +31 -11
  247. package/src/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue +1 -2
  248. package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +0 -1
  249. package/src/components/CnLinkButtonWidget/CnLinkButtonWidget.vue +2 -17
  250. package/src/components/CnLogsPage/CnLogsPage.vue +37 -12
  251. package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
  252. package/src/components/CnObjectList/CnObjectList.vue +19 -3
  253. package/src/components/CnObjectListWidget/CnObjectListWidget.vue +47 -15
  254. package/src/components/CnObjectRow/CnObjectRow.vue +25 -7
  255. package/src/components/CnObjectSidebar/CnFilesTab.vue +0 -1
  256. package/src/components/CnPageRenderer/CnPageRenderer.vue +2 -0
  257. package/src/components/CnRowActions/CnRowActions.vue +7 -2
  258. package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
  259. package/src/components/CnTabs/CnTabs.vue +7 -3
  260. package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
  261. package/src/css/table.css +26 -0
  262. package/src/integrations/builtin/analytics/CnAnalyticsCard.vue +3 -2
  263. package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +5 -6
  264. package/src/integrations/builtin/bookmarks/CnBookmarksCard.vue +12 -1
  265. package/src/integrations/builtin/bookmarks/CnBookmarksTab.vue +23 -6
  266. package/src/integrations/builtin/bookmarks/__tests__/CnBookmarksTab.spec.js +7 -2
  267. package/src/integrations/builtin/collectives/CnCollectivesCard.vue +3 -2
  268. package/src/integrations/builtin/collectives/CnCollectivesTab.vue +5 -6
  269. package/src/integrations/builtin/cospend/CnCospendCard.vue +2 -2
  270. package/src/integrations/builtin/cospend/CnCospendTab.vue +3 -4
  271. package/src/integrations/builtin/deck/CnDeckCard.vue +2 -2
  272. package/src/integrations/builtin/deck/CnDeckTab.vue +3 -4
  273. package/src/integrations/builtin/email/CnEmailCard.vue +6 -2
  274. package/src/integrations/builtin/email/CnEmailTab.vue +7 -4
  275. package/src/integrations/builtin/flow/CnFlowCard.vue +2 -2
  276. package/src/integrations/builtin/flow/CnFlowTab.vue +3 -4
  277. package/src/integrations/builtin/forms/CnFormsCard.vue +3 -2
  278. package/src/integrations/builtin/forms/CnFormsTab.vue +5 -6
  279. package/src/integrations/builtin/maps/CnMapsCard.vue +3 -2
  280. package/src/integrations/builtin/maps/CnMapsTab.vue +5 -6
  281. package/src/integrations/builtin/maps/__tests__/CnMapsTab.spec.js +9 -0
  282. package/src/integrations/builtin/openproject/CnOpenprojectCard.vue +3 -2
  283. package/src/integrations/builtin/openproject/CnOpenprojectTab.vue +5 -6
  284. package/src/integrations/builtin/photos/CnPhotosCard.vue +2 -2
  285. package/src/integrations/builtin/photos/CnPhotosTab.vue +3 -4
  286. package/src/integrations/builtin/polls/CnPollsCard.vue +2 -2
  287. package/src/integrations/builtin/polls/CnPollsTab.vue +3 -4
  288. package/src/integrations/builtin/shares/CnSharesTab.vue +3 -6
  289. package/src/integrations/builtin/talk/CnTalkCard.vue +3 -2
  290. package/src/integrations/builtin/talk/CnTalkTab.vue +5 -6
  291. package/src/integrations/builtin/time-tracker/CnTimeTrackerCard.vue +2 -2
  292. package/src/integrations/builtin/time-tracker/CnTimeTrackerTab.vue +3 -4
  293. package/src/integrations/builtin/xwiki/CnXwikiCard.vue +4 -2
  294. package/src/integrations/builtin/xwiki/CnXwikiTab.vue +7 -7
  295. package/src/integrations/builtin/xwiki/__tests__/CnXwikiTab.spec.js +9 -0
  296. package/src/utils/actionLink.js +5 -0
  297. package/src/utils/actionsDispatcher.js +15 -0
  298. package/src/utils/linkNavigation.js +6 -3
  299. package/src/utils/rowAuxClick.js +29 -4
  300. package/src/utils/safeHref.js +18 -3
@@ -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 })
@@ -2,7 +2,7 @@
2
2
  <div
3
3
  class="cn-object-row"
4
4
  :class="{ 'cn-object-row--selected': selected }"
5
- @mousedown="onPointerDown"
5
+ @mousedown="onRowMouseDown"
6
6
  @click="onRowClick($event)"
7
7
  @auxclick="onRowAuxClick($event)">
8
8
  <!-- Selection checkbox -->
@@ -68,7 +68,7 @@
68
68
  import { NcCheckboxRadioSwitch } from '@nextcloud/vue'
69
69
  import { useClickDragGuard } from '../../composables/useClickDragGuard.js'
70
70
  import { resolveImageUrl } from '../../utils/resolveImageUrl.js'
71
- import { isRowMiddleClick } from '../../utils/rowAuxClick.js'
71
+ import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
72
72
  import { CnIcon } from '../CnIcon/index.js'
73
73
  import { CnStatusBadge } from '../CnStatusBadge/index.js'
74
74
 
@@ -146,7 +146,7 @@ export default {
146
146
  // again from `$emit('click', object)` — twice per click, with different
147
147
  // payloads. Declaring the names here removes them from `$attrs`, which is
148
148
  // also what stops VTU v2 recording the native DOM event into `emitted()`.
149
- emits: ['select', 'click'],
149
+ emits: ['select', 'click', 'aux-click'],
150
150
 
151
151
  setup() {
152
152
  // Tell a deliberate row click apart from a text-selection drag.
@@ -237,15 +237,29 @@ export default {
237
237
  return
238
238
  }
239
239
  /**
240
- * @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.
240
+ * @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.
241
241
  * @type {object} The row's object.
242
242
  */
243
243
  this.$emit('click', this.object, event)
244
244
  },
245
245
 
246
246
  /**
247
- * Row-body middle click: emits `click` like a click on a
248
- * non-selectable row.
247
+ * Row mousedown: record the press for the drag guard, and on a
248
+ * non-selectable row keep a middle press from starting autoscroll.
249
+ *
250
+ * @param {MouseEvent} event The mousedown event.
251
+ */
252
+ onRowMouseDown(event) {
253
+ this.onPointerDown(event)
254
+ if (!this.selectable) {
255
+ preventMiddleClickAutoscroll(event)
256
+ }
257
+ },
258
+
259
+ /**
260
+ * Row-body middle click on a non-selectable row: emits `aux-click`, not
261
+ * `click`, so an existing `click` listener that navigates never moves
262
+ * the current tab away.
249
263
  *
250
264
  * @param {MouseEvent} event The auxclick event.
251
265
  */
@@ -253,7 +267,11 @@ export default {
253
267
  if (this.selectable || !isRowMiddleClick(event)) {
254
268
  return
255
269
  }
256
- this.$emit('click', this.object, event)
270
+ /**
271
+ * @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.
272
+ * @type {object} The row's object.
273
+ */
274
+ this.$emit('aux-click', this.object, event)
257
275
  },
258
276
  },
259
277
  }
@@ -153,7 +153,6 @@
153
153
  v-if="file.id"
154
154
  :href="showInFilesUrl(file)"
155
155
  target="_blank"
156
- rel="noopener noreferrer"
157
156
  :closeAfterClick="true">
158
157
  <template #icon>
159
158
  <FolderOutline :size="20" />
@@ -128,6 +128,7 @@
128
128
  v-bind="{ ...$attrs, ...resolvedProps }"
129
129
  @view="onRowOpen"
130
130
  @rowClick="onRowOpen"
131
+ @rowAuxClick="onRowOpen"
131
132
  @editOpen="onRowOpen"
132
133
  @configure="showConfigModal = true">
133
134
  <!-- This `<template v-for>` defines dynamic SLOTS, not a
@@ -203,6 +204,7 @@
203
204
  v-bind="{ ...$attrs, ...resolvedProps }"
204
205
  @view="onRowOpen"
205
206
  @rowClick="onRowOpen"
207
+ @rowAuxClick="onRowOpen"
206
208
  @editOpen="onRowOpen"
207
209
  @configure="showConfigModal = true">
208
210
  <!-- Dynamic slot definition, not a rendered list — see the note on
@@ -41,6 +41,7 @@
41
41
  <script>
42
42
  import { NcActionButton, NcActionLink, NcActions } from '@nextcloud/vue'
43
43
  import { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'
44
+ import { isModifiedClick } from '../../utils/linkNavigation.js'
44
45
  import { evaluateVisibleWhenLocal, isLocallyDecidableVisibleWhen } from '../../utils/visibleWhen.js'
45
46
  import { CnIcon } from '../CnIcon/index.js'
46
47
 
@@ -215,16 +216,20 @@ export default {
215
216
  /**
216
217
  * A link entry was clicked: route a plain in-app click, leave the rest to
217
218
  * the browser, and emit `action` as a button would. The `handler` is not
218
- * called, since navigating is what the link already does.
219
+ * called, since navigating is what the link already does. A modified
220
+ * click opens a new tab, so nothing is emitted in this one.
219
221
  *
220
222
  * @param {object} action The action definition.
221
223
  * @param {object} link The resolved link.
222
224
  * @param {MouseEvent} event The click event.
223
225
  */
224
226
  onLinkAction(action, link, event) {
227
+ if (isModifiedClick(event)) {
228
+ return
229
+ }
225
230
  followItemActionLink(event, link, this.$router)
226
231
  /**
227
- * @event action User picked an entry. Payload: the action's label and the row. A button entry has already run its `handler`; a link entry navigates instead.
232
+ * @event action User picked an entry. Payload: the action's label and the row. A button entry has already run its `handler`; a link entry navigates instead, and a modified (new-tab) click on a link emits nothing.
228
233
  * @type {{ action: string, row: object|null }}
229
234
  */
230
235
  this.$emit('action', { action: action.label, row: this.row })
@@ -145,7 +145,8 @@ const DEBOUNCE_MS = 200
145
145
  * Data origin (decoupling seam): all data flows through a consumer-supplied
146
146
  * `dataSource` prop OR the `cnSpendAnalyticsSource` injection — an object
147
147
  * exposing `fetchSummary(args)`, `fetchVendorCommitments(args)`,
148
- * `fetchNarrative(args)`, and optionally `resolveDeepLink(app, kind, id)`. The
148
+ * `fetchNarrative(args)`, and optionally `resolveDeepLink(app, kind, id)`
149
+ * (pure and synchronous: it runs for every row on every render). The
149
150
  * renderer imports NO financeq / procest / launchpad service module and never
150
151
  * calls axios itself; the consuming app (typically over GraphQL) owns the
151
152
  * transport. The `requires.graphql` hint lives only in the registry entry, not
@@ -182,8 +183,9 @@ export default {
182
183
  * Consumer-supplied data source overriding the
183
184
  * `cnSpendAnalyticsSource` injection. Must expose `fetchSummary`,
184
185
  * `fetchVendorCommitments`, and `fetchNarrative`; may expose
185
- * `resolveDeepLink`. When `null` the injection (then the empty state)
186
- * is used.
186
+ * `resolveDeepLink`, which must be pure and synchronous, since it is
187
+ * called for every row on every render. When `null` the injection
188
+ * (then the empty state) is used.
187
189
  *
188
190
  * @type {object|null}
189
191
  */
@@ -467,7 +467,11 @@ export default defineComponent({
467
467
  }
468
468
 
469
469
  /* A fade over the clipped edge, only on the side that hides tabs. Stops a
470
- pixel above the bar's rule so the rule keeps its full colour. */
470
+ pixel above the bar's rule so the rule keeps its full colour.
471
+
472
+ z-index 2 so the fades outrank a lifted tab: CnTabsWidget puts the open tab
473
+ at 1, and a tie goes to DOM order, which would draw that tab over the start
474
+ fade (it precedes the tabs) while the end fade still covered it. */
471
475
  .cn-tabs__strip::before,
472
476
  .cn-tabs__strip::after {
473
477
  content: '';
@@ -476,7 +480,7 @@ export default defineComponent({
476
480
  pointer-events: none;
477
481
  position: absolute;
478
482
  width: 56px;
479
- z-index: 1;
483
+ z-index: 2;
480
484
  }
481
485
 
482
486
  .cn-tabs__strip::before {
@@ -513,7 +517,7 @@ export default defineComponent({
513
517
  padding: 0;
514
518
  position: absolute;
515
519
  width: 28px;
516
- z-index: 2;
520
+ z-index: 3;
517
521
  }
518
522
 
519
523
  /* Nextcloud's `button:hover` rule would otherwise fill the chevron. */
@@ -31,6 +31,7 @@
31
31
  class="cn-tasks-widget__row"
32
32
  :data-state="task.state"
33
33
  @click="onRowClick(task, $event)"
34
+ @mousedown="preventMiddleClickAutoscroll"
34
35
  @auxclick="onRowAuxClick(task, $event)">
35
36
  <span class="cn-tasks-widget__body">
36
37
  <span class="cn-tasks-widget__name">{{ titleOf(task) }}</span>
@@ -90,7 +91,7 @@ import { inject, ref } from 'vue'
90
91
  import { taskDeepLink, taskDueLabel } from '../../composables/indexSources.js'
91
92
  import { useEndpointSource } from '../../composables/useEndpointSource.js'
92
93
  import { openRowTarget } from '../../utils/linkNavigation.js'
93
- import { isRowMiddleClick } from '../../utils/rowAuxClick.js'
94
+ import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
94
95
 
95
96
  /**
96
97
  * The OpenRegister inbox read (openregister flow-task-entity). One endpoint
@@ -367,6 +368,8 @@ export default {
367
368
  },
368
369
 
369
370
  methods: {
371
+ preventMiddleClickAutoscroll,
372
+
370
373
  /**
371
374
  * Start (or restart) the refetch interval, unless polling is off.
372
375
  *
package/src/css/table.css CHANGED
@@ -334,6 +334,32 @@
334
334
  background-color: var(--color-primary-light);
335
335
  }
336
336
 
337
+ /* A row with a route is a real link (see CnDataTable's row link): the anchor
338
+ in its first cell is stretched over the whole row. The row's own controls
339
+ sit above it so they stay usable; keep the list in step with NESTED_CONTROL
340
+ in utils/rowAuxClick.js. */
341
+ .cn-table-row--linked {
342
+ position: relative;
343
+ }
344
+
345
+ .cn-table-row__link {
346
+ position: absolute;
347
+ inset: 0;
348
+ cursor: pointer;
349
+ }
350
+
351
+ .cn-table-row__link:focus-visible {
352
+ outline: 2px solid var(--color-main-text);
353
+ outline-offset: -2px;
354
+ }
355
+
356
+ .cn-table-row--linked .cn-table-col--checkbox,
357
+ .cn-table-row--linked .cn-table-col--actions,
358
+ .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) {
359
+ position: relative;
360
+ z-index: 1;
361
+ }
362
+
337
363
  /* Column Types */
338
364
  .cn-table-col--checkbox {
339
365
  width: 50px;
@@ -122,7 +122,7 @@ import ChartPie from 'vue-material-design-icons/ChartPie.vue'
122
122
  import TableIcon from 'vue-material-design-icons/Table.vue'
123
123
  import ViewDashboard from 'vue-material-design-icons/ViewDashboard.vue'
124
124
  import CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'
125
- import { buildHeaders, prefixUrl } from '../../../utils/index.js'
125
+ import { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'
126
126
 
127
127
  const VALID_SURFACES = ['user-dashboard', 'app-dashboard', 'detail-page', 'single-entity']
128
128
  const COMPACT_LIMIT = 5
@@ -287,8 +287,9 @@ export default {
287
287
  return `cn-analytics-card__badge--type-${type ?? 'unknown'}`
288
288
  },
289
289
 
290
+ // A provider URL is used only when it is a safe scheme; else the app link.
290
291
  reportUrl(report) {
291
- if (report && report.url) {
292
+ if (report && report.url && safeHref(report.url) !== '#') {
292
293
  return report.url
293
294
  }
294
295
  const id = this.reportKey(report)
@@ -82,8 +82,7 @@
82
82
  <NcButton
83
83
  variant="primary"
84
84
  :href="analyticsAppUrl"
85
- target="_blank"
86
- rel="noopener noreferrer">
85
+ target="_blank">
87
86
  <template #icon>
88
87
  <ChartBar :size="20" />
89
88
  </template>
@@ -131,8 +130,7 @@
131
130
  <NcActionLink
132
131
  :closeAfterClick="true"
133
132
  :href="reportUrl(report)"
134
- target="_blank"
135
- rel="noopener noreferrer">
133
+ target="_blank">
136
134
  <template #icon>
137
135
  <OpenInNew :size="20" />
138
136
  </template>
@@ -178,7 +176,7 @@ import ViewDashboard from 'vue-material-design-icons/ViewDashboard.vue'
178
176
  import CnAnalyticsReportCreate from '../../../components/CnAnalyticsReportCreate/CnAnalyticsReportCreate.vue'
179
177
  import CnAnalyticsReportPicker from '../../../components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue'
180
178
  import CnStatusBadge from '../../../components/CnStatusBadge/CnStatusBadge.vue'
181
- import { buildHeaders, prefixUrl } from '../../../utils/index.js'
179
+ import { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'
182
180
 
183
181
  /**
184
182
  * CnAnalyticsTab — bespoke dataset list for the `analytics` integration.
@@ -408,8 +406,9 @@ export default {
408
406
  return t('nextcloud-vue', 'Latest value')
409
407
  },
410
408
 
409
+ // A provider URL is used only when it is a safe scheme; else the app link.
411
410
  reportUrl(report) {
412
- if (report && report.url) {
411
+ if (report && report.url && safeHref(report.url) !== '#') {
413
412
  return report.url
414
413
  }
415
414
  const id = this.reportKey(report)