@conduction/nextcloud-vue 2.56.0-beta.36 → 2.56.0-beta.38
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/CnAdminSettingsShell/CnAdminSettingsShell.vue.js +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js +131 -3
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js +54 -18
- package/dist/esm/components/CnAdminSettingsShell/CnAdminSettingsShell.vue3.js.map +1 -1
- package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue.js +1 -1
- package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue2.js +3 -2
- package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue2.js.map +1 -1
- package/dist/esm/components/CnAdvancedFormDialog/CnMetadataTab.vue3.js.map +1 -1
- package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue.js +1 -1
- package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue2.js +5 -4
- package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue2.js.map +1 -1
- package/dist/esm/components/CnAdvancedFormDialog/CnPropertyValueCell.vue3.js.map +1 -1
- package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue.js +1 -1
- package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue2.js +2 -1
- package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue2.js.map +1 -1
- package/dist/esm/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue3.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue.js +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js +2 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue2.js.map +1 -1
- package/dist/esm/components/CnAuditTrailCard/CnAuditTrailCard.vue3.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue.js +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js +376 -6
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +146 -71
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js.map +1 -1
- package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue.js +1 -1
- package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue2.js +2 -1
- package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue2.js.map +1 -1
- package/dist/esm/components/CnCalendarEventPicker/CnCalendarEventPicker.vue3.js.map +1 -1
- package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue.js +1 -1
- package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue2.js +2 -1
- package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnCalendarWidget/CnCalendarWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue.js +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js +6 -5
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnChartWidget/CnChartWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue.js +1 -1
- package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue2.js +2 -1
- package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue2.js.map +1 -1
- package/dist/esm/components/CnCollectivePagePicker/CnCollectivePagePicker.vue3.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue.js +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js +2 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue2.js.map +1 -1
- package/dist/esm/components/CnConversationThread/CnConversationThread.vue3.js.map +1 -1
- package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue.js +1 -1
- package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js +2 -1
- package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnCountdownWidget/CnCountdownWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue.js +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js +47 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js +22 -12
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue.js +1 -1
- package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue2.js +3 -1
- package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue2.js.map +1 -1
- package/dist/esm/components/CnDataMatrix/CnDataMatrix.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue2.js +2 -1
- package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailHeaderChips.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js +23 -4
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailPage/CnDetailPage.vue3.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue.js +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js +3 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue2.js.map +1 -1
- package/dist/esm/components/CnDetailWidgetHost/CnDetailWidgetHost.vue3.js.map +1 -1
- package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue.js +1 -1
- package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue2.js +2 -1
- package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue2.js.map +1 -1
- package/dist/esm/components/CnEmailPicker/CnEmailPicker.vue3.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue.js +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js +18 -5
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnFactsWidget/CnFactsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue.js +1 -1
- package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue2.js +3 -1
- package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue2.js.map +1 -1
- package/dist/esm/components/CnFederationStatus/CnFederationStatus.vue3.js.map +1 -1
- package/dist/esm/components/CnFileManager/CnFileManager.vue.js +1 -1
- package/dist/esm/components/CnFileManager/CnFileManager.vue2.js +3 -1
- package/dist/esm/components/CnFileManager/CnFileManager.vue2.js.map +1 -1
- package/dist/esm/components/CnFileManager/CnFileManager.vue3.js.map +1 -1
- package/dist/esm/components/CnFilePreview/CnFilePreview.vue.js +1 -1
- package/dist/esm/components/CnFilePreview/CnFilePreview.vue2.js +2 -1
- package/dist/esm/components/CnFilePreview/CnFilePreview.vue2.js.map +1 -1
- package/dist/esm/components/CnFilePreview/CnFilePreview.vue3.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue.js +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js +49 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue2.js.map +1 -1
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js +3 -3
- package/dist/esm/components/CnFilesBrowser/CnFilesBrowser.vue3.js.map +1 -1
- package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue.js +1 -1
- package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js +2 -1
- package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue2.js.map +1 -1
- package/dist/esm/components/CnFollowToggle/CnFollowToggle.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js +571 -77
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js +191 -82
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.js.map +1 -1
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js +11 -2
- package/dist/esm/components/CnIndexPage/useSelfFetchList.js.map +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue.js +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js +2 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue2.js.map +1 -1
- package/dist/esm/components/CnNotesCard/CnNotesCard.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue.js +1 -1
- package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue2.js +3 -2
- package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectCalendar/CnObjectCalendar.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js +28 -0
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js +82 -75
- package/dist/esm/components/CnObjectDataWidget/CnObjectDataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue.js +1 -1
- package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue2.js +5 -4
- package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue.js +1 -1
- package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue2.js +2 -1
- package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnAuditTrailTab.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue.js +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue2.js +2 -1
- package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnFlowTasksPanel.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue.js +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js +2 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnNotesTab.vue3.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue.js +1 -1
- package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue2.js +2 -1
- package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue2.js.map +1 -1
- package/dist/esm/components/CnObjectSidebar/CnTasksTab.vue3.js.map +1 -1
- package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue.js +1 -1
- package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue2.js +2 -1
- package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue2.js.map +1 -1
- package/dist/esm/components/CnPropertySourceField/CnPropertySourceField.vue3.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue.js +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js +70 -2
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnRecordListWidget/CnRecordListWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue.js +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js +67 -5
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue2.js.map +1 -1
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js +181 -124
- package/dist/esm/components/CnRegisterMapping/CnRegisterMapping.vue3.js.map +1 -1
- package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue.js +1 -1
- package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue2.js +2 -1
- package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue2.js.map +1 -1
- package/dist/esm/components/CnRoadmapItem/CnRoadmapItem.vue3.js.map +1 -1
- package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue2.js +2 -0
- package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue2.js.map +1 -1
- package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue3.js +2 -2
- package/dist/esm/components/CnSchemaFormDialog/CnSchemaFormDialog.vue3.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue.js +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js +5 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue2.js.map +1 -1
- package/dist/esm/components/CnSettingsPage/CnSettingsPage.vue3.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue.js +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js +134 -10
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js +6 -2
- package/dist/esm/components/CnStatWidget/CnStatWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue.js +1 -1
- package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue2.js +2 -1
- package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue2.js.map +1 -1
- package/dist/esm/components/CnStatsBlock/CnStatsBlock.vue3.js.map +1 -1
- package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue.js +1 -1
- package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue2.js +2 -1
- package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue2.js.map +1 -1
- package/dist/esm/components/CnSummaryAggregates/CnSummaryAggregates.vue3.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue.js +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js +6 -3
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTasksCard/CnTasksCard.vue.js +1 -1
- package/dist/esm/components/CnTasksCard/CnTasksCard.vue2.js +2 -1
- package/dist/esm/components/CnTasksCard/CnTasksCard.vue2.js.map +1 -1
- package/dist/esm/components/CnTasksCard/CnTasksCard.vue3.js.map +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue.js +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js +2 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTimelineWidget/CnTimelineWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue.js +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js +140 -7
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnToggleTableWidget/CnToggleTableWidget.vue3.js.map +1 -1
- package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue.js +1 -1
- package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue2.js +2 -1
- package/dist/esm/components/CnTranslatedBadge/CnTranslatedBadge.vue2.js.map +1 -1
- package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue.js +1 -1
- package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue2.js +2 -1
- package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue2.js.map +1 -1
- package/dist/esm/components/CnVersionHistory/CnVersionHistory.vue3.js.map +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue.js +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js +37 -9
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue2.js.map +1 -1
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js +6 -5
- package/dist/esm/components/CnVersionInfoCard/CnVersionInfoCard.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js +53 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js +3 -2
- package/dist/esm/components/CnWidgetCardGrid/CnWidgetCardGrid.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue.js +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js +135 -0
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetObjectTable/CnWidgetObjectTable.vue3.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +19 -0
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js +37 -19
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.js.map +1 -1
- package/dist/esm/composables/useListView.js +21 -0
- package/dist/esm/composables/useListView.js.map +1 -1
- package/dist/esm/dialogs/CnNoteHistoryDialog.vue.js +1 -1
- package/dist/esm/dialogs/CnNoteHistoryDialog.vue2.js +2 -1
- package/dist/esm/dialogs/CnNoteHistoryDialog.vue2.js.map +1 -1
- package/dist/esm/dialogs/CnNoteHistoryDialog.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/activity/CnActivityCard.vue.js +1 -1
- package/dist/esm/integrations/builtin/activity/CnActivityCard.vue2.js +3 -2
- package/dist/esm/integrations/builtin/activity/CnActivityCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/activity/CnActivityCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/activity/CnActivityTab.vue.js +1 -1
- package/dist/esm/integrations/builtin/activity/CnActivityTab.vue2.js +4 -3
- package/dist/esm/integrations/builtin/activity/CnActivityTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/activity/CnActivityTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue.js +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js +3 -2
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/analytics/CnAnalyticsTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue.js +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue.js +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue2.js +6 -5
- package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/calendar/CnCalendarTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue.js +1 -1
- package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/contactmoment/CnContactmomentCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/cospend/CnCospendTab.vue.js +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.map +1 -1
- package/dist/esm/integrations/builtin/deck/CnDeckTab.vue.js +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.map +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailCard.vue.js +1 -1
- package/dist/esm/integrations/builtin/email/CnEmailCard.vue2.js +2 -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/field-inspection/CnFieldInspectionCard.vue.js +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js +2 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionCard.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue.js +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue2.js +2 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue2.js.map +1 -1
- package/dist/esm/integrations/builtin/field-inspection/CnFieldInspectionTab.vue3.js.map +1 -1
- package/dist/esm/integrations/builtin/photos/CnPhotosTab.vue.js +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.map +1 -1
- package/dist/esm/l10n/en.json.js +57 -2
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +78 -2
- package/dist/esm/l10n/nl.json.js.map +1 -1
- package/dist/esm/library-style.js +1 -1
- package/dist/esm/nextcloud-vue.css +1541 -1166
- package/dist/esm/store/useObjectStore.js +23 -4
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/boardColumns.js +58 -2
- package/dist/esm/utils/boardColumns.js.map +1 -1
- package/dist/esm/utils/boardReferenceColumns.js +330 -0
- package/dist/esm/utils/boardReferenceColumns.js.map +1 -0
- package/dist/esm/utils/buildManifest.js +4 -1
- package/dist/esm/utils/buildManifest.js.map +1 -1
- package/dist/esm/utils/schema.js +5 -4
- package/dist/esm/utils/schema.js.map +1 -1
- package/dist/esm/utils/userLocale.js +30 -0
- package/dist/esm/utils/userLocale.js.map +1 -0
- package/dist/esm/utils/validateManifestV2.compiled.js +3 -3
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/esm/utils/widgetDispatch.js +8 -2
- package/dist/esm/utils/widgetDispatch.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +30291 -27618
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +1541 -1166
- package/l10n/en.json +57 -2
- package/l10n/nl.json +78 -2
- package/package.json +1 -1
- package/src/components/CnAdminSettingsShell/CnAdminSettingsShell.vue +160 -8
- package/src/components/CnAdvancedFormDialog/CnMetadataTab.vue +3 -2
- package/src/components/CnAdvancedFormDialog/CnPropertyValueCell.vue +5 -4
- package/src/components/CnAnalyticsReportPicker/CnAnalyticsReportPicker.vue +2 -1
- package/src/components/CnAuditTrailCard/CnAuditTrailCard.vue +2 -1
- package/src/components/CnBoardView/CnBoardView.vue +433 -12
- package/src/components/CnCalendarEventPicker/CnCalendarEventPicker.vue +2 -1
- package/src/components/CnCalendarWidget/CnCalendarWidget.vue +2 -1
- package/src/components/CnChartWidget/CnChartWidget.vue +6 -5
- package/src/components/CnCollectivePagePicker/CnCollectivePagePicker.vue +2 -1
- package/src/components/CnConversationThread/CnConversationThread.vue +2 -1
- package/src/components/CnCountdownWidget/CnCountdownWidget.vue +2 -1
- package/src/components/CnDashboardPage/CnDashboardPage.vue +59 -3
- package/src/components/CnDataMatrix/CnDataMatrix.vue +2 -1
- package/src/components/CnDetailPage/CnDetailHeaderChips.vue +2 -1
- package/src/components/CnDetailPage/CnDetailPage.md +1 -1
- package/src/components/CnDetailPage/CnDetailPage.vue +23 -4
- package/src/components/CnDetailWidgetHost/CnDetailWidgetHost.vue +3 -1
- package/src/components/CnEmailPicker/CnEmailPicker.vue +2 -1
- package/src/components/CnFactsWidget/CnFactsWidget.vue +18 -5
- package/src/components/CnFederationStatus/CnFederationStatus.vue +3 -1
- package/src/components/CnFileManager/CnFileManager.vue +2 -1
- package/src/components/CnFilePreview/CnFilePreview.vue +2 -1
- package/src/components/CnFilesBrowser/CnFilesBrowser.vue +54 -6
- package/src/components/CnFollowToggle/CnFollowToggle.vue +2 -1
- package/src/components/CnIndexPage/CnIndexPage.vue +610 -25
- package/src/components/CnIndexPage/useSelfFetchList.js +10 -1
- package/src/components/CnNotesCard/CnNotesCard.vue +2 -1
- package/src/components/CnObjectCalendar/CnObjectCalendar.vue +3 -2
- package/src/components/CnObjectDataWidget/CnObjectDataWidget.vue +36 -0
- package/src/components/CnObjectMetadataWidget/CnObjectMetadataWidget.vue +5 -4
- package/src/components/CnObjectSidebar/CnAuditTrailTab.vue +2 -1
- package/src/components/CnObjectSidebar/CnFlowTasksPanel.vue +2 -1
- package/src/components/CnObjectSidebar/CnNotesTab.vue +2 -1
- package/src/components/CnObjectSidebar/CnTasksTab.vue +2 -1
- package/src/components/CnPropertySourceField/CnPropertySourceField.vue +2 -1
- package/src/components/CnRecordListWidget/CnRecordListWidget.vue +70 -2
- package/src/components/CnRegisterMapping/CnRegisterMapping.md +5 -0
- package/src/components/CnRegisterMapping/CnRegisterMapping.vue +231 -96
- package/src/components/CnRoadmapItem/CnRoadmapItem.vue +2 -1
- package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +4 -2
- package/src/components/CnSettingsPage/CnSettingsPage.vue +5 -1
- package/src/components/CnStatWidget/CnStatWidget.vue +136 -11
- package/src/components/CnStatsBlock/CnStatsBlock.vue +2 -1
- package/src/components/CnSummaryAggregates/CnSummaryAggregates.vue +2 -1
- package/src/components/CnTabsWidget/CnTabsWidget.vue +6 -3
- package/src/components/CnTasksCard/CnTasksCard.vue +2 -1
- package/src/components/CnTimelineWidget/CnTimelineWidget.vue +2 -1
- package/src/components/CnToggleTableWidget/CnToggleTableWidget.vue +140 -7
- package/src/components/CnTranslatedBadge/CnTranslatedBadge.vue +2 -1
- package/src/components/CnVersionHistory/CnVersionHistory.vue +2 -1
- package/src/components/CnVersionInfoCard/CnVersionInfoCard.md +2 -1
- package/src/components/CnVersionInfoCard/CnVersionInfoCard.vue +42 -13
- package/src/components/CnWidgetCardGrid/CnWidgetCardGrid.vue +55 -2
- package/src/components/CnWidgetObjectTable/CnWidgetObjectTable.vue +135 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.md +10 -0
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +44 -1
- package/src/composables/useListView.js +21 -0
- package/src/css/board.css +105 -4
- package/src/css/dialog.css +4 -2
- package/src/css/index-page.css +49 -0
- package/src/css/look-board.css +77 -7
- package/src/dialogs/CnNoteHistoryDialog.vue +2 -1
- package/src/integrations/builtin/activity/CnActivityCard.vue +3 -2
- package/src/integrations/builtin/activity/CnActivityTab.vue +4 -3
- package/src/integrations/builtin/analytics/CnAnalyticsTab.vue +3 -2
- package/src/integrations/builtin/calendar/CnCalendarCard.vue +2 -1
- package/src/integrations/builtin/calendar/CnCalendarTab.vue +6 -5
- package/src/integrations/builtin/contactmoment/CnContactmomentCard.vue +2 -1
- package/src/integrations/builtin/cospend/CnCospendTab.vue +2 -1
- package/src/integrations/builtin/deck/CnDeckTab.vue +2 -1
- package/src/integrations/builtin/email/CnEmailCard.vue +2 -1
- package/src/integrations/builtin/field-inspection/CnFieldInspectionCard.vue +2 -1
- package/src/integrations/builtin/field-inspection/CnFieldInspectionTab.vue +2 -1
- package/src/integrations/builtin/photos/CnPhotosTab.vue +2 -1
- package/src/schemas/app-manifest-v2.schema.json +116 -5
- package/src/store/useObjectStore.js +23 -4
- package/src/utils/boardColumns.js +57 -1
- package/src/utils/boardReferenceColumns.js +326 -0
- package/src/utils/buildManifest.js +4 -1
- package/src/utils/schema.js +5 -4
- package/src/utils/userLocale.js +26 -0
- package/src/utils/validateManifestV2.compiled.js +3 -3
- package/src/utils/widgetDispatch.js +8 -2
|
@@ -2,7 +2,7 @@ import script from './CnActivityCard.vue2.js';
|
|
|
2
2
|
import { render } from './CnActivityCard.vue3.js';
|
|
3
3
|
|
|
4
4
|
script.render = render;
|
|
5
|
-
script.__scopeId = "data-v-
|
|
5
|
+
script.__scopeId = "data-v-287c17fa";
|
|
6
6
|
const __sfc_main = script;
|
|
7
7
|
|
|
8
8
|
export { __sfc_main as default };
|
|
@@ -10,6 +10,7 @@ import TagOutline from 'vue-material-design-icons/TagOutline.vue';
|
|
|
10
10
|
import Timeline from 'vue-material-design-icons/Timeline.vue';
|
|
11
11
|
import __sfc_main from '../../../components/CnDetailCard/CnDetailCard.vue.js';
|
|
12
12
|
import __sfc_main$1 from '../../../components/CnVisibilityChip/CnVisibilityChip.vue.js';
|
|
13
|
+
import { userLocale } from '../../../utils/userLocale.js';
|
|
13
14
|
import { prefixUrl, buildHeaders } from '../../../utils/headers.js';
|
|
14
15
|
|
|
15
16
|
const VALID_SURFACES = ['user-dashboard', 'app-dashboard', 'detail-page', 'single-entity'];
|
|
@@ -196,7 +197,7 @@ var script = {
|
|
|
196
197
|
return translate('nextcloud-vue', 'Yesterday')
|
|
197
198
|
}
|
|
198
199
|
try {
|
|
199
|
-
return date.toLocaleDateString(
|
|
200
|
+
return date.toLocaleDateString(userLocale(), { weekday: 'short', day: 'numeric', month: 'short' })
|
|
200
201
|
} catch {
|
|
201
202
|
return date.toISOString().split('T')[0]
|
|
202
203
|
}
|
|
@@ -208,7 +209,7 @@ var script = {
|
|
|
208
209
|
return ''
|
|
209
210
|
}
|
|
210
211
|
try {
|
|
211
|
-
return ts.toLocaleTimeString(
|
|
212
|
+
return ts.toLocaleTimeString(userLocale(), { hour: '2-digit', minute: '2-digit' })
|
|
212
213
|
} catch {
|
|
213
214
|
return ts.toISOString().split('T')[1].slice(0, 5)
|
|
214
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnActivityCard.vue2.js","sources":["../../../../../src/integrations/builtin/activity/CnActivityCard.vue"],"sourcesContent":["<!--\n CnActivityCard — bespoke surface-aware widget for the `activity` integration.\n\n Replaces the generic CnIntegrationCard for the `activity` leaf. Branches\n on `surface` per AD-19:\n - user-dashboard / app-dashboard : headline count of activity events\n (with a \"today\" sub-count) + most-recent line summarising the\n latest event (actor + verb + time).\n - detail-page : compact chronological feed grouped\n by day (mirrors the tab layout at a smaller scale).\n - single-entity : chip with type icon + actor +\n subject (referenceType: 'activity').\n\n Pulls rows from the same OR pluggable-integration sub-resource as\n CnActivityTab; for `single-entity` the optional `value` prop addresses\n a single event by id (matching CnIntegrationCard's fetchSingle\n contract).\n\n See `openregister/openspec/changes/integration-activity/` for the spec\n delta and ADR-019 (registry mechanism), AD-19 (surface fallback).\n-->\n<template>\n\t<CnDetailCard :title=\"cardTitle\" :icon=\"cardIcon\" :collapsible=\"collapsible\">\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<!-- single-entity surface: chip -->\n\t\t<template v-else-if=\"surface === 'single-entity'\">\n\t\t\t<span v-if=\"entity\" class=\"cn-activity-card__chip\" :title=\"subjectFor(entity)\">\n\t\t\t\t<component :is=\"iconFor(entity)\" :size=\"14\" />\n\t\t\t\t<span class=\"cn-activity-card__chip-label\">\n\t\t\t\t\t<span class=\"cn-activity-card__chip-actor\">{{ actorFor(entity) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-subject\">{{ subjectFor(entity) }}</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t<span v-else class=\"cn-activity-card__empty\">{{ emptyLabel }}</span>\n\t\t</template>\n\n\t\t<!-- dashboard surfaces: headline count + most-recent line -->\n\t\t<template v-else-if=\"surface === 'user-dashboard' || surface === 'app-dashboard'\">\n\t\t\t<div v-if=\"degraded\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ degraded }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"entries.length === 0\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-activity-card__headline\">\n\t\t\t\t<div class=\"cn-activity-card__headline-line\">\n\t\t\t\t\t<strong>{{ headlineLabel }}</strong>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"mostRecent\" class=\"cn-activity-card__headline-recent\">\n\t\t\t\t\t<component :is=\"iconFor(mostRecent)\" :size=\"14\" />\n\t\t\t\t\t<span class=\"cn-activity-card__headline-actor\">{{ actorFor(mostRecent) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__headline-subject\">{{ subjectFor(mostRecent) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__headline-time\">{{ relativeTime(mostRecent) }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- detail-page surface: compact timeline -->\n\t\t<template v-else>\n\t\t\t<div v-if=\"degraded\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ degraded }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"entries.length === 0\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-activity-card__timeline\">\n\t\t\t\t<section\n\t\t\t\t\tv-for=\"day in groupedByDay\"\n\t\t\t\t\t:key=\"day.key\"\n\t\t\t\t\tclass=\"cn-activity-card__day\">\n\t\t\t\t\t<header class=\"cn-activity-card__day-header\">\n\t\t\t\t\t\t<CalendarOutline :size=\"14\" />\n\t\t\t\t\t\t<span>{{ day.label }}</span>\n\t\t\t\t\t\t<span class=\"cn-activity-card__day-count\">{{ day.rows.length }}</span>\n\t\t\t\t\t</header>\n\t\t\t\t\t<ul class=\"cn-activity-card__list\">\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tv-for=\"entry in day.rows.slice(0, COMPACT_LIMIT)\"\n\t\t\t\t\t\t\t:key=\"entryKey(entry)\"\n\t\t\t\t\t\t\tclass=\"cn-activity-card__row\">\n\t\t\t\t\t\t\t<component :is=\"iconFor(entry)\" :size=\"14\" />\n\t\t\t\t\t\t\t<div class=\"cn-activity-card__row-main\">\n\t\t\t\t\t\t\t\t<span class=\"cn-activity-card__row-subject\">{{ subjectFor(entry) }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-activity-card__row-meta\">\n\t\t\t\t\t\t\t\t\t{{ actorFor(entry) }} · {{ relativeTime(entry) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<CnVisibilityChip v-if=\"showVisibility\" :visibility=\"entry.visibility\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</section>\n\t\t\t</div>\n\t\t</template>\n\t</CnDetailCard>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcLoadingIcon } from '@nextcloud/vue'\nimport AccountOutline from 'vue-material-design-icons/AccountOutline.vue'\nimport CalendarClockOutline from 'vue-material-design-icons/CalendarClockOutline.vue'\nimport CalendarOutline from 'vue-material-design-icons/CalendarOutline.vue'\nimport CommentTextOutline from 'vue-material-design-icons/CommentTextOutline.vue'\nimport FileOutline from 'vue-material-design-icons/FileOutline.vue'\nimport ShareVariantOutline from 'vue-material-design-icons/ShareVariantOutline.vue'\nimport TagOutline from 'vue-material-design-icons/TagOutline.vue'\nimport Timeline from 'vue-material-design-icons/Timeline.vue'\nimport CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'\nimport CnVisibilityChip from '../../../components/CnVisibilityChip/CnVisibilityChip.vue'\nimport { buildHeaders, prefixUrl } from '../../../utils/index.js'\n\nconst VALID_SURFACES = ['user-dashboard', 'app-dashboard', 'detail-page', 'single-entity']\nconst COMPACT_LIMIT = 4\n\n/**\n * CnActivityCard — bespoke surface-aware widget for the `activity` integration.\n *\n * Renders activity events across all four surfaces. See the file-level\n * docblock for surface-by-surface behaviour.\n */\nexport default {\n\tname: 'CnActivityCard',\n\n\tcomponents: {\n\t\tCnDetailCard,\n\t\tCnVisibilityChip,\n\t\tNcLoadingIcon,\n\t\tCalendarOutline,\n\t\tTimeline,\n\t\tFileOutline,\n\t\tAccountOutline,\n\t\tCommentTextOutline,\n\t\tShareVariantOutline,\n\t\tTagOutline,\n\t\tCalendarClockOutline,\n\t},\n\n\tprops: {\n\t\t/** Show a visibility chip (internal or public) on each row of the detail-page feed. Off by default. */\n\t\tshowVisibility: { type: Boolean, default: false },\n\t\t/** Stable integration id (forwarded from the registry — always `'activity'`). */\n\t\tintegrationId: { type: String, default: 'activity' },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, required: true },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, required: true },\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** Rendering surface (AD-19). */\n\t\tsurface: {\n\t\t\ttype: String,\n\t\t\tdefault: 'detail-page',\n\t\t\tvalidator: (s) => VALID_SURFACES.includes(s),\n\t\t},\n\n\t\t/** Optional single-entity reference (event id). */\n\t\tvalue: { type: [String, Number], default: '' },\n\t\t/** Pre-translated card title. */\n\t\ttitle: { type: String, default: () => t('nextcloud-vue', 'Activity') },\n\t\t/** Optional Material Design Icon component. */\n\t\ticon: { type: Object, default: () => Timeline },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Whether the card body is collapsible. */\n\t\tcollapsible: { type: Boolean, default: true },\n\t\t/** Compact-feed page size for dashboard / detail surfaces. */\n\t\tpageSize: { type: Number, default: 12 },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No activity yet for this object') },\n\t\t/** Pre-translated unavailable label. */\n\t\tunavailableLabel: { type: String, default: () => t('nextcloud-vue', 'NC Activity is currently unavailable.') },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tentries: [],\n\t\t\tentity: null,\n\t\t\tloading: false,\n\t\t\tdegraded: '',\n\t\t\ttotal: 0,\n\t\t\tCOMPACT_LIMIT,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcardTitle() {\n\t\t\treturn this.title || this.integrationId\n\t\t},\n\n\t\tcardIcon() {\n\t\t\treturn this.icon\n\t\t},\n\n\t\ttodayCount() {\n\t\t\tconst now = new Date()\n\t\t\tconst start = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime()\n\t\t\tlet count = 0\n\t\t\tfor (const entry of this.entries) {\n\t\t\t\tconst ts = this.timestampFor(entry)\n\t\t\t\tif (ts !== null && ts.getTime() >= start) {\n\t\t\t\t\tcount += 1\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count\n\t\t},\n\n\t\theadlineLabel() {\n\t\t\tif (this.todayCount > 0) {\n\t\t\t\treturn t('nextcloud-vue', '{n} today', { n: this.todayCount })\n\t\t\t}\n\t\t\tconst total = this.total > 0 ? this.total : this.entries.length\n\t\t\treturn t('nextcloud-vue', '{n} events', { n: total })\n\t\t},\n\n\t\tmostRecent() {\n\t\t\tif (this.entries.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// Provider sorts DESC; rely on first row.\n\t\t\treturn this.entries[0]\n\t\t},\n\n\t\tgroupedByDay() {\n\t\t\tconst groups = new Map()\n\t\t\tfor (const entry of this.entries) {\n\t\t\t\tconst ts = this.timestampFor(entry)\n\t\t\t\tconst key = this.dayKey(ts)\n\t\t\t\tif (groups.has(key) === false) {\n\t\t\t\t\tgroups.set(key, { key, label: this.dayLabel(ts), rows: [] })\n\t\t\t\t}\n\t\t\t\tgroups.get(key).rows.push(entry)\n\t\t\t}\n\t\t\treturn [...groups.values()]\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler() {\n\t\t\tthis.fetch()\n\t\t} },\n\n\t\tsurface() {\n\t\t\tthis.fetch()\n\t\t},\n\n\t\tvalue() {\n\t\t\tif (this.surface === 'single-entity') {\n\t\t\t\tthis.fetchSingle()\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\tbaseUrl() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/integrations/${this.integrationId}`\n\t\t},\n\n\t\tentryKey(entry) {\n\t\t\treturn entry.id ?? entry.activity_id ?? entry.activityId ?? ''\n\t\t},\n\n\t\ttimestampFor(entry) {\n\t\t\tconst raw = entry.timestamp ?? entry.datetime ?? entry.created ?? entry.creationDateTime ?? null\n\t\t\tif (raw === null || raw === undefined || raw === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof raw === 'number' && raw < 1e12) {\n\t\t\t\treturn new Date(raw * 1000)\n\t\t\t}\n\t\t\tconst parsed = new Date(raw)\n\t\t\treturn Number.isNaN(parsed.getTime()) ? null : parsed\n\t\t},\n\n\t\tdayKey(date) {\n\t\t\tif (date === null) {\n\t\t\t\treturn 'unknown'\n\t\t\t}\n\t\t\treturn `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`\n\t\t},\n\n\t\tdayLabel(date) {\n\t\t\tif (date === null) {\n\t\t\t\treturn t('nextcloud-vue', 'Earlier')\n\t\t\t}\n\t\t\tconst now = new Date()\n\t\t\tconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n\t\t\tconst yesterday = new Date(today.getTime() - 86400000)\n\t\t\tconst start = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n\t\t\tif (start.getTime() === today.getTime()) {\n\t\t\t\treturn t('nextcloud-vue', 'Today')\n\t\t\t}\n\t\t\tif (start.getTime() === yesterday.getTime()) {\n\t\t\t\treturn t('nextcloud-vue', 'Yesterday')\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn date.toLocaleDateString(undefined, { weekday: 'short', day: 'numeric', month: 'short' })\n\t\t\t} catch {\n\t\t\t\treturn date.toISOString().split('T')[0]\n\t\t\t}\n\t\t},\n\n\t\trelativeTime(entry) {\n\t\t\tconst ts = this.timestampFor(entry)\n\t\t\tif (ts === null) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn ts.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n\t\t\t} catch {\n\t\t\t\treturn ts.toISOString().split('T')[1].slice(0, 5)\n\t\t\t}\n\t\t},\n\n\t\tsubjectFor(entry) {\n\t\t\treturn entry.subject_rich ?? entry.subjectRich ?? entry.subject ?? entry.title ?? ''\n\t\t},\n\n\t\tactorFor(entry) {\n\t\t\treturn entry.actor_id ?? entry.actorDisplayName ?? entry.user ?? entry.affecteduser ?? t('nextcloud-vue', 'System')\n\t\t},\n\n\t\ticonFor(entry) {\n\t\t\tconst type = String(entry.type ?? '').toLowerCase()\n\t\t\tif (type.includes('file') || type.includes('upload') || type.includes('change')) {\n\t\t\t\treturn 'FileOutline'\n\t\t\t}\n\t\t\tif (type.includes('comment')) {\n\t\t\t\treturn 'CommentTextOutline'\n\t\t\t}\n\t\t\tif (type.includes('share')) {\n\t\t\t\treturn 'ShareVariantOutline'\n\t\t\t}\n\t\t\tif (type.includes('tag')) {\n\t\t\t\treturn 'TagOutline'\n\t\t\t}\n\t\t\tif (type.includes('calendar') || type.includes('event')) {\n\t\t\t\treturn 'CalendarClockOutline'\n\t\t\t}\n\t\t\tif (type.includes('user') || type.includes('account')) {\n\t\t\t\treturn 'AccountOutline'\n\t\t\t}\n\t\t\treturn 'Timeline'\n\t\t},\n\n\t\tfetch() {\n\t\t\tif (this.surface === 'single-entity') {\n\t\t\t\tthis.fetchSingle()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.fetchList()\n\t\t},\n\n\t\tasync fetchList() {\n\t\t\tif (!this.register || !this.schema || !this.objectId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst params = new URLSearchParams({ limit: String(this.pageSize) })\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.baseUrl()}?${params.toString()}`), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tthis.entries = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t\tthis.total = Number(data.total ?? 0)\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.entries = []\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.entries = []\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnActivityCard] failed to fetch activity', err)\n\t\t\t\tthis.entries = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tasync fetchSingle() {\n\t\t\tif (this.value === '' || this.value === null || this.value === undefined\n\t\t\t\t|| !this.register || !this.schema || !this.objectId) {\n\t\t\t\tthis.entity = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.baseUrl()}/${encodeURIComponent(String(this.value))}`), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tthis.entity = await response.json()\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.entity = null\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.entity = null\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnActivityCard] failed to fetch single event', err)\n\t\t\t\tthis.entity = null\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-activity-card__empty {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\tpadding: 8px 0;\n}\n\n.cn-activity-card__headline {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-activity-card__headline-line {\n\tfont-size: 1.05em;\n\tcolor: var(--color-main-text);\n}\n\n.cn-activity-card__headline-recent {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 0.9em;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-activity-card__headline-actor {\n\tfont-weight: 500;\n}\n\n.cn-activity-card__headline-subject {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 8px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-hover);\n\tfont-size: 0.9em;\n\tmax-width: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__chip-label {\n\tdisplay: inline-flex;\n\tgap: 4px;\n\tcolor: var(--color-main-text);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-activity-card__chip-actor {\n\tfont-weight: 500;\n}\n\n.cn-activity-card__chip-sep {\n\topacity: 0.6;\n}\n\n.cn-activity-card__chip-subject {\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__day {\n\tmargin-bottom: 10px;\n}\n\n.cn-activity-card__day-header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 0;\n\tfont-size: 0.8em;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-activity-card__day-count {\n\tmargin-left: auto;\n\tfont-weight: normal;\n\tfont-size: 0.8em;\n\tpadding: 1px 6px;\n\tborder-radius: 9px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-activity-card__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-activity-card__row {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 6px;\n\tpadding: 6px 0;\n}\n\n.cn-activity-card__row-main {\n\tflex: 1;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.cn-activity-card__row-subject {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tcolor: var(--color-main-text);\n\tfont-size: 0.95em;\n}\n\n.cn-activity-card__row-meta {\n\tfont-size: 0.8em;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n</style>\n"],"names":["CnDetailCard","CnVisibilityChip","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnActivityCard.vue2.js","sources":["../../../../../src/integrations/builtin/activity/CnActivityCard.vue"],"sourcesContent":["<!--\n CnActivityCard — bespoke surface-aware widget for the `activity` integration.\n\n Replaces the generic CnIntegrationCard for the `activity` leaf. Branches\n on `surface` per AD-19:\n - user-dashboard / app-dashboard : headline count of activity events\n (with a \"today\" sub-count) + most-recent line summarising the\n latest event (actor + verb + time).\n - detail-page : compact chronological feed grouped\n by day (mirrors the tab layout at a smaller scale).\n - single-entity : chip with type icon + actor +\n subject (referenceType: 'activity').\n\n Pulls rows from the same OR pluggable-integration sub-resource as\n CnActivityTab; for `single-entity` the optional `value` prop addresses\n a single event by id (matching CnIntegrationCard's fetchSingle\n contract).\n\n See `openregister/openspec/changes/integration-activity/` for the spec\n delta and ADR-019 (registry mechanism), AD-19 (surface fallback).\n-->\n<template>\n\t<CnDetailCard :title=\"cardTitle\" :icon=\"cardIcon\" :collapsible=\"collapsible\">\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<!-- single-entity surface: chip -->\n\t\t<template v-else-if=\"surface === 'single-entity'\">\n\t\t\t<span v-if=\"entity\" class=\"cn-activity-card__chip\" :title=\"subjectFor(entity)\">\n\t\t\t\t<component :is=\"iconFor(entity)\" :size=\"14\" />\n\t\t\t\t<span class=\"cn-activity-card__chip-label\">\n\t\t\t\t\t<span class=\"cn-activity-card__chip-actor\">{{ actorFor(entity) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-subject\">{{ subjectFor(entity) }}</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t<span v-else class=\"cn-activity-card__empty\">{{ emptyLabel }}</span>\n\t\t</template>\n\n\t\t<!-- dashboard surfaces: headline count + most-recent line -->\n\t\t<template v-else-if=\"surface === 'user-dashboard' || surface === 'app-dashboard'\">\n\t\t\t<div v-if=\"degraded\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ degraded }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"entries.length === 0\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-activity-card__headline\">\n\t\t\t\t<div class=\"cn-activity-card__headline-line\">\n\t\t\t\t\t<strong>{{ headlineLabel }}</strong>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"mostRecent\" class=\"cn-activity-card__headline-recent\">\n\t\t\t\t\t<component :is=\"iconFor(mostRecent)\" :size=\"14\" />\n\t\t\t\t\t<span class=\"cn-activity-card__headline-actor\">{{ actorFor(mostRecent) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__headline-subject\">{{ subjectFor(mostRecent) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__headline-time\">{{ relativeTime(mostRecent) }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- detail-page surface: compact timeline -->\n\t\t<template v-else>\n\t\t\t<div v-if=\"degraded\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ degraded }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"entries.length === 0\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-activity-card__timeline\">\n\t\t\t\t<section\n\t\t\t\t\tv-for=\"day in groupedByDay\"\n\t\t\t\t\t:key=\"day.key\"\n\t\t\t\t\tclass=\"cn-activity-card__day\">\n\t\t\t\t\t<header class=\"cn-activity-card__day-header\">\n\t\t\t\t\t\t<CalendarOutline :size=\"14\" />\n\t\t\t\t\t\t<span>{{ day.label }}</span>\n\t\t\t\t\t\t<span class=\"cn-activity-card__day-count\">{{ day.rows.length }}</span>\n\t\t\t\t\t</header>\n\t\t\t\t\t<ul class=\"cn-activity-card__list\">\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tv-for=\"entry in day.rows.slice(0, COMPACT_LIMIT)\"\n\t\t\t\t\t\t\t:key=\"entryKey(entry)\"\n\t\t\t\t\t\t\tclass=\"cn-activity-card__row\">\n\t\t\t\t\t\t\t<component :is=\"iconFor(entry)\" :size=\"14\" />\n\t\t\t\t\t\t\t<div class=\"cn-activity-card__row-main\">\n\t\t\t\t\t\t\t\t<span class=\"cn-activity-card__row-subject\">{{ subjectFor(entry) }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-activity-card__row-meta\">\n\t\t\t\t\t\t\t\t\t{{ actorFor(entry) }} · {{ relativeTime(entry) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<CnVisibilityChip v-if=\"showVisibility\" :visibility=\"entry.visibility\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</section>\n\t\t\t</div>\n\t\t</template>\n\t</CnDetailCard>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcLoadingIcon } from '@nextcloud/vue'\nimport AccountOutline from 'vue-material-design-icons/AccountOutline.vue'\nimport CalendarClockOutline from 'vue-material-design-icons/CalendarClockOutline.vue'\nimport CalendarOutline from 'vue-material-design-icons/CalendarOutline.vue'\nimport CommentTextOutline from 'vue-material-design-icons/CommentTextOutline.vue'\nimport FileOutline from 'vue-material-design-icons/FileOutline.vue'\nimport ShareVariantOutline from 'vue-material-design-icons/ShareVariantOutline.vue'\nimport TagOutline from 'vue-material-design-icons/TagOutline.vue'\nimport Timeline from 'vue-material-design-icons/Timeline.vue'\nimport CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'\nimport CnVisibilityChip from '../../../components/CnVisibilityChip/CnVisibilityChip.vue'\nimport { buildHeaders, prefixUrl } from '../../../utils/index.js'\nimport { userLocale } from '../../../utils/userLocale.js'\n\nconst VALID_SURFACES = ['user-dashboard', 'app-dashboard', 'detail-page', 'single-entity']\nconst COMPACT_LIMIT = 4\n\n/**\n * CnActivityCard — bespoke surface-aware widget for the `activity` integration.\n *\n * Renders activity events across all four surfaces. See the file-level\n * docblock for surface-by-surface behaviour.\n */\nexport default {\n\tname: 'CnActivityCard',\n\n\tcomponents: {\n\t\tCnDetailCard,\n\t\tCnVisibilityChip,\n\t\tNcLoadingIcon,\n\t\tCalendarOutline,\n\t\tTimeline,\n\t\tFileOutline,\n\t\tAccountOutline,\n\t\tCommentTextOutline,\n\t\tShareVariantOutline,\n\t\tTagOutline,\n\t\tCalendarClockOutline,\n\t},\n\n\tprops: {\n\t\t/** Show a visibility chip (internal or public) on each row of the detail-page feed. Off by default. */\n\t\tshowVisibility: { type: Boolean, default: false },\n\t\t/** Stable integration id (forwarded from the registry — always `'activity'`). */\n\t\tintegrationId: { type: String, default: 'activity' },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, required: true },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, required: true },\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** Rendering surface (AD-19). */\n\t\tsurface: {\n\t\t\ttype: String,\n\t\t\tdefault: 'detail-page',\n\t\t\tvalidator: (s) => VALID_SURFACES.includes(s),\n\t\t},\n\n\t\t/** Optional single-entity reference (event id). */\n\t\tvalue: { type: [String, Number], default: '' },\n\t\t/** Pre-translated card title. */\n\t\ttitle: { type: String, default: () => t('nextcloud-vue', 'Activity') },\n\t\t/** Optional Material Design Icon component. */\n\t\ticon: { type: Object, default: () => Timeline },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Whether the card body is collapsible. */\n\t\tcollapsible: { type: Boolean, default: true },\n\t\t/** Compact-feed page size for dashboard / detail surfaces. */\n\t\tpageSize: { type: Number, default: 12 },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No activity yet for this object') },\n\t\t/** Pre-translated unavailable label. */\n\t\tunavailableLabel: { type: String, default: () => t('nextcloud-vue', 'NC Activity is currently unavailable.') },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tentries: [],\n\t\t\tentity: null,\n\t\t\tloading: false,\n\t\t\tdegraded: '',\n\t\t\ttotal: 0,\n\t\t\tCOMPACT_LIMIT,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcardTitle() {\n\t\t\treturn this.title || this.integrationId\n\t\t},\n\n\t\tcardIcon() {\n\t\t\treturn this.icon\n\t\t},\n\n\t\ttodayCount() {\n\t\t\tconst now = new Date()\n\t\t\tconst start = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime()\n\t\t\tlet count = 0\n\t\t\tfor (const entry of this.entries) {\n\t\t\t\tconst ts = this.timestampFor(entry)\n\t\t\t\tif (ts !== null && ts.getTime() >= start) {\n\t\t\t\t\tcount += 1\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count\n\t\t},\n\n\t\theadlineLabel() {\n\t\t\tif (this.todayCount > 0) {\n\t\t\t\treturn t('nextcloud-vue', '{n} today', { n: this.todayCount })\n\t\t\t}\n\t\t\tconst total = this.total > 0 ? this.total : this.entries.length\n\t\t\treturn t('nextcloud-vue', '{n} events', { n: total })\n\t\t},\n\n\t\tmostRecent() {\n\t\t\tif (this.entries.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// Provider sorts DESC; rely on first row.\n\t\t\treturn this.entries[0]\n\t\t},\n\n\t\tgroupedByDay() {\n\t\t\tconst groups = new Map()\n\t\t\tfor (const entry of this.entries) {\n\t\t\t\tconst ts = this.timestampFor(entry)\n\t\t\t\tconst key = this.dayKey(ts)\n\t\t\t\tif (groups.has(key) === false) {\n\t\t\t\t\tgroups.set(key, { key, label: this.dayLabel(ts), rows: [] })\n\t\t\t\t}\n\t\t\t\tgroups.get(key).rows.push(entry)\n\t\t\t}\n\t\t\treturn [...groups.values()]\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler() {\n\t\t\tthis.fetch()\n\t\t} },\n\n\t\tsurface() {\n\t\t\tthis.fetch()\n\t\t},\n\n\t\tvalue() {\n\t\t\tif (this.surface === 'single-entity') {\n\t\t\t\tthis.fetchSingle()\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\tbaseUrl() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/integrations/${this.integrationId}`\n\t\t},\n\n\t\tentryKey(entry) {\n\t\t\treturn entry.id ?? entry.activity_id ?? entry.activityId ?? ''\n\t\t},\n\n\t\ttimestampFor(entry) {\n\t\t\tconst raw = entry.timestamp ?? entry.datetime ?? entry.created ?? entry.creationDateTime ?? null\n\t\t\tif (raw === null || raw === undefined || raw === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof raw === 'number' && raw < 1e12) {\n\t\t\t\treturn new Date(raw * 1000)\n\t\t\t}\n\t\t\tconst parsed = new Date(raw)\n\t\t\treturn Number.isNaN(parsed.getTime()) ? null : parsed\n\t\t},\n\n\t\tdayKey(date) {\n\t\t\tif (date === null) {\n\t\t\t\treturn 'unknown'\n\t\t\t}\n\t\t\treturn `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`\n\t\t},\n\n\t\tdayLabel(date) {\n\t\t\tif (date === null) {\n\t\t\t\treturn t('nextcloud-vue', 'Earlier')\n\t\t\t}\n\t\t\tconst now = new Date()\n\t\t\tconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n\t\t\tconst yesterday = new Date(today.getTime() - 86400000)\n\t\t\tconst start = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n\t\t\tif (start.getTime() === today.getTime()) {\n\t\t\t\treturn t('nextcloud-vue', 'Today')\n\t\t\t}\n\t\t\tif (start.getTime() === yesterday.getTime()) {\n\t\t\t\treturn t('nextcloud-vue', 'Yesterday')\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn date.toLocaleDateString(userLocale(), { weekday: 'short', day: 'numeric', month: 'short' })\n\t\t\t} catch {\n\t\t\t\treturn date.toISOString().split('T')[0]\n\t\t\t}\n\t\t},\n\n\t\trelativeTime(entry) {\n\t\t\tconst ts = this.timestampFor(entry)\n\t\t\tif (ts === null) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn ts.toLocaleTimeString(userLocale(), { hour: '2-digit', minute: '2-digit' })\n\t\t\t} catch {\n\t\t\t\treturn ts.toISOString().split('T')[1].slice(0, 5)\n\t\t\t}\n\t\t},\n\n\t\tsubjectFor(entry) {\n\t\t\treturn entry.subject_rich ?? entry.subjectRich ?? entry.subject ?? entry.title ?? ''\n\t\t},\n\n\t\tactorFor(entry) {\n\t\t\treturn entry.actor_id ?? entry.actorDisplayName ?? entry.user ?? entry.affecteduser ?? t('nextcloud-vue', 'System')\n\t\t},\n\n\t\ticonFor(entry) {\n\t\t\tconst type = String(entry.type ?? '').toLowerCase()\n\t\t\tif (type.includes('file') || type.includes('upload') || type.includes('change')) {\n\t\t\t\treturn 'FileOutline'\n\t\t\t}\n\t\t\tif (type.includes('comment')) {\n\t\t\t\treturn 'CommentTextOutline'\n\t\t\t}\n\t\t\tif (type.includes('share')) {\n\t\t\t\treturn 'ShareVariantOutline'\n\t\t\t}\n\t\t\tif (type.includes('tag')) {\n\t\t\t\treturn 'TagOutline'\n\t\t\t}\n\t\t\tif (type.includes('calendar') || type.includes('event')) {\n\t\t\t\treturn 'CalendarClockOutline'\n\t\t\t}\n\t\t\tif (type.includes('user') || type.includes('account')) {\n\t\t\t\treturn 'AccountOutline'\n\t\t\t}\n\t\t\treturn 'Timeline'\n\t\t},\n\n\t\tfetch() {\n\t\t\tif (this.surface === 'single-entity') {\n\t\t\t\tthis.fetchSingle()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.fetchList()\n\t\t},\n\n\t\tasync fetchList() {\n\t\t\tif (!this.register || !this.schema || !this.objectId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst params = new URLSearchParams({ limit: String(this.pageSize) })\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.baseUrl()}?${params.toString()}`), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tthis.entries = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t\tthis.total = Number(data.total ?? 0)\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.entries = []\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.entries = []\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnActivityCard] failed to fetch activity', err)\n\t\t\t\tthis.entries = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tasync fetchSingle() {\n\t\t\tif (this.value === '' || this.value === null || this.value === undefined\n\t\t\t\t|| !this.register || !this.schema || !this.objectId) {\n\t\t\t\tthis.entity = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.baseUrl()}/${encodeURIComponent(String(this.value))}`), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tthis.entity = await response.json()\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.entity = null\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.entity = null\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnActivityCard] failed to fetch single event', err)\n\t\t\t\tthis.entity = null\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-activity-card__empty {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\tpadding: 8px 0;\n}\n\n.cn-activity-card__headline {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-activity-card__headline-line {\n\tfont-size: 1.05em;\n\tcolor: var(--color-main-text);\n}\n\n.cn-activity-card__headline-recent {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 0.9em;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-activity-card__headline-actor {\n\tfont-weight: 500;\n}\n\n.cn-activity-card__headline-subject {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 8px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-hover);\n\tfont-size: 0.9em;\n\tmax-width: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__chip-label {\n\tdisplay: inline-flex;\n\tgap: 4px;\n\tcolor: var(--color-main-text);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-activity-card__chip-actor {\n\tfont-weight: 500;\n}\n\n.cn-activity-card__chip-sep {\n\topacity: 0.6;\n}\n\n.cn-activity-card__chip-subject {\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__day {\n\tmargin-bottom: 10px;\n}\n\n.cn-activity-card__day-header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 0;\n\tfont-size: 0.8em;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-activity-card__day-count {\n\tmargin-left: auto;\n\tfont-weight: normal;\n\tfont-size: 0.8em;\n\tpadding: 1px 6px;\n\tborder-radius: 9px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-activity-card__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-activity-card__row {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 6px;\n\tpadding: 6px 0;\n}\n\n.cn-activity-card__row-main {\n\tflex: 1;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.cn-activity-card__row-subject {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tcolor: var(--color-main-text);\n\tfont-size: 0.95em;\n}\n\n.cn-activity-card__row-meta {\n\tfont-size: 0.8em;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n</style>\n"],"names":["CnDetailCard","CnVisibilityChip","t"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnActivityCard.vue3.js","sources":["../../../../../src/integrations/builtin/activity/CnActivityCard.vue?vue&type=template&id=ebdd405c&lang.js"],"sourcesContent":["<!--\n CnActivityCard — bespoke surface-aware widget for the `activity` integration.\n\n Replaces the generic CnIntegrationCard for the `activity` leaf. Branches\n on `surface` per AD-19:\n - user-dashboard / app-dashboard : headline count of activity events\n (with a \"today\" sub-count) + most-recent line summarising the\n latest event (actor + verb + time).\n - detail-page : compact chronological feed grouped\n by day (mirrors the tab layout at a smaller scale).\n - single-entity : chip with type icon + actor +\n subject (referenceType: 'activity').\n\n Pulls rows from the same OR pluggable-integration sub-resource as\n CnActivityTab; for `single-entity` the optional `value` prop addresses\n a single event by id (matching CnIntegrationCard's fetchSingle\n contract).\n\n See `openregister/openspec/changes/integration-activity/` for the spec\n delta and ADR-019 (registry mechanism), AD-19 (surface fallback).\n-->\n<template>\n\t<CnDetailCard :title=\"cardTitle\" :icon=\"cardIcon\" :collapsible=\"collapsible\">\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<!-- single-entity surface: chip -->\n\t\t<template v-else-if=\"surface === 'single-entity'\">\n\t\t\t<span v-if=\"entity\" class=\"cn-activity-card__chip\" :title=\"subjectFor(entity)\">\n\t\t\t\t<component :is=\"iconFor(entity)\" :size=\"14\" />\n\t\t\t\t<span class=\"cn-activity-card__chip-label\">\n\t\t\t\t\t<span class=\"cn-activity-card__chip-actor\">{{ actorFor(entity) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-subject\">{{ subjectFor(entity) }}</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t<span v-else class=\"cn-activity-card__empty\">{{ emptyLabel }}</span>\n\t\t</template>\n\n\t\t<!-- dashboard surfaces: headline count + most-recent line -->\n\t\t<template v-else-if=\"surface === 'user-dashboard' || surface === 'app-dashboard'\">\n\t\t\t<div v-if=\"degraded\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ degraded }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"entries.length === 0\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-activity-card__headline\">\n\t\t\t\t<div class=\"cn-activity-card__headline-line\">\n\t\t\t\t\t<strong>{{ headlineLabel }}</strong>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"mostRecent\" class=\"cn-activity-card__headline-recent\">\n\t\t\t\t\t<component :is=\"iconFor(mostRecent)\" :size=\"14\" />\n\t\t\t\t\t<span class=\"cn-activity-card__headline-actor\">{{ actorFor(mostRecent) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__headline-subject\">{{ subjectFor(mostRecent) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__headline-time\">{{ relativeTime(mostRecent) }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- detail-page surface: compact timeline -->\n\t\t<template v-else>\n\t\t\t<div v-if=\"degraded\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ degraded }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"entries.length === 0\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-activity-card__timeline\">\n\t\t\t\t<section\n\t\t\t\t\tv-for=\"day in groupedByDay\"\n\t\t\t\t\t:key=\"day.key\"\n\t\t\t\t\tclass=\"cn-activity-card__day\">\n\t\t\t\t\t<header class=\"cn-activity-card__day-header\">\n\t\t\t\t\t\t<CalendarOutline :size=\"14\" />\n\t\t\t\t\t\t<span>{{ day.label }}</span>\n\t\t\t\t\t\t<span class=\"cn-activity-card__day-count\">{{ day.rows.length }}</span>\n\t\t\t\t\t</header>\n\t\t\t\t\t<ul class=\"cn-activity-card__list\">\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tv-for=\"entry in day.rows.slice(0, COMPACT_LIMIT)\"\n\t\t\t\t\t\t\t:key=\"entryKey(entry)\"\n\t\t\t\t\t\t\tclass=\"cn-activity-card__row\">\n\t\t\t\t\t\t\t<component :is=\"iconFor(entry)\" :size=\"14\" />\n\t\t\t\t\t\t\t<div class=\"cn-activity-card__row-main\">\n\t\t\t\t\t\t\t\t<span class=\"cn-activity-card__row-subject\">{{ subjectFor(entry) }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-activity-card__row-meta\">\n\t\t\t\t\t\t\t\t\t{{ actorFor(entry) }} · {{ relativeTime(entry) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<CnVisibilityChip v-if=\"showVisibility\" :visibility=\"entry.visibility\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</section>\n\t\t\t</div>\n\t\t</template>\n\t</CnDetailCard>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcLoadingIcon } from '@nextcloud/vue'\nimport AccountOutline from 'vue-material-design-icons/AccountOutline.vue'\nimport CalendarClockOutline from 'vue-material-design-icons/CalendarClockOutline.vue'\nimport CalendarOutline from 'vue-material-design-icons/CalendarOutline.vue'\nimport CommentTextOutline from 'vue-material-design-icons/CommentTextOutline.vue'\nimport FileOutline from 'vue-material-design-icons/FileOutline.vue'\nimport ShareVariantOutline from 'vue-material-design-icons/ShareVariantOutline.vue'\nimport TagOutline from 'vue-material-design-icons/TagOutline.vue'\nimport Timeline from 'vue-material-design-icons/Timeline.vue'\nimport CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'\nimport CnVisibilityChip from '../../../components/CnVisibilityChip/CnVisibilityChip.vue'\nimport { buildHeaders, prefixUrl } from '../../../utils/index.js'\n\nconst VALID_SURFACES = ['user-dashboard', 'app-dashboard', 'detail-page', 'single-entity']\nconst COMPACT_LIMIT = 4\n\n/**\n * CnActivityCard — bespoke surface-aware widget for the `activity` integration.\n *\n * Renders activity events across all four surfaces. See the file-level\n * docblock for surface-by-surface behaviour.\n */\nexport default {\n\tname: 'CnActivityCard',\n\n\tcomponents: {\n\t\tCnDetailCard,\n\t\tCnVisibilityChip,\n\t\tNcLoadingIcon,\n\t\tCalendarOutline,\n\t\tTimeline,\n\t\tFileOutline,\n\t\tAccountOutline,\n\t\tCommentTextOutline,\n\t\tShareVariantOutline,\n\t\tTagOutline,\n\t\tCalendarClockOutline,\n\t},\n\n\tprops: {\n\t\t/** Show a visibility chip (internal or public) on each row of the detail-page feed. Off by default. */\n\t\tshowVisibility: { type: Boolean, default: false },\n\t\t/** Stable integration id (forwarded from the registry — always `'activity'`). */\n\t\tintegrationId: { type: String, default: 'activity' },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, required: true },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, required: true },\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** Rendering surface (AD-19). */\n\t\tsurface: {\n\t\t\ttype: String,\n\t\t\tdefault: 'detail-page',\n\t\t\tvalidator: (s) => VALID_SURFACES.includes(s),\n\t\t},\n\n\t\t/** Optional single-entity reference (event id). */\n\t\tvalue: { type: [String, Number], default: '' },\n\t\t/** Pre-translated card title. */\n\t\ttitle: { type: String, default: () => t('nextcloud-vue', 'Activity') },\n\t\t/** Optional Material Design Icon component. */\n\t\ticon: { type: Object, default: () => Timeline },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Whether the card body is collapsible. */\n\t\tcollapsible: { type: Boolean, default: true },\n\t\t/** Compact-feed page size for dashboard / detail surfaces. */\n\t\tpageSize: { type: Number, default: 12 },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No activity yet for this object') },\n\t\t/** Pre-translated unavailable label. */\n\t\tunavailableLabel: { type: String, default: () => t('nextcloud-vue', 'NC Activity is currently unavailable.') },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tentries: [],\n\t\t\tentity: null,\n\t\t\tloading: false,\n\t\t\tdegraded: '',\n\t\t\ttotal: 0,\n\t\t\tCOMPACT_LIMIT,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcardTitle() {\n\t\t\treturn this.title || this.integrationId\n\t\t},\n\n\t\tcardIcon() {\n\t\t\treturn this.icon\n\t\t},\n\n\t\ttodayCount() {\n\t\t\tconst now = new Date()\n\t\t\tconst start = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime()\n\t\t\tlet count = 0\n\t\t\tfor (const entry of this.entries) {\n\t\t\t\tconst ts = this.timestampFor(entry)\n\t\t\t\tif (ts !== null && ts.getTime() >= start) {\n\t\t\t\t\tcount += 1\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count\n\t\t},\n\n\t\theadlineLabel() {\n\t\t\tif (this.todayCount > 0) {\n\t\t\t\treturn t('nextcloud-vue', '{n} today', { n: this.todayCount })\n\t\t\t}\n\t\t\tconst total = this.total > 0 ? this.total : this.entries.length\n\t\t\treturn t('nextcloud-vue', '{n} events', { n: total })\n\t\t},\n\n\t\tmostRecent() {\n\t\t\tif (this.entries.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// Provider sorts DESC; rely on first row.\n\t\t\treturn this.entries[0]\n\t\t},\n\n\t\tgroupedByDay() {\n\t\t\tconst groups = new Map()\n\t\t\tfor (const entry of this.entries) {\n\t\t\t\tconst ts = this.timestampFor(entry)\n\t\t\t\tconst key = this.dayKey(ts)\n\t\t\t\tif (groups.has(key) === false) {\n\t\t\t\t\tgroups.set(key, { key, label: this.dayLabel(ts), rows: [] })\n\t\t\t\t}\n\t\t\t\tgroups.get(key).rows.push(entry)\n\t\t\t}\n\t\t\treturn [...groups.values()]\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler() {\n\t\t\tthis.fetch()\n\t\t} },\n\n\t\tsurface() {\n\t\t\tthis.fetch()\n\t\t},\n\n\t\tvalue() {\n\t\t\tif (this.surface === 'single-entity') {\n\t\t\t\tthis.fetchSingle()\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\tbaseUrl() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/integrations/${this.integrationId}`\n\t\t},\n\n\t\tentryKey(entry) {\n\t\t\treturn entry.id ?? entry.activity_id ?? entry.activityId ?? ''\n\t\t},\n\n\t\ttimestampFor(entry) {\n\t\t\tconst raw = entry.timestamp ?? entry.datetime ?? entry.created ?? entry.creationDateTime ?? null\n\t\t\tif (raw === null || raw === undefined || raw === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof raw === 'number' && raw < 1e12) {\n\t\t\t\treturn new Date(raw * 1000)\n\t\t\t}\n\t\t\tconst parsed = new Date(raw)\n\t\t\treturn Number.isNaN(parsed.getTime()) ? null : parsed\n\t\t},\n\n\t\tdayKey(date) {\n\t\t\tif (date === null) {\n\t\t\t\treturn 'unknown'\n\t\t\t}\n\t\t\treturn `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`\n\t\t},\n\n\t\tdayLabel(date) {\n\t\t\tif (date === null) {\n\t\t\t\treturn t('nextcloud-vue', 'Earlier')\n\t\t\t}\n\t\t\tconst now = new Date()\n\t\t\tconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n\t\t\tconst yesterday = new Date(today.getTime() - 86400000)\n\t\t\tconst start = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n\t\t\tif (start.getTime() === today.getTime()) {\n\t\t\t\treturn t('nextcloud-vue', 'Today')\n\t\t\t}\n\t\t\tif (start.getTime() === yesterday.getTime()) {\n\t\t\t\treturn t('nextcloud-vue', 'Yesterday')\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn date.toLocaleDateString(undefined, { weekday: 'short', day: 'numeric', month: 'short' })\n\t\t\t} catch {\n\t\t\t\treturn date.toISOString().split('T')[0]\n\t\t\t}\n\t\t},\n\n\t\trelativeTime(entry) {\n\t\t\tconst ts = this.timestampFor(entry)\n\t\t\tif (ts === null) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn ts.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })\n\t\t\t} catch {\n\t\t\t\treturn ts.toISOString().split('T')[1].slice(0, 5)\n\t\t\t}\n\t\t},\n\n\t\tsubjectFor(entry) {\n\t\t\treturn entry.subject_rich ?? entry.subjectRich ?? entry.subject ?? entry.title ?? ''\n\t\t},\n\n\t\tactorFor(entry) {\n\t\t\treturn entry.actor_id ?? entry.actorDisplayName ?? entry.user ?? entry.affecteduser ?? t('nextcloud-vue', 'System')\n\t\t},\n\n\t\ticonFor(entry) {\n\t\t\tconst type = String(entry.type ?? '').toLowerCase()\n\t\t\tif (type.includes('file') || type.includes('upload') || type.includes('change')) {\n\t\t\t\treturn 'FileOutline'\n\t\t\t}\n\t\t\tif (type.includes('comment')) {\n\t\t\t\treturn 'CommentTextOutline'\n\t\t\t}\n\t\t\tif (type.includes('share')) {\n\t\t\t\treturn 'ShareVariantOutline'\n\t\t\t}\n\t\t\tif (type.includes('tag')) {\n\t\t\t\treturn 'TagOutline'\n\t\t\t}\n\t\t\tif (type.includes('calendar') || type.includes('event')) {\n\t\t\t\treturn 'CalendarClockOutline'\n\t\t\t}\n\t\t\tif (type.includes('user') || type.includes('account')) {\n\t\t\t\treturn 'AccountOutline'\n\t\t\t}\n\t\t\treturn 'Timeline'\n\t\t},\n\n\t\tfetch() {\n\t\t\tif (this.surface === 'single-entity') {\n\t\t\t\tthis.fetchSingle()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.fetchList()\n\t\t},\n\n\t\tasync fetchList() {\n\t\t\tif (!this.register || !this.schema || !this.objectId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst params = new URLSearchParams({ limit: String(this.pageSize) })\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.baseUrl()}?${params.toString()}`), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tthis.entries = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t\tthis.total = Number(data.total ?? 0)\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.entries = []\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.entries = []\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnActivityCard] failed to fetch activity', err)\n\t\t\t\tthis.entries = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tasync fetchSingle() {\n\t\t\tif (this.value === '' || this.value === null || this.value === undefined\n\t\t\t\t|| !this.register || !this.schema || !this.objectId) {\n\t\t\t\tthis.entity = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.baseUrl()}/${encodeURIComponent(String(this.value))}`), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tthis.entity = await response.json()\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.entity = null\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.entity = null\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnActivityCard] failed to fetch single event', err)\n\t\t\t\tthis.entity = null\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-activity-card__empty {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\tpadding: 8px 0;\n}\n\n.cn-activity-card__headline {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-activity-card__headline-line {\n\tfont-size: 1.05em;\n\tcolor: var(--color-main-text);\n}\n\n.cn-activity-card__headline-recent {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 0.9em;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-activity-card__headline-actor {\n\tfont-weight: 500;\n}\n\n.cn-activity-card__headline-subject {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 8px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-hover);\n\tfont-size: 0.9em;\n\tmax-width: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__chip-label {\n\tdisplay: inline-flex;\n\tgap: 4px;\n\tcolor: var(--color-main-text);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-activity-card__chip-actor {\n\tfont-weight: 500;\n}\n\n.cn-activity-card__chip-sep {\n\topacity: 0.6;\n}\n\n.cn-activity-card__chip-subject {\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__day {\n\tmargin-bottom: 10px;\n}\n\n.cn-activity-card__day-header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 0;\n\tfont-size: 0.8em;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-activity-card__day-count {\n\tmargin-left: auto;\n\tfont-weight: normal;\n\tfont-size: 0.8em;\n\tpadding: 1px 6px;\n\tborder-radius: 9px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-activity-card__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-activity-card__row {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 6px;\n\tpadding: 6px 0;\n}\n\n.cn-activity-card__row-main {\n\tflex: 1;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.cn-activity-card__row-subject {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tcolor: var(--color-main-text);\n\tfont-size: 0.95em;\n}\n\n.cn-activity-card__row-meta {\n\tfont-size: 0.8em;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n</style>\n"],"names":["_createBlock","_createElementBlock","_Fragment","_openBlock","_resolveDynamicComponent","_createElementVNode","_toDisplayString","_createVNode"],"mappings":";;;AAkDU,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,8BAA8B,GAAA;AACnC,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,8BAA8B,GAAA;AAEpC,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,gCAAgC,GAAA;;;AAGjC,EAAA,KAAK,EAAC,yBAAyB;;;;AAKvB,EAAA,KAAK,EAAC,yBAAiB;;;;AAG9B,EAAA,KAAA,EAAA,yBAAA;;;;AAGF,EAAA,KAAI,EAAA,4BAAA;;AACX,MAAA,UAAA,GAAA,EAAA,KAAA,EAAA,iCAAA,GAAA;;;AAGmB,EAAA,KAAI,EAAA,mCAAA;;AAEpB,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,kCAAiB,GAAA;AAEvB,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,oCAAkB,GAAA;AAEzB,MAAA,WAAA,GAAA,EAAA,KAAM,EAAC,iCAAgC,GAAA;;;AAOzB,EAAA,KAAK,EAAC,yBAAqB;;;;AAGV,EAAA,KAAK,EAAC,yBAAC;;;;AAGjC,EAAA,KAAK,EAAC,4BAA4B;;AAKzC,MAAA,WAAA,GAAA,EAAA,KAAA,EAAA,8BAAA,GAAA;;;;;;;;;;;;;uBApDLA;AAAa,IAAA,KAAK,EAAE,QAAS,CAAA,SAAA;AAAG,IAAA,IAAI,EAAE,QAAQ,CAAA,QAAA;AAAG,IAAA,WAAW,EAAE,MAAO,CAAA,WAAA;;2BACrD;OAAA,KAAA,CAAA,OAAA;mCAAA,CAAA,wBAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA;WAGI,MAAO,CAAA,OAAA,KAAA,eAAA;0BAA1BC,kBAUK,CAAAC,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;eATO,KAAK,CAAA,MAAA;gCAAhBD,kBAOI,CAAA,MAAA,EAAA;;AAPc,oBAAA,KAAK,0BAAY;oBAAA,KAAA,EAAA,QAAA,CAAA,UAAA,CAAA,KAAA,CAAA,MAAA,CAAA;;AACpC,qBAAAE,SAAA,EAAA,EAAAH,WAAA,CAAKI,wBAAA,QAAA,CAAA,OAAA,CAAA,YAAA,CAAA,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AACL,oBAAAC,kBAAA,CAIO,QAJP,UAIO,EAAA;AAHN,sBAAAA,kBAAA,CAAiD,MAAjD,EAAA,UAAiD,EAAHC,eAAA,CAAA,QAAA,CAAA,QAAG,CAAA,KAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA,YAAA;AACjD,sBAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAAD,kBAAA,CAAkD,MAA5C,EAAA,EAAA,KAAK,EAAC,4BAA4B,IAAC,GAAC,EAAA,CAAA,CAAA,cAAA,CAAA;AAC1C,sBAAAA,kBAAA,CAAgD,MAAhD,EAAA,UAAgD,EAAAC,eAAA,CAAA,QAAA,CAAA,UAAA,CAAA,KAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;gCAGhDL,kBAAkE,CAAA,MAAA,EAAlE,UAAkE,EAAAK,eAAA,CAApB,MAAU,CAAA,UAAA,CAAA,EAAA,CAAA,YAAA,CAAA;;;8CAwBrD,CAAAJ,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;iBAnBM,KAAQ,CAAA,QAAA;kCAAnBD,kBAEM,CAAA,KAAA,EAFN,UAEM,EAAAK,eAAA,CADF,KAAQ,CAAA,QAAA,CAAA,EAAA,CAAA,YAAA;AAEE,oBAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,KAAA,CAAA;sDAER,CAAA,KAAA,YAAA,EAAAA,eAAA,CADF,MAAC,CAAA,UAAA,CAAA,EAAA,CAAA,YAAA;uDAcC,iBAAA,EAAA;AAXL,wBAAAD,kBAAA,CAEM,OAFN,UAEM,EAAA;AADL,0BAAAA,kBAAA,CAAoC,gCAAzB,QAAa,CAAA,aAAA,CAAA,EAAA,CAAA,YAAA;;yBAEf,QAAW,CAAA,UAAA;6DAOf,kBAAA,EAAA;AANL,+BAAAF,SAAA,EAAA,EAAAH,WAAA,CAAaI,wBAAA,QAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AACb,8BAAAC,kBAAA,CAA6B,MAA7B,EAAA,WAA6B,EAAAC,eAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,CAAA,EAAA,CAAA,YAAA;AAC7B,8BAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAAD,kBAAA,CAA4C,MAAtC,EAAA,EAAA,KAAK,EAAC,4BAA4B,IAAC,GAAC,EAAA,CAAA,CAAA,cAAA,CAAA;iDACZ,mBAAA,EAAAC,eAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,UAAA,CAAA,CAAA,EAAA,CAAA,YAAA;2EACF,MAAtB,EAAA,EAAA,KAAK,EAAC,4BAAgB,IAAA,GAAA,EAAA,CAAA,CAAA,cAAA,CAAA;AAC3B,8BAAAD,kBAAA,CAAqE,MAArE,EAAA,WAAqE,EAArBC,eAAA,CAAA,QAAA,CAAA,YAAW,CAAE,QAAQ,CAAA,UAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;;iBAO7D,KAAQ,CAAA,QAAA;kCAAfL,kBAEE,CAAA,KAAA,EAFF,WAEE,EAAAK,eAAA,CADF,KAAQ,CAAA,QAAA,CAAA,EAAA,CAAA,YAAA;AAEI,oBAAA,CAAA,KAAA,CAAA,OAAO,CAAC,MAAM,KAAA,CAAA;oCAAzBL,kBAEC,CAAA,KAAA,EAFD,WAEC,EAAAK,eAAA,CADA,MAAQ,CAAA,UAAA,CAAA,EAAA,CAAA,YAAA;AAET,uBAAAH,SAAA,EAAA,EAAAF,kBAAA,QAAA;wFAEE,QAAA,CAAA,YAAA,EAAA,CAAA,GAAA,KAAA;;4BACJ,GAAG,EAAA,GAAA,CAAA,GAAA;AACJ,4BAAA,KAAK,EAAC,uBAAE;;AACR,4BAAAI,kBAAA,WAAA;8BACCE,WAAM,CAAA,0BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;8BACNF,kBAAS,CAAA,MAAA,EAAA,IAAA,EAAAC,eAAA,CAAA,GAAA,CAAA,KAAA,CAAA,EAAA,CAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"CnActivityCard.vue3.js","sources":["../../../../../src/integrations/builtin/activity/CnActivityCard.vue?vue&type=template&id=287c17fa&lang.js"],"sourcesContent":["<!--\n CnActivityCard — bespoke surface-aware widget for the `activity` integration.\n\n Replaces the generic CnIntegrationCard for the `activity` leaf. Branches\n on `surface` per AD-19:\n - user-dashboard / app-dashboard : headline count of activity events\n (with a \"today\" sub-count) + most-recent line summarising the\n latest event (actor + verb + time).\n - detail-page : compact chronological feed grouped\n by day (mirrors the tab layout at a smaller scale).\n - single-entity : chip with type icon + actor +\n subject (referenceType: 'activity').\n\n Pulls rows from the same OR pluggable-integration sub-resource as\n CnActivityTab; for `single-entity` the optional `value` prop addresses\n a single event by id (matching CnIntegrationCard's fetchSingle\n contract).\n\n See `openregister/openspec/changes/integration-activity/` for the spec\n delta and ADR-019 (registry mechanism), AD-19 (surface fallback).\n-->\n<template>\n\t<CnDetailCard :title=\"cardTitle\" :icon=\"cardIcon\" :collapsible=\"collapsible\">\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<!-- single-entity surface: chip -->\n\t\t<template v-else-if=\"surface === 'single-entity'\">\n\t\t\t<span v-if=\"entity\" class=\"cn-activity-card__chip\" :title=\"subjectFor(entity)\">\n\t\t\t\t<component :is=\"iconFor(entity)\" :size=\"14\" />\n\t\t\t\t<span class=\"cn-activity-card__chip-label\">\n\t\t\t\t\t<span class=\"cn-activity-card__chip-actor\">{{ actorFor(entity) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-subject\">{{ subjectFor(entity) }}</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t\t<span v-else class=\"cn-activity-card__empty\">{{ emptyLabel }}</span>\n\t\t</template>\n\n\t\t<!-- dashboard surfaces: headline count + most-recent line -->\n\t\t<template v-else-if=\"surface === 'user-dashboard' || surface === 'app-dashboard'\">\n\t\t\t<div v-if=\"degraded\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ degraded }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"entries.length === 0\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-activity-card__headline\">\n\t\t\t\t<div class=\"cn-activity-card__headline-line\">\n\t\t\t\t\t<strong>{{ headlineLabel }}</strong>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"mostRecent\" class=\"cn-activity-card__headline-recent\">\n\t\t\t\t\t<component :is=\"iconFor(mostRecent)\" :size=\"14\" />\n\t\t\t\t\t<span class=\"cn-activity-card__headline-actor\">{{ actorFor(mostRecent) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__headline-subject\">{{ subjectFor(mostRecent) }}</span>\n\t\t\t\t\t<span class=\"cn-activity-card__chip-sep\">·</span>\n\t\t\t\t\t<span class=\"cn-activity-card__headline-time\">{{ relativeTime(mostRecent) }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- detail-page surface: compact timeline -->\n\t\t<template v-else>\n\t\t\t<div v-if=\"degraded\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ degraded }}\n\t\t\t</div>\n\t\t\t<div v-else-if=\"entries.length === 0\" class=\"cn-activity-card__empty\">\n\t\t\t\t{{ emptyLabel }}\n\t\t\t</div>\n\t\t\t<div v-else class=\"cn-activity-card__timeline\">\n\t\t\t\t<section\n\t\t\t\t\tv-for=\"day in groupedByDay\"\n\t\t\t\t\t:key=\"day.key\"\n\t\t\t\t\tclass=\"cn-activity-card__day\">\n\t\t\t\t\t<header class=\"cn-activity-card__day-header\">\n\t\t\t\t\t\t<CalendarOutline :size=\"14\" />\n\t\t\t\t\t\t<span>{{ day.label }}</span>\n\t\t\t\t\t\t<span class=\"cn-activity-card__day-count\">{{ day.rows.length }}</span>\n\t\t\t\t\t</header>\n\t\t\t\t\t<ul class=\"cn-activity-card__list\">\n\t\t\t\t\t\t<li\n\t\t\t\t\t\t\tv-for=\"entry in day.rows.slice(0, COMPACT_LIMIT)\"\n\t\t\t\t\t\t\t:key=\"entryKey(entry)\"\n\t\t\t\t\t\t\tclass=\"cn-activity-card__row\">\n\t\t\t\t\t\t\t<component :is=\"iconFor(entry)\" :size=\"14\" />\n\t\t\t\t\t\t\t<div class=\"cn-activity-card__row-main\">\n\t\t\t\t\t\t\t\t<span class=\"cn-activity-card__row-subject\">{{ subjectFor(entry) }}</span>\n\t\t\t\t\t\t\t\t<span class=\"cn-activity-card__row-meta\">\n\t\t\t\t\t\t\t\t\t{{ actorFor(entry) }} · {{ relativeTime(entry) }}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<CnVisibilityChip v-if=\"showVisibility\" :visibility=\"entry.visibility\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</section>\n\t\t\t</div>\n\t\t</template>\n\t</CnDetailCard>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport { NcLoadingIcon } from '@nextcloud/vue'\nimport AccountOutline from 'vue-material-design-icons/AccountOutline.vue'\nimport CalendarClockOutline from 'vue-material-design-icons/CalendarClockOutline.vue'\nimport CalendarOutline from 'vue-material-design-icons/CalendarOutline.vue'\nimport CommentTextOutline from 'vue-material-design-icons/CommentTextOutline.vue'\nimport FileOutline from 'vue-material-design-icons/FileOutline.vue'\nimport ShareVariantOutline from 'vue-material-design-icons/ShareVariantOutline.vue'\nimport TagOutline from 'vue-material-design-icons/TagOutline.vue'\nimport Timeline from 'vue-material-design-icons/Timeline.vue'\nimport CnDetailCard from '../../../components/CnDetailCard/CnDetailCard.vue'\nimport CnVisibilityChip from '../../../components/CnVisibilityChip/CnVisibilityChip.vue'\nimport { buildHeaders, prefixUrl } from '../../../utils/index.js'\nimport { userLocale } from '../../../utils/userLocale.js'\n\nconst VALID_SURFACES = ['user-dashboard', 'app-dashboard', 'detail-page', 'single-entity']\nconst COMPACT_LIMIT = 4\n\n/**\n * CnActivityCard — bespoke surface-aware widget for the `activity` integration.\n *\n * Renders activity events across all four surfaces. See the file-level\n * docblock for surface-by-surface behaviour.\n */\nexport default {\n\tname: 'CnActivityCard',\n\n\tcomponents: {\n\t\tCnDetailCard,\n\t\tCnVisibilityChip,\n\t\tNcLoadingIcon,\n\t\tCalendarOutline,\n\t\tTimeline,\n\t\tFileOutline,\n\t\tAccountOutline,\n\t\tCommentTextOutline,\n\t\tShareVariantOutline,\n\t\tTagOutline,\n\t\tCalendarClockOutline,\n\t},\n\n\tprops: {\n\t\t/** Show a visibility chip (internal or public) on each row of the detail-page feed. Off by default. */\n\t\tshowVisibility: { type: Boolean, default: false },\n\t\t/** Stable integration id (forwarded from the registry — always `'activity'`). */\n\t\tintegrationId: { type: String, default: 'activity' },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, required: true },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, required: true },\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** Rendering surface (AD-19). */\n\t\tsurface: {\n\t\t\ttype: String,\n\t\t\tdefault: 'detail-page',\n\t\t\tvalidator: (s) => VALID_SURFACES.includes(s),\n\t\t},\n\n\t\t/** Optional single-entity reference (event id). */\n\t\tvalue: { type: [String, Number], default: '' },\n\t\t/** Pre-translated card title. */\n\t\ttitle: { type: String, default: () => t('nextcloud-vue', 'Activity') },\n\t\t/** Optional Material Design Icon component. */\n\t\ticon: { type: Object, default: () => Timeline },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Whether the card body is collapsible. */\n\t\tcollapsible: { type: Boolean, default: true },\n\t\t/** Compact-feed page size for dashboard / detail surfaces. */\n\t\tpageSize: { type: Number, default: 12 },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No activity yet for this object') },\n\t\t/** Pre-translated unavailable label. */\n\t\tunavailableLabel: { type: String, default: () => t('nextcloud-vue', 'NC Activity is currently unavailable.') },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\tentries: [],\n\t\t\tentity: null,\n\t\t\tloading: false,\n\t\t\tdegraded: '',\n\t\t\ttotal: 0,\n\t\t\tCOMPACT_LIMIT,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tcardTitle() {\n\t\t\treturn this.title || this.integrationId\n\t\t},\n\n\t\tcardIcon() {\n\t\t\treturn this.icon\n\t\t},\n\n\t\ttodayCount() {\n\t\t\tconst now = new Date()\n\t\t\tconst start = new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime()\n\t\t\tlet count = 0\n\t\t\tfor (const entry of this.entries) {\n\t\t\t\tconst ts = this.timestampFor(entry)\n\t\t\t\tif (ts !== null && ts.getTime() >= start) {\n\t\t\t\t\tcount += 1\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count\n\t\t},\n\n\t\theadlineLabel() {\n\t\t\tif (this.todayCount > 0) {\n\t\t\t\treturn t('nextcloud-vue', '{n} today', { n: this.todayCount })\n\t\t\t}\n\t\t\tconst total = this.total > 0 ? this.total : this.entries.length\n\t\t\treturn t('nextcloud-vue', '{n} events', { n: total })\n\t\t},\n\n\t\tmostRecent() {\n\t\t\tif (this.entries.length === 0) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\t// Provider sorts DESC; rely on first row.\n\t\t\treturn this.entries[0]\n\t\t},\n\n\t\tgroupedByDay() {\n\t\t\tconst groups = new Map()\n\t\t\tfor (const entry of this.entries) {\n\t\t\t\tconst ts = this.timestampFor(entry)\n\t\t\t\tconst key = this.dayKey(ts)\n\t\t\t\tif (groups.has(key) === false) {\n\t\t\t\t\tgroups.set(key, { key, label: this.dayLabel(ts), rows: [] })\n\t\t\t\t}\n\t\t\t\tgroups.get(key).rows.push(entry)\n\t\t\t}\n\t\t\treturn [...groups.values()]\n\t\t},\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler() {\n\t\t\tthis.fetch()\n\t\t} },\n\n\t\tsurface() {\n\t\t\tthis.fetch()\n\t\t},\n\n\t\tvalue() {\n\t\t\tif (this.surface === 'single-entity') {\n\t\t\t\tthis.fetchSingle()\n\t\t\t}\n\t\t},\n\t},\n\n\tmethods: {\n\t\tbaseUrl() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/integrations/${this.integrationId}`\n\t\t},\n\n\t\tentryKey(entry) {\n\t\t\treturn entry.id ?? entry.activity_id ?? entry.activityId ?? ''\n\t\t},\n\n\t\ttimestampFor(entry) {\n\t\t\tconst raw = entry.timestamp ?? entry.datetime ?? entry.created ?? entry.creationDateTime ?? null\n\t\t\tif (raw === null || raw === undefined || raw === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tif (typeof raw === 'number' && raw < 1e12) {\n\t\t\t\treturn new Date(raw * 1000)\n\t\t\t}\n\t\t\tconst parsed = new Date(raw)\n\t\t\treturn Number.isNaN(parsed.getTime()) ? null : parsed\n\t\t},\n\n\t\tdayKey(date) {\n\t\t\tif (date === null) {\n\t\t\t\treturn 'unknown'\n\t\t\t}\n\t\t\treturn `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`\n\t\t},\n\n\t\tdayLabel(date) {\n\t\t\tif (date === null) {\n\t\t\t\treturn t('nextcloud-vue', 'Earlier')\n\t\t\t}\n\t\t\tconst now = new Date()\n\t\t\tconst today = new Date(now.getFullYear(), now.getMonth(), now.getDate())\n\t\t\tconst yesterday = new Date(today.getTime() - 86400000)\n\t\t\tconst start = new Date(date.getFullYear(), date.getMonth(), date.getDate())\n\t\t\tif (start.getTime() === today.getTime()) {\n\t\t\t\treturn t('nextcloud-vue', 'Today')\n\t\t\t}\n\t\t\tif (start.getTime() === yesterday.getTime()) {\n\t\t\t\treturn t('nextcloud-vue', 'Yesterday')\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn date.toLocaleDateString(userLocale(), { weekday: 'short', day: 'numeric', month: 'short' })\n\t\t\t} catch {\n\t\t\t\treturn date.toISOString().split('T')[0]\n\t\t\t}\n\t\t},\n\n\t\trelativeTime(entry) {\n\t\t\tconst ts = this.timestampFor(entry)\n\t\t\tif (ts === null) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn ts.toLocaleTimeString(userLocale(), { hour: '2-digit', minute: '2-digit' })\n\t\t\t} catch {\n\t\t\t\treturn ts.toISOString().split('T')[1].slice(0, 5)\n\t\t\t}\n\t\t},\n\n\t\tsubjectFor(entry) {\n\t\t\treturn entry.subject_rich ?? entry.subjectRich ?? entry.subject ?? entry.title ?? ''\n\t\t},\n\n\t\tactorFor(entry) {\n\t\t\treturn entry.actor_id ?? entry.actorDisplayName ?? entry.user ?? entry.affecteduser ?? t('nextcloud-vue', 'System')\n\t\t},\n\n\t\ticonFor(entry) {\n\t\t\tconst type = String(entry.type ?? '').toLowerCase()\n\t\t\tif (type.includes('file') || type.includes('upload') || type.includes('change')) {\n\t\t\t\treturn 'FileOutline'\n\t\t\t}\n\t\t\tif (type.includes('comment')) {\n\t\t\t\treturn 'CommentTextOutline'\n\t\t\t}\n\t\t\tif (type.includes('share')) {\n\t\t\t\treturn 'ShareVariantOutline'\n\t\t\t}\n\t\t\tif (type.includes('tag')) {\n\t\t\t\treturn 'TagOutline'\n\t\t\t}\n\t\t\tif (type.includes('calendar') || type.includes('event')) {\n\t\t\t\treturn 'CalendarClockOutline'\n\t\t\t}\n\t\t\tif (type.includes('user') || type.includes('account')) {\n\t\t\t\treturn 'AccountOutline'\n\t\t\t}\n\t\t\treturn 'Timeline'\n\t\t},\n\n\t\tfetch() {\n\t\t\tif (this.surface === 'single-entity') {\n\t\t\t\tthis.fetchSingle()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.fetchList()\n\t\t},\n\n\t\tasync fetchList() {\n\t\t\tif (!this.register || !this.schema || !this.objectId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst params = new URLSearchParams({ limit: String(this.pageSize) })\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.baseUrl()}?${params.toString()}`), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tconst data = await response.json()\n\t\t\t\t\tthis.entries = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t\tthis.total = Number(data.total ?? 0)\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.entries = []\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.entries = []\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnActivityCard] failed to fetch activity', err)\n\t\t\t\tthis.entries = []\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tasync fetchSingle() {\n\t\t\tif (this.value === '' || this.value === null || this.value === undefined\n\t\t\t\t|| !this.register || !this.schema || !this.objectId) {\n\t\t\t\tthis.entity = null\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.loading = true\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.baseUrl()}/${encodeURIComponent(String(this.value))}`), { headers: buildHeaders() })\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tthis.entity = await response.json()\n\t\t\t\t} else if (response.status === 503) {\n\t\t\t\t\tthis.entity = null\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.entity = null\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error('[CnActivityCard] failed to fetch single event', err)\n\t\t\t\tthis.entity = null\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-activity-card__empty {\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: 0.9em;\n\tpadding: 8px 0;\n}\n\n.cn-activity-card__headline {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 4px;\n}\n\n.cn-activity-card__headline-line {\n\tfont-size: 1.05em;\n\tcolor: var(--color-main-text);\n}\n\n.cn-activity-card__headline-recent {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tfont-size: 0.9em;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-activity-card__headline-actor {\n\tfont-weight: 500;\n}\n\n.cn-activity-card__headline-subject {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__chip {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 8px;\n\tborder-radius: 12px;\n\tbackground: var(--color-background-hover);\n\tfont-size: 0.9em;\n\tmax-width: 100%;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__chip-label {\n\tdisplay: inline-flex;\n\tgap: 4px;\n\tcolor: var(--color-main-text);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n\n.cn-activity-card__chip-actor {\n\tfont-weight: 500;\n}\n\n.cn-activity-card__chip-sep {\n\topacity: 0.6;\n}\n\n.cn-activity-card__chip-subject {\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-activity-card__day {\n\tmargin-bottom: 10px;\n}\n\n.cn-activity-card__day-header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 4px 0;\n\tfont-size: 0.8em;\n\tfont-weight: 600;\n\tcolor: var(--color-text-maxcontrast);\n\tborder-bottom: 1px solid var(--color-border);\n}\n\n.cn-activity-card__day-count {\n\tmargin-left: auto;\n\tfont-weight: normal;\n\tfont-size: 0.8em;\n\tpadding: 1px 6px;\n\tborder-radius: 9px;\n\tbackground: var(--color-background-hover);\n}\n\n.cn-activity-card__list {\n\tlist-style: none;\n\tmargin: 0;\n\tpadding: 0;\n}\n\n.cn-activity-card__row {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tgap: 6px;\n\tpadding: 6px 0;\n}\n\n.cn-activity-card__row-main {\n\tflex: 1;\n\tmin-width: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n.cn-activity-card__row-subject {\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tcolor: var(--color-main-text);\n\tfont-size: 0.95em;\n}\n\n.cn-activity-card__row-meta {\n\tfont-size: 0.8em;\n\tcolor: var(--color-text-maxcontrast);\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n}\n</style>\n"],"names":["_createBlock","_createElementBlock","_Fragment","_openBlock","_resolveDynamicComponent","_createElementVNode","_toDisplayString","_createVNode"],"mappings":";;;AAkDU,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,8BAA8B,GAAA;AACnC,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,8BAA8B,GAAA;AAEpC,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,gCAAgC,GAAA;;;AAGjC,EAAA,KAAK,EAAC,yBAAyB;;;;AAKvB,EAAA,KAAK,EAAC,yBAAiB;;;;AAG9B,EAAA,KAAA,EAAA,yBAAA;;;;AAGF,EAAA,KAAI,EAAA,4BAAA;;AACX,MAAA,UAAA,GAAA,EAAA,KAAA,EAAA,iCAAA,GAAA;;;AAGmB,EAAA,KAAI,EAAA,mCAAA;;AAEpB,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,kCAAiB,GAAA;AAEvB,MAAA,WAAA,GAAA,EAAA,KAAK,EAAC,oCAAkB,GAAA;AAEzB,MAAA,WAAA,GAAA,EAAA,KAAM,EAAC,iCAAgC,GAAA;;;AAOzB,EAAA,KAAK,EAAC,yBAAqB;;;;AAGV,EAAA,KAAK,EAAC,yBAAC;;;;AAGjC,EAAA,KAAK,EAAC,4BAA4B;;AAKzC,MAAA,WAAA,GAAA,EAAA,KAAA,EAAA,8BAAA,GAAA;;;;;;;;;;;;;uBApDLA;AAAa,IAAA,KAAK,EAAE,QAAS,CAAA,SAAA;AAAG,IAAA,IAAI,EAAE,QAAQ,CAAA,QAAA;AAAG,IAAA,WAAW,EAAE,MAAO,CAAA,WAAA;;2BACrD;OAAA,KAAA,CAAA,OAAA;mCAAA,CAAA,wBAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA;WAGI,MAAO,CAAA,OAAA,KAAA,eAAA;0BAA1BC,kBAUK,CAAAC,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;eATO,KAAK,CAAA,MAAA;gCAAhBD,kBAOI,CAAA,MAAA,EAAA;;AAPc,oBAAA,KAAK,0BAAY;oBAAA,KAAA,EAAA,QAAA,CAAA,UAAA,CAAA,KAAA,CAAA,MAAA,CAAA;;AACpC,qBAAAE,SAAA,EAAA,EAAAH,WAAA,CAAKI,wBAAA,QAAA,CAAA,OAAA,CAAA,YAAA,CAAA,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AACL,oBAAAC,kBAAA,CAIO,QAJP,UAIO,EAAA;AAHN,sBAAAA,kBAAA,CAAiD,MAAjD,EAAA,UAAiD,EAAHC,eAAA,CAAA,QAAA,CAAA,QAAG,CAAA,KAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA,YAAA;AACjD,sBAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAAD,kBAAA,CAAkD,MAA5C,EAAA,EAAA,KAAK,EAAC,4BAA4B,IAAC,GAAC,EAAA,CAAA,CAAA,cAAA,CAAA;AAC1C,sBAAAA,kBAAA,CAAgD,MAAhD,EAAA,UAAgD,EAAAC,eAAA,CAAA,QAAA,CAAA,UAAA,CAAA,KAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;gCAGhDL,kBAAkE,CAAA,MAAA,EAAlE,UAAkE,EAAAK,eAAA,CAApB,MAAU,CAAA,UAAA,CAAA,EAAA,CAAA,YAAA,CAAA;;;8CAwBrD,CAAAJ,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;iBAnBM,KAAQ,CAAA,QAAA;kCAAnBD,kBAEM,CAAA,KAAA,EAFN,UAEM,EAAAK,eAAA,CADF,KAAQ,CAAA,QAAA,CAAA,EAAA,CAAA,YAAA;AAEE,oBAAA,CAAA,KAAA,CAAA,OAAA,CAAA,MAAA,KAAA,CAAA;sDAER,CAAA,KAAA,YAAA,EAAAA,eAAA,CADF,MAAC,CAAA,UAAA,CAAA,EAAA,CAAA,YAAA;uDAcC,iBAAA,EAAA;AAXL,wBAAAD,kBAAA,CAEM,OAFN,UAEM,EAAA;AADL,0BAAAA,kBAAA,CAAoC,gCAAzB,QAAa,CAAA,aAAA,CAAA,EAAA,CAAA,YAAA;;yBAEf,QAAW,CAAA,UAAA;6DAOf,kBAAA,EAAA;AANL,+BAAAF,SAAA,EAAA,EAAAH,WAAA,CAAaI,wBAAA,QAAA,CAAA,OAAA,CAAA,mBAAA,CAAA,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AACb,8BAAAC,kBAAA,CAA6B,MAA7B,EAAA,WAA6B,EAAAC,eAAA,CAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,UAAA,CAAA,CAAA,EAAA,CAAA,YAAA;AAC7B,8BAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAAD,kBAAA,CAA4C,MAAtC,EAAA,EAAA,KAAK,EAAC,4BAA4B,IAAC,GAAC,EAAA,CAAA,CAAA,cAAA,CAAA;iDACZ,mBAAA,EAAAC,eAAA,CAAA,QAAA,CAAA,UAAA,CAAA,QAAA,CAAA,UAAA,CAAA,CAAA,EAAA,CAAA,YAAA;2EACF,MAAtB,EAAA,EAAA,KAAK,EAAC,4BAAgB,IAAA,GAAA,EAAA,CAAA,CAAA,cAAA,CAAA;AAC3B,8BAAAD,kBAAA,CAAqE,MAArE,EAAA,WAAqE,EAArBC,eAAA,CAAA,QAAA,CAAA,YAAW,CAAE,QAAQ,CAAA,UAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;;iBAO7D,KAAQ,CAAA,QAAA;kCAAfL,kBAEE,CAAA,KAAA,EAFF,WAEE,EAAAK,eAAA,CADF,KAAQ,CAAA,QAAA,CAAA,EAAA,CAAA,YAAA;AAEI,oBAAA,CAAA,KAAA,CAAA,OAAO,CAAC,MAAM,KAAA,CAAA;oCAAzBL,kBAEC,CAAA,KAAA,EAFD,WAEC,EAAAK,eAAA,CADA,MAAQ,CAAA,UAAA,CAAA,EAAA,CAAA,YAAA;AAET,uBAAAH,SAAA,EAAA,EAAAF,kBAAA,QAAA;wFAEE,QAAA,CAAA,YAAA,EAAA,CAAA,GAAA,KAAA;;4BACJ,GAAG,EAAA,GAAA,CAAA,GAAA;AACJ,4BAAA,KAAK,EAAC,uBAAE;;AACR,4BAAAI,kBAAA,WAAA;8BACCE,WAAM,CAAA,0BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA;8BACNF,kBAAS,CAAA,MAAA,EAAA,IAAA,EAAAC,eAAA,CAAA,GAAA,CAAA,KAAA,CAAA,EAAA,CAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -2,7 +2,7 @@ import script from './CnActivityTab.vue2.js';
|
|
|
2
2
|
import { render } from './CnActivityTab.vue3.js';
|
|
3
3
|
|
|
4
4
|
script.render = render;
|
|
5
|
-
script.__scopeId = "data-v-
|
|
5
|
+
script.__scopeId = "data-v-bf3b0e7c";
|
|
6
6
|
const __sfc_main = script;
|
|
7
7
|
|
|
8
8
|
export { __sfc_main as default };
|
|
@@ -12,6 +12,7 @@ import TagOutline from 'vue-material-design-icons/TagOutline.vue';
|
|
|
12
12
|
import Timeline from 'vue-material-design-icons/Timeline.vue';
|
|
13
13
|
import __sfc_main from '../../../components/CnVisibilityChip/CnVisibilityChip.vue.js';
|
|
14
14
|
import { normalizeLook } from '../../../composables/useLook.js';
|
|
15
|
+
import { userLocale } from '../../../utils/userLocale.js';
|
|
15
16
|
import { ACTIVITY_FEED_KINDS, isReadRow, feedPath, feedQuery, exportBody, parseFeed } from './activityFeedWire.js';
|
|
16
17
|
import { prefixUrl, buildHeaders } from '../../../utils/headers.js';
|
|
17
18
|
|
|
@@ -337,7 +338,7 @@ var script = {
|
|
|
337
338
|
return translate('nextcloud-vue', 'Yesterday')
|
|
338
339
|
}
|
|
339
340
|
try {
|
|
340
|
-
return date.toLocaleDateString(
|
|
341
|
+
return date.toLocaleDateString(userLocale(), { weekday: 'short', day: 'numeric', month: 'short' })
|
|
341
342
|
} catch {
|
|
342
343
|
return date.toISOString().split('T')[0]
|
|
343
344
|
}
|
|
@@ -349,7 +350,7 @@ var script = {
|
|
|
349
350
|
return ''
|
|
350
351
|
}
|
|
351
352
|
try {
|
|
352
|
-
return ts.toLocaleTimeString(
|
|
353
|
+
return ts.toLocaleTimeString(userLocale(), { hour: '2-digit', minute: '2-digit' })
|
|
353
354
|
} catch {
|
|
354
355
|
return ts.toISOString().split('T')[1].slice(0, 5)
|
|
355
356
|
}
|
|
@@ -397,7 +398,7 @@ var script = {
|
|
|
397
398
|
let when = '';
|
|
398
399
|
if (ts !== null) {
|
|
399
400
|
try {
|
|
400
|
-
when = ts.toLocaleString(
|
|
401
|
+
when = ts.toLocaleString(userLocale(), { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' });
|
|
401
402
|
} catch {
|
|
402
403
|
when = ts.toISOString().replace('T', ' ').slice(0, 16);
|
|
403
404
|
}
|