@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnPhotosTab.vue3.js","sources":["../../../../../src/integrations/builtin/photos/CnPhotosTab.vue?vue&type=template&id=646bb332&lang.js"],"sourcesContent":["<!--\n CnPhotosTab — bespoke sidebar tab for the `photos` integration leaf.\n\n Replaces the generic `CnIntegrationTab` for the `photos` leaf: renders\n the linked NC Photos albums as a card grid (cover thumbnail, album\n name, photo count, last-edited date). Clicking a card deep-links into\n the NC Photos app at `/index.php/apps/photos/albums/{albumId}`.\n\n Tier-2 surface (this commit):\n - \"Link existing album\" → opens CnPhotoAlbumPicker (modal)\n - \"Create new album\" → opens CnPhotoAlbumCreate (modal)\n - Per-tile unlink → DELETE …/photos/{albumId}\n\n Talks to the OpenRegister Tier-2 photo-link endpoints\n GET /api/objects/{r}/{s}/{id}/photos — list\n POST /api/objects/{r}/{s}/{id}/photos — link existing\n POST /api/objects/{r}/{s}/{id}/photos/new — create + link\n DELETE /api/objects/{r}/{s}/{id}/photos/{albumId} — unlink\n GET /api/integrations/photos/available — picker source\n served by `OCA\\OpenRegister\\Controller\\PhotoLinksController`.\n\n The endpoint returns rows shaped:\n { id, title, url, albumId, albumName, coverPhotoUrl, photoCount,\n lastEdited, data: { … } }\n\n Empty + loading + error + 503 unavailable states follow ADR-017 and\n AD-23 graceful degradation. All UI strings are passed through\n `t('nextcloud-vue', ...)` per ADR-007. Styling uses Nextcloud CSS\n variables only so the nldesign overrides apply transparently\n (ADR-010).\n\n Bespoke-vs-generic rationale: the generic tab renders a flat link list\n which loses the cover thumbnail + photo count + recency — the three\n signals users rely on when triaging which album is relevant for a\n case. The bespoke tab surfaces them per card.\n-->\n<template>\n\t<div class=\"cn-sidebar-tab cn-photos-tab\">\n\t\t<!-- 503 unavailable banner (AD-23) -->\n\t\t<div v-if=\"degraded\" class=\"cn-photos-tab__banner\" role=\"alert\">\n\t\t\t<AlertCircleOutline :size=\"18\" />\n\t\t\t<span>{{ degraded }}</span>\n\t\t</div>\n\n\t\t<div class=\"cn-photos-tab__actions\">\n\t\t\t<NcButton variant=\"secondary\" @click=\"openPicker\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<LinkVariant :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Link existing album') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton variant=\"primary\" @click=\"openCreate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Create new album') }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<!-- Loading -->\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<!-- Error -->\n\t\t<div v-else-if=\"error\" class=\"cn-photos-tab__error\" role=\"alert\">\n\t\t\t{{ error }}\n\t\t</div>\n\n\t\t<!-- Empty -->\n\t\t<div v-else-if=\"albums.length === 0\" class=\"cn-sidebar-tab__empty cn-photos-tab__empty\">\n\t\t\t<ImageIcon :size=\"32\" class=\"cn-photos-tab__empty-icon\" />\n\t\t\t<p>{{ emptyLabel }}</p>\n\t\t\t<NcButton\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:href=\"photosAppUrl\"\n\t\t\t\ttarget=\"_blank\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ImageIcon :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ openPhotosLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<!-- Photo mosaic grid (mirrors the NC Photos timeline) -->\n\t\t<div v-else class=\"cn-photos-tab__grid\">\n\t\t\t<div\n\t\t\t\tv-for=\"album in albums\"\n\t\t\t\t:key=\"albumKey(album)\"\n\t\t\t\tclass=\"cn-photos-tab__tile\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"albumUrl(album)\"\n\t\t\t\t\tclass=\"cn-photos-tab__tile-link\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t:title=\"albumName(album)\">\n\t\t\t\t\t<div class=\"cn-photos-tab__cover\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tv-if=\"coverUrl(album)\"\n\t\t\t\t\t\t\t:src=\"coverUrl(album)\"\n\t\t\t\t\t\t\t:alt=\"albumName(album)\"\n\t\t\t\t\t\t\tclass=\"cn-photos-tab__cover-img\"\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t@error=\"onCoverError(album)\">\n\t\t\t\t\t\t<span v-else class=\"cn-photos-tab__cover-placeholder\">\n\t\t\t\t\t\t\t<ImageMultiple :size=\"36\" class=\"cn-photos-tab__cover-fallback\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<!-- Photo-count badge, top-left (mirrors album stack overlay) -->\n\t\t\t\t\t\t<span v-if=\"photoCount(album) !== null\" class=\"cn-photos-tab__badge\">\n\t\t\t\t\t\t\t<ImageMultiple :size=\"12\" />\n\t\t\t\t\t\t\t<span class=\"cn-photos-tab__badge-count\">{{ photoCountLabel(album) }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<!-- Hover scrim with name + date -->\n\t\t\t\t\t\t<div class=\"cn-photos-tab__meta\">\n\t\t\t\t\t\t\t<span class=\"cn-photos-tab__name\">{{ albumName(album) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"lastEdited(album)\" class=\"cn-photos-tab__when\">\n\t\t\t\t\t\t\t\t{{ formatWhen(lastEdited(album)) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</a>\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"tertiary-no-background\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Unlink album')\"\n\t\t\t\t\tclass=\"cn-photos-tab__unlink\"\n\t\t\t\t\t@click=\"unlinkAlbum(album)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<LinkOff :size=\"16\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<CnPhotoAlbumPicker\n\t\t\tv-if=\"pickerOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t@close=\"pickerOpen = false\"\n\t\t\t@link=\"onLinkPick\" />\n\n\t\t<CnPhotoAlbumCreate\n\t\t\tv-if=\"createOpen\"\n\t\t\t@close=\"createOpen = false\"\n\t\t\t@create=\"onCreatePick\" />\n\t</div>\n</template>\n\n<script>\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcLoadingIcon } from '@nextcloud/vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport ImageIcon from 'vue-material-design-icons/Image.vue'\nimport ImageMultiple from 'vue-material-design-icons/ImageMultiple.vue'\nimport LinkOff from 'vue-material-design-icons/LinkOff.vue'\nimport LinkVariant from 'vue-material-design-icons/LinkVariant.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnPhotoAlbumCreate from '../../../components/CnPhotoAlbumCreate/CnPhotoAlbumCreate.vue'\nimport CnPhotoAlbumPicker from '../../../components/CnPhotoAlbumPicker/CnPhotoAlbumPicker.vue'\nimport { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'\n\n/**\n * CnPhotosTab — bespoke album grid for the `photos` integration.\n *\n * Renders one tile per linked NC Photos album with cover thumbnail,\n * album name, photo count, and last-edited date. Clicking a tile opens\n * the album in the NC Photos app in a new tab. Tier-2: includes\n * link/create modals and per-tile unlink.\n */\nexport default {\n\tname: 'CnPhotosTab',\n\n\tcomponents: {\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tAlertCircleOutline,\n\t\tImageIcon,\n\t\tImageMultiple,\n\t\tLinkOff,\n\t\tLinkVariant,\n\t\tPlus,\n\t\tCnPhotoAlbumPicker,\n\t\tCnPhotoAlbumCreate,\n\t},\n\n\tprops: {\n\t\t/* eslint-disable vue/no-unused-properties -- the integration dispatch binds integrationId on every integration component (see CnIntegrationWidgetGrid), so declaring it keeps it out of $attrs */\n\t\t/** Stable integration id (forwarded from the registry — always `'photos'`). */\n\t\tintegrationId: { type: String, default: 'photos' },\n\t\t/* eslint-enable vue/no-unused-properties */\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, default: '' },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, default: '' },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No albums linked yet') },\n\t\t/** Pre-translated \"Open Photos\" CTA label. */\n\t\topenPhotosLabel: { type: String, default: () => t('nextcloud-vue', 'Open Photos') },\n\t\t/** Pre-translated 503 unavailable banner copy. */\n\t\tunavailableLabel: { type: String, default: () => t('nextcloud-vue', 'NC Photos is currently unavailable.') },\n\t\t/** URL of the NC Photos app entry. */\n\t\tphotosAppUrl: { type: String, default: '/index.php/apps/photos' },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\talbums: [],\n\t\t\tloading: false,\n\t\t\terror: '',\n\t\t\tdegraded: '',\n\t\t\tbrokenCovers: {},\n\t\t\tpickerOpen: false,\n\t\t\tcreateOpen: false,\n\t\t}\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler(id) {\n\t\t\tif (id) {\n\t\t\t\tthis.fetchAlbums()\n\t\t\t}\n\t\t} },\n\n\t\tregister() {\n\t\t\tthis.fetchAlbums()\n\t\t},\n\n\t\tschema() {\n\t\t\tthis.fetchAlbums()\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * Base for the Tier-2 photos endpoints (list/link/new/destroy).\n\t\t *\n\t\t * @return {string} The endpoint URL.\n\t\t */\n\t\tphotosEndpoint() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/photos`\n\t\t},\n\n\t\talbumKey(album) {\n\t\t\treturn (album && (album.albumId ?? album.id ?? album.data?.album_id)) || ''\n\t\t},\n\n\t\t/**\n\t\t * Resolve the displayable album name from the row, stripping any\n\t\t * legacy `[or:{uuid}]` marker (pre-Tier-2 albums embedded the\n\t\t * marker inside `name`).\n\t\t *\n\t\t * @param {object} album Provider row.\n\t\t *\n\t\t * @return {string} The display name.\n\t\t */\n\t\talbumName(album) {\n\t\t\tconst raw = (album && (album.albumName || album.title || album.name || album.data?.name)) || ''\n\t\t\treturn String(raw).replace(/\\s*\\[or:[^\\]]+\\]\\s*/g, ' ').trim() || t('nextcloud-vue', 'Untitled album')\n\t\t},\n\n\t\talbumUrl(album) {\n\t\t\tif (album && album.url && safeHref(album.url) !== '#') {\n\t\t\t\treturn album.url\n\t\t\t}\n\t\t\tconst id = this.albumKey(album)\n\t\t\treturn `/index.php/apps/photos/albums/${encodeURIComponent(id)}`\n\t\t},\n\n\t\tcoverUrl(album) {\n\t\t\tif (!album || this.brokenCovers[this.albumKey(album)]) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn album.coverPhotoUrl || album.data?.coverPhotoUrl || ''\n\t\t},\n\n\t\tonCoverError(album) {\n\t\t\tthis.brokenCovers[this.albumKey(album)] = true\n\t\t},\n\n\t\tphotoCount(album) {\n\t\t\tconst raw = album?.photoCount ?? album?.data?.photoCount ?? album?.data?.count\n\t\t\tif (raw === null || raw === undefined || raw === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst num = Number(raw)\n\t\t\treturn Number.isFinite(num) ? num : null\n\t\t},\n\n\t\tphotoCountLabel(album) {\n\t\t\tconst count = this.photoCount(album)\n\t\t\tif (count === null) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn n('nextcloud-vue', '{count} photo', '{count} photos', count, { count })\n\t\t},\n\n\t\tlastEdited(album) {\n\t\t\treturn album?.lastEdited\n\t\t\t\t|| album?.data?.lastEdited\n\t\t\t\t|| album?.data?.created\n\t\t\t\t|| ''\n\t\t},\n\n\t\tformatWhen(value) {\n\t\t\tif (!value) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\ttry {\n\t\t\t\t// NC Photos stores `created` as a unix timestamp in\n\t\t\t\t// seconds; accept ISO strings transparently too.\n\t\t\t\tconst num = Number(value)\n\t\t\t\tconst d = Number.isFinite(num) && num > 0 && String(value).length <= 12\n\t\t\t\t\t? new Date(num * 1000)\n\t\t\t\t\t: new Date(value)\n\t\t\t\tif (Number.isNaN(d.getTime())) {\n\t\t\t\t\treturn String(value)\n\t\t\t\t}\n\t\t\t\treturn d.toLocaleDateString(undefined, { dateStyle: 'medium' })\n\t\t\t} catch {\n\t\t\t\treturn String(value)\n\t\t\t}\n\t\t},\n\n\t\topenPicker() {\n\t\t\tthis.pickerOpen = true\n\t\t},\n\n\t\topenCreate() {\n\t\t\tthis.createOpen = true\n\t\t},\n\n\t\tasync onLinkPick(payload) {\n\t\t\tthis.pickerOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.photosEndpoint()), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchAlbums()\n\t\t\t\t} else if (response.status === 409) {\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'This album is already linked.')\n\t\t\t\t} else {\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'Could not link album.')\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('[CnPhotosTab] link failed', err)\n\t\t\t\tthis.error = t('nextcloud-vue', 'Could not link album.')\n\t\t\t}\n\t\t},\n\n\t\tasync onCreatePick(payload) {\n\t\t\tthis.createOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.photosEndpoint()}/new`), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchAlbums()\n\t\t\t\t} else {\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'Could not create album.')\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('[CnPhotosTab] create failed', err)\n\t\t\t\tthis.error = t('nextcloud-vue', 'Could not create album.')\n\t\t\t}\n\t\t},\n\n\t\tasync unlinkAlbum(album) {\n\t\t\tconst albumId = this.albumKey(album)\n\t\t\tif (!albumId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.photosEndpoint()}/${albumId}`), {\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchAlbums()\n\t\t\t\t} else {\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'Could not unlink album.')\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('[CnPhotosTab] unlink failed', err)\n\t\t\t\tthis.error = t('nextcloud-vue', 'Could not unlink album.')\n\t\t\t}\n\t\t},\n\n\t\tasync fetchAlbums() {\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.error = ''\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.photosEndpoint()), { 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.albums = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t} else if (response.status === 503 || response.status === 501) {\n\t\t\t\t\tthis.albums = []\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.albums = []\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'Could not load albums.')\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('[CnPhotosTab] failed to fetch albums', err)\n\t\t\t\tthis.albums = []\n\t\t\t\tthis.error = t('nextcloud-vue', 'Could not load albums.')\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-photos-tab {\n\tpadding: 12px;\n\toverflow-x: hidden;\n}\n\n.cn-photos-tab__actions {\n\tdisplay: flex;\n\tgap: 8px;\n\tmargin-bottom: 10px;\n\tflex-wrap: wrap;\n}\n\n.cn-photos-tab__banner {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 8px 10px;\n\tmargin-bottom: 10px;\n\tborder-radius: var(--border-radius);\n\tbackground: var(--color-warning, #e9a40f);\n\tcolor: var(--color-main-background);\n\tfont-size: 0.9em;\n}\n\n.cn-photos-tab__error {\n\tcolor: var(--color-error);\n\tfont-size: 0.9em;\n\tmargin: 4px 0 8px;\n}\n\n.cn-photos-tab__empty {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 16px 8px;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-align: center;\n}\n\n.cn-photos-tab__empty-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n/*\n * Dense edge-to-edge mosaic that mirrors the NC Photos timeline: square\n * thumbnails packed tight with a thin main-background gutter (the same\n * 2px border NC Photos draws between tiles), name + date revealed in a\n * bottom scrim on hover/focus so the imagery dominates at rest.\n */\n.cn-photos-tab__grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fill, minmax(104px, 1fr));\n\tgap: 2px;\n\tborder-radius: var(--border-radius-large, var(--border-radius));\n\toverflow: hidden;\n}\n\n.cn-photos-tab__tile {\n\tposition: relative;\n}\n\n.cn-photos-tab__unlink {\n\tposition: absolute;\n\ttop: 4px;\n\tright: 4px;\n\tz-index: 3;\n\topacity: 0;\n\tbackground: var(--color-main-background);\n\tborder-radius: 50%;\n\ttransition: opacity 0.15s ease;\n}\n\n.cn-photos-tab__tile:hover .cn-photos-tab__unlink,\n.cn-photos-tab__tile:focus-within .cn-photos-tab__unlink {\n\topacity: 1;\n}\n\n.cn-photos-tab__tile-link {\n\tdisplay: block;\n\ttext-decoration: none;\n\tcolor: inherit;\n}\n\n.cn-photos-tab__cover {\n\tposition: relative;\n\taspect-ratio: 1 / 1;\n\twidth: 100%;\n\t/* Match the NC Photos selection outline on focus. */\n\tborder: 2px solid var(--color-main-background);\n\tbox-sizing: border-box;\n\tbackground: var(--color-primary-element-light, var(--color-background-darker));\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\toverflow: hidden;\n}\n\n.cn-photos-tab__tile-link:focus-visible .cn-photos-tab__cover {\n\toutline: var(--color-primary-element) solid 2px;\n\toutline-offset: -2px;\n}\n\n.cn-photos-tab__cover-img {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: cover;\n\tdisplay: block;\n\ttransition: transform 0.2s ease;\n}\n\n.cn-photos-tab__tile:hover .cn-photos-tab__cover-img,\n.cn-photos-tab__tile:focus-within .cn-photos-tab__cover-img {\n\ttransform: scale(1.04);\n}\n\n.cn-photos-tab__cover-placeholder {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.cn-photos-tab__cover-fallback {\n\tcolor: var(--color-primary-element);\n}\n\n/* Photo-count badge (mirrors the album stack count overlay). */\n.cn-photos-tab__badge {\n\tposition: absolute;\n\ttop: 4px;\n\tleft: 4px;\n\tz-index: 2;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 3px;\n\tpadding: 1px 6px 1px 4px;\n\tborder-radius: var(--border-radius-pill, 12px);\n\tbackground: rgba(0, 0, 0, 0.55);\n\tcolor: #fff;\n\tfont-size: 11px;\n\tfont-weight: 500;\n\tline-height: 1.6;\n}\n\n.cn-photos-tab__badge-count {\n\twhite-space: nowrap;\n}\n\n/* Bottom scrim: hidden at rest, revealed on hover/focus. */\n.cn-photos-tab__meta {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 1px;\n\tpadding: 16px 8px 6px;\n\tbackground: linear-gradient(to top, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0));\n\topacity: 0;\n\ttransition: opacity 0.15s ease;\n\tpointer-events: none;\n}\n\n.cn-photos-tab__tile:hover .cn-photos-tab__meta,\n.cn-photos-tab__tile:focus-within .cn-photos-tab__meta {\n\topacity: 1;\n}\n\n.cn-photos-tab__name {\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: #fff;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-photos-tab__when {\n\tfont-size: 10px;\n\tcolor: rgba(255, 255, 255, 0.85);\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createVNode","_createElementVNode","_createTextVNode","_createBlock","_toDisplayString"],"mappings":";;AAyEM,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,8BAAW,GAAA;;;AAEJ,EAAA,KAAA,EAAA,uBAAA;AAAA,EAAA,IAAA,EAAA,OAAA;;AAKZ,MAAA,UAAA,GAAA,EAAA,KAAA,EAAA,wBAAA,GAAA;;;AAmBkB,EAAA,KAAK,EAAC,sBAAO;AAAA,EAAA,IAAA,EAAA,OAAA;;;;AAK1B,EAAA,KAAA,EAAA,4CAAA;;;;AAeA,EAAA,KAAA,EAAA,qBAAA;;;;;;;AAmBO,EAAA,KAAA,EAAA,kCAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AAjEf,EAAA,QAAAA,SAAA,EAAA,EAAAC,kBAAA,QAAA;KAEQ,KAAO,CAAA,QAAA;AAAf,SAAAD,SAAA,EAAA,EAAAC,kBAAA,CAGI,OAHJ,UAGI,EAAA;UAFHC,WAAuB,CAAA,6BAAA,EAAA,EAAJ,IAAI,EAAA,EAAA,EAAA,CAAA;6BACd,8BAAF,KAAE,CAAA,QAAA,CAAA,EAAA,CAAA,YAAA;;;AAGZ,IAAAC,kBAAA,CAaM,OAbN,UAaM,EAAA;iBAPM,CAAA,mBAAA,EAAA;;;;AAJC,QAAA,cACV,MAA0B;UAA1BD,WAA0B,CAAA,sBAAA,EAAA,EAAZ,IAAI,EAAE,EAAE,EAAA,CAAA;;yBACrB,MACF;AADE,UAAAE,eAAA,CAAA,GACF,mBAAG,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,qBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;iBAOM,CAAA,mBAAA,EAAA;AALD,QAAA,OAAO,EAAC,SAAS;AAAC,QAAA,OAAA,EAAA,QAAA,CAAA,UAAA;;AAC1B,QAAA,IAAA,UACA,MAAmB;UAAnBF,WAAmB,CAAA,eAAA,EAAA,EAAZ,IAAI,EAAE,EAAE,EAAA,CAAA;;yBACL,MACV;AADU,UAAAE,eAAA,CAAA,GACV,mBAAE,QAAC,CAAA,CAAA,CAAA,eAAA,EAAA,kBAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;;;;KAKe,KAAK,CAAA,OAAA;sBAArBC,WAAqB,CAAA,wBAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,CAAA;SAGV,KAAK,CAAA,KAAA;wBAAhBJ,kBAEC,CAAA,KAAA,EAFD,UAEC,EAAAK,eAAA,MADG,CAAA,KAAA,CAAA,EAAA,CAAA,YAAA;AAIC,UAAA,CAAA,KAAA,CAAA,MAAA,CAAA,MAAA,KAAA,CAAA;AAAN,aAAAN,SAAA,EAAA,EAAAC,kBAAA,CAYE,OAZF,UAYE,EAAA;yBAXqD,CAAA,oBAAA,EAAA;AAA9C,gBAAA,IAAI,EAAE,EAAE;AAAE,gBAAA,KAAK,EAAC,2BAA2B;;AACpD,cAAAE,kBAAA,CAAoB,2BAAjB,MAAU,CAAA,UAAA,CAAA,EAAA,CAAA,YAAA;yBASN,CAAA,mBAAA,EAAA;AAPN,gBAAA,OAAI,EAAA,SAAU;AACf,gBAAA,IAAG,EAAE,MAAC,CAAA,YAAA;sBACH,EAAE,QAAQ;;AACJ,gBAAA,IAAI,gBACU;6BAAA,CAAA,oBAAA,EAAA,EAAZ,IAAI,EAAE,EAAE,EAAA,CAAA;;iCACV,MACP;AADO,kBAAAC,eAAA,CAAA,GACP,mBAAA,MAAc,CAAA,eAAA,CAAA,EAAA,CAAA,YAAA;;;;;AAKlB,aAAAJ,SAAA,EAAA,EAAAC,kBAAA,QAAA;gCACCA,8CACe,KAAM,CAAA,MAAA,EAAA,CAAf,KAAK,KAAA;qCADXA;kBAEA,GAAG,EAAE,QAAQ,CAAA,QAAA,CAAC,KAAK,CAAA;uBACf,EAAC,qBAAqB;;kBAC1BE;oBACC,IAAI,EAAE,QAAQ,CAAA,QAAA,CAAC,KAAK,CAAA;AACrB,oBAAA,KAAK,EAAC,0BAAI;AACV,oBAAA,MAAM,EAAC,QAAE;AACT,oBAAA,GAAG,EAAA,qBAAA;oBACF,KAAC,EAAA,QAAA,CAAA,SAAA,CAAA,KAAA,CAAA;;;AAGM,sBAAA,CAAA,QAAA,CAAA,QAAM,CAAA,KAAA,CAAA;wCADbF,kBAMc,CAAA,KAAA,EAAA;;4BAJZ,GAAG,EAAE,QAAO,CAAA,QAAA,CAAA,KAAA,CAAA;4BACZ,GAAG,EAAE,QAAS,CAAA,SAAA,MAAM,CAAA;AACrB,4BAAA,KAAK,EAAC,0BAAU;;4BAEf,OAAK,EAAA,MAAA,KAAE,QAAK,CAAA,YAAA,CAAA,KAAA,CAAA,CAAA;;AACd,2BAAAD,SAAA,EAAA,EAAAC,kBAAA,CAEO,QAFP,WAEO,EAAA;4BADNC,WAAsB,CAAA,wBAAA,EAAA;kCAAF,EAAE,EAAA;AAAA,8BAAA,KAAA,EAAA,+BAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"CnPhotosTab.vue3.js","sources":["../../../../../src/integrations/builtin/photos/CnPhotosTab.vue?vue&type=template&id=1b937a5a&lang.js"],"sourcesContent":["<!--\n CnPhotosTab — bespoke sidebar tab for the `photos` integration leaf.\n\n Replaces the generic `CnIntegrationTab` for the `photos` leaf: renders\n the linked NC Photos albums as a card grid (cover thumbnail, album\n name, photo count, last-edited date). Clicking a card deep-links into\n the NC Photos app at `/index.php/apps/photos/albums/{albumId}`.\n\n Tier-2 surface (this commit):\n - \"Link existing album\" → opens CnPhotoAlbumPicker (modal)\n - \"Create new album\" → opens CnPhotoAlbumCreate (modal)\n - Per-tile unlink → DELETE …/photos/{albumId}\n\n Talks to the OpenRegister Tier-2 photo-link endpoints\n GET /api/objects/{r}/{s}/{id}/photos — list\n POST /api/objects/{r}/{s}/{id}/photos — link existing\n POST /api/objects/{r}/{s}/{id}/photos/new — create + link\n DELETE /api/objects/{r}/{s}/{id}/photos/{albumId} — unlink\n GET /api/integrations/photos/available — picker source\n served by `OCA\\OpenRegister\\Controller\\PhotoLinksController`.\n\n The endpoint returns rows shaped:\n { id, title, url, albumId, albumName, coverPhotoUrl, photoCount,\n lastEdited, data: { … } }\n\n Empty + loading + error + 503 unavailable states follow ADR-017 and\n AD-23 graceful degradation. All UI strings are passed through\n `t('nextcloud-vue', ...)` per ADR-007. Styling uses Nextcloud CSS\n variables only so the nldesign overrides apply transparently\n (ADR-010).\n\n Bespoke-vs-generic rationale: the generic tab renders a flat link list\n which loses the cover thumbnail + photo count + recency — the three\n signals users rely on when triaging which album is relevant for a\n case. The bespoke tab surfaces them per card.\n-->\n<template>\n\t<div class=\"cn-sidebar-tab cn-photos-tab\">\n\t\t<!-- 503 unavailable banner (AD-23) -->\n\t\t<div v-if=\"degraded\" class=\"cn-photos-tab__banner\" role=\"alert\">\n\t\t\t<AlertCircleOutline :size=\"18\" />\n\t\t\t<span>{{ degraded }}</span>\n\t\t</div>\n\n\t\t<div class=\"cn-photos-tab__actions\">\n\t\t\t<NcButton variant=\"secondary\" @click=\"openPicker\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<LinkVariant :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Link existing album') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton variant=\"primary\" @click=\"openCreate\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<Plus :size=\"18\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('nextcloud-vue', 'Create new album') }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<!-- Loading -->\n\t\t<NcLoadingIcon v-if=\"loading\" />\n\n\t\t<!-- Error -->\n\t\t<div v-else-if=\"error\" class=\"cn-photos-tab__error\" role=\"alert\">\n\t\t\t{{ error }}\n\t\t</div>\n\n\t\t<!-- Empty -->\n\t\t<div v-else-if=\"albums.length === 0\" class=\"cn-sidebar-tab__empty cn-photos-tab__empty\">\n\t\t\t<ImageIcon :size=\"32\" class=\"cn-photos-tab__empty-icon\" />\n\t\t\t<p>{{ emptyLabel }}</p>\n\t\t\t<NcButton\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t:href=\"photosAppUrl\"\n\t\t\t\ttarget=\"_blank\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<ImageIcon :size=\"20\" />\n\t\t\t\t</template>\n\t\t\t\t{{ openPhotosLabel }}\n\t\t\t</NcButton>\n\t\t</div>\n\n\t\t<!-- Photo mosaic grid (mirrors the NC Photos timeline) -->\n\t\t<div v-else class=\"cn-photos-tab__grid\">\n\t\t\t<div\n\t\t\t\tv-for=\"album in albums\"\n\t\t\t\t:key=\"albumKey(album)\"\n\t\t\t\tclass=\"cn-photos-tab__tile\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"albumUrl(album)\"\n\t\t\t\t\tclass=\"cn-photos-tab__tile-link\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t:title=\"albumName(album)\">\n\t\t\t\t\t<div class=\"cn-photos-tab__cover\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tv-if=\"coverUrl(album)\"\n\t\t\t\t\t\t\t:src=\"coverUrl(album)\"\n\t\t\t\t\t\t\t:alt=\"albumName(album)\"\n\t\t\t\t\t\t\tclass=\"cn-photos-tab__cover-img\"\n\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t@error=\"onCoverError(album)\">\n\t\t\t\t\t\t<span v-else class=\"cn-photos-tab__cover-placeholder\">\n\t\t\t\t\t\t\t<ImageMultiple :size=\"36\" class=\"cn-photos-tab__cover-fallback\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<!-- Photo-count badge, top-left (mirrors album stack overlay) -->\n\t\t\t\t\t\t<span v-if=\"photoCount(album) !== null\" class=\"cn-photos-tab__badge\">\n\t\t\t\t\t\t\t<ImageMultiple :size=\"12\" />\n\t\t\t\t\t\t\t<span class=\"cn-photos-tab__badge-count\">{{ photoCountLabel(album) }}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<!-- Hover scrim with name + date -->\n\t\t\t\t\t\t<div class=\"cn-photos-tab__meta\">\n\t\t\t\t\t\t\t<span class=\"cn-photos-tab__name\">{{ albumName(album) }}</span>\n\t\t\t\t\t\t\t<span v-if=\"lastEdited(album)\" class=\"cn-photos-tab__when\">\n\t\t\t\t\t\t\t\t{{ formatWhen(lastEdited(album)) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</a>\n\t\t\t\t<NcButton\n\t\t\t\t\tvariant=\"tertiary-no-background\"\n\t\t\t\t\t:aria-label=\"t('nextcloud-vue', 'Unlink album')\"\n\t\t\t\t\tclass=\"cn-photos-tab__unlink\"\n\t\t\t\t\t@click=\"unlinkAlbum(album)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<LinkOff :size=\"16\" />\n\t\t\t\t\t</template>\n\t\t\t\t</NcButton>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<CnPhotoAlbumPicker\n\t\t\tv-if=\"pickerOpen\"\n\t\t\t:apiBase=\"apiBase\"\n\t\t\t@close=\"pickerOpen = false\"\n\t\t\t@link=\"onLinkPick\" />\n\n\t\t<CnPhotoAlbumCreate\n\t\t\tv-if=\"createOpen\"\n\t\t\t@close=\"createOpen = false\"\n\t\t\t@create=\"onCreatePick\" />\n\t</div>\n</template>\n\n<script>\nimport { translatePlural as n, translate as t } from '@nextcloud/l10n'\nimport { NcButton, NcLoadingIcon } from '@nextcloud/vue'\nimport AlertCircleOutline from 'vue-material-design-icons/AlertCircleOutline.vue'\nimport ImageIcon from 'vue-material-design-icons/Image.vue'\nimport ImageMultiple from 'vue-material-design-icons/ImageMultiple.vue'\nimport LinkOff from 'vue-material-design-icons/LinkOff.vue'\nimport LinkVariant from 'vue-material-design-icons/LinkVariant.vue'\nimport Plus from 'vue-material-design-icons/Plus.vue'\nimport CnPhotoAlbumCreate from '../../../components/CnPhotoAlbumCreate/CnPhotoAlbumCreate.vue'\nimport CnPhotoAlbumPicker from '../../../components/CnPhotoAlbumPicker/CnPhotoAlbumPicker.vue'\nimport { buildHeaders, prefixUrl, safeHref } from '../../../utils/index.js'\nimport { userLocale } from '../../../utils/userLocale.js'\n\n/**\n * CnPhotosTab — bespoke album grid for the `photos` integration.\n *\n * Renders one tile per linked NC Photos album with cover thumbnail,\n * album name, photo count, and last-edited date. Clicking a tile opens\n * the album in the NC Photos app in a new tab. Tier-2: includes\n * link/create modals and per-tile unlink.\n */\nexport default {\n\tname: 'CnPhotosTab',\n\n\tcomponents: {\n\t\tNcButton,\n\t\tNcLoadingIcon,\n\t\tAlertCircleOutline,\n\t\tImageIcon,\n\t\tImageMultiple,\n\t\tLinkOff,\n\t\tLinkVariant,\n\t\tPlus,\n\t\tCnPhotoAlbumPicker,\n\t\tCnPhotoAlbumCreate,\n\t},\n\n\tprops: {\n\t\t/* eslint-disable vue/no-unused-properties -- the integration dispatch binds integrationId on every integration component (see CnIntegrationWidgetGrid), so declaring it keeps it out of $attrs */\n\t\t/** Stable integration id (forwarded from the registry — always `'photos'`). */\n\t\tintegrationId: { type: String, default: 'photos' },\n\t\t/* eslint-enable vue/no-unused-properties */\n\t\t/** Parent object id. */\n\t\tobjectId: { type: String, required: true },\n\t\t/** OpenRegister register id (slug or uuid). */\n\t\tregister: { type: String, default: '' },\n\t\t/** OpenRegister schema id (slug or uuid). */\n\t\tschema: { type: String, default: '' },\n\t\t/** Base API URL. */\n\t\tapiBase: { type: String, default: '/apps/openregister/api' },\n\t\t/** Pre-translated empty-state label. */\n\t\temptyLabel: { type: String, default: () => t('nextcloud-vue', 'No albums linked yet') },\n\t\t/** Pre-translated \"Open Photos\" CTA label. */\n\t\topenPhotosLabel: { type: String, default: () => t('nextcloud-vue', 'Open Photos') },\n\t\t/** Pre-translated 503 unavailable banner copy. */\n\t\tunavailableLabel: { type: String, default: () => t('nextcloud-vue', 'NC Photos is currently unavailable.') },\n\t\t/** URL of the NC Photos app entry. */\n\t\tphotosAppUrl: { type: String, default: '/index.php/apps/photos' },\n\t},\n\n\tdata() {\n\t\treturn {\n\t\t\talbums: [],\n\t\t\tloading: false,\n\t\t\terror: '',\n\t\t\tdegraded: '',\n\t\t\tbrokenCovers: {},\n\t\t\tpickerOpen: false,\n\t\t\tcreateOpen: false,\n\t\t}\n\t},\n\n\twatch: {\n\t\tobjectId: { immediate: true, handler(id) {\n\t\t\tif (id) {\n\t\t\t\tthis.fetchAlbums()\n\t\t\t}\n\t\t} },\n\n\t\tregister() {\n\t\t\tthis.fetchAlbums()\n\t\t},\n\n\t\tschema() {\n\t\t\tthis.fetchAlbums()\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\n\t\t/**\n\t\t * Base for the Tier-2 photos endpoints (list/link/new/destroy).\n\t\t *\n\t\t * @return {string} The endpoint URL.\n\t\t */\n\t\tphotosEndpoint() {\n\t\t\treturn `${this.apiBase}/objects/${this.register}/${this.schema}/${this.objectId}/photos`\n\t\t},\n\n\t\talbumKey(album) {\n\t\t\treturn (album && (album.albumId ?? album.id ?? album.data?.album_id)) || ''\n\t\t},\n\n\t\t/**\n\t\t * Resolve the displayable album name from the row, stripping any\n\t\t * legacy `[or:{uuid}]` marker (pre-Tier-2 albums embedded the\n\t\t * marker inside `name`).\n\t\t *\n\t\t * @param {object} album Provider row.\n\t\t *\n\t\t * @return {string} The display name.\n\t\t */\n\t\talbumName(album) {\n\t\t\tconst raw = (album && (album.albumName || album.title || album.name || album.data?.name)) || ''\n\t\t\treturn String(raw).replace(/\\s*\\[or:[^\\]]+\\]\\s*/g, ' ').trim() || t('nextcloud-vue', 'Untitled album')\n\t\t},\n\n\t\talbumUrl(album) {\n\t\t\tif (album && album.url && safeHref(album.url) !== '#') {\n\t\t\t\treturn album.url\n\t\t\t}\n\t\t\tconst id = this.albumKey(album)\n\t\t\treturn `/index.php/apps/photos/albums/${encodeURIComponent(id)}`\n\t\t},\n\n\t\tcoverUrl(album) {\n\t\t\tif (!album || this.brokenCovers[this.albumKey(album)]) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn album.coverPhotoUrl || album.data?.coverPhotoUrl || ''\n\t\t},\n\n\t\tonCoverError(album) {\n\t\t\tthis.brokenCovers[this.albumKey(album)] = true\n\t\t},\n\n\t\tphotoCount(album) {\n\t\t\tconst raw = album?.photoCount ?? album?.data?.photoCount ?? album?.data?.count\n\t\t\tif (raw === null || raw === undefined || raw === '') {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\tconst num = Number(raw)\n\t\t\treturn Number.isFinite(num) ? num : null\n\t\t},\n\n\t\tphotoCountLabel(album) {\n\t\t\tconst count = this.photoCount(album)\n\t\t\tif (count === null) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\treturn n('nextcloud-vue', '{count} photo', '{count} photos', count, { count })\n\t\t},\n\n\t\tlastEdited(album) {\n\t\t\treturn album?.lastEdited\n\t\t\t\t|| album?.data?.lastEdited\n\t\t\t\t|| album?.data?.created\n\t\t\t\t|| ''\n\t\t},\n\n\t\tformatWhen(value) {\n\t\t\tif (!value) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\ttry {\n\t\t\t\t// NC Photos stores `created` as a unix timestamp in\n\t\t\t\t// seconds; accept ISO strings transparently too.\n\t\t\t\tconst num = Number(value)\n\t\t\t\tconst d = Number.isFinite(num) && num > 0 && String(value).length <= 12\n\t\t\t\t\t? new Date(num * 1000)\n\t\t\t\t\t: new Date(value)\n\t\t\t\tif (Number.isNaN(d.getTime())) {\n\t\t\t\t\treturn String(value)\n\t\t\t\t}\n\t\t\t\treturn d.toLocaleDateString(userLocale(), { dateStyle: 'medium' })\n\t\t\t} catch {\n\t\t\t\treturn String(value)\n\t\t\t}\n\t\t},\n\n\t\topenPicker() {\n\t\t\tthis.pickerOpen = true\n\t\t},\n\n\t\topenCreate() {\n\t\t\tthis.createOpen = true\n\t\t},\n\n\t\tasync onLinkPick(payload) {\n\t\t\tthis.pickerOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.photosEndpoint()), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchAlbums()\n\t\t\t\t} else if (response.status === 409) {\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'This album is already linked.')\n\t\t\t\t} else {\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'Could not link album.')\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('[CnPhotosTab] link failed', err)\n\t\t\t\tthis.error = t('nextcloud-vue', 'Could not link album.')\n\t\t\t}\n\t\t},\n\n\t\tasync onCreatePick(payload) {\n\t\t\tthis.createOpen = false\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.photosEndpoint()}/new`), {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { ...buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchAlbums()\n\t\t\t\t} else {\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'Could not create album.')\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('[CnPhotosTab] create failed', err)\n\t\t\t\tthis.error = t('nextcloud-vue', 'Could not create album.')\n\t\t\t}\n\t\t},\n\n\t\tasync unlinkAlbum(album) {\n\t\t\tconst albumId = this.albumKey(album)\n\t\t\tif (!albumId) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(`${this.photosEndpoint()}/${albumId}`), {\n\t\t\t\t\tmethod: 'DELETE',\n\t\t\t\t\theaders: buildHeaders(),\n\t\t\t\t})\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tawait this.fetchAlbums()\n\t\t\t\t} else {\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'Could not unlink album.')\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('[CnPhotosTab] unlink failed', err)\n\t\t\t\tthis.error = t('nextcloud-vue', 'Could not unlink album.')\n\t\t\t}\n\t\t},\n\n\t\tasync fetchAlbums() {\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.error = ''\n\t\t\tthis.degraded = ''\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(prefixUrl(this.photosEndpoint()), { 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.albums = data.results || data.items || (Array.isArray(data) ? data : []) || []\n\t\t\t\t} else if (response.status === 503 || response.status === 501) {\n\t\t\t\t\tthis.albums = []\n\t\t\t\t\tthis.degraded = this.unavailableLabel\n\t\t\t\t} else {\n\t\t\t\t\tthis.albums = []\n\t\t\t\t\tthis.error = t('nextcloud-vue', 'Could not load albums.')\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('[CnPhotosTab] failed to fetch albums', err)\n\t\t\t\tthis.albums = []\n\t\t\t\tthis.error = t('nextcloud-vue', 'Could not load albums.')\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-photos-tab {\n\tpadding: 12px;\n\toverflow-x: hidden;\n}\n\n.cn-photos-tab__actions {\n\tdisplay: flex;\n\tgap: 8px;\n\tmargin-bottom: 10px;\n\tflex-wrap: wrap;\n}\n\n.cn-photos-tab__banner {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 8px 10px;\n\tmargin-bottom: 10px;\n\tborder-radius: var(--border-radius);\n\tbackground: var(--color-warning, #e9a40f);\n\tcolor: var(--color-main-background);\n\tfont-size: 0.9em;\n}\n\n.cn-photos-tab__error {\n\tcolor: var(--color-error);\n\tfont-size: 0.9em;\n\tmargin: 4px 0 8px;\n}\n\n.cn-photos-tab__empty {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: 8px;\n\tpadding: 16px 8px;\n\tcolor: var(--color-text-maxcontrast);\n\ttext-align: center;\n}\n\n.cn-photos-tab__empty-icon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n/*\n * Dense edge-to-edge mosaic that mirrors the NC Photos timeline: square\n * thumbnails packed tight with a thin main-background gutter (the same\n * 2px border NC Photos draws between tiles), name + date revealed in a\n * bottom scrim on hover/focus so the imagery dominates at rest.\n */\n.cn-photos-tab__grid {\n\tdisplay: grid;\n\tgrid-template-columns: repeat(auto-fill, minmax(104px, 1fr));\n\tgap: 2px;\n\tborder-radius: var(--border-radius-large, var(--border-radius));\n\toverflow: hidden;\n}\n\n.cn-photos-tab__tile {\n\tposition: relative;\n}\n\n.cn-photos-tab__unlink {\n\tposition: absolute;\n\ttop: 4px;\n\tright: 4px;\n\tz-index: 3;\n\topacity: 0;\n\tbackground: var(--color-main-background);\n\tborder-radius: 50%;\n\ttransition: opacity 0.15s ease;\n}\n\n.cn-photos-tab__tile:hover .cn-photos-tab__unlink,\n.cn-photos-tab__tile:focus-within .cn-photos-tab__unlink {\n\topacity: 1;\n}\n\n.cn-photos-tab__tile-link {\n\tdisplay: block;\n\ttext-decoration: none;\n\tcolor: inherit;\n}\n\n.cn-photos-tab__cover {\n\tposition: relative;\n\taspect-ratio: 1 / 1;\n\twidth: 100%;\n\t/* Match the NC Photos selection outline on focus. */\n\tborder: 2px solid var(--color-main-background);\n\tbox-sizing: border-box;\n\tbackground: var(--color-primary-element-light, var(--color-background-darker));\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\toverflow: hidden;\n}\n\n.cn-photos-tab__tile-link:focus-visible .cn-photos-tab__cover {\n\toutline: var(--color-primary-element) solid 2px;\n\toutline-offset: -2px;\n}\n\n.cn-photos-tab__cover-img {\n\twidth: 100%;\n\theight: 100%;\n\tobject-fit: cover;\n\tdisplay: block;\n\ttransition: transform 0.2s ease;\n}\n\n.cn-photos-tab__tile:hover .cn-photos-tab__cover-img,\n.cn-photos-tab__tile:focus-within .cn-photos-tab__cover-img {\n\ttransform: scale(1.04);\n}\n\n.cn-photos-tab__cover-placeholder {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 100%;\n\theight: 100%;\n}\n\n.cn-photos-tab__cover-fallback {\n\tcolor: var(--color-primary-element);\n}\n\n/* Photo-count badge (mirrors the album stack count overlay). */\n.cn-photos-tab__badge {\n\tposition: absolute;\n\ttop: 4px;\n\tleft: 4px;\n\tz-index: 2;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 3px;\n\tpadding: 1px 6px 1px 4px;\n\tborder-radius: var(--border-radius-pill, 12px);\n\tbackground: rgba(0, 0, 0, 0.55);\n\tcolor: #fff;\n\tfont-size: 11px;\n\tfont-weight: 500;\n\tline-height: 1.6;\n}\n\n.cn-photos-tab__badge-count {\n\twhite-space: nowrap;\n}\n\n/* Bottom scrim: hidden at rest, revealed on hover/focus. */\n.cn-photos-tab__meta {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 1px;\n\tpadding: 16px 8px 6px;\n\tbackground: linear-gradient(to top, rgba(0, 0, 0, 0.7), rgba(0, 0, 0, 0));\n\topacity: 0;\n\ttransition: opacity 0.15s ease;\n\tpointer-events: none;\n}\n\n.cn-photos-tab__tile:hover .cn-photos-tab__meta,\n.cn-photos-tab__tile:focus-within .cn-photos-tab__meta {\n\topacity: 1;\n}\n\n.cn-photos-tab__name {\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tcolor: #fff;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n.cn-photos-tab__when {\n\tfont-size: 10px;\n\tcolor: rgba(255, 255, 255, 0.85);\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createVNode","_createElementVNode","_createTextVNode","_createBlock","_toDisplayString"],"mappings":"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"}
|
package/dist/esm/l10n/en.json.js
CHANGED
|
@@ -72,7 +72,7 @@ var translations = {
|
|
|
72
72
|
"Could not change the favourite.": "Could not change the favourite.",
|
|
73
73
|
Follow: "Follow",
|
|
74
74
|
Following: "Following",
|
|
75
|
-
"Loading
|
|
75
|
+
"Loading …": "Loading …",
|
|
76
76
|
"Add a colleague": "Add a colleague",
|
|
77
77
|
"{count} followers": "{count} followers",
|
|
78
78
|
"Follow this record to get its updates": "Follow this record to get its updates",
|
|
@@ -1417,7 +1417,62 @@ var translations = {
|
|
|
1417
1417
|
"No value ({count})": "No value ({count})",
|
|
1418
1418
|
"{start} to {end}": "{start} to {end}",
|
|
1419
1419
|
Breadcrumb: "Breadcrumb",
|
|
1420
|
-
"Moving to {stage}": "Moving to {stage}"
|
|
1420
|
+
"Moving to {stage}": "Moving to {stage}",
|
|
1421
|
+
"Application name": "Application name",
|
|
1422
|
+
"Configured version": "Configured version",
|
|
1423
|
+
"Updating…": "Updating…",
|
|
1424
|
+
"Up to date": "Up to date",
|
|
1425
|
+
"Loading version information…": "Loading version information…",
|
|
1426
|
+
"Configuration re-imported successfully": "Configuration re-imported successfully",
|
|
1427
|
+
"Configure your {app} installation": "Configure your {app} installation",
|
|
1428
|
+
"For support, contact us at": "For support, contact us at",
|
|
1429
|
+
"For a Service Level Agreement (SLA), contact": "For a Service Level Agreement (SLA), contact",
|
|
1430
|
+
"Help us": "Help us",
|
|
1431
|
+
"Importing…": "Importing…",
|
|
1432
|
+
"Information about the current {app} installation": "Information about the current {app} installation",
|
|
1433
|
+
"Re-import failed": "Re-import failed",
|
|
1434
|
+
"Run setup wizard": "Run setup wizard",
|
|
1435
|
+
Support: "Support",
|
|
1436
|
+
"{app} Settings": "{app} Settings",
|
|
1437
|
+
"Loading registers…": "Loading registers…",
|
|
1438
|
+
"Object type": "Object type",
|
|
1439
|
+
"Register {id}": "Register {id}",
|
|
1440
|
+
"Schema {id}": "Schema {id}",
|
|
1441
|
+
"The registers could not be loaded: {reason}": "The registers could not be loaded: {reason}",
|
|
1442
|
+
"no connection": "no connection",
|
|
1443
|
+
"Confirm action": "Confirm action",
|
|
1444
|
+
"Are you sure you want to continue?": "Are you sure you want to continue?",
|
|
1445
|
+
Confirm: "Confirm",
|
|
1446
|
+
"Action failed.": "Action failed.",
|
|
1447
|
+
"Could not open the form.": "Could not open the form.",
|
|
1448
|
+
"Could not open this action.": "Could not open this action.",
|
|
1449
|
+
"Saved.": "Saved.",
|
|
1450
|
+
"Save failed.": "Save failed.",
|
|
1451
|
+
"Action completed.": "Action completed.",
|
|
1452
|
+
"Run queued": "Run queued",
|
|
1453
|
+
"Agent runtime unavailable": "Agent runtime unavailable",
|
|
1454
|
+
"Run completed.": "Run completed.",
|
|
1455
|
+
"Edit with Buildiq": "Edit with Buildiq",
|
|
1456
|
+
"Save page": "Save page",
|
|
1457
|
+
"Edit page": "Edit page",
|
|
1458
|
+
"Add widget…": "Add widget…",
|
|
1459
|
+
"Edit pages…": "Edit pages…",
|
|
1460
|
+
"Edit menu…": "Edit menu…",
|
|
1461
|
+
"Edit sidebar…": "Edit sidebar…",
|
|
1462
|
+
"Edit actions…": "Edit actions…",
|
|
1463
|
+
"Edit data…": "Edit data…",
|
|
1464
|
+
"Edit flows…": "Edit flows…",
|
|
1465
|
+
"This value was not accepted.": "This value was not accepted.",
|
|
1466
|
+
"Provide details": "Provide details",
|
|
1467
|
+
"This field is required.": "This field is required.",
|
|
1468
|
+
"This action does not accept the field \"{field}\".": "This action does not accept the field \"{field}\".",
|
|
1469
|
+
"Are you sure?": "Are you sure?",
|
|
1470
|
+
Loading: "Loading",
|
|
1471
|
+
"Configure widget": "Configure widget",
|
|
1472
|
+
"Link related object": "Link related object",
|
|
1473
|
+
"{type} parts": "{type} parts",
|
|
1474
|
+
"Cannot save: this record has no id, so the edit would create a duplicate instead of updating it.": "Cannot save: this record has no id, so the edit would create a duplicate instead of updating it.",
|
|
1475
|
+
"Save failed": "Save failed"
|
|
1421
1476
|
};
|
|
1422
1477
|
var plurals = {
|
|
1423
1478
|
"{count} selected": [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/l10n/nl.json.js
CHANGED
|
@@ -72,7 +72,7 @@ var translations = {
|
|
|
72
72
|
"Could not change the favourite.": "De favoriet kon niet worden gewijzigd.",
|
|
73
73
|
Follow: "Volgen",
|
|
74
74
|
Following: "Volgend",
|
|
75
|
-
"Loading
|
|
75
|
+
"Loading …": "Laden …",
|
|
76
76
|
"Add a colleague": "Collega toevoegen",
|
|
77
77
|
"{count} followers": "{count} volgers",
|
|
78
78
|
"Follow this record to get its updates": "Volg dit dossier om de wijzigingen te ontvangen",
|
|
@@ -1583,7 +1583,83 @@ var translations = {
|
|
|
1583
1583
|
"Transition failed": "De overgang is mislukt",
|
|
1584
1584
|
Closed: "Afgesloten",
|
|
1585
1585
|
"Skip to {action}": "Ga naar {action}",
|
|
1586
|
-
"Moving to {stage}": "Bezig met verplaatsen naar {stage}"
|
|
1586
|
+
"Moving to {stage}": "Bezig met verplaatsen naar {stage}",
|
|
1587
|
+
"Due {date}": "Termijn {date}",
|
|
1588
|
+
"Overdue {date}": "Over tijd sinds {date}",
|
|
1589
|
+
Elsewhere: "Elders",
|
|
1590
|
+
"Move to": "Verplaatsen naar",
|
|
1591
|
+
"Nothing here": "Niets in deze kolom",
|
|
1592
|
+
"Open in new tab": "Openen in nieuw tabblad",
|
|
1593
|
+
"Show {count} more": "Toon {count} meer",
|
|
1594
|
+
"Somebody else moved this card. It is shown where it is now.": "Iemand anders heeft deze kaart al verplaatst. Je ziet hem nu op zijn nieuwe plek.",
|
|
1595
|
+
"That move was refused.": "Die verplaatsing is geweigerd.",
|
|
1596
|
+
"This list has no status field with stages, so it cannot be shown as a board.": "Deze lijst heeft geen statusveld met fases, dus er is geen bord van te maken.",
|
|
1597
|
+
"not allowed": "niet toegestaan",
|
|
1598
|
+
"on this page": "op deze pagina",
|
|
1599
|
+
"{count} on this page": "{count} op deze pagina",
|
|
1600
|
+
"{name} cannot move to {column}.": "{name} kan niet naar {column}.",
|
|
1601
|
+
"{name}, in {column}": "{name}, in {column}",
|
|
1602
|
+
full: "vol",
|
|
1603
|
+
"{count} / {capacity}": "{count} / {capacity}",
|
|
1604
|
+
"{column} is full: {count} of {capacity}.": "{column} is vol: {count} van {capacity}.",
|
|
1605
|
+
"This card cannot move to that column.": "Deze kaart kan niet naar die kolom.",
|
|
1606
|
+
Nobody: "Niemand",
|
|
1607
|
+
"{label}:": "{label}:",
|
|
1608
|
+
"Application name": "Naam van de app",
|
|
1609
|
+
"Configured version": "Ingestelde versie",
|
|
1610
|
+
"Updating…": "Bijwerken…",
|
|
1611
|
+
"Up to date": "Bijgewerkt",
|
|
1612
|
+
"Loading version information…": "Versie-informatie laden…",
|
|
1613
|
+
"Configuration re-imported successfully": "De configuratie is opnieuw geïmporteerd",
|
|
1614
|
+
"Configure your {app} installation": "Stel je {app}-installatie in",
|
|
1615
|
+
"For support, contact us at": "Voor ondersteuning mail je naar",
|
|
1616
|
+
"For a Service Level Agreement (SLA), contact": "Voor een Service Level Agreement (SLA) mail je naar",
|
|
1617
|
+
"Help us": "Help ons",
|
|
1618
|
+
"Importing…": "Importeren…",
|
|
1619
|
+
"Information about the current {app} installation": "Informatie over de huidige {app}-installatie",
|
|
1620
|
+
"Re-import failed": "Opnieuw importeren is mislukt",
|
|
1621
|
+
"Run setup wizard": "Installatiehulp starten",
|
|
1622
|
+
Support: "Ondersteuning",
|
|
1623
|
+
"{app} Settings": "{app}-instellingen",
|
|
1624
|
+
"Loading registers…": "Registers laden…",
|
|
1625
|
+
"Object type": "Soort object",
|
|
1626
|
+
"Register {id}": "Register {id}",
|
|
1627
|
+
"Schema {id}": "Schema {id}",
|
|
1628
|
+
"The registers could not be loaded: {reason}": "De registers konden niet worden geladen: {reason}",
|
|
1629
|
+
"no connection": "geen verbinding",
|
|
1630
|
+
"Confirm action": "Actie bevestigen",
|
|
1631
|
+
"Are you sure you want to continue?": "Weet je zeker dat je wilt doorgaan?",
|
|
1632
|
+
Confirm: "Bevestigen",
|
|
1633
|
+
"Action failed.": "De actie is mislukt.",
|
|
1634
|
+
"Could not open the form.": "Het formulier kon niet worden geopend.",
|
|
1635
|
+
"Could not open this action.": "Deze actie kon niet worden geopend.",
|
|
1636
|
+
"Saved.": "Opgeslagen.",
|
|
1637
|
+
"Save failed.": "Opslaan is mislukt.",
|
|
1638
|
+
"Action completed.": "Actie uitgevoerd.",
|
|
1639
|
+
"Run queued": "Run staat in de wachtrij",
|
|
1640
|
+
"Agent runtime unavailable": "De agent-runtime is niet beschikbaar",
|
|
1641
|
+
"Run completed.": "Run voltooid.",
|
|
1642
|
+
"Edit with Buildiq": "Bewerken met Buildiq",
|
|
1643
|
+
"Save page": "Pagina opslaan",
|
|
1644
|
+
"Edit page": "Pagina bewerken",
|
|
1645
|
+
"Add widget…": "Widget toevoegen…",
|
|
1646
|
+
"Edit pages…": "Pagina's bewerken…",
|
|
1647
|
+
"Edit menu…": "Menu bewerken…",
|
|
1648
|
+
"Edit sidebar…": "Zijbalk bewerken…",
|
|
1649
|
+
"Edit actions…": "Acties bewerken…",
|
|
1650
|
+
"Edit data…": "Gegevens bewerken…",
|
|
1651
|
+
"Edit flows…": "Flows bewerken…",
|
|
1652
|
+
"This value was not accepted.": "Deze waarde is niet geaccepteerd.",
|
|
1653
|
+
"Provide details": "Geef de details op",
|
|
1654
|
+
"This field is required.": "Dit veld is verplicht.",
|
|
1655
|
+
"This action does not accept the field \"{field}\".": "Deze actie accepteert het veld \"{field}\" niet.",
|
|
1656
|
+
"Are you sure?": "Weet je het zeker?",
|
|
1657
|
+
Loading: "Laden",
|
|
1658
|
+
"Configure widget": "Widget instellen",
|
|
1659
|
+
"Link related object": "Gerelateerd object koppelen",
|
|
1660
|
+
"{type} parts": "Onderdelen van {type}",
|
|
1661
|
+
"Cannot save: this record has no id, so the edit would create a duplicate instead of updating it.": "Opslaan kan niet: dit record heeft geen id, dus de wijziging zou een kopie maken in plaats van het record bij te werken.",
|
|
1662
|
+
"Save failed": "Opslaan is mislukt"
|
|
1587
1663
|
};
|
|
1588
1664
|
var plurals = {
|
|
1589
1665
|
"{count} selected": [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|