@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.
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js +12 -2
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js +1 -2
- package/dist/esm/components/CnActionsBar/CnActionsBar.vue3.js.map +1 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue2.js.map +1 -1
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js +0 -3
- package/dist/esm/components/CnActionsMenu/CnActionsMenu.vue3.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +1 -2
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js +21 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue2.js.map +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js +1 -1
- package/dist/esm/components/CnAppRoot/CnAppRoot.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +12 -5
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +2 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js +9 -1
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnCardGrid/CnCardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js +6 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue2.js.map +1 -1
- package/dist/esm/components/CnContextMenu/CnContextMenu.vue3.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js +116 -15
- package/dist/esm/components/CnDataTable/CnDataTable.vue2.js.map +1 -1
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js +27 -14
- package/dist/esm/components/CnDataTable/CnDataTable.vue3.js.map +1 -1
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js +13 -6
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue2.js.map +1 -1
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js +2 -0
- package/dist/esm/components/CnDateAxisView/CnDateAxisView.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +29 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue2.js.map +1 -1
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js +1 -2
- package/dist/esm/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +3 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +17 -17
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js +4 -21
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesWidget/CnFilesWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js +0 -13
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js +8 -8
- package/dist/esm/components/CnFlowRunsWidget/CnFlowRunsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js +3 -2
- package/dist/esm/components/CnFlowsPage/CnFlowsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +67 -13
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +15 -8
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/manifestActionDispatch.js +31 -11
- package/dist/esm/components/CnIndexPage/manifestActionDispatch.js.map +1 -1
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue2.js.map +1 -1
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js +1 -2
- package/dist/esm/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue3.js.map +1 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js +0 -1
- package/dist/esm/components/CnInteractionFormWidget/CnInteractionFormWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js +2 -17
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnLinkButtonWidget/CnLinkButtonWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js +35 -11
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js +3 -2
- package/dist/esm/components/CnLogsPage/CnLogsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js +23 -5
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js +1 -1
- package/dist/esm/components/CnObjectCard/CnObjectCard.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectList/CnObjectList.vue2.js +19 -3
- package/dist/esm/components/CnObjectList/CnObjectList.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectList/CnObjectList.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js +45 -15
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js +4 -2
- package/dist/esm/components/CnObjectListWidget/CnObjectListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js +24 -6
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js +1 -1
- package/dist/esm/components/CnObjectRow/CnObjectRow.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js +0 -1
- package/dist/esm/components/CnObjectSidebar/CnFilesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js +4 -2
- package/dist/esm/components/CnPageRenderer/CnPageRenderer.vue3.js.map +1 -1
- package/dist/esm/components/CnRowActions/CnRowActions.vue2.js +7 -2
- package/dist/esm/components/CnRowActions/CnRowActions.vue2.js.map +1 -1
- package/dist/esm/components/CnRowActions/CnRowActions.vue3.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js +49 -5
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue2.js.map +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js +1 -1
- package/dist/esm/components/CnSetupWizard/CnSetupWizard.vue3.js.map +1 -1
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js +5 -3
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js +3 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js +1 -0
- package/dist/esm/components/CnTasksWidget/CnTasksWidget.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js +6 -0
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js +68 -53
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js +17 -0
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js +21 -19
- package/dist/esm/integrations/builtin/bookmarks/CnBookmarksTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/collectives/CnCollectivesTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/email/CnEmailTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/flow/CnFlowTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/forms/CnFormsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/maps/CnMapsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/openproject/CnOpenprojectTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/polls/CnPollsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js +3 -6
- package/dist/esm/integrations/builtin/shares/CnSharesTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js +3 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js +3 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/talk/CnTalkTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js +1 -2
- package/dist/esm/integrations/builtin/time-tracker/CnTimeTrackerTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js +4 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js +6 -3
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js +2 -4
- package/dist/esm/integrations/builtin/xwiki/CnXwikiTab.vue3.js.map +1 -1
- package/dist/esm/l10n/en.json.js +2 -0
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +2 -0
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +78 -7
- package/dist/esm/utils/actionLink.js +5 -0
- package/dist/esm/utils/actionLink.js.map +1 -1
- package/dist/esm/utils/actionsDispatcher.js +16 -1
- package/dist/esm/utils/actionsDispatcher.js.map +1 -1
- package/dist/esm/utils/linkNavigation.js +6 -3
- package/dist/esm/utils/linkNavigation.js.map +1 -1
- package/dist/esm/utils/rowAuxClick.js +30 -5
- package/dist/esm/utils/rowAuxClick.js.map +1 -1
- package/dist/esm/utils/safeHref.js +18 -3
- package/dist/esm/utils/safeHref.js.map +1 -1
- package/dist/esm/utils/validateManifestV2.compiled.js +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +885 -393
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +78 -7
- package/l10n/en.json +2 -0
- package/l10n/nl.json +2 -0
- package/package.json +1 -1
- package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
- package/src/components/CnActionsMenu/CnActionsMenu.vue +0 -3
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
- package/src/components/CnAppRoot/CnAppRoot.vue +31 -2
- package/src/components/CnBoardView/CnBoardView.vue +13 -5
- package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
- package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
- package/src/components/CnDataTable/CnDataTable.md +1 -1
- package/src/components/CnDataTable/CnDataTable.vue +131 -17
- package/src/components/CnDateAxisView/CnDateAxisView.vue +15 -6
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +29 -1
- package/src/components/CnFeaturesAndRoadmapView/CnFeaturesAndRoadmapView.vue +1 -2
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +5 -3
- package/src/components/CnFilesWidget/CnFilesWidget.vue +4 -21
- package/src/components/CnFlowRunsWidget/CnFlowRunsWidget.vue +8 -21
- package/src/components/CnFlowsPage/CnFlowsPage.vue +2 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +75 -14
- package/src/components/CnIndexPage/manifestActionDispatch.js +31 -11
- package/src/components/CnIntegrationWidget/CnIntegrationWidgetEmpty.vue +1 -2
- package/src/components/CnInteractionFormWidget/CnInteractionFormWidget.vue +0 -1
- package/src/components/CnLinkButtonWidget/CnLinkButtonWidget.vue +2 -17
- package/src/components/CnLogsPage/CnLogsPage.vue +37 -12
- package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
- package/src/components/CnObjectList/CnObjectList.vue +19 -3
- package/src/components/CnObjectListWidget/CnObjectListWidget.vue +47 -15
- package/src/components/CnObjectRow/CnObjectRow.vue +25 -7
- package/src/components/CnObjectSidebar/CnFilesTab.vue +0 -1
- package/src/components/CnPageRenderer/CnPageRenderer.vue +2 -0
- package/src/components/CnRowActions/CnRowActions.vue +7 -2
- package/src/components/CnSetupWizard/CnSetupWizard.vue +57 -6
- package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
- package/src/components/CnTabs/CnTabs.vue +7 -3
- package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
- package/src/css/table.css +26 -0
- package/src/integrations/builtin/analytics/CnAnalyticsCard.vue +3 -2
- package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +5 -6
- package/src/integrations/builtin/bookmarks/CnBookmarksCard.vue +12 -1
- package/src/integrations/builtin/bookmarks/CnBookmarksTab.vue +23 -6
- package/src/integrations/builtin/bookmarks/__tests__/CnBookmarksTab.spec.js +7 -2
- package/src/integrations/builtin/collectives/CnCollectivesCard.vue +3 -2
- package/src/integrations/builtin/collectives/CnCollectivesTab.vue +5 -6
- package/src/integrations/builtin/cospend/CnCospendCard.vue +2 -2
- package/src/integrations/builtin/cospend/CnCospendTab.vue +3 -4
- package/src/integrations/builtin/deck/CnDeckCard.vue +2 -2
- package/src/integrations/builtin/deck/CnDeckTab.vue +3 -4
- package/src/integrations/builtin/email/CnEmailCard.vue +6 -2
- package/src/integrations/builtin/email/CnEmailTab.vue +7 -4
- package/src/integrations/builtin/flow/CnFlowCard.vue +2 -2
- package/src/integrations/builtin/flow/CnFlowTab.vue +3 -4
- package/src/integrations/builtin/forms/CnFormsCard.vue +3 -2
- package/src/integrations/builtin/forms/CnFormsTab.vue +5 -6
- package/src/integrations/builtin/maps/CnMapsCard.vue +3 -2
- package/src/integrations/builtin/maps/CnMapsTab.vue +5 -6
- package/src/integrations/builtin/maps/__tests__/CnMapsTab.spec.js +9 -0
- package/src/integrations/builtin/openproject/CnOpenprojectCard.vue +3 -2
- package/src/integrations/builtin/openproject/CnOpenprojectTab.vue +5 -6
- package/src/integrations/builtin/photos/CnPhotosCard.vue +2 -2
- package/src/integrations/builtin/photos/CnPhotosTab.vue +3 -4
- package/src/integrations/builtin/polls/CnPollsCard.vue +2 -2
- package/src/integrations/builtin/polls/CnPollsTab.vue +3 -4
- package/src/integrations/builtin/shares/CnSharesTab.vue +3 -6
- package/src/integrations/builtin/talk/CnTalkCard.vue +3 -2
- package/src/integrations/builtin/talk/CnTalkTab.vue +5 -6
- package/src/integrations/builtin/time-tracker/CnTimeTrackerCard.vue +2 -2
- package/src/integrations/builtin/time-tracker/CnTimeTrackerTab.vue +3 -4
- package/src/integrations/builtin/xwiki/CnXwikiCard.vue +4 -2
- package/src/integrations/builtin/xwiki/CnXwikiTab.vue +7 -7
- package/src/integrations/builtin/xwiki/__tests__/CnXwikiTab.spec.js +9 -0
- package/src/schemas/app-manifest-v2.schema.json +2 -1
- package/src/utils/actionLink.js +5 -0
- package/src/utils/actionsDispatcher.js +15 -0
- package/src/utils/linkNavigation.js +6 -3
- package/src/utils/rowAuxClick.js +29 -4
- package/src/utils/safeHref.js +18 -3
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -451,6 +451,7 @@
|
|
|
451
451
|
@sort="onSortEvent"
|
|
452
452
|
@select="onSelect"
|
|
453
453
|
@rowClick="onRowClick"
|
|
454
|
+
@rowAuxClick="onRowAuxClick"
|
|
454
455
|
@rowContextMenu="onRowContextMenu">
|
|
455
456
|
<!-- Pass through column slots -->
|
|
456
457
|
<template
|
|
@@ -548,6 +549,7 @@
|
|
|
548
549
|
:runTransition="runTransition"
|
|
549
550
|
:paged="isPaged"
|
|
550
551
|
@cardClick="onRowClick"
|
|
552
|
+
@cardAuxClick="onRowAuxClick"
|
|
551
553
|
@moved="onBoardMoved" />
|
|
552
554
|
|
|
553
555
|
<!--
|
|
@@ -563,7 +565,8 @@
|
|
|
563
565
|
:laneField="dateAxis.laneField || ''"
|
|
564
566
|
:labelField="dateAxis.labelField || ''"
|
|
565
567
|
:rowKey="rowKey"
|
|
566
|
-
@rowClick="onRowClick"
|
|
568
|
+
@rowClick="onRowClick"
|
|
569
|
+
@rowAuxClick="onRowAuxClick" />
|
|
567
570
|
|
|
568
571
|
<!-- List view -->
|
|
569
572
|
<CnObjectList
|
|
@@ -576,6 +579,7 @@
|
|
|
576
579
|
:rowKey="rowKey"
|
|
577
580
|
:emptyText="emptyText"
|
|
578
581
|
@click="onRowClick"
|
|
582
|
+
@auxClick="onRowAuxClick"
|
|
579
583
|
@select="onSelect">
|
|
580
584
|
<!--
|
|
581
585
|
List-item slot resolution priority (highest first):
|
|
@@ -596,6 +600,7 @@
|
|
|
596
600
|
:register="register"
|
|
597
601
|
:selected="selected"
|
|
598
602
|
@click="(...args) => onRowClick(object, args.find(isDomEvent))"
|
|
603
|
+
@mousedown="onCustomItemMouseDown"
|
|
599
604
|
@auxclick="onCustomItemAuxClick(object, $event)"
|
|
600
605
|
@select="onSelect(toggleIdInArray(internalSelectedIds, object[rowKey]))" />
|
|
601
606
|
</template>
|
|
@@ -629,6 +634,7 @@
|
|
|
629
634
|
:rowKey="rowKey"
|
|
630
635
|
:emptyText="emptyText"
|
|
631
636
|
@click="onRowClick"
|
|
637
|
+
@auxClick="onRowAuxClick"
|
|
632
638
|
@select="onSelect">
|
|
633
639
|
<!--
|
|
634
640
|
Card slot resolution priority (highest first):
|
|
@@ -649,6 +655,7 @@
|
|
|
649
655
|
:register="register"
|
|
650
656
|
:selected="selected"
|
|
651
657
|
@click="(...args) => onRowClick(object, args.find(isDomEvent))"
|
|
658
|
+
@mousedown="onCustomItemMouseDown"
|
|
652
659
|
@auxclick="onCustomItemAuxClick(object, $event)"
|
|
653
660
|
@select="onSelect(toggleIdInArray(internalSelectedIds, object[rowKey]))" />
|
|
654
661
|
</template>
|
|
@@ -781,7 +788,7 @@ import { LIST_SHORTCUTS, listPaletteCommands, shortcutFor } from '../../utils/li
|
|
|
781
788
|
import { multiKeySort } from '../../utils/multiKeySort.js'
|
|
782
789
|
import { resolveDeepTokens, resolveFilterValue } from '../../utils/resolveFilterTokens.js'
|
|
783
790
|
import { availableRowActions, DEFAULT_ROW_ACTION_FIELD, refusalReasonFor, undeclaredRowActions } from '../../utils/rowActionAvailability.js'
|
|
784
|
-
import { isNewTabClick, isRowMiddleClick, markNewTabHandled } from '../../utils/rowAuxClick.js'
|
|
791
|
+
import { isNewTabClick, isNewTabHandled, isRowMiddleClick, markNewTabHandled, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
|
|
785
792
|
import { DEFAULT_ROW_INDICATOR_CAP } from '../../utils/rowIndicators.js'
|
|
786
793
|
import { buildRouteQueryFromViewState, buildViewCreatePayload, extractViewState, extractViewStateFromRouteQuery, savedViewScope, viewMatchesScope } from '../../utils/savedViewHelpers.js'
|
|
787
794
|
import { columnsFromSchema } from '../../utils/schema.js'
|
|
@@ -995,7 +1002,8 @@ function namedFilterToQuery(values) {
|
|
|
995
1002
|
* @event {object} mass-export — Mass export confirmed. Payload: { ids, format }
|
|
996
1003
|
* @event {object} mass-import — Mass import confirmed. Payload: import data
|
|
997
1004
|
* @event {void} refresh — Refresh button clicked
|
|
998
|
-
* @event {object} row-click — Table row or card clicked
|
|
1005
|
+
* @event {object} row-click — Table row or card clicked. Payload: (row, event) — the row object and the native click event
|
|
1006
|
+
* @event {object} row-aux-click — Table row or card middle-clicked. Payload: (row, event) — the row object and the native auxclick event
|
|
999
1007
|
* @event {{ key: string, order: string }} sort — Column sort changed
|
|
1000
1008
|
* @event {number} page-changed — Pagination page changed
|
|
1001
1009
|
* @event {number} page-size-changed — Pagination page size changed
|
|
@@ -2568,6 +2576,7 @@ export default {
|
|
|
2568
2576
|
'quick-filter-change',
|
|
2569
2577
|
'refresh',
|
|
2570
2578
|
'row-click',
|
|
2579
|
+
'row-aux-click',
|
|
2571
2580
|
'search',
|
|
2572
2581
|
'select',
|
|
2573
2582
|
'sort',
|
|
@@ -2810,6 +2819,9 @@ export default {
|
|
|
2810
2819
|
* that is what Add does (no host `@add` listener) and the router can
|
|
2811
2820
|
* resolve it. The bar then renders Add as a real link; null otherwise.
|
|
2812
2821
|
*
|
|
2822
|
+
* `$.vnode.props` is not reactive, so an `add` listener attached or
|
|
2823
|
+
* removed after mount does not re-evaluate this.
|
|
2824
|
+
*
|
|
2813
2825
|
* @return {string|object|null}
|
|
2814
2826
|
*/
|
|
2815
2827
|
addLinkTo() {
|
|
@@ -5565,21 +5577,60 @@ export default {
|
|
|
5565
5577
|
/**
|
|
5566
5578
|
* Row/card click: toggles selection when `selectable` (covers the custom
|
|
5567
5579
|
* `cardComponent` path), otherwise emits `row-click` for navigation. A
|
|
5568
|
-
* ctrl/cmd/shift
|
|
5580
|
+
* ctrl/cmd/shift click opens a named source's row in a new tab.
|
|
5569
5581
|
*
|
|
5570
5582
|
* The `@event` block below sits directly against its `$emit`, and must
|
|
5571
5583
|
* stay there. vue-docgen binds an event's description to the emit it
|
|
5572
5584
|
* IMMEDIATELY precedes.
|
|
5573
5585
|
*
|
|
5574
5586
|
* @param {object} row The clicked row object
|
|
5575
|
-
* @param {MouseEvent|KeyboardEvent} [event] The originating click
|
|
5587
|
+
* @param {MouseEvent|KeyboardEvent} [event] The originating click event.
|
|
5576
5588
|
*/
|
|
5577
5589
|
onRowClick(row, event) {
|
|
5590
|
+
if (!this.routeClickedRow(row, event)) {
|
|
5591
|
+
return
|
|
5592
|
+
}
|
|
5593
|
+
/**
|
|
5594
|
+
* @event row-click Emitted on a row/card click for navigation. Fires when `selectable` is false, OR when `rowClickToView` is set and something can open the row (selection then happens via the checkbox). Payload: `(row, event)` — the clicked row and the native click event (absent for a keyboard shortcut or map marker), so a host can open the row in a new tab on a ctrl/cmd/shift click with `openRowTarget`. A middle click emits `row-aux-click` instead.
|
|
5595
|
+
* @type {object} The clicked row object.
|
|
5596
|
+
*/
|
|
5597
|
+
this.$emit('row-click', ...(event ? [row, event] : [row]))
|
|
5598
|
+
},
|
|
5599
|
+
|
|
5600
|
+
/**
|
|
5601
|
+
* Row/card middle click: opens a named source's row in a new tab and
|
|
5602
|
+
* emits `row-aux-click`, not `row-click`, so a host whose `row-click`
|
|
5603
|
+
* listener navigates never moves the current tab away.
|
|
5604
|
+
*
|
|
5605
|
+
* @param {object} row The clicked row object
|
|
5606
|
+
* @param {MouseEvent} event The originating auxclick event.
|
|
5607
|
+
*/
|
|
5608
|
+
onRowAuxClick(row, event) {
|
|
5609
|
+
if (!this.routeClickedRow(row, event)) {
|
|
5610
|
+
return
|
|
5611
|
+
}
|
|
5612
|
+
/**
|
|
5613
|
+
* @event row-aux-click Emitted on a row/card middle click, under the same conditions as `row-click`, so a host can open the row in a new tab with `openRowTarget`. Payload: `(row, event)` — the clicked row and the native auxclick event.
|
|
5614
|
+
* @type {object} The clicked row object.
|
|
5615
|
+
*/
|
|
5616
|
+
this.$emit('row-aux-click', row, event)
|
|
5617
|
+
},
|
|
5618
|
+
|
|
5619
|
+
/**
|
|
5620
|
+
* The shared part of a row click and a middle click: on a selectable
|
|
5621
|
+
* page a plain click toggles selection instead, and a named source opens
|
|
5622
|
+
* its own row.
|
|
5623
|
+
*
|
|
5624
|
+
* @param {object} row The clicked row object
|
|
5625
|
+
* @param {MouseEvent|KeyboardEvent} [event] The originating event.
|
|
5626
|
+
* @return {boolean} Whether the click navigates, so the caller emits.
|
|
5627
|
+
*/
|
|
5628
|
+
routeClickedRow(row, event) {
|
|
5578
5629
|
if (this.selectable && !this.rowClickOpens) {
|
|
5579
5630
|
if (!event || event.button === undefined || event.button === 0) {
|
|
5580
5631
|
this.onSelect(this.toggleIdInArray(this.internalSelectedIds, row[this.rowKey]))
|
|
5581
5632
|
}
|
|
5582
|
-
return
|
|
5633
|
+
return false
|
|
5583
5634
|
}
|
|
5584
5635
|
// A named source knows where its rows live. Emitting only would leave
|
|
5585
5636
|
// the click inert on a manifest page, which has no listener to bind —
|
|
@@ -5626,11 +5677,7 @@ export default {
|
|
|
5626
5677
|
}
|
|
5627
5678
|
}
|
|
5628
5679
|
}
|
|
5629
|
-
|
|
5630
|
-
* @event row-click Emitted on a row/card click (or middle click) for navigation. Fires when `selectable` is false, OR when `rowClickToView` is set and something can open the row (selection then happens via the checkbox). Payload: `(row, event)` — the clicked row and the native click/auxclick event (absent for a keyboard shortcut or map marker), so a host can open the row in a new tab on a ctrl/cmd/shift or middle click with `openRowTarget`.
|
|
5631
|
-
* @type {object} The clicked row object.
|
|
5632
|
-
*/
|
|
5633
|
-
this.$emit('row-click', ...(event ? [row, event] : [row]))
|
|
5680
|
+
return true
|
|
5634
5681
|
},
|
|
5635
5682
|
|
|
5636
5683
|
/**
|
|
@@ -5644,17 +5691,31 @@ export default {
|
|
|
5644
5691
|
return typeof Event !== 'undefined' && value instanceof Event
|
|
5645
5692
|
},
|
|
5646
5693
|
|
|
5694
|
+
/**
|
|
5695
|
+
* Mousedown on a custom list/card component's root: when a middle click
|
|
5696
|
+
* opens the row, keep the browser from starting autoscroll.
|
|
5697
|
+
*
|
|
5698
|
+
* @param {MouseEvent} event The mousedown event.
|
|
5699
|
+
* @return {void}
|
|
5700
|
+
*/
|
|
5701
|
+
onCustomItemMouseDown(event) {
|
|
5702
|
+
if (!this.selectable || this.rowClickOpens) {
|
|
5703
|
+
preventMiddleClickAutoscroll(event)
|
|
5704
|
+
}
|
|
5705
|
+
},
|
|
5706
|
+
|
|
5647
5707
|
/**
|
|
5648
5708
|
* Middle click on a custom list/card component's root: open the row
|
|
5649
|
-
* like a click would.
|
|
5709
|
+
* like a middle click on a built-in card would. Skipped when something
|
|
5710
|
+
* inside the component already opened it in a new tab.
|
|
5650
5711
|
*
|
|
5651
5712
|
* @param {object} row The component's row.
|
|
5652
5713
|
* @param {MouseEvent} event The auxclick event.
|
|
5653
5714
|
* @return {void}
|
|
5654
5715
|
*/
|
|
5655
5716
|
onCustomItemAuxClick(row, event) {
|
|
5656
|
-
if (isRowMiddleClick(event)) {
|
|
5657
|
-
this.
|
|
5717
|
+
if (isRowMiddleClick(event) && !isNewTabHandled(event)) {
|
|
5718
|
+
this.onRowAuxClick(row, event)
|
|
5658
5719
|
}
|
|
5659
5720
|
},
|
|
5660
5721
|
|
|
@@ -37,19 +37,39 @@ function resolveRowToken(value, row) {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
|
-
* The
|
|
41
|
-
*
|
|
42
|
-
*
|
|
40
|
+
* The implicit `{ id }` param for a row, only when the named route declares
|
|
41
|
+
* `:id`: vue-router warns about (and drops) a param its path does not take.
|
|
42
|
+
* Without a router to ask, or for a route it does not know, the id is kept.
|
|
43
43
|
*
|
|
44
|
-
* @param {object}
|
|
44
|
+
* @param {object} [router] The app's router.
|
|
45
|
+
* @param {string} name The route name.
|
|
45
46
|
* @param {object} row The row.
|
|
46
47
|
* @param {string} rowKey The row's id field.
|
|
48
|
+
* @return {object} `{ id }`, or an empty object.
|
|
49
|
+
*/
|
|
50
|
+
function rowIdParam(router, name, row, rowKey) {
|
|
51
|
+
const routes = typeof router?.getRoutes === 'function' ? router.getRoutes() : null
|
|
52
|
+
const route = routes ? routes.find((r) => r.name === name) : null
|
|
53
|
+
if (route && !/:id\b/.test(route.path)) {
|
|
54
|
+
return {}
|
|
55
|
+
}
|
|
56
|
+
return { id: row?.[rowKey] }
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The route params a `handler: "navigate"` action pushes for a row: the row id
|
|
61
|
+
* (when the route takes one), overridden by the declared `params` after the
|
|
62
|
+
* `{field}` token grammar. A token naming a field the row lacks is dropped.
|
|
63
|
+
*
|
|
64
|
+
* @param {object} action Manifest action descriptor.
|
|
65
|
+
* @param {object} row The row.
|
|
66
|
+
* @param {object} ctx Dispatch context (`rowKey`, `router`).
|
|
47
67
|
* @param {boolean} warn Whether to warn about a dropped param.
|
|
48
68
|
* @return {object} The params.
|
|
49
69
|
*/
|
|
50
|
-
function navigateParams(action, row,
|
|
70
|
+
function navigateParams(action, row, ctx, warn) {
|
|
51
71
|
const declaredParams = (action.params && typeof action.params === 'object') ? action.params : null
|
|
52
|
-
const params =
|
|
72
|
+
const params = rowIdParam(ctx.router, action.route, row, ctx.rowKey)
|
|
53
73
|
for (const [key, declared] of Object.entries(declaredParams || {})) {
|
|
54
74
|
const { resolved, value } = resolveRowToken(declared, row)
|
|
55
75
|
if (resolved) {
|
|
@@ -88,7 +108,7 @@ export function resolveActionTarget(action, row, ctx, warn = false) {
|
|
|
88
108
|
return null
|
|
89
109
|
}
|
|
90
110
|
if (type === 'open-page') {
|
|
91
|
-
return { target: { name: target, params:
|
|
111
|
+
return { target: { name: target, params: rowIdParam(ctx.router, target, row, ctx.rowKey) }, external: false }
|
|
92
112
|
}
|
|
93
113
|
return { target, external: isExternalActionTarget(target) }
|
|
94
114
|
}
|
|
@@ -96,7 +116,7 @@ export function resolveActionTarget(action, row, ctx, warn = false) {
|
|
|
96
116
|
if (typeof action.route !== 'string' || action.route.length === 0) {
|
|
97
117
|
return null
|
|
98
118
|
}
|
|
99
|
-
return { target: { name: action.route, params: navigateParams(action, row, ctx
|
|
119
|
+
return { target: { name: action.route, params: navigateParams(action, row, ctx, warn) }, external: false }
|
|
100
120
|
}
|
|
101
121
|
return null
|
|
102
122
|
}
|
|
@@ -115,8 +135,8 @@ export function resolveActionTarget(action, row, ctx, warn = false) {
|
|
|
115
135
|
* - `open-modal` → not wired for index actions; falls back to `@action`.
|
|
116
136
|
*
|
|
117
137
|
* Handler dispatch (`type: 'handler'`, the default) reads `action.handler`:
|
|
118
|
-
* - `navigate` → $router.push to `action.route` with `{ id: row[rowKey] }
|
|
119
|
-
* merged with the `action.params` map (declared params win — so a
|
|
138
|
+
* - `navigate` → $router.push to `action.route` with `{ id: row[rowKey] }`
|
|
139
|
+
* (when the route declares `:id`), merged with the `action.params` map (declared params win — so a
|
|
120
140
|
* "New X" action can navigate to a detail route with `{ id: "new" }`).
|
|
121
141
|
* Param strings run the `{field}` row-token grammar: `"{id}"` resolves to
|
|
122
142
|
* `row.id` (type preserved), `"item-{id}"` interpolates, and a brace-less
|
|
@@ -187,7 +207,7 @@ export function resolveActionHandler(action, ctx) {
|
|
|
187
207
|
// `{field}` row-token grammar first — an unresolved token is dropped
|
|
188
208
|
// rather than pushed as a literal `%7Bid%7D` path segment.
|
|
189
209
|
return (row) => {
|
|
190
|
-
ctx.router.push({ name: route, params: navigateParams(action, row, ctx
|
|
210
|
+
ctx.router.push({ name: route, params: navigateParams(action, row, ctx, true) })
|
|
191
211
|
}
|
|
192
212
|
}
|
|
193
213
|
|
|
@@ -420,10 +420,9 @@ export default {
|
|
|
420
420
|
* @return {void}
|
|
421
421
|
*/
|
|
422
422
|
dispatchAction({ actionType, url, value }) {
|
|
423
|
+
// An `external` entry with a URL is a real link (see linkAttrsFor);
|
|
424
|
+
// one without a URL has nothing to open.
|
|
423
425
|
switch (actionType) {
|
|
424
|
-
case ACTION_TYPES.EXTERNAL:
|
|
425
|
-
this.handleExternal(url)
|
|
426
|
-
break
|
|
427
426
|
case ACTION_TYPES.INTERNAL:
|
|
428
427
|
this.$emit('internal-action', url)
|
|
429
428
|
break
|
|
@@ -434,20 +433,6 @@ export default {
|
|
|
434
433
|
break
|
|
435
434
|
}
|
|
436
435
|
},
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* Open an external URL in a new tab; `noopener,noreferrer` prevents
|
|
440
|
-
* the opened page reaching back via `window.opener`.
|
|
441
|
-
*
|
|
442
|
-
* @param {string} url the URL to open.
|
|
443
|
-
* @return {void}
|
|
444
|
-
*/
|
|
445
|
-
handleExternal(url) {
|
|
446
|
-
if (typeof url !== 'string' || url === '') {
|
|
447
|
-
return
|
|
448
|
-
}
|
|
449
|
-
window.open(url, '_blank', 'noopener,noreferrer')
|
|
450
|
-
},
|
|
451
436
|
},
|
|
452
437
|
}
|
|
453
438
|
</script>
|
|
@@ -89,7 +89,8 @@
|
|
|
89
89
|
:sortKeys="effectiveSortKeys"
|
|
90
90
|
:emptyText="emptyText"
|
|
91
91
|
@sort="onSort"
|
|
92
|
-
@rowClick="onRowClick"
|
|
92
|
+
@rowClick="onRowClick"
|
|
93
|
+
@rowAuxClick="onRowAuxClick">
|
|
93
94
|
<template
|
|
94
95
|
v-for="col in slotColumns"
|
|
95
96
|
#[`column-${col}`]="{ row, value }">
|
|
@@ -484,14 +485,21 @@ export default {
|
|
|
484
485
|
*/
|
|
485
486
|
'action',
|
|
486
487
|
/**
|
|
487
|
-
* @event row-click Emitted when a log row's body is clicked or
|
|
488
|
-
*
|
|
489
|
-
*
|
|
490
|
-
*
|
|
491
|
-
*
|
|
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
|
|
998
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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="
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
1418
|
-
*
|
|
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
|
|
1423
|
+
* @param {MouseEvent} [event] The originating click event.
|
|
1422
1424
|
* @return {void}
|
|
1423
1425
|
*/
|
|
1424
1426
|
onRowClick(row, event) {
|
|
1425
|
-
|
|
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)
|
|
1433
|
-
*
|
|
1434
|
-
*
|
|
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
|
-
|
|
1469
|
-
if (/[@{]/.test(target)) {
|
|
1501
|
+
if (hasActionTargetTokens(action.target)) {
|
|
1470
1502
|
return {}
|
|
1471
1503
|
}
|
|
1472
1504
|
const link = actionLink(action, { router: this.$router || null })
|