@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
|
@@ -83,11 +83,19 @@
|
|
|
83
83
|
v-for="card in column.cards"
|
|
84
84
|
:key="`card-${cardKey(card)}`"
|
|
85
85
|
class="cn-board-view__card"
|
|
86
|
+
:class="dueState(card) ? `cn-board-view__card--${dueState(card)}` : null"
|
|
86
87
|
role="listitem"
|
|
87
88
|
data-testid="cn-board-card"
|
|
88
89
|
:data-card-id="cardKey(card)"
|
|
89
90
|
:draggable="canMove"
|
|
90
91
|
@dragstart="onDragStart(card, column, $event)">
|
|
92
|
+
<span
|
|
93
|
+
v-if="dueLabel(card)"
|
|
94
|
+
class="cn-board-view__due"
|
|
95
|
+
:class="`cn-board-view__due--${dueState(card)}`"
|
|
96
|
+
data-testid="cn-board-due">
|
|
97
|
+
{{ dueLabel(card) }}
|
|
98
|
+
</span>
|
|
91
99
|
<span
|
|
92
100
|
v-for="field in cardFields"
|
|
93
101
|
:key="`f-${cardKey(card)}-${field}`"
|
|
@@ -108,6 +116,7 @@
|
|
|
108
116
|
:data-card-id="cardKey(card)"
|
|
109
117
|
:aria-label="cardLabel(card, column)"
|
|
110
118
|
@click="openCard(card, $event)"
|
|
119
|
+
@mousedown="preventMiddleClickAutoscroll"
|
|
111
120
|
@auxclick="onCardAuxClick(card, $event)">
|
|
112
121
|
{{ openLabel }}
|
|
113
122
|
</button>
|
|
@@ -161,7 +170,8 @@ import { translate as t } from '@nextcloud/l10n'
|
|
|
161
170
|
import { buildBoardColumns } from '../../utils/boardColumns.js'
|
|
162
171
|
import { buildSwimlanes } from '../../utils/boardSwimlanes.js'
|
|
163
172
|
import { DROP_OUTCOMES, runBoardDrop } from '../../utils/boardTransition.js'
|
|
164
|
-
import {
|
|
173
|
+
import { dueStateForRow } from '../../utils/dueRule.js'
|
|
174
|
+
import { isRowMiddleClick, preventMiddleClickAutoscroll } from '../../utils/rowAuxClick.js'
|
|
165
175
|
|
|
166
176
|
/**
|
|
167
177
|
* CnBoardView — the index page's rows as a board, one column per stage.
|
|
@@ -251,9 +261,25 @@ export default {
|
|
|
251
261
|
type: Boolean,
|
|
252
262
|
default: false,
|
|
253
263
|
},
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Marks late cards: `{ field, soonDays? }`. `field` is the dot-path to
|
|
267
|
+
* a card's due date. A date before today gets an error edge and the
|
|
268
|
+
* label "Overdue"; a date within `soonDays` (default 3) gets "Due
|
|
269
|
+
* soon" in the warning colour. `null` (the default) marks nothing.
|
|
270
|
+
*
|
|
271
|
+
* The same rule shape the table's date cell uses, so a list and its
|
|
272
|
+
* board agree on what late means.
|
|
273
|
+
*
|
|
274
|
+
* @type {{field: string, soonDays?: number}|null}
|
|
275
|
+
*/
|
|
276
|
+
dueRule: {
|
|
277
|
+
type: Object,
|
|
278
|
+
default: null,
|
|
279
|
+
},
|
|
254
280
|
},
|
|
255
281
|
|
|
256
|
-
emits: ['card-click', 'moved', 'refused', 'stale'],
|
|
282
|
+
emits: ['card-click', 'card-aux-click', 'moved', 'refused', 'stale'],
|
|
257
283
|
|
|
258
284
|
data() {
|
|
259
285
|
return {
|
|
@@ -263,6 +289,8 @@ export default {
|
|
|
263
289
|
refusal: '',
|
|
264
290
|
/** The card being dragged, and where from. */
|
|
265
291
|
dragging: null,
|
|
292
|
+
/** The day late marking measures from. */
|
|
293
|
+
today: new Date(),
|
|
266
294
|
}
|
|
267
295
|
},
|
|
268
296
|
|
|
@@ -333,6 +361,35 @@ export default {
|
|
|
333
361
|
methods: {
|
|
334
362
|
t,
|
|
335
363
|
|
|
364
|
+
preventMiddleClickAutoscroll,
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* A card's due state under `dueRule`.
|
|
368
|
+
*
|
|
369
|
+
* @param {object} card The card's row.
|
|
370
|
+
* @return {'overdue'|'soon'|'ok'|null} The state, or null when no rule applies.
|
|
371
|
+
* @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-late-marking-on-board-cards
|
|
372
|
+
*/
|
|
373
|
+
dueState(card) {
|
|
374
|
+
return dueStateForRow(card, this.dueRule, this.today)
|
|
375
|
+
},
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* The words a late card carries. Colour alone would not reach a reader
|
|
379
|
+
* who cannot see it, or cannot tell red from amber.
|
|
380
|
+
*
|
|
381
|
+
* @param {object} card The card's row.
|
|
382
|
+
* @return {string} "Overdue", "Due soon", or '' for a card that is fine.
|
|
383
|
+
* @spec openspec/changes/detail-action-model-and-case-surfaces/specs/detail-action-model/spec.md#requirement-late-marking-on-board-cards
|
|
384
|
+
*/
|
|
385
|
+
dueLabel(card) {
|
|
386
|
+
const state = this.dueState(card)
|
|
387
|
+
if (state === 'overdue') {
|
|
388
|
+
return t('nextcloud-vue', 'Overdue')
|
|
389
|
+
}
|
|
390
|
+
return state === 'soon' ? t('nextcloud-vue', 'Due soon') : ''
|
|
391
|
+
},
|
|
392
|
+
|
|
336
393
|
/**
|
|
337
394
|
* Open one card. The pointer and the keyboard both come through here,
|
|
338
395
|
* so a reader on Enter reaches the same record as a reader on click.
|
|
@@ -343,13 +400,15 @@ export default {
|
|
|
343
400
|
*/
|
|
344
401
|
openCard(card, event) {
|
|
345
402
|
/**
|
|
346
|
-
* @event card-click Emitted when a reader opens a card, by click
|
|
403
|
+
* @event card-click Emitted when a reader opens a card, by click or Enter. Payload: `(card, event)` — the card row and the native event, so the host can open it in a new tab on a ctrl/cmd/shift click. A middle click emits `card-aux-click` instead.
|
|
347
404
|
*/
|
|
348
405
|
this.$emit('card-click', card, event)
|
|
349
406
|
},
|
|
350
407
|
|
|
351
408
|
/**
|
|
352
|
-
* Middle click on a card's open button:
|
|
409
|
+
* Middle click on a card's open button: emits `card-aux-click`, not
|
|
410
|
+
* `card-click`, so an existing listener that navigates never moves the
|
|
411
|
+
* current tab away.
|
|
353
412
|
*
|
|
354
413
|
* @param {object} card The card the reader picked.
|
|
355
414
|
* @param {MouseEvent} event The auxclick event.
|
|
@@ -357,7 +416,10 @@ export default {
|
|
|
357
416
|
*/
|
|
358
417
|
onCardAuxClick(card, event) {
|
|
359
418
|
if (isRowMiddleClick(event)) {
|
|
360
|
-
|
|
419
|
+
/**
|
|
420
|
+
* @event card-aux-click Emitted when a reader middle-clicks a card, for opening it in a new tab (see `openRowTarget`). Payload: `(card, event)` — the card row and the native auxclick event.
|
|
421
|
+
*/
|
|
422
|
+
this.$emit('card-aux-click', card, event)
|
|
361
423
|
}
|
|
362
424
|
},
|
|
363
425
|
|
|
@@ -553,6 +615,29 @@ export default {
|
|
|
553
615
|
display: block;
|
|
554
616
|
}
|
|
555
617
|
|
|
618
|
+
/* A late card: an edge in the error colour, drawn as an inset shadow so the
|
|
619
|
+
card keeps its size and its rounded corners. The label below carries the
|
|
620
|
+
meaning; the edge only helps a sighted reader find it. */
|
|
621
|
+
.cn-board-view__card--overdue {
|
|
622
|
+
border-color: var(--color-error);
|
|
623
|
+
box-shadow: inset 3px 0 0 var(--color-error);
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.cn-board-view__due {
|
|
627
|
+
display: block;
|
|
628
|
+
font-size: 0.85em;
|
|
629
|
+
font-weight: 700;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
.cn-board-view__due--overdue {
|
|
633
|
+
color: var(--color-error-text, var(--color-error));
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
.cn-board-view__due--soon {
|
|
637
|
+
color: var(--color-warning-text, var(--color-main-text));
|
|
638
|
+
font-weight: 600;
|
|
639
|
+
}
|
|
640
|
+
|
|
556
641
|
/*
|
|
557
642
|
* The card's opening control. The cursor and the focus ring live here now,
|
|
558
643
|
* on the thing that actually does something, rather than on the box.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
The brand stripe of the organisation. A theme sets its colours, shares and height through the `--cn-brand-stripe-*` custom properties. Without a theme it is one band in the primary colour.
|
|
2
|
+
|
|
3
|
+
```vue
|
|
4
|
+
<CnBrandStripe />
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
With the properties a theme would set:
|
|
8
|
+
|
|
9
|
+
```vue
|
|
10
|
+
<div style="--cn-brand-stripe-color-1: #cc0000; --cn-brand-stripe-color-2: #3669a5; --cn-brand-stripe-color-3: #cc0000; --cn-brand-stripe-ratio-1: 6; --cn-brand-stripe-ratio-2: 3; --cn-brand-stripe-ratio-3: 1; --cn-brand-stripe-height: 5px">
|
|
11
|
+
<CnBrandStripe />
|
|
12
|
+
</div>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Down the side of a panel, with `orientation="vertical"`:
|
|
16
|
+
|
|
17
|
+
```vue
|
|
18
|
+
<div style="display: flex; height: 80px; gap: 12px;">
|
|
19
|
+
<CnBrandStripe orientation="vertical" />
|
|
20
|
+
<span>Content beside the stripe</span>
|
|
21
|
+
</div>
|
|
22
|
+
```
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
SPDX-FileCopyrightText: 2026 Conduction B.V.
|
|
3
|
+
SPDX-License-Identifier: EUPL-1.2
|
|
4
|
+
-->
|
|
5
|
+
<template>
|
|
6
|
+
<div
|
|
7
|
+
class="cn-brand-stripe"
|
|
8
|
+
:class="{ 'cn-brand-stripe--vertical': orientation === 'vertical' }"
|
|
9
|
+
aria-hidden="true"
|
|
10
|
+
data-testid="cn-brand-stripe">
|
|
11
|
+
<span class="cn-brand-stripe__band cn-brand-stripe__band--1" />
|
|
12
|
+
<span class="cn-brand-stripe__band cn-brand-stripe__band--2" />
|
|
13
|
+
<span class="cn-brand-stripe__band cn-brand-stripe__band--3" />
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script>
|
|
18
|
+
/**
|
|
19
|
+
* CnBrandStripe draws the organisation's brand stripe: up to three coloured
|
|
20
|
+
* bands next to each other, for the top of a page, a card or a sidebar.
|
|
21
|
+
*
|
|
22
|
+
* The theme decides what it looks like, through the library's own custom
|
|
23
|
+
* properties: `--cn-brand-stripe-color-1/2/3` (the colours, start to end),
|
|
24
|
+
* `--cn-brand-stripe-ratio-1/2/3` (unitless shares, such as 6, 3 and 1)
|
|
25
|
+
* and `--cn-brand-stripe-height` (such as 5px). A theming app maps its own
|
|
26
|
+
* tokens onto these; the library never reads a theme's tokens. Without them the
|
|
27
|
+
* stripe is one band in the Nextcloud primary colour, 4px high.
|
|
28
|
+
*
|
|
29
|
+
* The stripe is decoration: it carries no meaning and is hidden from
|
|
30
|
+
* assistive technology.
|
|
31
|
+
*
|
|
32
|
+
* ```vue
|
|
33
|
+
* <CnBrandStripe />
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export default {
|
|
37
|
+
name: 'CnBrandStripe',
|
|
38
|
+
|
|
39
|
+
props: {
|
|
40
|
+
/**
|
|
41
|
+
* The direction the stripe runs in: `horizontal` (the default, a bar
|
|
42
|
+
* across the top) or `vertical` (a bar down the side; the height
|
|
43
|
+
* token then sets its width).
|
|
44
|
+
*
|
|
45
|
+
* @type {'horizontal'|'vertical'}
|
|
46
|
+
*/
|
|
47
|
+
orientation: {
|
|
48
|
+
type: String,
|
|
49
|
+
default: 'horizontal',
|
|
50
|
+
validator: (v) => ['horizontal', 'vertical'].includes(v),
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
</script>
|
|
55
|
+
|
|
56
|
+
<!--
|
|
57
|
+
The stripe reads the library's own `--cn-brand-stripe-*` properties, each
|
|
58
|
+
with a Nextcloud fallback. A theming app sets them from its own tokens.
|
|
59
|
+
-->
|
|
60
|
+
<style scoped>
|
|
61
|
+
.cn-brand-stripe {
|
|
62
|
+
display: flex;
|
|
63
|
+
flex: none;
|
|
64
|
+
width: 100%;
|
|
65
|
+
height: var(--cn-brand-stripe-height, 4px);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.cn-brand-stripe--vertical {
|
|
69
|
+
flex-direction: column;
|
|
70
|
+
width: var(--cn-brand-stripe-height, 4px);
|
|
71
|
+
height: 100%;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.cn-brand-stripe__band {
|
|
75
|
+
flex-basis: 0;
|
|
76
|
+
flex-shrink: 1;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.cn-brand-stripe__band--1 {
|
|
80
|
+
flex-grow: var(--cn-brand-stripe-ratio-1, 1);
|
|
81
|
+
background-color: var(--cn-brand-stripe-color-1, var(--color-primary-element));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.cn-brand-stripe__band--2 {
|
|
85
|
+
flex-grow: var(--cn-brand-stripe-ratio-2, 1);
|
|
86
|
+
background-color: var(--cn-brand-stripe-color-2, var(--color-primary-element));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.cn-brand-stripe__band--3 {
|
|
90
|
+
flex-grow: var(--cn-brand-stripe-ratio-3, 1);
|
|
91
|
+
background-color: var(--cn-brand-stripe-color-3, var(--color-primary-element));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@media print {
|
|
95
|
+
.cn-brand-stripe {
|
|
96
|
+
print-color-adjust: exact;
|
|
97
|
+
-webkit-print-color-adjust: exact;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
</style>
|
|
@@ -149,7 +149,7 @@ export default {
|
|
|
149
149
|
},
|
|
150
150
|
},
|
|
151
151
|
|
|
152
|
-
emits: ['click', 'select'],
|
|
152
|
+
emits: ['click', 'select', 'aux-click'],
|
|
153
153
|
|
|
154
154
|
computed: {
|
|
155
155
|
/**
|
|
@@ -184,6 +184,14 @@ export default {
|
|
|
184
184
|
const listeners = { select: () => this.toggleSelect(object) }
|
|
185
185
|
if (!this.selectable || this.clickToView) {
|
|
186
186
|
listeners.click = (_card, event) => this.$emit('click', object, event)
|
|
187
|
+
// A middle click, kept off `click` so a navigating listener stays put.
|
|
188
|
+
listeners['aux-click'] = (_card, event) => {
|
|
189
|
+
/**
|
|
190
|
+
* @event aux-click Emitted when a navigating card is middle-clicked, for opening it in a new tab (see `openRowTarget`). Payload: `(object, event)` — the card's object and the native auxclick event.
|
|
191
|
+
* @type {object} The card's object.
|
|
192
|
+
*/
|
|
193
|
+
this.$emit('aux-click', object, event)
|
|
194
|
+
}
|
|
187
195
|
}
|
|
188
196
|
return listeners
|
|
189
197
|
},
|
|
@@ -55,6 +55,43 @@
|
|
|
55
55
|
<span v-else :title="rawTitle">{{ formattedValue }}</span>
|
|
56
56
|
</template>
|
|
57
57
|
|
|
58
|
+
<!-- Built-in "avatar" widget: a person as an avatar with the name beside
|
|
59
|
+
it. A user id (widgetProps.userField, or widgetProps.user for a cell
|
|
60
|
+
that holds the id itself) gets the Nextcloud avatar; a free name
|
|
61
|
+
gets its initials. The picture is decoration: the name is the text. -->
|
|
62
|
+
<template v-else-if="widget === 'avatar'">
|
|
63
|
+
<span v-if="avatarName || avatarUserId" class="cn-cell-renderer__avatar">
|
|
64
|
+
<span v-if="avatarUserId" class="cn-cell-renderer__avatar-picture" aria-hidden="true">
|
|
65
|
+
<NcAvatar
|
|
66
|
+
:user="avatarUserId"
|
|
67
|
+
:displayName="avatarName || avatarUserId"
|
|
68
|
+
:size="avatarSize"
|
|
69
|
+
:disableMenu="true"
|
|
70
|
+
:disableTooltip="true" />
|
|
71
|
+
</span>
|
|
72
|
+
<span
|
|
73
|
+
v-else
|
|
74
|
+
class="cn-cell-renderer__avatar-initials"
|
|
75
|
+
:style="{ width: avatarSize + 'px', height: avatarSize + 'px' }"
|
|
76
|
+
aria-hidden="true">{{ avatarInitials }}</span>
|
|
77
|
+
<span class="cn-cell-renderer__avatar-name" :title="avatarName || avatarUserId">{{ avatarName || avatarUserId }}</span>
|
|
78
|
+
</span>
|
|
79
|
+
<span v-else class="cn-cell-renderer__dash">—</span>
|
|
80
|
+
</template>
|
|
81
|
+
|
|
82
|
+
<!-- Built-in "date" widget: a date whose colour follows
|
|
83
|
+
widgetProps.variantWhen, rules on the number of days until it
|
|
84
|
+
(0 = today, negative = overdue). -->
|
|
85
|
+
<template v-else-if="widget === 'date'">
|
|
86
|
+
<time
|
|
87
|
+
v-if="dateTimestamp"
|
|
88
|
+
class="cn-cell-renderer__date"
|
|
89
|
+
:class="dateVariant ? 'cn-cell-renderer__date--' + dateVariant : null"
|
|
90
|
+
:datetime="dateTimestamp.toISOString()"
|
|
91
|
+
:title="rawTitle">{{ dateLabel }}</time>
|
|
92
|
+
<span v-else class="cn-cell-renderer__dash">—</span>
|
|
93
|
+
</template>
|
|
94
|
+
|
|
58
95
|
<!-- Explicit column formatter — overrides the type-aware paths below -->
|
|
59
96
|
<template v-else-if="hasFormatter">
|
|
60
97
|
<span :title="rawTitle">{{ formattedValue }}</span>
|
|
@@ -129,10 +166,13 @@
|
|
|
129
166
|
</template>
|
|
130
167
|
|
|
131
168
|
<script>
|
|
132
|
-
import {
|
|
169
|
+
import { getCanonicalLocale } from '@nextcloud/l10n'
|
|
170
|
+
import { NcAvatar, NcDateTime } from '@nextcloud/vue'
|
|
133
171
|
import CheckBold from 'vue-material-design-icons/CheckBold.vue'
|
|
134
172
|
import CnFkResolveCell from '../CnFkResolveCell/CnFkResolveCell.vue'
|
|
173
|
+
import { parseDateValue, resolveDateVariant } from '../../utils/dateVariant.js'
|
|
135
174
|
import { safeCurrencyCode } from '../../utils/formatMetric.js'
|
|
175
|
+
import { objectFieldValue } from '../../utils/objectName.js'
|
|
136
176
|
import { safeHref } from '../../utils/safeHref.js'
|
|
137
177
|
import { formatValue } from '../../utils/schema.js'
|
|
138
178
|
import { CnStatusBadge } from '../CnStatusBadge/index.js'
|
|
@@ -162,6 +202,7 @@ export default {
|
|
|
162
202
|
CnStatusBadge,
|
|
163
203
|
CnFkResolveCell,
|
|
164
204
|
CheckBold,
|
|
205
|
+
NcAvatar,
|
|
165
206
|
NcDateTime,
|
|
166
207
|
},
|
|
167
208
|
|
|
@@ -232,6 +273,12 @@ export default {
|
|
|
232
273
|
* the built-in id `"badge"` renders `CnStatusBadge` and the built-in
|
|
233
274
|
* id `"fkResolve"` renders `CnFkResolveCell` (uuid → related object
|
|
234
275
|
* label, config via `widgetProps { register, schema, labelField }`).
|
|
276
|
+
* The built-in id `"avatar"` renders a person as an avatar with the
|
|
277
|
+
* name beside it (`widgetProps { userField?, user?, nameField?, size? }`;
|
|
278
|
+
* a free name gets its initials), and the built-in id `"date"` renders
|
|
279
|
+
* a date whose colour follows `widgetProps.variantWhen`, rules on the
|
|
280
|
+
* number of days until the date (`[{ op: "lt", value: 0, variant:
|
|
281
|
+
* "error" }, { op: "lte", value: 5, variant: "warning" }]`).
|
|
235
282
|
* Takes precedence over `formatter`/the type-aware rendering, but the
|
|
236
283
|
* value handed to the widget is the formatter-shaped `formatted` when
|
|
237
284
|
* `formatter` is also set.
|
|
@@ -350,6 +397,112 @@ export default {
|
|
|
350
397
|
return Number.isNaN(date.getTime()) ? null : date
|
|
351
398
|
},
|
|
352
399
|
|
|
400
|
+
/**
|
|
401
|
+
* `avatar` widget: the Nextcloud user id whose avatar to show, or ''
|
|
402
|
+
* for a free name. Read from the row field `widgetProps.userField`,
|
|
403
|
+
* or from the cell value itself when `widgetProps.user` is true.
|
|
404
|
+
*
|
|
405
|
+
* @return {string}
|
|
406
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
|
|
407
|
+
*/
|
|
408
|
+
avatarUserId() {
|
|
409
|
+
const props = this.widgetProps || {}
|
|
410
|
+
let id = ''
|
|
411
|
+
if (typeof props.userField === 'string' && props.userField !== '') {
|
|
412
|
+
id = objectFieldValue(this.row, props.userField)
|
|
413
|
+
} else if (props.user === true) {
|
|
414
|
+
id = this.value
|
|
415
|
+
}
|
|
416
|
+
return (typeof id === 'string' || typeof id === 'number') ? String(id) : ''
|
|
417
|
+
},
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* `avatar` widget: the name shown beside the picture. Read from the
|
|
421
|
+
* row field `widgetProps.nameField` when set, else the cell value.
|
|
422
|
+
*
|
|
423
|
+
* @return {string}
|
|
424
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
|
|
425
|
+
*/
|
|
426
|
+
avatarName() {
|
|
427
|
+
const props = this.widgetProps || {}
|
|
428
|
+
if (typeof props.nameField === 'string' && props.nameField !== '') {
|
|
429
|
+
const name = objectFieldValue(this.row, props.nameField)
|
|
430
|
+
if (typeof name === 'string' && name !== '') {
|
|
431
|
+
return name
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
if (!this.hasValue || typeof this.value === 'object') {
|
|
435
|
+
return ''
|
|
436
|
+
}
|
|
437
|
+
return String(this.hasFormatter ? this.formattedValue : this.value)
|
|
438
|
+
},
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* `avatar` widget: the initials of a free name, at most two letters
|
|
442
|
+
* (first and last word).
|
|
443
|
+
*
|
|
444
|
+
* @return {string}
|
|
445
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
|
|
446
|
+
*/
|
|
447
|
+
avatarInitials() {
|
|
448
|
+
const words = this.avatarName.trim().split(/\s+/).filter((word) => word !== '')
|
|
449
|
+
if (words.length === 0) {
|
|
450
|
+
return ''
|
|
451
|
+
}
|
|
452
|
+
const first = Array.from(words[0])[0] || ''
|
|
453
|
+
const last = words.length > 1 ? (Array.from(words[words.length - 1])[0] || '') : ''
|
|
454
|
+
return (first + last).toLocaleUpperCase()
|
|
455
|
+
},
|
|
456
|
+
|
|
457
|
+
/**
|
|
458
|
+
* `avatar` widget: the picture size in pixels (`widgetProps.size`, default 24).
|
|
459
|
+
*
|
|
460
|
+
* @return {number}
|
|
461
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
|
|
462
|
+
*/
|
|
463
|
+
avatarSize() {
|
|
464
|
+
const size = Number(this.widgetProps && this.widgetProps.size)
|
|
465
|
+
return Number.isFinite(size) && size > 0 ? size : 24
|
|
466
|
+
},
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* `date` widget: the variant of the first `widgetProps.variantWhen`
|
|
470
|
+
* rule the date matches, or '' for none.
|
|
471
|
+
*
|
|
472
|
+
* @return {string}
|
|
473
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
|
|
474
|
+
*/
|
|
475
|
+
dateVariant() {
|
|
476
|
+
const rules = this.widgetProps && this.widgetProps.variantWhen
|
|
477
|
+
const variant = resolveDateVariant(this.value, rules)
|
|
478
|
+
return variant === 'default' ? '' : variant
|
|
479
|
+
},
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* `date` widget: the date written out in the user's locale.
|
|
483
|
+
*
|
|
484
|
+
* @return {string}
|
|
485
|
+
* @spec openspec/changes/workplace-dashboard-primitives/specs/workplace-dashboard-primitives/spec.md#requirement-avatar-and-date-cells
|
|
486
|
+
*/
|
|
487
|
+
dateLabel() {
|
|
488
|
+
const date = parseDateValue(this.value)
|
|
489
|
+
if (date === null) {
|
|
490
|
+
return ''
|
|
491
|
+
}
|
|
492
|
+
const options = { day: 'numeric', month: 'short', year: 'numeric' }
|
|
493
|
+
let locale
|
|
494
|
+
try {
|
|
495
|
+
locale = getCanonicalLocale()
|
|
496
|
+
} catch {
|
|
497
|
+
locale = undefined
|
|
498
|
+
}
|
|
499
|
+
try {
|
|
500
|
+
return new Intl.DateTimeFormat(locale || undefined, options).format(date)
|
|
501
|
+
} catch {
|
|
502
|
+
return new Intl.DateTimeFormat(undefined, options).format(date)
|
|
503
|
+
}
|
|
504
|
+
},
|
|
505
|
+
|
|
353
506
|
/** True when the property is a URI / URL (rendered as an external link). */
|
|
354
507
|
isUri() {
|
|
355
508
|
return this.property?.format === 'uri' || this.property?.format === 'url'
|
|
@@ -750,6 +903,59 @@ export default {
|
|
|
750
903
|
color: var(--color-text-maxcontrast);
|
|
751
904
|
}
|
|
752
905
|
|
|
906
|
+
.cn-cell-renderer__avatar {
|
|
907
|
+
display: inline-flex;
|
|
908
|
+
align-items: center;
|
|
909
|
+
gap: 8px;
|
|
910
|
+
max-width: 100%;
|
|
911
|
+
vertical-align: middle;
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
.cn-cell-renderer__avatar-picture {
|
|
915
|
+
display: inline-flex;
|
|
916
|
+
flex: none;
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
.cn-cell-renderer__avatar-initials {
|
|
920
|
+
display: inline-flex;
|
|
921
|
+
flex: none;
|
|
922
|
+
align-items: center;
|
|
923
|
+
justify-content: center;
|
|
924
|
+
border-radius: 50%;
|
|
925
|
+
background-color: var(--color-primary-element-light);
|
|
926
|
+
color: var(--color-primary-element-light-text);
|
|
927
|
+
font-size: 0.75em;
|
|
928
|
+
font-weight: 700;
|
|
929
|
+
line-height: 1;
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
.cn-cell-renderer__avatar-name {
|
|
933
|
+
min-width: 0;
|
|
934
|
+
overflow: hidden;
|
|
935
|
+
text-overflow: ellipsis;
|
|
936
|
+
white-space: nowrap;
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
/* A date that matched a rule is also set in a heavier weight, so the signal
|
|
940
|
+
does not rest on colour alone. */
|
|
941
|
+
.cn-cell-renderer__date--success,
|
|
942
|
+
.cn-cell-renderer__date--warning,
|
|
943
|
+
.cn-cell-renderer__date--error {
|
|
944
|
+
font-weight: 600;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
.cn-cell-renderer__date--success {
|
|
948
|
+
color: var(--color-text-success, var(--color-success-text));
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
.cn-cell-renderer__date--warning {
|
|
952
|
+
color: var(--color-text-warning, var(--color-warning-text));
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
.cn-cell-renderer__date--error {
|
|
956
|
+
color: var(--color-text-error, var(--color-error-text));
|
|
957
|
+
}
|
|
958
|
+
|
|
753
959
|
.cn-cell-renderer__icon--success {
|
|
754
960
|
color: var(--color-success);
|
|
755
961
|
}
|
|
@@ -94,6 +94,7 @@
|
|
|
94
94
|
import { NcActionButton, NcActionLink, NcActions } from '@nextcloud/vue'
|
|
95
95
|
import { CTX_MENU_DATA_ATTR, CTX_MENU_POPPER_ATTR } from '../../composables/useContextMenu.js'
|
|
96
96
|
import { followItemActionLink, resolveItemActionLink } from '../../utils/actionLink.js'
|
|
97
|
+
import { isModifiedClick } from '../../utils/linkNavigation.js'
|
|
97
98
|
import { CnIcon } from '../CnIcon/index.js'
|
|
98
99
|
|
|
99
100
|
/**
|
|
@@ -493,13 +494,17 @@ export default {
|
|
|
493
494
|
/**
|
|
494
495
|
* A link entry was clicked: route a plain in-app click, leave the rest to
|
|
495
496
|
* the browser, and emit `action` as a button would. The `handler` is not
|
|
496
|
-
* called, since navigating is what the link already does.
|
|
497
|
+
* called, since navigating is what the link already does. A modified
|
|
498
|
+
* click opens a new tab, so nothing is emitted in this one.
|
|
497
499
|
*
|
|
498
500
|
* @param {object} action The action descriptor.
|
|
499
501
|
* @param {object} link The resolved link.
|
|
500
502
|
* @param {MouseEvent} event The click event.
|
|
501
503
|
*/
|
|
502
504
|
onLinkAction(action, link, event) {
|
|
505
|
+
if (isModifiedClick(event)) {
|
|
506
|
+
return
|
|
507
|
+
}
|
|
503
508
|
followItemActionLink(event, link, this.$router)
|
|
504
509
|
this.$emit('action', { action: action.label, row: this.targetItem })
|
|
505
510
|
},
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
A thread with a reply box:
|
|
2
|
+
|
|
3
|
+
```vue
|
|
4
|
+
<CnConversationThread
|
|
5
|
+
title="Contact with the resident"
|
|
6
|
+
reply-label="Answer to the resident"
|
|
7
|
+
:messages="[
|
|
8
|
+
{ id: 1, author: 'Sanne de Vries', time: '2026-10-04T10:52:00', side: 'them',
|
|
9
|
+
text: 'Thank you. I would like to see all documents about the lighting.' },
|
|
10
|
+
{ id: 2, time: '2026-10-04T10:24:00', side: 'us',
|
|
11
|
+
text: 'Construction starts in March. There will be lighting along the whole cycle path.' },
|
|
12
|
+
]" />
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Read-only, for a closed record:
|
|
16
|
+
|
|
17
|
+
```vue
|
|
18
|
+
<CnConversationThread
|
|
19
|
+
title="Contact"
|
|
20
|
+
:allow-reply="false"
|
|
21
|
+
:messages="[
|
|
22
|
+
{ id: 1, author: 'Sanne de Vries', time: '4 Oct, 10:52', side: 'them', text: 'Thank you.' },
|
|
23
|
+
]" />
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
No messages yet:
|
|
27
|
+
|
|
28
|
+
```vue
|
|
29
|
+
<CnConversationThread title="Contact" :messages="[]" />
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Posting to an endpoint. The reply goes out as `{ message, ...payload }`. `title-tag`, `placeholder`, `send-label`, `us-label` and `empty-text` adjust the wording, and the `reply-actions` slot adds buttons before Send:
|
|
33
|
+
|
|
34
|
+
```vue
|
|
35
|
+
<CnConversationThread
|
|
36
|
+
title="Contact"
|
|
37
|
+
title-tag="h2"
|
|
38
|
+
placeholder="Write your answer"
|
|
39
|
+
send-label="Send to resident"
|
|
40
|
+
us-label="Municipality"
|
|
41
|
+
empty-text="Nobody has written yet."
|
|
42
|
+
endpoint="/apps/example/api/cases/42/messages"
|
|
43
|
+
:payload="{ channel: 'portal' }"
|
|
44
|
+
:messages="[
|
|
45
|
+
{ id: 1, time: '2026-10-04T11:00:00', side: 'us', text: 'We received your request.' },
|
|
46
|
+
]">
|
|
47
|
+
<template #reply-actions="{ draft }">
|
|
48
|
+
<NcButton :disabled="!draft">Save draft</NcButton>
|
|
49
|
+
</template>
|
|
50
|
+
</CnConversationThread>
|
|
51
|
+
```
|