@conduction/nextcloud-vue 2.58.0 → 2.60.0
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 +14 -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/CnAppNav/CnAppNav.vue2.js +39 -0
- package/dist/esm/components/CnAppNav/CnAppNav.vue2.js.map +1 -1
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js +46 -4
- package/dist/esm/components/CnAppNav/CnAppNav.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js +224 -9
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js +79 -25
- package/dist/esm/components/CnBannerWidget/CnBannerWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js +42 -3
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js +39 -6
- package/dist/esm/components/CnBannerWidgetForm/CnBannerWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +58 -5
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +13 -5
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js +10 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue.js.map +1 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js +39 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue2.js.map +1 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js +16 -0
- package/dist/esm/components/CnBrandStripe/CnBrandStripe.vue3.js.map +1 -0
- 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/CnCellRenderer/CnCellRenderer.vue2.js +117 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue2.js.map +1 -1
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.vue3.js +147 -89
- package/dist/esm/components/CnCellRenderer/CnCellRenderer.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/CnConversationThread/CnConversationThread.vue.js +10 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +259 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js +131 -0
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js +10 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js +116 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js +24 -0
- package/dist/esm/components/CnConversationThread/CnConversationWidget.vue3.js.map +1 -0
- 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 +532 -29
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js +300 -142
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js +10 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js +237 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue2.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js +120 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewList.vue3.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js +10 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js +77 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js +27 -0
- package/dist/esm/components/CnDocumentReviewList/CnDocumentReviewWidget.vue3.js.map +1 -0
- 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/CnHeaderWidget/CnHeaderWidget.vue2.js +169 -12
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js +15 -7
- package/dist/esm/components/CnHeaderWidget/CnHeaderWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js +37 -3
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js +44 -16
- package/dist/esm/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +199 -16
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +20 -10
- 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/CnNextStepCard/CnNextStepCard.vue.js +10 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js +150 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue2.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js +106 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepCard.vue3.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js +9 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js +47 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js +17 -0
- package/dist/esm/components/CnNextStepCard/CnNextStepWidget.vue3.js.map +1 -0
- 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/CnObjectDataWidget/CnObjectDataWidget.vue2.js +49 -0
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js +6 -0
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js +46 -0
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.vue3.js +15 -3
- package/dist/esm/components/CnObjectKanban/CnObjectKanban.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/CnQuickFilterBar/CnQuickFilterBar.vue2.js +37 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue2.js.map +1 -1
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js +29 -13
- package/dist/esm/components/CnQuickFilterBar/CnQuickFilterBar.vue3.js.map +1 -1
- package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js +100 -3
- package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.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/CnSavedViewsControl/CnSavedViewsControl.vue2.js +50 -3
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue2.js.map +1 -1
- package/dist/esm/components/CnSavedViewsControl/CnSavedViewsControl.vue3.js.map +1 -1
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js +10 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js +186 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue2.js.map +1 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js +46 -0
- package/dist/esm/components/CnSegmentedControl/CnSegmentedControl.vue3.js.map +1 -0
- 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/CnStackedBarWidget/CnStackedBarWidget.vue.js +11 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js +298 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js +77 -0
- package/dist/esm/components/CnStackedBarWidget/CnStackedBarWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js +10 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js +169 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue2.js.map +1 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js +48 -0
- package/dist/esm/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue3.js.map +1 -0
- package/dist/esm/components/CnTabs/CnTab.vue2.js +35 -0
- package/dist/esm/components/CnTabs/CnTab.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTab.vue3.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue2.js +120 -7
- package/dist/esm/components/CnTabs/CnTabs.vue2.js.map +1 -1
- package/dist/esm/components/CnTabs/CnTabs.vue3.js +57 -5
- package/dist/esm/components/CnTabs/CnTabs.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +59 -4
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +6 -2
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.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/components/CnWeekStripWidget/CnWeekStripWidget.vue.js +10 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js +484 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue2.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js +115 -0
- package/dist/esm/components/CnWeekStripWidget/CnWeekStripWidget.vue3.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js +10 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js +189 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue2.js.map +1 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js +74 -0
- package/dist/esm/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue3.js.map +1 -0
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js +82 -8
- package/dist/esm/components/CnWidgetGrid/registerDashboardWidgets.js.map +1 -1
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.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 +55 -1
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +55 -1
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/nextcloud-vue.css +998 -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/dateVariant.js +124 -0
- package/dist/esm/utils/dateVariant.js.map +1 -0
- package/dist/esm/utils/detailActionModel.js +260 -0
- package/dist/esm/utils/detailActionModel.js.map +1 -0
- package/dist/esm/utils/dueRule.js +84 -0
- package/dist/esm/utils/dueRule.js.map +1 -0
- package/dist/esm/utils/fetchAggregate.js +37 -1
- package/dist/esm/utils/fetchAggregate.js.map +1 -1
- package/dist/esm/utils/fetchFilterCounts.js +186 -0
- package/dist/esm/utils/fetchFilterCounts.js.map +1 -0
- package/dist/esm/utils/libraryWidgetKeys.js +5 -0
- package/dist/esm/utils/libraryWidgetKeys.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/readPath.js +30 -0
- package/dist/esm/utils/readPath.js.map +1 -0
- 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 +15855 -9353
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +998 -7
- package/l10n/en.json +55 -1
- package/l10n/nl.json +55 -1
- package/package.json +1 -1
- package/scripts/.jsdoc-baselines.json +3 -0
- package/src/components/CnActionsBar/CnActionsBar.vue +14 -5
- package/src/components/CnActionsMenu/CnActionsMenu.vue +14 -4
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +1 -2
- package/src/components/CnAppNav/CnAppNav.md +26 -0
- package/src/components/CnAppNav/CnAppNav.vue +104 -1
- package/src/components/CnBannerWidget/CnBannerWidget.vue +365 -10
- package/src/components/CnBannerWidgetForm/CnBannerWidgetForm.vue +65 -3
- package/src/components/CnBoardView/CnBoardView.vue +90 -5
- package/src/components/CnBrandStripe/CnBrandStripe.md +22 -0
- package/src/components/CnBrandStripe/CnBrandStripe.vue +100 -0
- package/src/components/CnBrandStripe/index.js +4 -0
- package/src/components/CnCardGrid/CnCardGrid.vue +9 -1
- package/src/components/CnCellRenderer/CnCellRenderer.vue +207 -1
- package/src/components/CnContextMenu/CnContextMenu.vue +6 -1
- package/src/components/CnConversationThread/CnConversationThread.md +51 -0
- package/src/components/CnConversationThread/CnConversationThread.vue +457 -0
- package/src/components/CnConversationThread/CnConversationWidget.vue +144 -0
- package/src/components/CnConversationThread/index.js +4 -0
- 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 +17 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +712 -49
- package/src/components/CnDocumentReviewList/CnDocumentReviewList.md +55 -0
- package/src/components/CnDocumentReviewList/CnDocumentReviewList.vue +384 -0
- package/src/components/CnDocumentReviewList/CnDocumentReviewWidget.vue +108 -0
- package/src/components/CnDocumentReviewList/index.js +4 -0
- 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/CnHeaderWidget/CnHeaderWidget.vue +189 -14
- package/src/components/CnHeaderWidgetForm/CnHeaderWidgetForm.vue +53 -3
- package/src/components/CnIndexPage/CnIndexPage.vue +210 -17
- 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/CnNextStepCard/CnNextStepCard.md +40 -0
- package/src/components/CnNextStepCard/CnNextStepCard.vue +319 -0
- package/src/components/CnNextStepCard/CnNextStepWidget.vue +59 -0
- package/src/components/CnNextStepCard/index.js +4 -0
- package/src/components/CnObjectCard/CnObjectCard.vue +24 -6
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +49 -0
- package/src/components/CnObjectDataWidgetForm/CnObjectDataWidgetForm.vue +6 -0
- package/src/components/CnObjectKanban/CnObjectKanban.vue +86 -2
- 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/CnQuickFilterBar/CnQuickFilterBar.md +3 -0
- package/src/components/CnQuickFilterBar/CnQuickFilterBar.vue +60 -1
- package/src/components/CnRelatedObjectsWidget/CnRelatedObjectsWidget.vue +100 -3
- package/src/components/CnRowActions/CnRowActions.vue +7 -2
- package/src/components/CnSavedViewsControl/CnSavedViewsControl.vue +50 -3
- package/src/components/CnSegmentedControl/CnSegmentedControl.md +46 -0
- package/src/components/CnSegmentedControl/CnSegmentedControl.vue +291 -0
- package/src/components/CnSegmentedControl/index.js +4 -0
- package/src/components/CnSpendAnalyticsWidget/CnSpendAnalyticsWidget.vue +5 -3
- package/src/components/CnStackedBarWidget/CnStackedBarWidget.md +15 -0
- package/src/components/CnStackedBarWidget/CnStackedBarWidget.vue +414 -0
- package/src/components/CnStackedBarWidget/index.js +14 -0
- package/src/components/CnStackedBarWidgetForm/CnStackedBarWidgetForm.vue +224 -0
- package/src/components/CnStackedBarWidgetForm/index.js +4 -0
- package/src/components/CnTabs/CnTab.vue +35 -0
- package/src/components/CnTabs/CnTabs.vue +251 -13
- package/src/components/CnTabsWidget/CnTabsWidget.vue +63 -4
- package/src/components/CnTasksWidget/CnTasksWidget.vue +4 -1
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.md +31 -0
- package/src/components/CnWeekStripWidget/CnWeekStripWidget.vue +668 -0
- package/src/components/CnWeekStripWidget/index.js +14 -0
- package/src/components/CnWeekStripWidgetForm/CnWeekStripWidgetForm.vue +265 -0
- package/src/components/CnWeekStripWidgetForm/index.js +4 -0
- package/src/components/CnWidgetGrid/registerDashboardWidgets.js +74 -0
- package/src/components/index.js +11 -0
- package/src/css/detail-page.css +47 -0
- package/src/css/table.css +26 -0
- package/src/index.js +9 -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 +389 -1
- package/src/schemas/app-manifest.schema.json +2 -1
- package/src/utils/actionLink.js +5 -0
- package/src/utils/actionsDispatcher.js +15 -0
- package/src/utils/dateVariant.js +120 -0
- package/src/utils/detailActionModel.js +256 -0
- package/src/utils/dueRule.js +94 -0
- package/src/utils/fetchAggregate.js +36 -0
- package/src/utils/fetchFilterCounts.js +182 -0
- package/src/utils/index.js +1 -0
- package/src/utils/libraryWidgetKeys.js +5 -0
- package/src/utils/linkNavigation.js +6 -3
- package/src/utils/readPath.js +27 -0
- package/src/utils/rowAuxClick.js +29 -4
- package/src/utils/safeHref.js +18 -3
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -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 })
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<div
|
|
3
3
|
class="cn-object-row"
|
|
4
4
|
:class="{ 'cn-object-row--selected': selected }"
|
|
5
|
-
@mousedown="
|
|
5
|
+
@mousedown="onRowMouseDown"
|
|
6
6
|
@click="onRowClick($event)"
|
|
7
7
|
@auxclick="onRowAuxClick($event)">
|
|
8
8
|
<!-- Selection checkbox -->
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
import { NcCheckboxRadioSwitch } from '@nextcloud/vue'
|
|
69
69
|
import { useClickDragGuard } from '../../composables/useClickDragGuard.js'
|
|
70
70
|
import { resolveImageUrl } from '../../utils/resolveImageUrl.js'
|
|
71
|
-
import { isRowMiddleClick } from '../../utils/rowAuxClick.js'
|
|
71
|
+
import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
|
|
72
72
|
import { CnIcon } from '../CnIcon/index.js'
|
|
73
73
|
import { CnStatusBadge } from '../CnStatusBadge/index.js'
|
|
74
74
|
|
|
@@ -146,7 +146,7 @@ export default {
|
|
|
146
146
|
// again from `$emit('click', object)` — twice per click, with different
|
|
147
147
|
// payloads. Declaring the names here removes them from `$attrs`, which is
|
|
148
148
|
// also what stops VTU v2 recording the native DOM event into `emitted()`.
|
|
149
|
-
emits: ['select', 'click'],
|
|
149
|
+
emits: ['select', 'click', 'aux-click'],
|
|
150
150
|
|
|
151
151
|
setup() {
|
|
152
152
|
// Tell a deliberate row click apart from a text-selection drag.
|
|
@@ -237,15 +237,29 @@ export default {
|
|
|
237
237
|
return
|
|
238
238
|
}
|
|
239
239
|
/**
|
|
240
|
-
* @event click Emitted when a non-selectable row is clicked
|
|
240
|
+
* @event click Emitted when a non-selectable row is clicked (navigation). Payload: `(object, event)` — the row's object and the native click event, for opening it in a new tab on a ctrl/cmd/shift click. A middle click emits `aux-click` instead.
|
|
241
241
|
* @type {object} The row's object.
|
|
242
242
|
*/
|
|
243
243
|
this.$emit('click', this.object, event)
|
|
244
244
|
},
|
|
245
245
|
|
|
246
246
|
/**
|
|
247
|
-
* Row
|
|
248
|
-
* non-selectable row.
|
|
247
|
+
* Row mousedown: record the press for the drag guard, and on a
|
|
248
|
+
* non-selectable row keep a middle press from starting autoscroll.
|
|
249
|
+
*
|
|
250
|
+
* @param {MouseEvent} event The mousedown event.
|
|
251
|
+
*/
|
|
252
|
+
onRowMouseDown(event) {
|
|
253
|
+
this.onPointerDown(event)
|
|
254
|
+
if (!this.selectable) {
|
|
255
|
+
preventMiddleClickAutoscroll(event)
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Row-body middle click on a non-selectable row: emits `aux-click`, not
|
|
261
|
+
* `click`, so an existing `click` listener that navigates never moves
|
|
262
|
+
* the current tab away.
|
|
249
263
|
*
|
|
250
264
|
* @param {MouseEvent} event The auxclick event.
|
|
251
265
|
*/
|
|
@@ -253,7 +267,11 @@ export default {
|
|
|
253
267
|
if (this.selectable || !isRowMiddleClick(event)) {
|
|
254
268
|
return
|
|
255
269
|
}
|
|
256
|
-
|
|
270
|
+
/**
|
|
271
|
+
* @event aux-click Emitted when a non-selectable row is middle-clicked, for opening it in a new tab (see `openRowTarget`). Payload: `(object, event)` — the row's object and the native auxclick event.
|
|
272
|
+
* @type {object} The row's object.
|
|
273
|
+
*/
|
|
274
|
+
this.$emit('aux-click', this.object, event)
|
|
257
275
|
},
|
|
258
276
|
},
|
|
259
277
|
}
|
|
@@ -128,6 +128,7 @@
|
|
|
128
128
|
v-bind="{ ...$attrs, ...resolvedProps }"
|
|
129
129
|
@view="onRowOpen"
|
|
130
130
|
@rowClick="onRowOpen"
|
|
131
|
+
@rowAuxClick="onRowOpen"
|
|
131
132
|
@editOpen="onRowOpen"
|
|
132
133
|
@configure="showConfigModal = true">
|
|
133
134
|
<!-- This `<template v-for>` defines dynamic SLOTS, not a
|
|
@@ -203,6 +204,7 @@
|
|
|
203
204
|
v-bind="{ ...$attrs, ...resolvedProps }"
|
|
204
205
|
@view="onRowOpen"
|
|
205
206
|
@rowClick="onRowOpen"
|
|
207
|
+
@rowAuxClick="onRowOpen"
|
|
206
208
|
@editOpen="onRowOpen"
|
|
207
209
|
@configure="showConfigModal = true">
|
|
208
210
|
<!-- Dynamic slot definition, not a rendered list — see the note on
|
|
@@ -45,6 +45,8 @@ In `manifest.json` (the usual entry-point — CnIndexPage mounts the bar for you
|
|
|
45
45
|
| `filter` | Object | yes | Filter map merged into the fetch when this tab is active. Same value syntax as `config.filter`: literals pass through; `"@route.<name>"` / `":<name>"` resolve from `$route.params`. |
|
|
46
46
|
| `default` | Boolean | no | Pre-selected on mount; first tab with `default:true` (else index 0) is active |
|
|
47
47
|
| `icon` | String | no | Optional MDI icon name shown next to the label |
|
|
48
|
+
| `showCount` | Boolean | no | On a CnIndexPage: show how many records this tab matches. Tabs that filter the same single field share one grouped request. |
|
|
49
|
+
| `count` | Number | no | A count you supply yourself, shown after the label. |
|
|
48
50
|
|
|
49
51
|
## Props
|
|
50
52
|
|
|
@@ -57,6 +59,7 @@ In `manifest.json` (the usual entry-point — CnIndexPage mounts the bar for you
|
|
|
57
59
|
- `selectLabel` (String, default `'Filter'`) — accessible label / placeholder for the dropdown control.
|
|
58
60
|
- `placeholder` (String) — placeholder text for the dropdown (falls back to `selectLabel`).
|
|
59
61
|
- `maxVisible` (Number, default `0`) — chips mode only: how many pills render inline before the rest move behind one more chip, a `⋯` pill that opens a small panel of the hidden lenses (also as chips). `0` renders every tab. The visible set is the first `maxVisible` entries of `tabs`, so their declared order decides what stays in the strip; an active hidden tab moves its label and fill onto that chip. Manifest: `config.quickFilterMaxVisible`.
|
|
62
|
+
- `counts` (Object or Array, default `null`): how many records each tab matches, keyed by tab index. A tab with a number shows it after its label. CnIndexPage fills this for tabs that set `showCount`.
|
|
60
63
|
|
|
61
64
|
### Events
|
|
62
65
|
|
|
@@ -44,6 +44,10 @@
|
|
|
44
44
|
:size="16"
|
|
45
45
|
class="cn-quick-filter-bar__icon" />
|
|
46
46
|
<span class="cn-quick-filter-bar__label">{{ entry.tab.label }}</span>
|
|
47
|
+
<span
|
|
48
|
+
v-if="countOf(entry) !== null"
|
|
49
|
+
class="cn-quick-filter-bar__count"
|
|
50
|
+
data-testid="cn-quick-filter-count">{{ ' ' + countOf(entry) }}</span>
|
|
47
51
|
</button>
|
|
48
52
|
</div>
|
|
49
53
|
<!-- The overflow is a CHIP and not a toolbar button: it is one of the
|
|
@@ -96,6 +100,10 @@
|
|
|
96
100
|
:size="16"
|
|
97
101
|
class="cn-quick-filter-bar__icon" />
|
|
98
102
|
<span class="cn-quick-filter-bar__label">{{ entry.tab.label }}</span>
|
|
103
|
+
<span
|
|
104
|
+
v-if="countOf(entry) !== null"
|
|
105
|
+
class="cn-quick-filter-bar__count"
|
|
106
|
+
data-testid="cn-quick-filter-count">{{ ' ' + countOf(entry) }}</span>
|
|
99
107
|
</button>
|
|
100
108
|
</div>
|
|
101
109
|
</div>
|
|
@@ -231,6 +239,19 @@ export default {
|
|
|
231
239
|
default: 0,
|
|
232
240
|
validator: (v) => Number.isFinite(v) && v >= 0,
|
|
233
241
|
},
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* How many records each tab matches, keyed by tab index (an array in
|
|
245
|
+
* tab order works too). A tab with a number here shows it after its
|
|
246
|
+
* label; a tab without one shows no count. A tab can also carry its
|
|
247
|
+
* own `count`. `null` (the default) shows no counts at all.
|
|
248
|
+
*
|
|
249
|
+
* @type {{[index: number]: number}|Array<number|null>|null}
|
|
250
|
+
*/
|
|
251
|
+
counts: {
|
|
252
|
+
type: [Object, Array],
|
|
253
|
+
default: null,
|
|
254
|
+
},
|
|
234
255
|
},
|
|
235
256
|
|
|
236
257
|
emits: ['update:active-index', 'update:selected-indices'],
|
|
@@ -324,10 +345,19 @@ export default {
|
|
|
324
345
|
* omitted — an empty selection already means "all".
|
|
325
346
|
*
|
|
326
347
|
* @return {Array<{label: string, index: number, icon: string}>}
|
|
348
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
|
|
327
349
|
*/
|
|
328
350
|
dropdownOptions() {
|
|
329
351
|
return this.tabs
|
|
330
|
-
.map((tab, index) =>
|
|
352
|
+
.map((tab, index) => {
|
|
353
|
+
const count = this.countOf({ tab, index })
|
|
354
|
+
return {
|
|
355
|
+
label: count === null ? tab.label : `${tab.label} (${count})`,
|
|
356
|
+
icon: tab.icon,
|
|
357
|
+
index,
|
|
358
|
+
_empty: this.isEmptyFilter(tab),
|
|
359
|
+
}
|
|
360
|
+
})
|
|
331
361
|
.filter((o) => !o._empty)
|
|
332
362
|
},
|
|
333
363
|
|
|
@@ -346,6 +376,20 @@ export default {
|
|
|
346
376
|
},
|
|
347
377
|
|
|
348
378
|
methods: {
|
|
379
|
+
/**
|
|
380
|
+
* The count to show on a tab, or null for none: `counts[index]`
|
|
381
|
+
* first, else the tab's own `count`.
|
|
382
|
+
*
|
|
383
|
+
* @param {{tab: object, index: number}} entry The tab and its index.
|
|
384
|
+
* @return {number|null}
|
|
385
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
|
|
386
|
+
*/
|
|
387
|
+
countOf(entry) {
|
|
388
|
+
const fromProp = this.counts ? this.counts[entry.index] : undefined
|
|
389
|
+
const value = (fromProp !== undefined && fromProp !== null) ? fromProp : entry.tab.count
|
|
390
|
+
return (typeof value === 'number' && Number.isFinite(value)) ? value : null
|
|
391
|
+
},
|
|
392
|
+
|
|
349
393
|
/**
|
|
350
394
|
* Is tab `i` rendered active in chips mode (handles both single
|
|
351
395
|
* `activeIndex` and `multiple` `selectedIndices`).
|
|
@@ -501,6 +545,21 @@ export default {
|
|
|
501
545
|
line-height: 1;
|
|
502
546
|
}
|
|
503
547
|
|
|
548
|
+
/* Inherits the chip's own text colour, so it stays readable on the active
|
|
549
|
+
(primary) fill as well as on the resting one. The count's text starts with
|
|
550
|
+
a space: the chip is a flex row, so the space is not drawn, but it keeps a
|
|
551
|
+
screen reader from reading label and count as one word. */
|
|
552
|
+
.cn-quick-filter-bar__count {
|
|
553
|
+
min-width: 1.5em;
|
|
554
|
+
padding: 2px 6px;
|
|
555
|
+
border: 1px solid currentColor;
|
|
556
|
+
border-radius: var(--border-radius-pill, 10px);
|
|
557
|
+
font-size: 0.85em;
|
|
558
|
+
font-weight: 600;
|
|
559
|
+
line-height: 1;
|
|
560
|
+
text-align: center;
|
|
561
|
+
}
|
|
562
|
+
|
|
504
563
|
/* NcPopover wraps its trigger in a plain `<div class="v-popper">`, which as a
|
|
505
564
|
block would drop the chip onto its own line under the strip. */
|
|
506
565
|
.cn-quick-filter-bar > :deep(.v-popper) {
|
|
@@ -322,6 +322,26 @@ const CORE_TABS = ['files', 'notes', 'tags', 'tasks', 'auditTrail', 'shares']
|
|
|
322
322
|
/** One-time guard so the legacy-path deprecation warning logs only once. */
|
|
323
323
|
let legacyWarned = false
|
|
324
324
|
|
|
325
|
+
/**
|
|
326
|
+
* Schema titles by numeric schema id, shared by every widget on the page so a
|
|
327
|
+
* schema is asked for once. OpenRegister's `/uses` and `/used` answer
|
|
328
|
+
* `@self.schema` as that id ("120"), which is not a word anyone can read.
|
|
329
|
+
*
|
|
330
|
+
* @type {Map<string, Promise<string>>}
|
|
331
|
+
*/
|
|
332
|
+
const schemaTitleCache = new Map()
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Whether a value is a bare number, the way OpenRegister names a schema by id.
|
|
336
|
+
*
|
|
337
|
+
* @param {string|number|undefined|null} value The value.
|
|
338
|
+
* @return {boolean}
|
|
339
|
+
*/
|
|
340
|
+
function isNumericId(value) {
|
|
341
|
+
return (typeof value === 'number' && Number.isFinite(value))
|
|
342
|
+
|| (typeof value === 'string' && /^\d+$/.test(value.trim()))
|
|
343
|
+
}
|
|
344
|
+
|
|
325
345
|
/**
|
|
326
346
|
* Leaf groups surfaced by the aggregated `/relations` endpoint, in tab order.
|
|
327
347
|
* `responseKey` is the key in the `/relations` payload; `integrationId` is the
|
|
@@ -404,6 +424,14 @@ export default {
|
|
|
404
424
|
NcEmptyContent,
|
|
405
425
|
},
|
|
406
426
|
|
|
427
|
+
inject: {
|
|
428
|
+
/**
|
|
429
|
+
* The host app's translator (CnAppRoot provides it), so a schema title
|
|
430
|
+
* reads in the app's language. Without it a title reads as stored.
|
|
431
|
+
*/
|
|
432
|
+
cnTranslate: { default: () => (key) => key },
|
|
433
|
+
},
|
|
434
|
+
|
|
407
435
|
props: {
|
|
408
436
|
/** Widget title shown in the header. */
|
|
409
437
|
title: {
|
|
@@ -667,6 +695,8 @@ export default {
|
|
|
667
695
|
* @type {HTMLInputElement|null}
|
|
668
696
|
*/
|
|
669
697
|
fileInputEl: null,
|
|
698
|
+
/** Schema titles by numeric schema id, for object rows. */
|
|
699
|
+
schemaTitles: {},
|
|
670
700
|
/** Whether any section/tab is currently fetching. */
|
|
671
701
|
loading: false,
|
|
672
702
|
/** True once the first fetch has completed (gates the empty state). */
|
|
@@ -1359,9 +1389,74 @@ export default {
|
|
|
1359
1389
|
self.name,
|
|
1360
1390
|
raw.summary,
|
|
1361
1391
|
raw.description,
|
|
1362
|
-
].find((v) => typeof v === 'string' && v.trim() && !isUuid(v))
|
|
1363
|
-
|
|
1364
|
-
|
|
1392
|
+
].find((v) => typeof v === 'string' && v.trim() && !isUuid(v))
|
|
1393
|
+
|| [raw.givenName, raw.familyName].filter((v) => typeof v === 'string' && v.trim()).join(' ')
|
|
1394
|
+
// OpenRegister names the schema by numeric id: show its title, never the number.
|
|
1395
|
+
const schema = this.schemaName(self.schema || raw.schema)
|
|
1396
|
+
const finalLabel = label || schema || String(id)
|
|
1397
|
+
return { id, label: finalLabel, meta: schema === finalLabel ? '' : schema, raw }
|
|
1398
|
+
},
|
|
1399
|
+
|
|
1400
|
+
/**
|
|
1401
|
+
* How a row names its schema: the translated title for a numeric id
|
|
1402
|
+
* (empty until it is read, or when it cannot be), a slug as it is.
|
|
1403
|
+
*
|
|
1404
|
+
* @param {string|number|undefined|null} schema - `@self.schema` of the related object.
|
|
1405
|
+
* @return {string}
|
|
1406
|
+
*/
|
|
1407
|
+
schemaName(schema) {
|
|
1408
|
+
if (isNumericId(schema)) {
|
|
1409
|
+
const title = this.schemaTitles[String(schema).trim()]
|
|
1410
|
+
return title ? this.cnTranslate(title) : ''
|
|
1411
|
+
}
|
|
1412
|
+
return typeof schema === 'string' ? schema : ''
|
|
1413
|
+
},
|
|
1414
|
+
|
|
1415
|
+
/**
|
|
1416
|
+
* Read the titles of the numeric schema ids in these envelopes once,
|
|
1417
|
+
* before the rows are built, so no row shows a number first.
|
|
1418
|
+
*
|
|
1419
|
+
* @param {Array<object|null>} envelopes - The `{ results }` payloads.
|
|
1420
|
+
* @return {Promise<void>}
|
|
1421
|
+
*/
|
|
1422
|
+
async resolveSchemaTitles(envelopes) {
|
|
1423
|
+
const ids = new Set()
|
|
1424
|
+
for (const envelope of envelopes) {
|
|
1425
|
+
for (const raw of ((envelope && envelope.results) || [])) {
|
|
1426
|
+
const schema = (raw && (raw['@self'] || {}).schema) ?? (raw && raw.schema)
|
|
1427
|
+
if (isNumericId(schema)) {
|
|
1428
|
+
ids.add(String(schema).trim())
|
|
1429
|
+
}
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
1432
|
+
const titles = { ...this.schemaTitles }
|
|
1433
|
+
await Promise.all([...ids].filter((id) => !(id in titles)).map(async (id) => {
|
|
1434
|
+
if (!schemaTitleCache.has(id)) {
|
|
1435
|
+
schemaTitleCache.set(id, this.fetchSchemaTitle(id))
|
|
1436
|
+
}
|
|
1437
|
+
titles[id] = await schemaTitleCache.get(id)
|
|
1438
|
+
}))
|
|
1439
|
+
this.schemaTitles = titles
|
|
1440
|
+
},
|
|
1441
|
+
|
|
1442
|
+
/**
|
|
1443
|
+
* GET one schema's title; '' when it cannot be read.
|
|
1444
|
+
*
|
|
1445
|
+
* @param {string} id - The numeric schema id.
|
|
1446
|
+
* @return {Promise<string>}
|
|
1447
|
+
*/
|
|
1448
|
+
async fetchSchemaTitle(id) {
|
|
1449
|
+
try {
|
|
1450
|
+
const response = await fetch(generateUrl('/apps/openregister/api/schemas/{id}', { id }), { method: 'GET', headers: buildHeaders() })
|
|
1451
|
+
if (!response.ok) {
|
|
1452
|
+
return ''
|
|
1453
|
+
}
|
|
1454
|
+
const schema = await response.json()
|
|
1455
|
+
const title = schema && (schema.title || schema.slug)
|
|
1456
|
+
return typeof title === 'string' ? title : ''
|
|
1457
|
+
} catch {
|
|
1458
|
+
return ''
|
|
1459
|
+
}
|
|
1365
1460
|
},
|
|
1366
1461
|
|
|
1367
1462
|
/**
|
|
@@ -1465,6 +1560,7 @@ export default {
|
|
|
1465
1560
|
const groups = []
|
|
1466
1561
|
|
|
1467
1562
|
if (this.showObjects) {
|
|
1563
|
+
await this.resolveSchemaTitles([uses, used, contracts])
|
|
1468
1564
|
const objectItems = this.mergeObjectResults([uses, used, contracts])
|
|
1469
1565
|
groups.push({ key: 'objects', label: this.objectsLabel, icon: 'FileTreeOutline', integrationId: '', items: objectItems, total: objectItems.length })
|
|
1470
1566
|
}
|
|
@@ -1590,6 +1686,7 @@ export default {
|
|
|
1590
1686
|
calls.push(store.fetchContracts(type, id))
|
|
1591
1687
|
}
|
|
1592
1688
|
const groups = await Promise.all(calls)
|
|
1689
|
+
await this.resolveSchemaTitles(groups.map((results) => ({ results: results || [] })))
|
|
1593
1690
|
const seen = new Set()
|
|
1594
1691
|
const merged = []
|
|
1595
1692
|
for (const group of groups) {
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
<script>
|
|
42
42
|
import { NcActionButton, NcActionLink, NcActions } from '@nextcloud/vue'
|
|
43
43
|
import { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'
|
|
44
|
+
import { isModifiedClick } from '../../utils/linkNavigation.js'
|
|
44
45
|
import { evaluateVisibleWhenLocal, isLocallyDecidableVisibleWhen } from '../../utils/visibleWhen.js'
|
|
45
46
|
import { CnIcon } from '../CnIcon/index.js'
|
|
46
47
|
|
|
@@ -215,16 +216,20 @@ export default {
|
|
|
215
216
|
/**
|
|
216
217
|
* A link entry was clicked: route a plain in-app click, leave the rest to
|
|
217
218
|
* the browser, and emit `action` as a button would. The `handler` is not
|
|
218
|
-
* called, since navigating is what the link already does.
|
|
219
|
+
* called, since navigating is what the link already does. A modified
|
|
220
|
+
* click opens a new tab, so nothing is emitted in this one.
|
|
219
221
|
*
|
|
220
222
|
* @param {object} action The action definition.
|
|
221
223
|
* @param {object} link The resolved link.
|
|
222
224
|
* @param {MouseEvent} event The click event.
|
|
223
225
|
*/
|
|
224
226
|
onLinkAction(action, link, event) {
|
|
227
|
+
if (isModifiedClick(event)) {
|
|
228
|
+
return
|
|
229
|
+
}
|
|
225
230
|
followItemActionLink(event, link, this.$router)
|
|
226
231
|
/**
|
|
227
|
-
* @event action User picked an entry. Payload: the action's label and the row. A button entry has already run its `handler`; a link entry navigates instead.
|
|
232
|
+
* @event action User picked an entry. Payload: the action's label and the row. A button entry has already run its `handler`; a link entry navigates instead, and a modified (new-tab) click on a link emits nothing.
|
|
228
233
|
* @type {{ action: string, row: object|null }}
|
|
229
234
|
*/
|
|
230
235
|
this.$emit('action', { action: action.label, row: this.row })
|
|
@@ -182,6 +182,18 @@ export default {
|
|
|
182
182
|
type: Number,
|
|
183
183
|
default: 3,
|
|
184
184
|
},
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* How many records each view matches, keyed by view id (or slug). A
|
|
188
|
+
* view with a number here shows it after its name; a view can also
|
|
189
|
+
* carry its own `count`. `null` (the default) shows no counts.
|
|
190
|
+
*
|
|
191
|
+
* @type {{[viewId: string]: number}|null}
|
|
192
|
+
*/
|
|
193
|
+
counts: {
|
|
194
|
+
type: Object,
|
|
195
|
+
default: null,
|
|
196
|
+
},
|
|
185
197
|
},
|
|
186
198
|
|
|
187
199
|
emits: ['apply', 'delete-request', 'save-request'],
|
|
@@ -245,9 +257,42 @@ export default {
|
|
|
245
257
|
*
|
|
246
258
|
* @param {object} row The row from buildViewTree().
|
|
247
259
|
* @return {string} The name.
|
|
260
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
|
|
248
261
|
*/
|
|
249
262
|
rowName(row) {
|
|
250
|
-
return `${'\u2007'.repeat(row.depth * 2)}${row.view
|
|
263
|
+
return `${'\u2007'.repeat(row.depth * 2)}${this.nameWithCount(row.view)}`
|
|
264
|
+
},
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* The number of records a view matches, or null when none is known:
|
|
268
|
+
* `counts[id]` (or `counts[slug]`) first, else the view's own `count`.
|
|
269
|
+
*
|
|
270
|
+
* @param {object} view The saved view.
|
|
271
|
+
* @return {number|null}
|
|
272
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
|
|
273
|
+
*/
|
|
274
|
+
countOf(view) {
|
|
275
|
+
const counts = this.counts || {}
|
|
276
|
+
let value = counts[view.id]
|
|
277
|
+
if (value === undefined || value === null) {
|
|
278
|
+
value = counts[view.slug]
|
|
279
|
+
}
|
|
280
|
+
if (value === undefined || value === null) {
|
|
281
|
+
value = view.count
|
|
282
|
+
}
|
|
283
|
+
return (typeof value === 'number' && Number.isFinite(value)) ? value : null
|
|
284
|
+
},
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* A view's name, followed by its count when one is known.
|
|
288
|
+
*
|
|
289
|
+
* @param {object} view The saved view.
|
|
290
|
+
* @return {string}
|
|
291
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
|
|
292
|
+
*/
|
|
293
|
+
nameWithCount(view) {
|
|
294
|
+
const count = this.countOf(view)
|
|
295
|
+
return count === null ? view.name : `${view.name} (${count})`
|
|
251
296
|
},
|
|
252
297
|
|
|
253
298
|
/**
|
|
@@ -259,11 +304,13 @@ export default {
|
|
|
259
304
|
*
|
|
260
305
|
* @param {object} row The row from buildViewTree().
|
|
261
306
|
* @return {string} The accessible label.
|
|
307
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-counts-on-filters-and-views
|
|
262
308
|
*/
|
|
263
309
|
rowLabel(row) {
|
|
310
|
+
const viewName = this.nameWithCount(row.view)
|
|
264
311
|
const name = row.depth === 0
|
|
265
|
-
?
|
|
266
|
-
: t('nextcloud-vue', '{name}, level {level}', { name:
|
|
312
|
+
? viewName
|
|
313
|
+
: t('nextcloud-vue', '{name}, level {level}', { name: viewName, level: row.depth + 1 })
|
|
267
314
|
|
|
268
315
|
if (row.orphaned !== true) {
|
|
269
316
|
return name
|