@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.
- 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/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/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 +1 -0
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +1 -0
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +71 -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/nextcloud-vue.cjs.js +809 -383
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +71 -7
- package/l10n/en.json +1 -0
- package/l10n/nl.json +1 -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/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/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/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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnObjectList.vue2.js","sources":["../../../../src/components/CnObjectList/CnObjectList.vue"],"sourcesContent":["<template>\n\t<div class=\"cn-object-list\">\n\t\t<!-- Loading state -->\n\t\t<div v-if=\"loading\" class=\"cn-object-list__loading\">\n\t\t\t<NcLoadingIcon :size=\"32\" />\n\t\t</div>\n\n\t\t<!-- Empty state -->\n\t\t<div v-else-if=\"objects.length === 0\" class=\"cn-object-list__empty\">\n\t\t\t<!-- @slot empty Custom empty state shown when there are no objects. -->\n\t\t\t<slot name=\"empty\">\n\t\t\t\t<NcEmptyContent :name=\"resolvedEmptyText\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<FormatListBulletedSquare :size=\"64\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcEmptyContent>\n\t\t\t</slot>\n\t\t</div>\n\n\t\t<!-- Rows -->\n\t\t<div v-else class=\"cn-object-list__rows\">\n\t\t\t<div\n\t\t\t\tv-for=\"object in objects\"\n\t\t\t\t:key=\"object[rowKey]\"\n\t\t\t\tclass=\"cn-object-list__item\">\n\t\t\t\t<!-- @slot list-item Fully replace the default row (bypasses CnObjectRow). -->\n\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t<!-- @binding {boolean} selected Whether the row is selected. -->\n\t\t\t\t<!-- @binding {?object} schema The schema prop. -->\n\t\t\t\t<!-- @binding {object} config The config prop. -->\n\t\t\t\t<slot\n\t\t\t\t\tname=\"list-item\"\n\t\t\t\t\t:object=\"object\"\n\t\t\t\t\t:selected=\"isSelected(object)\"\n\t\t\t\t\t:schema=\"schema\"\n\t\t\t\t\t:config=\"config\">\n\t\t\t\t\t<CnObjectRow\n\t\t\t\t\t\t:object=\"object\"\n\t\t\t\t\t\t:schema=\"schema\"\n\t\t\t\t\t\t:config=\"config\"\n\t\t\t\t\t\t:selectable=\"selectable\"\n\t\t\t\t\t\t:selected=\"isSelected(object)\"\n\t\t\t\t\t\tv-on=\"rowListeners(object)\">\n\t\t\t\t\t\t<template v-if=\"$slots['row-actions']\" #actions=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-actions Trailing actions on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-actions\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"$slots['row-badges']\" #badges=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-badges Badge area on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-badges\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"$slots['row-icon']\" #icon=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-icon Leading icon/image on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-icon\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</CnObjectRow>\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport { CnObjectRow } from '../CnObjectRow/index.js'\n\n/**\n * CnObjectList — Vertical list container for CnObjectRow instances.\n *\n * The list-mode counterpart to `CnCardGrid`. Renders objects as compact\n * single-line rows, with selection, loading/empty states, and full row\n * override via the `#list-item` slot (or per-part `#row-icon` / `#row-badges`\n * / `#row-actions` slots on the default row).\n *\n * ```vue\n * <CnObjectList\n * :objects=\"secrets\"\n * :schema=\"secretSchema\"\n * :config=\"{ subtitleField: 'url', iconName: 'Key' }\"\n * @click=\"openSecret\">\n * <template #row-actions=\"{ object }\">\n * <NcButton @click=\"copy(object)\">Copy</NcButton>\n * </template>\n * </CnObjectList>\n * ```\n */\nexport default {\n\tname: 'CnObjectList',\n\n\tcomponents: {\n\t\tNcLoadingIcon,\n\t\tNcEmptyContent,\n\t\tFormatListBulletedSquare,\n\t\tCnObjectRow,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored empty-state copy is run through it. Defaults to\n\t\t * an identity function so an untranslated key renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Array of objects to display as rows */\n\t\tobjects: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Schema definition (passed through to CnObjectRow) */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Field-mapping config passed through to CnObjectRow.\n\t\t *\n\t\t * @type {{ titleField?: string, subtitleField?: string, imageField?: string, iconField?: string, iconName?: string, badgeField?: string, badgeVariantField?: string, badgeVariant?: string, badgeColorMap?: object }}\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Whether data is loading */\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether rows can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Array of currently selected object IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Property name used as unique identifier */\n\t\trowKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'id',\n\t\t},\n\n\t\t/** Text shown when there are no objects */\n\t\temptyText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No items found'),\n\t\t},\n\t},\n\n\temits: ['click', 'select'],\n\n\tcomputed: {\n\t\t/**\n\t\t * The empty-state copy run through the host translate function.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tresolvedEmptyText() {\n\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\treturn this.emptyText ? fn(this.emptyText) : this.emptyText\n\t\t},\n\t},\n\n\tmethods: {\n\t\tisSelected(object) {\n\t\t\treturn this.selectedIds.includes(object[this.rowKey])\n\t\t},\n\n\t\t/**\n\t\t * Listeners bound on each CnObjectRow. Selectable rows select via\n\t\t * `@select` only; the `@click` (navigation) listener is bound only for\n\t\t * non-selectable rows.\n\t\t *\n\t\t * @param {object} object The row's object.\n\t\t * @return {object} Event listeners for the row.\n\t\t */\n\t\trowListeners(object) {\n\t\t\tconst listeners = { select: () => this.toggleSelect(object) }\n\t\t\tif (!this.selectable) {\n\t\t\t\tlisteners.click = (_row, event) => this.emitClick(object, event)\n\t\t\t}\n\t\t\treturn listeners\n\t\t},\n\n\t\t/**\n\t\t * Emit `click` for a non-selectable row (navigation).\n\t\t *\n\t\t * @param {object} object The clicked row's object.\n\t\t * @param {MouseEvent} [event] The native click/auxclick event.\n\t\t */\n\t\temitClick(object, event) {\n\t\t\t/**\n\t\t\t * @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.\n\t\t\t * @type {object} The clicked row's object.\n\t\t\t */\n\t\t\tthis.$emit('click', object, event)\n\t\t},\n\n\t\ttoggleSelect(object) {\n\t\t\tconst id = object[this.rowKey]\n\t\t\tconst newIds = this.isSelected(object)\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\n\t\t\t\t: [...this.selectedIds, id]\n\t\t\t/**\n\t\t\t * @event select Emitted when the selected-id set changes.\n\t\t\t * @type {Array<string|number>} The new array of selected ids.\n\t\t\t */\n\t\t\tthis.$emit('select', newIds)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-object-list__rows {\n\tdisplay: flex;\n\tflex-direction: column;\n\tborder-top: 1px solid var(--color-border);\n}\n\n/* A list-item slot whose component renders nothing (e.g. a v-if client-side\n filter) still matches :empty per the CSS spec — collapse it so it leaves no\n ghost row / divider. */\n.cn-object-list__item:empty {\n\tdisplay: none;\n}\n\n.cn-object-list__loading {\n\tdisplay: flex;\n\tjustify-content: center;\n\tpadding: 40px;\n}\n\n.cn-object-list__empty {\n\tpadding: 40px 20px;\n\ttext-align: center;\n}\n</style>\n"],"names":["CnObjectRow","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnObjectList.vue2.js","sources":["../../../../src/components/CnObjectList/CnObjectList.vue"],"sourcesContent":["<template>\n\t<div class=\"cn-object-list\">\n\t\t<!-- Loading state -->\n\t\t<div v-if=\"loading\" class=\"cn-object-list__loading\">\n\t\t\t<NcLoadingIcon :size=\"32\" />\n\t\t</div>\n\n\t\t<!-- Empty state -->\n\t\t<div v-else-if=\"objects.length === 0\" class=\"cn-object-list__empty\">\n\t\t\t<!-- @slot empty Custom empty state shown when there are no objects. -->\n\t\t\t<slot name=\"empty\">\n\t\t\t\t<NcEmptyContent :name=\"resolvedEmptyText\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<FormatListBulletedSquare :size=\"64\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcEmptyContent>\n\t\t\t</slot>\n\t\t</div>\n\n\t\t<!-- Rows -->\n\t\t<div v-else class=\"cn-object-list__rows\">\n\t\t\t<div\n\t\t\t\tv-for=\"object in objects\"\n\t\t\t\t:key=\"object[rowKey]\"\n\t\t\t\tclass=\"cn-object-list__item\">\n\t\t\t\t<!-- @slot list-item Fully replace the default row (bypasses CnObjectRow). -->\n\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t<!-- @binding {boolean} selected Whether the row is selected. -->\n\t\t\t\t<!-- @binding {?object} schema The schema prop. -->\n\t\t\t\t<!-- @binding {object} config The config prop. -->\n\t\t\t\t<slot\n\t\t\t\t\tname=\"list-item\"\n\t\t\t\t\t:object=\"object\"\n\t\t\t\t\t:selected=\"isSelected(object)\"\n\t\t\t\t\t:schema=\"schema\"\n\t\t\t\t\t:config=\"config\">\n\t\t\t\t\t<CnObjectRow\n\t\t\t\t\t\t:object=\"object\"\n\t\t\t\t\t\t:schema=\"schema\"\n\t\t\t\t\t\t:config=\"config\"\n\t\t\t\t\t\t:selectable=\"selectable\"\n\t\t\t\t\t\t:selected=\"isSelected(object)\"\n\t\t\t\t\t\tv-on=\"rowListeners(object)\">\n\t\t\t\t\t\t<template v-if=\"$slots['row-actions']\" #actions=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-actions Trailing actions on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-actions\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"$slots['row-badges']\" #badges=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-badges Badge area on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-badges\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"$slots['row-icon']\" #icon=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-icon Leading icon/image on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-icon\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</CnObjectRow>\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport { CnObjectRow } from '../CnObjectRow/index.js'\n\n/**\n * CnObjectList — Vertical list container for CnObjectRow instances.\n *\n * The list-mode counterpart to `CnCardGrid`. Renders objects as compact\n * single-line rows, with selection, loading/empty states, and full row\n * override via the `#list-item` slot (or per-part `#row-icon` / `#row-badges`\n * / `#row-actions` slots on the default row).\n *\n * ```vue\n * <CnObjectList\n * :objects=\"secrets\"\n * :schema=\"secretSchema\"\n * :config=\"{ subtitleField: 'url', iconName: 'Key' }\"\n * @click=\"openSecret\">\n * <template #row-actions=\"{ object }\">\n * <NcButton @click=\"copy(object)\">Copy</NcButton>\n * </template>\n * </CnObjectList>\n * ```\n */\nexport default {\n\tname: 'CnObjectList',\n\n\tcomponents: {\n\t\tNcLoadingIcon,\n\t\tNcEmptyContent,\n\t\tFormatListBulletedSquare,\n\t\tCnObjectRow,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored empty-state copy is run through it. Defaults to\n\t\t * an identity function so an untranslated key renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Array of objects to display as rows */\n\t\tobjects: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Schema definition (passed through to CnObjectRow) */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Field-mapping config passed through to CnObjectRow.\n\t\t *\n\t\t * @type {{ titleField?: string, subtitleField?: string, imageField?: string, iconField?: string, iconName?: string, badgeField?: string, badgeVariantField?: string, badgeVariant?: string, badgeColorMap?: object }}\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Whether data is loading */\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether rows can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Array of currently selected object IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Property name used as unique identifier */\n\t\trowKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'id',\n\t\t},\n\n\t\t/** Text shown when there are no objects */\n\t\temptyText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No items found'),\n\t\t},\n\t},\n\n\temits: ['click', 'select', 'aux-click'],\n\n\tcomputed: {\n\t\t/**\n\t\t * The empty-state copy run through the host translate function.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tresolvedEmptyText() {\n\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\treturn this.emptyText ? fn(this.emptyText) : this.emptyText\n\t\t},\n\t},\n\n\tmethods: {\n\t\tisSelected(object) {\n\t\t\treturn this.selectedIds.includes(object[this.rowKey])\n\t\t},\n\n\t\t/**\n\t\t * Listeners bound on each CnObjectRow. Selectable rows select via\n\t\t * `@select` only; the `@click` (navigation) listener is bound only for\n\t\t * non-selectable rows.\n\t\t *\n\t\t * @param {object} object The row's object.\n\t\t * @return {object} Event listeners for the row.\n\t\t */\n\t\trowListeners(object) {\n\t\t\tconst listeners = { select: () => this.toggleSelect(object) }\n\t\t\tif (!this.selectable) {\n\t\t\t\tlisteners.click = (_row, event) => this.emitClick(object, event)\n\t\t\t\tlisteners['aux-click'] = (_row, event) => this.emitAuxClick(object, event)\n\t\t\t}\n\t\t\treturn listeners\n\t\t},\n\n\t\t/**\n\t\t * Emit `click` for a non-selectable row (navigation).\n\t\t *\n\t\t * @param {object} object The clicked row's object.\n\t\t * @param {MouseEvent} [event] The native click event.\n\t\t */\n\t\temitClick(object, event) {\n\t\t\t/**\n\t\t\t * @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.\n\t\t\t * @type {object} The clicked row's object.\n\t\t\t */\n\t\t\tthis.$emit('click', object, event)\n\t\t},\n\n\t\t/**\n\t\t * Emit `aux-click` for a middle click on a non-selectable row, kept off\n\t\t * `click` so a navigating listener never moves the current tab away.\n\t\t *\n\t\t * @param {object} object The clicked row's object.\n\t\t * @param {MouseEvent} event The native auxclick event.\n\t\t */\n\t\temitAuxClick(object, event) {\n\t\t\t/**\n\t\t\t * @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.\n\t\t\t * @type {object} The clicked row's object.\n\t\t\t */\n\t\t\tthis.$emit('aux-click', object, event)\n\t\t},\n\n\t\ttoggleSelect(object) {\n\t\t\tconst id = object[this.rowKey]\n\t\t\tconst newIds = this.isSelected(object)\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\n\t\t\t\t: [...this.selectedIds, id]\n\t\t\t/**\n\t\t\t * @event select Emitted when the selected-id set changes.\n\t\t\t * @type {Array<string|number>} The new array of selected ids.\n\t\t\t */\n\t\t\tthis.$emit('select', newIds)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-object-list__rows {\n\tdisplay: flex;\n\tflex-direction: column;\n\tborder-top: 1px solid var(--color-border);\n}\n\n/* A list-item slot whose component renders nothing (e.g. a v-if client-side\n filter) still matches :empty per the CSS spec — collapse it so it leaves no\n ghost row / divider. */\n.cn-object-list__item:empty {\n\tdisplay: none;\n}\n\n.cn-object-list__loading {\n\tdisplay: flex;\n\tjustify-content: center;\n\tpadding: 40px;\n}\n\n.cn-object-list__empty {\n\tpadding: 40px 20px;\n\ttext-align: center;\n}\n</style>\n"],"names":["CnObjectRow","t"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnObjectList.vue3.js","sources":["../../../../src/components/CnObjectList/CnObjectList.vue?vue&type=template&id=f55c7962&lang.js"],"sourcesContent":["<template>\n\t<div class=\"cn-object-list\">\n\t\t<!-- Loading state -->\n\t\t<div v-if=\"loading\" class=\"cn-object-list__loading\">\n\t\t\t<NcLoadingIcon :size=\"32\" />\n\t\t</div>\n\n\t\t<!-- Empty state -->\n\t\t<div v-else-if=\"objects.length === 0\" class=\"cn-object-list__empty\">\n\t\t\t<!-- @slot empty Custom empty state shown when there are no objects. -->\n\t\t\t<slot name=\"empty\">\n\t\t\t\t<NcEmptyContent :name=\"resolvedEmptyText\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<FormatListBulletedSquare :size=\"64\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcEmptyContent>\n\t\t\t</slot>\n\t\t</div>\n\n\t\t<!-- Rows -->\n\t\t<div v-else class=\"cn-object-list__rows\">\n\t\t\t<div\n\t\t\t\tv-for=\"object in objects\"\n\t\t\t\t:key=\"object[rowKey]\"\n\t\t\t\tclass=\"cn-object-list__item\">\n\t\t\t\t<!-- @slot list-item Fully replace the default row (bypasses CnObjectRow). -->\n\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t<!-- @binding {boolean} selected Whether the row is selected. -->\n\t\t\t\t<!-- @binding {?object} schema The schema prop. -->\n\t\t\t\t<!-- @binding {object} config The config prop. -->\n\t\t\t\t<slot\n\t\t\t\t\tname=\"list-item\"\n\t\t\t\t\t:object=\"object\"\n\t\t\t\t\t:selected=\"isSelected(object)\"\n\t\t\t\t\t:schema=\"schema\"\n\t\t\t\t\t:config=\"config\">\n\t\t\t\t\t<CnObjectRow\n\t\t\t\t\t\t:object=\"object\"\n\t\t\t\t\t\t:schema=\"schema\"\n\t\t\t\t\t\t:config=\"config\"\n\t\t\t\t\t\t:selectable=\"selectable\"\n\t\t\t\t\t\t:selected=\"isSelected(object)\"\n\t\t\t\t\t\tv-on=\"rowListeners(object)\">\n\t\t\t\t\t\t<template v-if=\"$slots['row-actions']\" #actions=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-actions Trailing actions on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-actions\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"$slots['row-badges']\" #badges=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-badges Badge area on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-badges\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"$slots['row-icon']\" #icon=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-icon Leading icon/image on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-icon\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</CnObjectRow>\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport { CnObjectRow } from '../CnObjectRow/index.js'\n\n/**\n * CnObjectList — Vertical list container for CnObjectRow instances.\n *\n * The list-mode counterpart to `CnCardGrid`. Renders objects as compact\n * single-line rows, with selection, loading/empty states, and full row\n * override via the `#list-item` slot (or per-part `#row-icon` / `#row-badges`\n * / `#row-actions` slots on the default row).\n *\n * ```vue\n * <CnObjectList\n * :objects=\"secrets\"\n * :schema=\"secretSchema\"\n * :config=\"{ subtitleField: 'url', iconName: 'Key' }\"\n * @click=\"openSecret\">\n * <template #row-actions=\"{ object }\">\n * <NcButton @click=\"copy(object)\">Copy</NcButton>\n * </template>\n * </CnObjectList>\n * ```\n */\nexport default {\n\tname: 'CnObjectList',\n\n\tcomponents: {\n\t\tNcLoadingIcon,\n\t\tNcEmptyContent,\n\t\tFormatListBulletedSquare,\n\t\tCnObjectRow,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored empty-state copy is run through it. Defaults to\n\t\t * an identity function so an untranslated key renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Array of objects to display as rows */\n\t\tobjects: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Schema definition (passed through to CnObjectRow) */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Field-mapping config passed through to CnObjectRow.\n\t\t *\n\t\t * @type {{ titleField?: string, subtitleField?: string, imageField?: string, iconField?: string, iconName?: string, badgeField?: string, badgeVariantField?: string, badgeVariant?: string, badgeColorMap?: object }}\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Whether data is loading */\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether rows can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Array of currently selected object IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Property name used as unique identifier */\n\t\trowKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'id',\n\t\t},\n\n\t\t/** Text shown when there are no objects */\n\t\temptyText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No items found'),\n\t\t},\n\t},\n\n\temits: ['click', 'select'],\n\n\tcomputed: {\n\t\t/**\n\t\t * The empty-state copy run through the host translate function.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tresolvedEmptyText() {\n\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\treturn this.emptyText ? fn(this.emptyText) : this.emptyText\n\t\t},\n\t},\n\n\tmethods: {\n\t\tisSelected(object) {\n\t\t\treturn this.selectedIds.includes(object[this.rowKey])\n\t\t},\n\n\t\t/**\n\t\t * Listeners bound on each CnObjectRow. Selectable rows select via\n\t\t * `@select` only; the `@click` (navigation) listener is bound only for\n\t\t * non-selectable rows.\n\t\t *\n\t\t * @param {object} object The row's object.\n\t\t * @return {object} Event listeners for the row.\n\t\t */\n\t\trowListeners(object) {\n\t\t\tconst listeners = { select: () => this.toggleSelect(object) }\n\t\t\tif (!this.selectable) {\n\t\t\t\tlisteners.click = (_row, event) => this.emitClick(object, event)\n\t\t\t}\n\t\t\treturn listeners\n\t\t},\n\n\t\t/**\n\t\t * Emit `click` for a non-selectable row (navigation).\n\t\t *\n\t\t * @param {object} object The clicked row's object.\n\t\t * @param {MouseEvent} [event] The native click/auxclick event.\n\t\t */\n\t\temitClick(object, event) {\n\t\t\t/**\n\t\t\t * @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.\n\t\t\t * @type {object} The clicked row's object.\n\t\t\t */\n\t\t\tthis.$emit('click', object, event)\n\t\t},\n\n\t\ttoggleSelect(object) {\n\t\t\tconst id = object[this.rowKey]\n\t\t\tconst newIds = this.isSelected(object)\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\n\t\t\t\t: [...this.selectedIds, id]\n\t\t\t/**\n\t\t\t * @event select Emitted when the selected-id set changes.\n\t\t\t * @type {Array<string|number>} The new array of selected ids.\n\t\t\t */\n\t\t\tthis.$emit('select', newIds)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-object-list__rows {\n\tdisplay: flex;\n\tflex-direction: column;\n\tborder-top: 1px solid var(--color-border);\n}\n\n/* A list-item slot whose component renders nothing (e.g. a v-if client-side\n filter) still matches :empty per the CSS spec — collapse it so it leaves no\n ghost row / divider. */\n.cn-object-list__item:empty {\n\tdisplay: none;\n}\n\n.cn-object-list__loading {\n\tdisplay: flex;\n\tjustify-content: center;\n\tpadding: 40px;\n}\n\n.cn-object-list__empty {\n\tpadding: 40px 20px;\n\ttext-align: center;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createVNode","_renderSlot","_Fragment","_renderList","_mergeProps","_toHandlers","_createSlots","_withCtx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnObjectList.vue3.js","sources":["../../../../src/components/CnObjectList/CnObjectList.vue?vue&type=template&id=f55c7962&lang.js"],"sourcesContent":["<template>\n\t<div class=\"cn-object-list\">\n\t\t<!-- Loading state -->\n\t\t<div v-if=\"loading\" class=\"cn-object-list__loading\">\n\t\t\t<NcLoadingIcon :size=\"32\" />\n\t\t</div>\n\n\t\t<!-- Empty state -->\n\t\t<div v-else-if=\"objects.length === 0\" class=\"cn-object-list__empty\">\n\t\t\t<!-- @slot empty Custom empty state shown when there are no objects. -->\n\t\t\t<slot name=\"empty\">\n\t\t\t\t<NcEmptyContent :name=\"resolvedEmptyText\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<FormatListBulletedSquare :size=\"64\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcEmptyContent>\n\t\t\t</slot>\n\t\t</div>\n\n\t\t<!-- Rows -->\n\t\t<div v-else class=\"cn-object-list__rows\">\n\t\t\t<div\n\t\t\t\tv-for=\"object in objects\"\n\t\t\t\t:key=\"object[rowKey]\"\n\t\t\t\tclass=\"cn-object-list__item\">\n\t\t\t\t<!-- @slot list-item Fully replace the default row (bypasses CnObjectRow). -->\n\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t<!-- @binding {boolean} selected Whether the row is selected. -->\n\t\t\t\t<!-- @binding {?object} schema The schema prop. -->\n\t\t\t\t<!-- @binding {object} config The config prop. -->\n\t\t\t\t<slot\n\t\t\t\t\tname=\"list-item\"\n\t\t\t\t\t:object=\"object\"\n\t\t\t\t\t:selected=\"isSelected(object)\"\n\t\t\t\t\t:schema=\"schema\"\n\t\t\t\t\t:config=\"config\">\n\t\t\t\t\t<CnObjectRow\n\t\t\t\t\t\t:object=\"object\"\n\t\t\t\t\t\t:schema=\"schema\"\n\t\t\t\t\t\t:config=\"config\"\n\t\t\t\t\t\t:selectable=\"selectable\"\n\t\t\t\t\t\t:selected=\"isSelected(object)\"\n\t\t\t\t\t\tv-on=\"rowListeners(object)\">\n\t\t\t\t\t\t<template v-if=\"$slots['row-actions']\" #actions=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-actions Trailing actions on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-actions\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"$slots['row-badges']\" #badges=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-badges Badge area on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-badges\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"$slots['row-icon']\" #icon=\"{ object: obj }\">\n\t\t\t\t\t\t\t<!-- @slot row-icon Leading icon/image on the default row. -->\n\t\t\t\t\t\t\t<!-- @binding {object} object The row's object. -->\n\t\t\t\t\t\t\t<slot name=\"row-icon\" :object=\"obj\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</CnObjectRow>\n\t\t\t\t</slot>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'\nimport FormatListBulletedSquare from 'vue-material-design-icons/FormatListBulletedSquare.vue'\nimport { CnObjectRow } from '../CnObjectRow/index.js'\n\n/**\n * CnObjectList — Vertical list container for CnObjectRow instances.\n *\n * The list-mode counterpart to `CnCardGrid`. Renders objects as compact\n * single-line rows, with selection, loading/empty states, and full row\n * override via the `#list-item` slot (or per-part `#row-icon` / `#row-badges`\n * / `#row-actions` slots on the default row).\n *\n * ```vue\n * <CnObjectList\n * :objects=\"secrets\"\n * :schema=\"secretSchema\"\n * :config=\"{ subtitleField: 'url', iconName: 'Key' }\"\n * @click=\"openSecret\">\n * <template #row-actions=\"{ object }\">\n * <NcButton @click=\"copy(object)\">Copy</NcButton>\n * </template>\n * </CnObjectList>\n * ```\n */\nexport default {\n\tname: 'CnObjectList',\n\n\tcomponents: {\n\t\tNcLoadingIcon,\n\t\tNcEmptyContent,\n\t\tFormatListBulletedSquare,\n\t\tCnObjectRow,\n\t},\n\n\tinject: {\n\t\t/**\n\t\t * Host translate function provided by CnAppRoot as\n\t\t * `cnTranslate: this.translate` (bound to the host app's id). The\n\t\t * manifest-authored empty-state copy is run through it. Defaults to\n\t\t * an identity function so an untranslated key renders as itself.\n\t\t */\n\t\tcnTranslate: { default: () => (key) => key },\n\t},\n\n\tprops: {\n\t\t/** Array of objects to display as rows */\n\t\tobjects: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Schema definition (passed through to CnObjectRow) */\n\t\tschema: {\n\t\t\ttype: Object,\n\t\t\tdefault: null,\n\t\t},\n\n\t\t/**\n\t\t * Field-mapping config passed through to CnObjectRow.\n\t\t *\n\t\t * @type {{ titleField?: string, subtitleField?: string, imageField?: string, iconField?: string, iconName?: string, badgeField?: string, badgeVariantField?: string, badgeVariant?: string, badgeColorMap?: object }}\n\t\t */\n\t\tconfig: {\n\t\t\ttype: Object,\n\t\t\tdefault: () => ({}),\n\t\t},\n\n\t\t/** Whether data is loading */\n\t\tloading: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Whether rows can be selected */\n\t\tselectable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Array of currently selected object IDs */\n\t\tselectedIds: {\n\t\t\ttype: Array,\n\t\t\tdefault: () => [],\n\t\t},\n\n\t\t/** Property name used as unique identifier */\n\t\trowKey: {\n\t\t\ttype: String,\n\t\t\tdefault: 'id',\n\t\t},\n\n\t\t/** Text shown when there are no objects */\n\t\temptyText: {\n\t\t\ttype: String,\n\t\t\tdefault: () => t('nextcloud-vue', 'No items found'),\n\t\t},\n\t},\n\n\temits: ['click', 'select', 'aux-click'],\n\n\tcomputed: {\n\t\t/**\n\t\t * The empty-state copy run through the host translate function.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tresolvedEmptyText() {\n\t\t\tconst fn = typeof this.cnTranslate === 'function' ? this.cnTranslate : (k) => k\n\t\t\treturn this.emptyText ? fn(this.emptyText) : this.emptyText\n\t\t},\n\t},\n\n\tmethods: {\n\t\tisSelected(object) {\n\t\t\treturn this.selectedIds.includes(object[this.rowKey])\n\t\t},\n\n\t\t/**\n\t\t * Listeners bound on each CnObjectRow. Selectable rows select via\n\t\t * `@select` only; the `@click` (navigation) listener is bound only for\n\t\t * non-selectable rows.\n\t\t *\n\t\t * @param {object} object The row's object.\n\t\t * @return {object} Event listeners for the row.\n\t\t */\n\t\trowListeners(object) {\n\t\t\tconst listeners = { select: () => this.toggleSelect(object) }\n\t\t\tif (!this.selectable) {\n\t\t\t\tlisteners.click = (_row, event) => this.emitClick(object, event)\n\t\t\t\tlisteners['aux-click'] = (_row, event) => this.emitAuxClick(object, event)\n\t\t\t}\n\t\t\treturn listeners\n\t\t},\n\n\t\t/**\n\t\t * Emit `click` for a non-selectable row (navigation).\n\t\t *\n\t\t * @param {object} object The clicked row's object.\n\t\t * @param {MouseEvent} [event] The native click event.\n\t\t */\n\t\temitClick(object, event) {\n\t\t\t/**\n\t\t\t * @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.\n\t\t\t * @type {object} The clicked row's object.\n\t\t\t */\n\t\t\tthis.$emit('click', object, event)\n\t\t},\n\n\t\t/**\n\t\t * Emit `aux-click` for a middle click on a non-selectable row, kept off\n\t\t * `click` so a navigating listener never moves the current tab away.\n\t\t *\n\t\t * @param {object} object The clicked row's object.\n\t\t * @param {MouseEvent} event The native auxclick event.\n\t\t */\n\t\temitAuxClick(object, event) {\n\t\t\t/**\n\t\t\t * @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.\n\t\t\t * @type {object} The clicked row's object.\n\t\t\t */\n\t\t\tthis.$emit('aux-click', object, event)\n\t\t},\n\n\t\ttoggleSelect(object) {\n\t\t\tconst id = object[this.rowKey]\n\t\t\tconst newIds = this.isSelected(object)\n\t\t\t\t? this.selectedIds.filter((i) => i !== id)\n\t\t\t\t: [...this.selectedIds, id]\n\t\t\t/**\n\t\t\t * @event select Emitted when the selected-id set changes.\n\t\t\t * @type {Array<string|number>} The new array of selected ids.\n\t\t\t */\n\t\t\tthis.$emit('select', newIds)\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-object-list__rows {\n\tdisplay: flex;\n\tflex-direction: column;\n\tborder-top: 1px solid var(--color-border);\n}\n\n/* A list-item slot whose component renders nothing (e.g. a v-if client-side\n filter) still matches :empty per the CSS spec — collapse it so it leaves no\n ghost row / divider. */\n.cn-object-list__item:empty {\n\tdisplay: none;\n}\n\n.cn-object-list__loading {\n\tdisplay: flex;\n\tjustify-content: center;\n\tpadding: 40px;\n}\n\n.cn-object-list__empty {\n\tpadding: 40px 20px;\n\ttext-align: center;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createVNode","_renderSlot","_Fragment","_renderList","_mergeProps","_toHandlers","_createSlots","_withCtx"],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import __sfc_main$5 from '../CnFkResolveCell/CnFkResolveCell.vue.js';
|
|
|
7
7
|
import __sfc_main$1 from '../CnFormDialog/CnFormDialog.vue.js';
|
|
8
8
|
import __sfc_main$2 from '../CnPagination/CnPagination.vue.js';
|
|
9
9
|
import __sfc_main$3 from '../CnWidgetEmptyState/CnWidgetEmptyState.vue.js';
|
|
10
|
-
import { actionLink, dispatchAction } from '../../utils/actionsDispatcher.js';
|
|
10
|
+
import { hasActionTargetTokens, actionLink, dispatchAction } from '../../utils/actionsDispatcher.js';
|
|
11
11
|
import { resolveHref, followLinkClick, openRowTarget } from '../../utils/linkNavigation.js';
|
|
12
12
|
import { objectFieldValue } from '../../utils/objectName.js';
|
|
13
13
|
import { dropOptionalUnresolved, resolveFilterTokens, hasUnresolvedTokens } from '../../utils/resolveFilterTokens.js';
|
|
@@ -142,7 +142,7 @@ var script = {
|
|
|
142
142
|
},
|
|
143
143
|
},
|
|
144
144
|
|
|
145
|
-
emits: ['created', 'row-click', 'view-all', 'files-dropped'],
|
|
145
|
+
emits: ['created', 'row-click', 'row-aux-click', 'view-all', 'files-dropped'],
|
|
146
146
|
|
|
147
147
|
data() {
|
|
148
148
|
return {
|
|
@@ -1135,29 +1135,60 @@ var script = {
|
|
|
1135
1135
|
|
|
1136
1136
|
/**
|
|
1137
1137
|
* Navigate to a configured detail route on row click (when `rowRoute`
|
|
1138
|
-
* is set and a router is available); a ctrl/cmd/shift
|
|
1139
|
-
*
|
|
1138
|
+
* is set and a router is available); a ctrl/cmd/shift click opens it
|
|
1139
|
+
* in a new tab.
|
|
1140
1140
|
*
|
|
1141
1141
|
* @param {object} row The clicked object row.
|
|
1142
|
-
* @param {MouseEvent} [event] The originating click
|
|
1142
|
+
* @param {MouseEvent} [event] The originating click event.
|
|
1143
1143
|
* @return {void}
|
|
1144
1144
|
*/
|
|
1145
1145
|
onRowClick(row, event) {
|
|
1146
|
-
|
|
1147
|
-
const id = row && (row.id || (row['@self'] && row['@self'].id));
|
|
1148
|
-
if (route && id && this.$router) {
|
|
1149
|
-
markNewTabHandled(event, openRowTarget(event, { name: route, params: { id } }, this.$router));
|
|
1150
|
-
}
|
|
1146
|
+
this.openRowRoute(row, event);
|
|
1151
1147
|
/**
|
|
1152
1148
|
* @event row-click Emitted with the clicked object (for hosts that
|
|
1153
|
-
* want to handle navigation themselves)
|
|
1154
|
-
*
|
|
1155
|
-
*
|
|
1149
|
+
* want to handle navigation themselves). Payload: `(row, event)`, the
|
|
1150
|
+
* second being the native click event. A middle click emits
|
|
1151
|
+
* `row-aux-click` instead.
|
|
1156
1152
|
* @type {object}
|
|
1157
1153
|
*/
|
|
1158
1154
|
this.$emit('row-click', row, event);
|
|
1159
1155
|
},
|
|
1160
1156
|
|
|
1157
|
+
/**
|
|
1158
|
+
* A row middle click: opens the configured detail route in a new tab
|
|
1159
|
+
* and emits `row-aux-click`, not `row-click`.
|
|
1160
|
+
*
|
|
1161
|
+
* @param {object} row The clicked object row.
|
|
1162
|
+
* @param {MouseEvent} event The originating auxclick event.
|
|
1163
|
+
* @return {void}
|
|
1164
|
+
*/
|
|
1165
|
+
onRowAuxClick(row, event) {
|
|
1166
|
+
this.openRowRoute(row, event);
|
|
1167
|
+
/**
|
|
1168
|
+
* @event row-aux-click Emitted with the middle-clicked object, for
|
|
1169
|
+
* opening it in a new tab. Payload: `(row, event)`, the second being
|
|
1170
|
+
* the native auxclick event.
|
|
1171
|
+
* @type {object}
|
|
1172
|
+
*/
|
|
1173
|
+
this.$emit('row-aux-click', row, event);
|
|
1174
|
+
},
|
|
1175
|
+
|
|
1176
|
+
/**
|
|
1177
|
+
* Open `content.rowRoute` for a row: in place, or in a new tab on a
|
|
1178
|
+
* ctrl/cmd/shift or middle click.
|
|
1179
|
+
*
|
|
1180
|
+
* @param {object} row The clicked object row.
|
|
1181
|
+
* @param {MouseEvent} [event] The originating event.
|
|
1182
|
+
* @return {void}
|
|
1183
|
+
*/
|
|
1184
|
+
openRowRoute(row, event) {
|
|
1185
|
+
const route = this.content.rowRoute;
|
|
1186
|
+
const id = row && (row.id || (row['@self'] && row['@self'].id));
|
|
1187
|
+
if (route && id && this.$router) {
|
|
1188
|
+
markNewTabHandled(event, openRowTarget(event, { name: route, params: { id } }, this.$router));
|
|
1189
|
+
}
|
|
1190
|
+
},
|
|
1191
|
+
|
|
1161
1192
|
/**
|
|
1162
1193
|
* Dispatch one declared row action. A `handler` action gets the row
|
|
1163
1194
|
* appended as its last argument, the same convention CnWidgetObjectTable
|
|
@@ -1186,8 +1217,7 @@ var script = {
|
|
|
1186
1217
|
* @return {object} `{ href, linkTarget }`, `{ to }`, or `{}`.
|
|
1187
1218
|
*/
|
|
1188
1219
|
rowActionLink(action) {
|
|
1189
|
-
|
|
1190
|
-
if (/[@{]/.test(target)) {
|
|
1220
|
+
if (hasActionTargetTokens(action.target)) {
|
|
1191
1221
|
return {}
|
|
1192
1222
|
}
|
|
1193
1223
|
const link = actionLink(action, { router: this.$router || null });
|