@conduction/nextcloud-vue 2.56.0-beta.37 → 2.56.0-beta.39
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/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 +156 -14
- package/dist/esm/components/CnBoardView/CnBoardView.vue2.js.map +1 -1
- package/dist/esm/components/CnBoardView/CnBoardView.vue3.js +105 -74
- 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 +2 -1
- package/dist/esm/components/CnDashboardPage/CnDashboardPage.vue2.js.map +1 -1
- 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/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/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 +30 -5
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue2.js.map +1 -1
- package/dist/esm/components/CnIndexPage/CnIndexPage.vue3.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/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/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 +36 -0
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue2.js.map +1 -1
- package/dist/esm/components/CnTabsWidget/CnTabsWidget.vue3.js +55 -40
- 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/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/CnWidgetWrapper/CnWidgetWrapper.vue.js +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js +3 -26
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue2.js.map +1 -1
- package/dist/esm/components/CnWidgetWrapper/CnWidgetWrapper.vue3.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 +35 -2
- package/dist/esm/l10n/en.json.js.map +1 -1
- package/dist/esm/l10n/nl.json.js +38 -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 +1068 -962
- package/dist/esm/store/useObjectStore.js +7 -2
- package/dist/esm/store/useObjectStore.js.map +1 -1
- package/dist/esm/utils/boardColumns.js +50 -1
- package/dist/esm/utils/boardColumns.js.map +1 -1
- package/dist/esm/utils/boardReferenceColumns.js +115 -4
- package/dist/esm/utils/boardReferenceColumns.js.map +1 -1
- package/dist/esm/utils/contentHeaderLink.js +48 -1
- package/dist/esm/utils/contentHeaderLink.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 +2 -2
- package/dist/esm/utils/validateManifestV2.compiled.js.map +1 -1
- package/dist/nextcloud-vue.cjs.js +1088 -476
- package/dist/nextcloud-vue.cjs.js.map +2 -2
- package/dist/nextcloud-vue.css +1068 -962
- package/l10n/en.json +35 -2
- package/l10n/nl.json +38 -2
- package/package.json +1 -1
- 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 +189 -24
- 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 +2 -1
- package/src/components/CnDataMatrix/CnDataMatrix.vue +2 -1
- package/src/components/CnDetailPage/CnDetailHeaderChips.vue +2 -1
- package/src/components/CnEmailPicker/CnEmailPicker.vue +2 -1
- 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 +30 -4
- 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/CnRoadmapItem/CnRoadmapItem.vue +2 -1
- package/src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue +4 -2
- package/src/components/CnStatsBlock/CnStatsBlock.vue +2 -1
- package/src/components/CnSummaryAggregates/CnSummaryAggregates.vue +2 -1
- package/src/components/CnTabsWidget/CnTabsWidget.vue +71 -0
- package/src/components/CnTasksCard/CnTasksCard.vue +2 -1
- package/src/components/CnTimelineWidget/CnTimelineWidget.vue +2 -1
- package/src/components/CnTranslatedBadge/CnTranslatedBadge.vue +2 -1
- package/src/components/CnVersionHistory/CnVersionHistory.vue +2 -1
- package/src/components/CnWidgetWrapper/CnWidgetWrapper.vue +3 -26
- package/src/css/board.css +40 -0
- 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 +4 -1
- package/src/store/useObjectStore.js +7 -2
- package/src/utils/boardColumns.js +49 -0
- package/src/utils/boardReferenceColumns.js +114 -3
- package/src/utils/contentHeaderLink.js +47 -0
- package/src/utils/schema.js +5 -4
- package/src/utils/userLocale.js +26 -0
- package/src/utils/validateManifestV2.compiled.js +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnPropertySourceField.vue3.js","sources":["../../../../src/components/CnPropertySourceField/CnPropertySourceField.vue?vue&type=template&id=e3c89950&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-property-source-field\">\n\t\t<NcTextField\n\t\t\tv-if=\"plain\"\n\t\t\t:label=\"inputLabel\"\n\t\t\t:modelValue=\"modelValue != null ? String(modelValue) : ''\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:error=\"error\"\n\t\t\t:helperText=\"reason\"\n\t\t\t@update:modelValue=\"onPlainInput\" />\n\t\t<template v-else>\n\t\t\t<NcSelect\n\t\t\t\t:inputId=\"inputId\"\n\t\t\t\t:inputLabel=\"inputLabel\"\n\t\t\t\t:modelValue=\"selectedOption\"\n\t\t\t\t:options=\"options\"\n\t\t\t\t:loading=\"loading\"\n\t\t\t\t:clearable=\"clearable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:filterable=\"false\"\n\t\t\t\tlabel=\"label\"\n\t\t\t\t@search=\"onSearch\"\n\t\t\t\t@update:modelValue=\"onPick\" />\n\t\t\t<p v-if=\"reason\" class=\"cn-property-source-field__reason\" data-testid=\"cn-property-source-reason\">\n\t\t\t\t{{ reason }}\n\t\t\t</p>\n\t\t</template>\n\t\t<p\n\t\t\tv-if=\"provenanceLine\"\n\t\t\tclass=\"cn-property-source-field__provenance\"\n\t\t\tdata-testid=\"cn-property-source-provenance\">\n\t\t\t{{ provenanceLine }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcSelect, NcTextField } from '@nextcloud/vue'\nimport { isAppInstalled } from '../../utils/appInstalled.js'\n\nconst BASE = '/apps/integriq/api/property-sources'\n\n/**\n * CnPropertySourceField — a type-ahead over a registry (integriq\n * `registry-field-source`) for a schema property that declares\n * `x-openregister-property-source`.\n *\n * From `minChars` typed characters it asks the provider for suggestions; on a\n * pick it resolves the identifier and only then sets the value (the\n * identifier). `resolved` carries the answer so a form can fill sibling\n * fields. Without integriq, an unknown provider, a missing permission or an\n * unreachable source the field turns into a plain text input with a one-line\n * reason, and the form still saves.\n *\n * Example:\n * ```vue\n * <CnPropertySourceField provider=\"kvk\" input-label=\"KvK number\"\n * :model-value=\"kvk\" @update:modelValue=\"kvk = $event\" @resolved=\"onResolved\" />\n * ```\n */\nexport default {\n\tname: 'CnPropertySourceField',\n\n\tcomponents: { NcSelect, NcTextField },\n\n\tprops: {\n\t\t/** Registry provider id, e.g. `kvk`, `bag` or `brp`. */\n\t\tprovider: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/** Stored identifier (v-model). */\n\t\tmodelValue: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Declaration mode: `live` reads the source where it is shown, `default` is a one-off copy. */\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'live',\n\t\t},\n\n\t\t/** Accessible label of the field. */\n\t\tinputLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** DOM id of the input. */\n\t\tinputId: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder text. */\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether the value can be cleared. */\n\t\tclearable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Disable the field. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Show the field in its error state. */\n\t\terror: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Characters needed before the first suggest request. */\n\t\tminChars: {\n\t\t\ttype: Number,\n\t\t\tdefault: 3,\n\t\t},\n\n\t\t/** Milliseconds to wait after typing before suggesting. */\n\t\tdebounce: {\n\t\t\ttype: Number,\n\t\t\tdefault: 300,\n\t\t},\n\n\t\t/** Human name of the provider for the provenance line; defaults to the provider id. */\n\t\tproviderLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['update:modelValue', 'resolved'],\n\n\tdata() {\n\t\treturn {\n\t\t\toptions: [],\n\t\t\tloading: false,\n\t\t\tselected: null,\n\t\t\tplain: !isAppInstalled('integriq'),\n\t\t\treason: isAppInstalled('integriq') ? '' : t('nextcloud-vue', 'Registry lookup is not available on this server.'),\n\t\t\tprovenance: null,\n\t\t\ttimer: null,\n\t\t\tseq: 0,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tselectedOption() {\n\t\t\tif (this.selected && String(this.selected.identifier) === String(this.modelValue)) {\n\t\t\t\treturn this.selected\n\t\t\t}\n\t\t\tif (this.modelValue === '' || this.modelValue === null || this.modelValue === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { identifier: String(this.modelValue), label: String(this.modelValue) }\n\t\t},\n\n\t\tprovenanceLine() {\n\t\t\tconst p = this.provenance\n\t\t\tif (!p) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst name = this.providerLabel || p.provider || this.provider\n\t\t\tlet line = p.readAt\n\t\t\t\t? t('nextcloud-vue', 'From {provider}, read {time}', { provider: name, time: this.formatTime(p.readAt) })\n\t\t\t\t: t('nextcloud-vue', 'From {provider}', { provider: name })\n\t\t\tif (p.unreachable) {\n\t\t\t\tline += '. ' + t('nextcloud-vue', 'Source unreachable.')\n\t\t\t} else if (p.origin === 'cache') {\n\t\t\t\tline += '. ' + t('nextcloud-vue', 'From cache.')\n\t\t\t}\n\t\t\treturn line\n\t\t},\n\t},\n\n\tmounted() {\n\t\t// Live mode on an existing record: resolve the stored identifier once to show label and provenance.\n\t\tif (!this.plain && this.mode === 'live' && this.modelValue !== '' && this.modelValue !== null && this.modelValue !== undefined) {\n\t\t\tthis.resolve(String(this.modelValue)).then((res) => {\n\t\t\t\tif (res) {\n\t\t\t\t\tthis.provenance = res.provenance || null\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t},\n\n\tbeforeUnmount() {\n\t\tclearTimeout(this.timer)\n\t},\n\n\tmethods: {\n\t\tformatTime(iso) {\n\t\t\tconst d = new Date(iso)\n\t\t\treturn Number.isNaN(d.getTime()) ? String(iso) : d.toLocaleString()\n\t\t},\n\n\t\turl(path) {\n\t\t\treturn generateUrl(`${BASE}/${encodeURIComponent(this.provider)}/${path}`)\n\t\t},\n\n\t\tdegrade(reason) {\n\t\t\tthis.plain = true\n\t\t\tthis.reason = reason\n\t\t\tthis.options = []\n\t\t},\n\n\t\tonPlainInput(value) {\n\t\t\t/** @event update:modelValue Emitted with the identifier (or typed text in plain mode). */\n\t\t\tthis.$emit('update:modelValue', value)\n\t\t},\n\n\t\tonSearch(query) {\n\t\t\tclearTimeout(this.timer)\n\t\t\tif (typeof query !== 'string' || query.trim().length < this.minChars) {\n\t\t\t\tthis.options = []\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.timer = setTimeout(() => this.suggest(query.trim()), this.debounce)\n\t\t},\n\n\t\tasync suggest(q) {\n\t\t\tconst seq = ++this.seq\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst res = await axios.get(this.url('suggest'), { params: { q } })\n\t\t\t\tif (seq !== this.seq) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst results = (res && res.data && Array.isArray(res.data.results)) ? res.data.results : []\n\t\t\t\tthis.options = results.map((r) => ({ ...r, label: String(r.label ?? r.identifier) }))\n\t\t\t} catch (err) {\n\t\t\t\tconst status = err && err.response && err.response.status\n\t\t\t\tif (status === 404) {\n\t\t\t\t\tthis.degrade(t('nextcloud-vue', 'The registry \"{provider}\" is not available.', { provider: this.providerLabel || this.provider }))\n\t\t\t\t} else if (status === 401 || status === 403) {\n\t\t\t\t\tthis.degrade(t('nextcloud-vue', 'You cannot look this up.'))\n\t\t\t\t} else {\n\t\t\t\t\tthis.degrade(t('nextcloud-vue', 'The source did not answer; type the value.'))\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (seq === this.seq) {\n\t\t\t\t\tthis.loading = false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tasync resolve(identifier) {\n\t\t\ttry {\n\t\t\t\tconst res = await axios.get(this.url('resolve'), { params: { identifier } })\n\t\t\t\treturn (res && res.data) || null\n\t\t\t} catch (err) {\n\t\t\t\tconst status = err && err.response && err.response.status\n\t\t\t\tthis.reason = (status === 401 || status === 403)\n\t\t\t\t\t? t('nextcloud-vue', 'You cannot look this up.')\n\t\t\t\t\t: (status === 404\n\t\t\t\t\t\t\t? t('nextcloud-vue', 'The registry \"{provider}\" is not available.', { provider: this.providerLabel || this.provider })\n\t\t\t\t\t\t\t: t('nextcloud-vue', 'The source did not answer; type the value.'))\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\tasync onPick(option) {\n\t\t\tthis.reason = ''\n\t\t\tif (!option) {\n\t\t\t\tthis.selected = null\n\t\t\t\tthis.provenance = null\n\t\t\t\tthis.$emit('update:modelValue', '')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst identifier = String(option.identifier)\n\t\t\tthis.selected = option\n\t\t\tconst answer = await this.resolve(identifier)\n\t\t\t// The identifier is kept even when the resolve fails: the user picked it.\n\t\t\tthis.$emit('update:modelValue', identifier)\n\t\t\tif (!answer) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.provenance = answer.provenance || null\n\t\t\tif (answer.provenance && answer.provenance.unreachable && (answer.value === undefined || answer.value === null)) {\n\t\t\t\tthis.reason = t('nextcloud-vue', 'The source did not answer; type the value.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event resolved Emitted after a successful resolve of a pick.\n\t\t\t * @type {{identifier: string, value: *, provenance: object|null}}\n\t\t\t */\n\t\t\tthis.$emit('resolved', { identifier, value: answer.value, provenance: answer.provenance || null })\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-property-source-field__reason,\n.cn-property-source-field__provenance {\n\tmargin: 4px 0 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: var(--default-font-size);\n}\n</style>\n"],"names":["_createBlock","_Fragment","_createVNode","_createElementBlock","_toDisplayString"],"mappings":";;AASM,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,0BAA0B,GAAA;;;AAuBnC,EAAA,KAAA,EAAA,kCAAA;AAAA,EAAA,aAAA,EAAA,2BAAA;;;;AAMA,EAAA,KAAG,EAAA,sCAAA;;;;;;;;;KA3BG,KAAK,CAAA,KAAA;sBADXA,WAOwB,CAAA,sBAAA,EAAA;;AALvB,UAAA,KAAK,EAAE,MAAU,CAAA,UAAA;AACjB,UAAA,UAAU,EAAE,MAAA,CAAA,UAAU,IAAW,IAAA,GAAA,MAAC,CAAA,MAAA,CAAA,UAAA,CAAA,GAAA,EAAA;AAClC,UAAA,QAAQ,EAAE,MAAI,CAAA,QAAA;AACd,UAAA,KAAK,EAAE,MAAA,CAAA,KAAA;AACP,UAAA,UAAU,EAAE,KAAK,CAAA,MAAA;AACjB,UAAA,qBAAiB,EAAE,QAAI,CAAA,YAAA;;wCAkBd,CAAAC,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;UAhBTC,WAYQ,CAAA,mBAAA,EAAA;AAXP,YAAA,OAAO,EAAE,MAAO,CAAA,OAAA;AAChB,YAAA,UAAU,EAAE,MAAQ,CAAA,UAAA;AACpB,YAAA,UAAU,EAAE,QAAM,CAAA,cAAA;AAClB,YAAA,OAAO,EAAE,KAAO,CAAA,OAAA;AAChB,YAAA,OAAO,EAAE,KAAO,CAAA,OAAA;AAChB,YAAA,SAAS,EAAE,MAAA,CAAA,SAAA;AACX,YAAA,QAAQ,EAAE,MAAM,CAAA,QAAA;AAChB,YAAA,WAAW,EAAE,MAAW,CAAA,WAAA;AACzB,YAAA,UAAW,EAAE,KAAK;AAClB,YAAA,KAAK,EAAC,OAAK;AACV,YAAA,QAAC,EAAA,QAAA,CAAA,QAAA;AACD,YAAA,qBAAO,EAAA,QAAA,CAAA,MAAA;;WACT,KAAA,CAAA,MAAA;4BAAAC,kBAEI,CAAA,GAAA,EAFJ,UAEI,EAAAC,eAAA,CADA,KAAM,CAAA,MAAA,CAAA,EAAA,CAAA,YAAA;;;KAIR,QAAA,CAAA,cAAA;sBADFD,wBAAA;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"CnPropertySourceField.vue3.js","sources":["../../../../src/components/CnPropertySourceField/CnPropertySourceField.vue?vue&type=template&id=41cdf4a8&lang.js"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Conduction B.V.\n - SPDX-License-Identifier: EUPL-1.2\n-->\n<template>\n\t<div class=\"cn-property-source-field\">\n\t\t<NcTextField\n\t\t\tv-if=\"plain\"\n\t\t\t:label=\"inputLabel\"\n\t\t\t:modelValue=\"modelValue != null ? String(modelValue) : ''\"\n\t\t\t:disabled=\"disabled\"\n\t\t\t:error=\"error\"\n\t\t\t:helperText=\"reason\"\n\t\t\t@update:modelValue=\"onPlainInput\" />\n\t\t<template v-else>\n\t\t\t<NcSelect\n\t\t\t\t:inputId=\"inputId\"\n\t\t\t\t:inputLabel=\"inputLabel\"\n\t\t\t\t:modelValue=\"selectedOption\"\n\t\t\t\t:options=\"options\"\n\t\t\t\t:loading=\"loading\"\n\t\t\t\t:clearable=\"clearable\"\n\t\t\t\t:disabled=\"disabled\"\n\t\t\t\t:placeholder=\"placeholder\"\n\t\t\t\t:filterable=\"false\"\n\t\t\t\tlabel=\"label\"\n\t\t\t\t@search=\"onSearch\"\n\t\t\t\t@update:modelValue=\"onPick\" />\n\t\t\t<p v-if=\"reason\" class=\"cn-property-source-field__reason\" data-testid=\"cn-property-source-reason\">\n\t\t\t\t{{ reason }}\n\t\t\t</p>\n\t\t</template>\n\t\t<p\n\t\t\tv-if=\"provenanceLine\"\n\t\t\tclass=\"cn-property-source-field__provenance\"\n\t\t\tdata-testid=\"cn-property-source-provenance\">\n\t\t\t{{ provenanceLine }}\n\t\t</p>\n\t</div>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport { translate as t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { NcSelect, NcTextField } from '@nextcloud/vue'\nimport { isAppInstalled } from '../../utils/appInstalled.js'\nimport { userLocale } from '../../utils/userLocale.js'\n\nconst BASE = '/apps/integriq/api/property-sources'\n\n/**\n * CnPropertySourceField — a type-ahead over a registry (integriq\n * `registry-field-source`) for a schema property that declares\n * `x-openregister-property-source`.\n *\n * From `minChars` typed characters it asks the provider for suggestions; on a\n * pick it resolves the identifier and only then sets the value (the\n * identifier). `resolved` carries the answer so a form can fill sibling\n * fields. Without integriq, an unknown provider, a missing permission or an\n * unreachable source the field turns into a plain text input with a one-line\n * reason, and the form still saves.\n *\n * Example:\n * ```vue\n * <CnPropertySourceField provider=\"kvk\" input-label=\"KvK number\"\n * :model-value=\"kvk\" @update:modelValue=\"kvk = $event\" @resolved=\"onResolved\" />\n * ```\n */\nexport default {\n\tname: 'CnPropertySourceField',\n\n\tcomponents: { NcSelect, NcTextField },\n\n\tprops: {\n\t\t/** Registry provider id, e.g. `kvk`, `bag` or `brp`. */\n\t\tprovider: {\n\t\t\ttype: String,\n\t\t\trequired: true,\n\t\t},\n\n\t\t/** Stored identifier (v-model). */\n\t\tmodelValue: {\n\t\t\ttype: [String, Number],\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Declaration mode: `live` reads the source where it is shown, `default` is a one-off copy. */\n\t\tmode: {\n\t\t\ttype: String,\n\t\t\tdefault: 'live',\n\t\t},\n\n\t\t/** Accessible label of the field. */\n\t\tinputLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** DOM id of the input. */\n\t\tinputId: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Placeholder text. */\n\t\tplaceholder: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\n\t\t/** Whether the value can be cleared. */\n\t\tclearable: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true,\n\t\t},\n\n\t\t/** Disable the field. */\n\t\tdisabled: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Show the field in its error state. */\n\t\terror: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false,\n\t\t},\n\n\t\t/** Characters needed before the first suggest request. */\n\t\tminChars: {\n\t\t\ttype: Number,\n\t\t\tdefault: 3,\n\t\t},\n\n\t\t/** Milliseconds to wait after typing before suggesting. */\n\t\tdebounce: {\n\t\t\ttype: Number,\n\t\t\tdefault: 300,\n\t\t},\n\n\t\t/** Human name of the provider for the provenance line; defaults to the provider id. */\n\t\tproviderLabel: {\n\t\t\ttype: String,\n\t\t\tdefault: '',\n\t\t},\n\t},\n\n\temits: ['update:modelValue', 'resolved'],\n\n\tdata() {\n\t\treturn {\n\t\t\toptions: [],\n\t\t\tloading: false,\n\t\t\tselected: null,\n\t\t\tplain: !isAppInstalled('integriq'),\n\t\t\treason: isAppInstalled('integriq') ? '' : t('nextcloud-vue', 'Registry lookup is not available on this server.'),\n\t\t\tprovenance: null,\n\t\t\ttimer: null,\n\t\t\tseq: 0,\n\t\t}\n\t},\n\n\tcomputed: {\n\t\tselectedOption() {\n\t\t\tif (this.selected && String(this.selected.identifier) === String(this.modelValue)) {\n\t\t\t\treturn this.selected\n\t\t\t}\n\t\t\tif (this.modelValue === '' || this.modelValue === null || this.modelValue === undefined) {\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn { identifier: String(this.modelValue), label: String(this.modelValue) }\n\t\t},\n\n\t\tprovenanceLine() {\n\t\t\tconst p = this.provenance\n\t\t\tif (!p) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst name = this.providerLabel || p.provider || this.provider\n\t\t\tlet line = p.readAt\n\t\t\t\t? t('nextcloud-vue', 'From {provider}, read {time}', { provider: name, time: this.formatTime(p.readAt) })\n\t\t\t\t: t('nextcloud-vue', 'From {provider}', { provider: name })\n\t\t\tif (p.unreachable) {\n\t\t\t\tline += '. ' + t('nextcloud-vue', 'Source unreachable.')\n\t\t\t} else if (p.origin === 'cache') {\n\t\t\t\tline += '. ' + t('nextcloud-vue', 'From cache.')\n\t\t\t}\n\t\t\treturn line\n\t\t},\n\t},\n\n\tmounted() {\n\t\t// Live mode on an existing record: resolve the stored identifier once to show label and provenance.\n\t\tif (!this.plain && this.mode === 'live' && this.modelValue !== '' && this.modelValue !== null && this.modelValue !== undefined) {\n\t\t\tthis.resolve(String(this.modelValue)).then((res) => {\n\t\t\t\tif (res) {\n\t\t\t\t\tthis.provenance = res.provenance || null\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t},\n\n\tbeforeUnmount() {\n\t\tclearTimeout(this.timer)\n\t},\n\n\tmethods: {\n\t\tformatTime(iso) {\n\t\t\tconst d = new Date(iso)\n\t\t\treturn Number.isNaN(d.getTime()) ? String(iso) : d.toLocaleString(userLocale())\n\t\t},\n\n\t\turl(path) {\n\t\t\treturn generateUrl(`${BASE}/${encodeURIComponent(this.provider)}/${path}`)\n\t\t},\n\n\t\tdegrade(reason) {\n\t\t\tthis.plain = true\n\t\t\tthis.reason = reason\n\t\t\tthis.options = []\n\t\t},\n\n\t\tonPlainInput(value) {\n\t\t\t/** @event update:modelValue Emitted with the identifier (or typed text in plain mode). */\n\t\t\tthis.$emit('update:modelValue', value)\n\t\t},\n\n\t\tonSearch(query) {\n\t\t\tclearTimeout(this.timer)\n\t\t\tif (typeof query !== 'string' || query.trim().length < this.minChars) {\n\t\t\t\tthis.options = []\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.timer = setTimeout(() => this.suggest(query.trim()), this.debounce)\n\t\t},\n\n\t\tasync suggest(q) {\n\t\t\tconst seq = ++this.seq\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst res = await axios.get(this.url('suggest'), { params: { q } })\n\t\t\t\tif (seq !== this.seq) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst results = (res && res.data && Array.isArray(res.data.results)) ? res.data.results : []\n\t\t\t\tthis.options = results.map((r) => ({ ...r, label: String(r.label ?? r.identifier) }))\n\t\t\t} catch (err) {\n\t\t\t\tconst status = err && err.response && err.response.status\n\t\t\t\tif (status === 404) {\n\t\t\t\t\tthis.degrade(t('nextcloud-vue', 'The registry \"{provider}\" is not available.', { provider: this.providerLabel || this.provider }))\n\t\t\t\t} else if (status === 401 || status === 403) {\n\t\t\t\t\tthis.degrade(t('nextcloud-vue', 'You cannot look this up.'))\n\t\t\t\t} else {\n\t\t\t\t\tthis.degrade(t('nextcloud-vue', 'The source did not answer; type the value.'))\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tif (seq === this.seq) {\n\t\t\t\t\tthis.loading = false\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tasync resolve(identifier) {\n\t\t\ttry {\n\t\t\t\tconst res = await axios.get(this.url('resolve'), { params: { identifier } })\n\t\t\t\treturn (res && res.data) || null\n\t\t\t} catch (err) {\n\t\t\t\tconst status = err && err.response && err.response.status\n\t\t\t\tthis.reason = (status === 401 || status === 403)\n\t\t\t\t\t? t('nextcloud-vue', 'You cannot look this up.')\n\t\t\t\t\t: (status === 404\n\t\t\t\t\t\t\t? t('nextcloud-vue', 'The registry \"{provider}\" is not available.', { provider: this.providerLabel || this.provider })\n\t\t\t\t\t\t\t: t('nextcloud-vue', 'The source did not answer; type the value.'))\n\t\t\t\treturn null\n\t\t\t}\n\t\t},\n\n\t\tasync onPick(option) {\n\t\t\tthis.reason = ''\n\t\t\tif (!option) {\n\t\t\t\tthis.selected = null\n\t\t\t\tthis.provenance = null\n\t\t\t\tthis.$emit('update:modelValue', '')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst identifier = String(option.identifier)\n\t\t\tthis.selected = option\n\t\t\tconst answer = await this.resolve(identifier)\n\t\t\t// The identifier is kept even when the resolve fails: the user picked it.\n\t\t\tthis.$emit('update:modelValue', identifier)\n\t\t\tif (!answer) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.provenance = answer.provenance || null\n\t\t\tif (answer.provenance && answer.provenance.unreachable && (answer.value === undefined || answer.value === null)) {\n\t\t\t\tthis.reason = t('nextcloud-vue', 'The source did not answer; type the value.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/**\n\t\t\t * @event resolved Emitted after a successful resolve of a pick.\n\t\t\t * @type {{identifier: string, value: *, provenance: object|null}}\n\t\t\t */\n\t\t\tthis.$emit('resolved', { identifier, value: answer.value, provenance: answer.provenance || null })\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-property-source-field__reason,\n.cn-property-source-field__provenance {\n\tmargin: 4px 0 0;\n\tcolor: var(--color-text-maxcontrast);\n\tfont-size: var(--default-font-size);\n}\n</style>\n"],"names":["_createBlock","_Fragment","_createVNode","_createElementBlock","_toDisplayString"],"mappings":";;AASM,MAAA,UAAA,GAAA,EAAA,KAAK,EAAC,0BAA0B,GAAA;;;AAuBnC,EAAA,KAAA,EAAA,kCAAA;AAAA,EAAA,aAAA,EAAA,2BAAA;;;;AAMA,EAAA,KAAG,EAAA,sCAAA;;;;;;;;;KA3BG,KAAK,CAAA,KAAA;sBADXA,WAOwB,CAAA,sBAAA,EAAA;;AALvB,UAAA,KAAK,EAAE,MAAU,CAAA,UAAA;AACjB,UAAA,UAAU,EAAE,MAAA,CAAA,UAAU,IAAW,IAAA,GAAA,MAAC,CAAA,MAAA,CAAA,UAAA,CAAA,GAAA,EAAA;AAClC,UAAA,QAAQ,EAAE,MAAI,CAAA,QAAA;AACd,UAAA,KAAK,EAAE,MAAA,CAAA,KAAA;AACP,UAAA,UAAU,EAAE,KAAK,CAAA,MAAA;AACjB,UAAA,qBAAiB,EAAE,QAAI,CAAA,YAAA;;wCAkBd,CAAAC,QAAA,EAAA,EAAA,GAAA,EAAA,CAAA,EAAA,EAAA;UAhBTC,WAYQ,CAAA,mBAAA,EAAA;AAXP,YAAA,OAAO,EAAE,MAAO,CAAA,OAAA;AAChB,YAAA,UAAU,EAAE,MAAQ,CAAA,UAAA;AACpB,YAAA,UAAU,EAAE,QAAM,CAAA,cAAA;AAClB,YAAA,OAAO,EAAE,KAAO,CAAA,OAAA;AAChB,YAAA,OAAO,EAAE,KAAO,CAAA,OAAA;AAChB,YAAA,SAAS,EAAE,MAAA,CAAA,SAAA;AACX,YAAA,QAAQ,EAAE,MAAM,CAAA,QAAA;AAChB,YAAA,WAAW,EAAE,MAAW,CAAA,WAAA;AACzB,YAAA,UAAW,EAAE,KAAK;AAClB,YAAA,KAAK,EAAC,OAAK;AACV,YAAA,QAAC,EAAA,QAAA,CAAA,QAAA;AACD,YAAA,qBAAO,EAAA,QAAA,CAAA,MAAA;;WACT,KAAA,CAAA,MAAA;4BAAAC,kBAEI,CAAA,GAAA,EAFJ,UAEI,EAAAC,eAAA,CADA,KAAM,CAAA,MAAA,CAAA,EAAA,CAAA,YAAA;;;KAIR,QAAA,CAAA,cAAA;sBADFD,wBAAA;;;;;;;"}
|
|
@@ -2,7 +2,7 @@ import script from './CnRoadmapItem.vue2.js';
|
|
|
2
2
|
import { render } from './CnRoadmapItem.vue3.js';
|
|
3
3
|
|
|
4
4
|
script.render = render;
|
|
5
|
-
script.__scopeId = "data-v-
|
|
5
|
+
script.__scopeId = "data-v-f352eb12";
|
|
6
6
|
const __sfc_main = script;
|
|
7
7
|
|
|
8
8
|
export { __sfc_main as default };
|
|
@@ -2,6 +2,7 @@ import ThumbUpOutline from 'vue-material-design-icons/ThumbUpOutline.vue';
|
|
|
2
2
|
import { cnRenderMarkdown } from '../../composables/cnRenderMarkdown.js';
|
|
3
3
|
import { ROADMAP_LABEL_BLOCKLIST } from '../../utils/roadmapLabelBlocklist.js';
|
|
4
4
|
import { safeHref } from '../../utils/safeHref.js';
|
|
5
|
+
import { userLocale } from '../../utils/userLocale.js';
|
|
5
6
|
|
|
6
7
|
var script = {
|
|
7
8
|
name: 'CnRoadmapItem',
|
|
@@ -57,7 +58,7 @@ var script = {
|
|
|
57
58
|
if (diffSec < 2592000) {
|
|
58
59
|
return `${Math.floor(diffSec / 86400)}d`
|
|
59
60
|
}
|
|
60
|
-
return created.toLocaleDateString()
|
|
61
|
+
return created.toLocaleDateString(userLocale())
|
|
61
62
|
},
|
|
62
63
|
},
|
|
63
64
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnRoadmapItem.vue2.js","sources":["../../../../src/components/CnRoadmapItem/CnRoadmapItem.vue"],"sourcesContent":["<template>\n\t<article class=\"cn-roadmap-item\">\n\t\t<header class=\"cn-roadmap-item__header\">\n\t\t\t<img\n\t\t\t\tv-if=\"item.user && item.user.avatar_url\"\n\t\t\t\t:src=\"item.user.avatar_url\"\n\t\t\t\t:alt=\"item.user.login || ''\"\n\t\t\t\twidth=\"24\"\n\t\t\t\theight=\"24\"\n\t\t\t\treferrerpolicy=\"no-referrer\"\n\t\t\t\tclass=\"cn-roadmap-item__avatar\">\n\t\t\t<div class=\"cn-roadmap-item__meta\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"safeHref(item.html_url)\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclass=\"cn-roadmap-item__title-link\">\n\t\t\t\t\t{{ item.title }}\n\t\t\t\t</a>\n\t\t\t\t<div class=\"cn-roadmap-item__submitter\">\n\t\t\t\t\t<span v-if=\"item.user && item.user.login\">{{ item.user.login }}</span>\n\t\t\t\t\t<span class=\"cn-roadmap-item__separator\">·</span>\n\t\t\t\t\t<span>{{ relativeCreatedAt }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"cn-roadmap-item__reactions\">\n\t\t\t\t<ThumbUpOutline :size=\"16\" />\n\t\t\t\t<span>{{ thumbsUpCount }}</span>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<div\n\t\t\tv-if=\"sanitizedBody !== ''\"\n\t\t\tclass=\"cn-roadmap-item__body\"\n\t\t\tv-html=\"sanitizedBody\" /><!-- eslint-disable-line vue/no-v-html -- sanitizedBody comes from cnRenderMarkdown(), which sanitises through DOMPurify -->\n\n\t\t<footer v-if=\"visibleLabels.length > 0\" class=\"cn-roadmap-item__labels\">\n\t\t\t<span\n\t\t\t\tv-for=\"label in visibleLabels\"\n\t\t\t\t:key=\"label.name\"\n\t\t\t\tclass=\"cn-roadmap-item__label-chip\"\n\t\t\t\t:style=\"chipStyle(label)\">\n\t\t\t\t{{ label.name }}\n\t\t\t</span>\n\t\t</footer>\n\t</article>\n</template>\n\n<script>\n/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n *\n * RoadmapItem — single roadmap card. Renders an issue's title (linking to\n * the GitHub URL in a new tab), submitter avatar + login + relative time,\n * reaction count, sanitized markdown body, and filtered label chips.\n *\n * Markdown safety: the body flows through `cnRenderMarkdown` (existing\n * `marked` wrapper) → `DOMPurify.sanitize(html, SAFE_MARKDOWN_DOMPURIFY_CONFIG)`.\n * Labels are filtered through `ROADMAP_LABEL_BLOCKLIST` so hydra workflow\n * labels never appear on the card.\n *\n * Template notes (kept here, NOT as `<!-- -->` comments inside `<template>`:\n * the Vue 3 SFC compiler preserves template comments as real DOM comment\n * nodes in dev builds, where Vue 2's compiler stripped them — so anything\n * written there leaks into the rendered markup):\n *\n * - The avatar is a plain `<img>` rather than `<NcAvatar>`: the GitHub login\n * is not a Nextcloud user, and NcAvatar's resolution path triggers an\n * `/avatar/<user>` lookup that returns 404 + initials instead of using the\n * GitHub-hosted `avatar_url`. CSP `img-src *` allows external images here.\n * - The avatar is eager-loaded: `loading=\"lazy\"` deferred the fetch\n * indefinitely for cards below the fold, leaving a broken-image glyph.\n * These are 24px images, so eager is cheap.\n * - `v-html` on the body is intentional AND safe: `cnRenderMarkdown` runs\n * `marked` then sanitises with SAFE_MARKDOWN_DOMPURIFY_CONFIG (strips\n * script elements, `on...` handler attributes, `javascript:` URLs, and\n * iframe + style elements). Never bind raw `item.body`.\n *\n * Spec: features-roadmap-component — Requirement \"RoadmapItem\".\n */\nimport ThumbUpOutline from 'vue-material-design-icons/ThumbUpOutline.vue'\nimport { cnRenderMarkdown } from '../../composables/cnRenderMarkdown.js'\nimport { ROADMAP_LABEL_BLOCKLIST } from '../../utils/roadmapLabelBlocklist.js'\nimport { safeHref } from '../../utils/safeHref.js'\n\nexport default {\n\tname: 'CnRoadmapItem',\n\n\tcomponents: { ThumbUpOutline },\n\n\tprops: {\n\t\t/**\n\t\t * Sanitized issue object from the OpenRegister GitHub proxy.\n\t\t * Shape: {number, title, body, html_url, user.{login, avatar_url},\n\t\t * reactions.{total_count, +1}, created_at, updated_at,\n\t\t * labels[].{name, color}}.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tcomputed: {\n\t\tsanitizedBody() {\n\t\t\t// cnRenderMarkdown already sanitises via DOMPurify internally —\n\t\t\t// no second pass needed (L1: double-sanitisation removed).\n\t\t\treturn cnRenderMarkdown(this.item.body || '')\n\t\t},\n\n\t\tthumbsUpCount() {\n\t\t\treturn (this.item.reactions && this.item.reactions['+1']) || 0\n\t\t},\n\n\t\tvisibleLabels() {\n\t\t\tconst labels = Array.isArray(this.item.labels) ? this.item.labels : []\n\t\t\treturn labels.filter((label) => label && typeof label.name === 'string' && !ROADMAP_LABEL_BLOCKLIST.some((re) => re.test(label.name)))\n\t\t},\n\n\t\trelativeCreatedAt() {\n\t\t\tif (!this.item.created_at) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst created = new Date(this.item.created_at)\n\t\t\tconst diffSec = Math.floor((Date.now() - created.getTime()) / 1000)\n\t\t\tif (diffSec < 60) {\n\t\t\t\treturn `${diffSec}s`\n\t\t\t}\n\t\t\tif (diffSec < 3600) {\n\t\t\t\treturn `${Math.floor(diffSec / 60)}m`\n\t\t\t}\n\t\t\tif (diffSec < 86400) {\n\t\t\t\treturn `${Math.floor(diffSec / 3600)}h`\n\t\t\t}\n\t\t\tif (diffSec < 2592000) {\n\t\t\t\treturn `${Math.floor(diffSec / 86400)}d`\n\t\t\t}\n\t\t\treturn created.toLocaleDateString()\n\t\t},\n\t},\n\n\tmethods: {\n\t\tsafeHref,\n\n\t\tchipStyle(label) {\n\t\t\tif (!label.color) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tbackgroundColor: '#' + label.color,\n\t\t\t\tcolor: this.contrastTextColor(label.color),\n\t\t\t}\n\t\t},\n\n\t\tcontrastTextColor(hexColor) {\n\t\t\t// Simple luminance check — dark text on bright bg, white on dark.\n\t\t\tconst r = parseInt(hexColor.slice(0, 2), 16)\n\t\t\tconst g = parseInt(hexColor.slice(2, 4), 16)\n\t\t\tconst b = parseInt(hexColor.slice(4, 6), 16)\n\t\t\tconst lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n\t\t\treturn lum > 0.55 ? '#000' : '#fff'\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-roadmap-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tpadding: 16px;\n\t/* Position anchor for the ::after overlay that expands the title link's\n\t click area to the whole card. Inner anchors stay above the overlay\n\t via z-index: 2 so the body's inline links still work. */\n\tposition: relative;\n}\n\n.cn-roadmap-item__title-link::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 1;\n\tborder-radius: inherit;\n}\n\n.cn-roadmap-item__body :deep(a),\n.cn-roadmap-item__labels {\n\tposition: relative;\n\tz-index: 2;\n}\n\n.cn-roadmap-item__header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tmargin-bottom: 8px;\n}\n\n.cn-roadmap-item__avatar {\n\twidth: 24px;\n\theight: 24px;\n\tborder-radius: 50%;\n\tflex-shrink: 0;\n\tobject-fit: cover;\n\tbackground: var(--color-background-darker);\n}\n\n.cn-roadmap-item__meta {\n\tflex: 1;\n}\n\n.cn-roadmap-item__title-link {\n\tdisplay: block;\n\tcolor: var(--color-main-text);\n\tfont-weight: 600;\n\ttext-decoration: none;\n}\n\n.cn-roadmap-item__title-link:hover {\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n}\n\n.cn-roadmap-item__submitter {\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-light);\n}\n\n.cn-roadmap-item__separator {\n\tmargin: 0 4px;\n}\n\n.cn-roadmap-item__reactions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 4px;\n\tcolor: var(--color-text-light);\n}\n\n.cn-roadmap-item__body {\n\tcolor: var(--color-main-text);\n\tfont-size: 0.95em;\n\tline-height: 1.4;\n\t/* Cap the rendered markdown so cards stay roughly feature-card-sized.\n\t Full body is reachable via the title link to the GitHub issue. */\n\tmax-height: 8.4em;\n\toverflow: hidden;\n\tposition: relative;\n\tmask-image: linear-gradient(to bottom, black 70%, transparent);\n\t-webkit-mask-image: linear-gradient(to bottom, black 70%, transparent);\n}\n\n.cn-roadmap-item__body :deep(p) { margin: 4px 0; }\n\n.cn-roadmap-item__body :deep(h1),\n.cn-roadmap-item__body :deep(h2),\n.cn-roadmap-item__body :deep(h3) {\n\tfont-size: 1em;\n\tmargin: 4px 0;\n\tfont-weight: 600;\n}\n\n.cn-roadmap-item__body :deep(pre) { background: var(--color-background-hover); padding: 8px; border-radius: 4px; overflow-x: auto; }\n\n.cn-roadmap-item__body :deep(code) { background: var(--color-background-hover); padding: 2px 4px; border-radius: 3px; }\n\n.cn-roadmap-item__labels {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n\tmargin-top: 8px;\n}\n\n.cn-roadmap-item__label-chip {\n\tpadding: 2px 8px;\n\tborder-radius: 10px;\n\tfont-size: 0.8em;\n}\n</style>\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnRoadmapItem.vue2.js","sources":["../../../../src/components/CnRoadmapItem/CnRoadmapItem.vue"],"sourcesContent":["<template>\n\t<article class=\"cn-roadmap-item\">\n\t\t<header class=\"cn-roadmap-item__header\">\n\t\t\t<img\n\t\t\t\tv-if=\"item.user && item.user.avatar_url\"\n\t\t\t\t:src=\"item.user.avatar_url\"\n\t\t\t\t:alt=\"item.user.login || ''\"\n\t\t\t\twidth=\"24\"\n\t\t\t\theight=\"24\"\n\t\t\t\treferrerpolicy=\"no-referrer\"\n\t\t\t\tclass=\"cn-roadmap-item__avatar\">\n\t\t\t<div class=\"cn-roadmap-item__meta\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"safeHref(item.html_url)\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclass=\"cn-roadmap-item__title-link\">\n\t\t\t\t\t{{ item.title }}\n\t\t\t\t</a>\n\t\t\t\t<div class=\"cn-roadmap-item__submitter\">\n\t\t\t\t\t<span v-if=\"item.user && item.user.login\">{{ item.user.login }}</span>\n\t\t\t\t\t<span class=\"cn-roadmap-item__separator\">·</span>\n\t\t\t\t\t<span>{{ relativeCreatedAt }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"cn-roadmap-item__reactions\">\n\t\t\t\t<ThumbUpOutline :size=\"16\" />\n\t\t\t\t<span>{{ thumbsUpCount }}</span>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<div\n\t\t\tv-if=\"sanitizedBody !== ''\"\n\t\t\tclass=\"cn-roadmap-item__body\"\n\t\t\tv-html=\"sanitizedBody\" /><!-- eslint-disable-line vue/no-v-html -- sanitizedBody comes from cnRenderMarkdown(), which sanitises through DOMPurify -->\n\n\t\t<footer v-if=\"visibleLabels.length > 0\" class=\"cn-roadmap-item__labels\">\n\t\t\t<span\n\t\t\t\tv-for=\"label in visibleLabels\"\n\t\t\t\t:key=\"label.name\"\n\t\t\t\tclass=\"cn-roadmap-item__label-chip\"\n\t\t\t\t:style=\"chipStyle(label)\">\n\t\t\t\t{{ label.name }}\n\t\t\t</span>\n\t\t</footer>\n\t</article>\n</template>\n\n<script>\n/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n *\n * RoadmapItem — single roadmap card. Renders an issue's title (linking to\n * the GitHub URL in a new tab), submitter avatar + login + relative time,\n * reaction count, sanitized markdown body, and filtered label chips.\n *\n * Markdown safety: the body flows through `cnRenderMarkdown` (existing\n * `marked` wrapper) → `DOMPurify.sanitize(html, SAFE_MARKDOWN_DOMPURIFY_CONFIG)`.\n * Labels are filtered through `ROADMAP_LABEL_BLOCKLIST` so hydra workflow\n * labels never appear on the card.\n *\n * Template notes (kept here, NOT as `<!-- -->` comments inside `<template>`:\n * the Vue 3 SFC compiler preserves template comments as real DOM comment\n * nodes in dev builds, where Vue 2's compiler stripped them — so anything\n * written there leaks into the rendered markup):\n *\n * - The avatar is a plain `<img>` rather than `<NcAvatar>`: the GitHub login\n * is not a Nextcloud user, and NcAvatar's resolution path triggers an\n * `/avatar/<user>` lookup that returns 404 + initials instead of using the\n * GitHub-hosted `avatar_url`. CSP `img-src *` allows external images here.\n * - The avatar is eager-loaded: `loading=\"lazy\"` deferred the fetch\n * indefinitely for cards below the fold, leaving a broken-image glyph.\n * These are 24px images, so eager is cheap.\n * - `v-html` on the body is intentional AND safe: `cnRenderMarkdown` runs\n * `marked` then sanitises with SAFE_MARKDOWN_DOMPURIFY_CONFIG (strips\n * script elements, `on...` handler attributes, `javascript:` URLs, and\n * iframe + style elements). Never bind raw `item.body`.\n *\n * Spec: features-roadmap-component — Requirement \"RoadmapItem\".\n */\nimport ThumbUpOutline from 'vue-material-design-icons/ThumbUpOutline.vue'\nimport { cnRenderMarkdown } from '../../composables/cnRenderMarkdown.js'\nimport { ROADMAP_LABEL_BLOCKLIST } from '../../utils/roadmapLabelBlocklist.js'\nimport { safeHref } from '../../utils/safeHref.js'\nimport { userLocale } from '../../utils/userLocale.js'\n\nexport default {\n\tname: 'CnRoadmapItem',\n\n\tcomponents: { ThumbUpOutline },\n\n\tprops: {\n\t\t/**\n\t\t * Sanitized issue object from the OpenRegister GitHub proxy.\n\t\t * Shape: {number, title, body, html_url, user.{login, avatar_url},\n\t\t * reactions.{total_count, +1}, created_at, updated_at,\n\t\t * labels[].{name, color}}.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tcomputed: {\n\t\tsanitizedBody() {\n\t\t\t// cnRenderMarkdown already sanitises via DOMPurify internally —\n\t\t\t// no second pass needed (L1: double-sanitisation removed).\n\t\t\treturn cnRenderMarkdown(this.item.body || '')\n\t\t},\n\n\t\tthumbsUpCount() {\n\t\t\treturn (this.item.reactions && this.item.reactions['+1']) || 0\n\t\t},\n\n\t\tvisibleLabels() {\n\t\t\tconst labels = Array.isArray(this.item.labels) ? this.item.labels : []\n\t\t\treturn labels.filter((label) => label && typeof label.name === 'string' && !ROADMAP_LABEL_BLOCKLIST.some((re) => re.test(label.name)))\n\t\t},\n\n\t\trelativeCreatedAt() {\n\t\t\tif (!this.item.created_at) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst created = new Date(this.item.created_at)\n\t\t\tconst diffSec = Math.floor((Date.now() - created.getTime()) / 1000)\n\t\t\tif (diffSec < 60) {\n\t\t\t\treturn `${diffSec}s`\n\t\t\t}\n\t\t\tif (diffSec < 3600) {\n\t\t\t\treturn `${Math.floor(diffSec / 60)}m`\n\t\t\t}\n\t\t\tif (diffSec < 86400) {\n\t\t\t\treturn `${Math.floor(diffSec / 3600)}h`\n\t\t\t}\n\t\t\tif (diffSec < 2592000) {\n\t\t\t\treturn `${Math.floor(diffSec / 86400)}d`\n\t\t\t}\n\t\t\treturn created.toLocaleDateString(userLocale())\n\t\t},\n\t},\n\n\tmethods: {\n\t\tsafeHref,\n\n\t\tchipStyle(label) {\n\t\t\tif (!label.color) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tbackgroundColor: '#' + label.color,\n\t\t\t\tcolor: this.contrastTextColor(label.color),\n\t\t\t}\n\t\t},\n\n\t\tcontrastTextColor(hexColor) {\n\t\t\t// Simple luminance check — dark text on bright bg, white on dark.\n\t\t\tconst r = parseInt(hexColor.slice(0, 2), 16)\n\t\t\tconst g = parseInt(hexColor.slice(2, 4), 16)\n\t\t\tconst b = parseInt(hexColor.slice(4, 6), 16)\n\t\t\tconst lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n\t\t\treturn lum > 0.55 ? '#000' : '#fff'\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-roadmap-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tpadding: 16px;\n\t/* Position anchor for the ::after overlay that expands the title link's\n\t click area to the whole card. Inner anchors stay above the overlay\n\t via z-index: 2 so the body's inline links still work. */\n\tposition: relative;\n}\n\n.cn-roadmap-item__title-link::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 1;\n\tborder-radius: inherit;\n}\n\n.cn-roadmap-item__body :deep(a),\n.cn-roadmap-item__labels {\n\tposition: relative;\n\tz-index: 2;\n}\n\n.cn-roadmap-item__header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tmargin-bottom: 8px;\n}\n\n.cn-roadmap-item__avatar {\n\twidth: 24px;\n\theight: 24px;\n\tborder-radius: 50%;\n\tflex-shrink: 0;\n\tobject-fit: cover;\n\tbackground: var(--color-background-darker);\n}\n\n.cn-roadmap-item__meta {\n\tflex: 1;\n}\n\n.cn-roadmap-item__title-link {\n\tdisplay: block;\n\tcolor: var(--color-main-text);\n\tfont-weight: 600;\n\ttext-decoration: none;\n}\n\n.cn-roadmap-item__title-link:hover {\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n}\n\n.cn-roadmap-item__submitter {\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-light);\n}\n\n.cn-roadmap-item__separator {\n\tmargin: 0 4px;\n}\n\n.cn-roadmap-item__reactions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 4px;\n\tcolor: var(--color-text-light);\n}\n\n.cn-roadmap-item__body {\n\tcolor: var(--color-main-text);\n\tfont-size: 0.95em;\n\tline-height: 1.4;\n\t/* Cap the rendered markdown so cards stay roughly feature-card-sized.\n\t Full body is reachable via the title link to the GitHub issue. */\n\tmax-height: 8.4em;\n\toverflow: hidden;\n\tposition: relative;\n\tmask-image: linear-gradient(to bottom, black 70%, transparent);\n\t-webkit-mask-image: linear-gradient(to bottom, black 70%, transparent);\n}\n\n.cn-roadmap-item__body :deep(p) { margin: 4px 0; }\n\n.cn-roadmap-item__body :deep(h1),\n.cn-roadmap-item__body :deep(h2),\n.cn-roadmap-item__body :deep(h3) {\n\tfont-size: 1em;\n\tmargin: 4px 0;\n\tfont-weight: 600;\n}\n\n.cn-roadmap-item__body :deep(pre) { background: var(--color-background-hover); padding: 8px; border-radius: 4px; overflow-x: auto; }\n\n.cn-roadmap-item__body :deep(code) { background: var(--color-background-hover); padding: 2px 4px; border-radius: 3px; }\n\n.cn-roadmap-item__labels {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n\tmargin-top: 8px;\n}\n\n.cn-roadmap-item__label-chip {\n\tpadding: 2px 8px;\n\tborder-radius: 10px;\n\tfont-size: 0.8em;\n}\n</style>\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnRoadmapItem.vue3.js","sources":["../../../../src/components/CnRoadmapItem/CnRoadmapItem.vue?vue&type=template&id=50cbffd1&lang.js"],"sourcesContent":["<template>\n\t<article class=\"cn-roadmap-item\">\n\t\t<header class=\"cn-roadmap-item__header\">\n\t\t\t<img\n\t\t\t\tv-if=\"item.user && item.user.avatar_url\"\n\t\t\t\t:src=\"item.user.avatar_url\"\n\t\t\t\t:alt=\"item.user.login || ''\"\n\t\t\t\twidth=\"24\"\n\t\t\t\theight=\"24\"\n\t\t\t\treferrerpolicy=\"no-referrer\"\n\t\t\t\tclass=\"cn-roadmap-item__avatar\">\n\t\t\t<div class=\"cn-roadmap-item__meta\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"safeHref(item.html_url)\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclass=\"cn-roadmap-item__title-link\">\n\t\t\t\t\t{{ item.title }}\n\t\t\t\t</a>\n\t\t\t\t<div class=\"cn-roadmap-item__submitter\">\n\t\t\t\t\t<span v-if=\"item.user && item.user.login\">{{ item.user.login }}</span>\n\t\t\t\t\t<span class=\"cn-roadmap-item__separator\">·</span>\n\t\t\t\t\t<span>{{ relativeCreatedAt }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"cn-roadmap-item__reactions\">\n\t\t\t\t<ThumbUpOutline :size=\"16\" />\n\t\t\t\t<span>{{ thumbsUpCount }}</span>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<div\n\t\t\tv-if=\"sanitizedBody !== ''\"\n\t\t\tclass=\"cn-roadmap-item__body\"\n\t\t\tv-html=\"sanitizedBody\" /><!-- eslint-disable-line vue/no-v-html -- sanitizedBody comes from cnRenderMarkdown(), which sanitises through DOMPurify -->\n\n\t\t<footer v-if=\"visibleLabels.length > 0\" class=\"cn-roadmap-item__labels\">\n\t\t\t<span\n\t\t\t\tv-for=\"label in visibleLabels\"\n\t\t\t\t:key=\"label.name\"\n\t\t\t\tclass=\"cn-roadmap-item__label-chip\"\n\t\t\t\t:style=\"chipStyle(label)\">\n\t\t\t\t{{ label.name }}\n\t\t\t</span>\n\t\t</footer>\n\t</article>\n</template>\n\n<script>\n/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n *\n * RoadmapItem — single roadmap card. Renders an issue's title (linking to\n * the GitHub URL in a new tab), submitter avatar + login + relative time,\n * reaction count, sanitized markdown body, and filtered label chips.\n *\n * Markdown safety: the body flows through `cnRenderMarkdown` (existing\n * `marked` wrapper) → `DOMPurify.sanitize(html, SAFE_MARKDOWN_DOMPURIFY_CONFIG)`.\n * Labels are filtered through `ROADMAP_LABEL_BLOCKLIST` so hydra workflow\n * labels never appear on the card.\n *\n * Template notes (kept here, NOT as `<!-- -->` comments inside `<template>`:\n * the Vue 3 SFC compiler preserves template comments as real DOM comment\n * nodes in dev builds, where Vue 2's compiler stripped them — so anything\n * written there leaks into the rendered markup):\n *\n * - The avatar is a plain `<img>` rather than `<NcAvatar>`: the GitHub login\n * is not a Nextcloud user, and NcAvatar's resolution path triggers an\n * `/avatar/<user>` lookup that returns 404 + initials instead of using the\n * GitHub-hosted `avatar_url`. CSP `img-src *` allows external images here.\n * - The avatar is eager-loaded: `loading=\"lazy\"` deferred the fetch\n * indefinitely for cards below the fold, leaving a broken-image glyph.\n * These are 24px images, so eager is cheap.\n * - `v-html` on the body is intentional AND safe: `cnRenderMarkdown` runs\n * `marked` then sanitises with SAFE_MARKDOWN_DOMPURIFY_CONFIG (strips\n * script elements, `on...` handler attributes, `javascript:` URLs, and\n * iframe + style elements). Never bind raw `item.body`.\n *\n * Spec: features-roadmap-component — Requirement \"RoadmapItem\".\n */\nimport ThumbUpOutline from 'vue-material-design-icons/ThumbUpOutline.vue'\nimport { cnRenderMarkdown } from '../../composables/cnRenderMarkdown.js'\nimport { ROADMAP_LABEL_BLOCKLIST } from '../../utils/roadmapLabelBlocklist.js'\nimport { safeHref } from '../../utils/safeHref.js'\n\nexport default {\n\tname: 'CnRoadmapItem',\n\n\tcomponents: { ThumbUpOutline },\n\n\tprops: {\n\t\t/**\n\t\t * Sanitized issue object from the OpenRegister GitHub proxy.\n\t\t * Shape: {number, title, body, html_url, user.{login, avatar_url},\n\t\t * reactions.{total_count, +1}, created_at, updated_at,\n\t\t * labels[].{name, color}}.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tcomputed: {\n\t\tsanitizedBody() {\n\t\t\t// cnRenderMarkdown already sanitises via DOMPurify internally —\n\t\t\t// no second pass needed (L1: double-sanitisation removed).\n\t\t\treturn cnRenderMarkdown(this.item.body || '')\n\t\t},\n\n\t\tthumbsUpCount() {\n\t\t\treturn (this.item.reactions && this.item.reactions['+1']) || 0\n\t\t},\n\n\t\tvisibleLabels() {\n\t\t\tconst labels = Array.isArray(this.item.labels) ? this.item.labels : []\n\t\t\treturn labels.filter((label) => label && typeof label.name === 'string' && !ROADMAP_LABEL_BLOCKLIST.some((re) => re.test(label.name)))\n\t\t},\n\n\t\trelativeCreatedAt() {\n\t\t\tif (!this.item.created_at) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst created = new Date(this.item.created_at)\n\t\t\tconst diffSec = Math.floor((Date.now() - created.getTime()) / 1000)\n\t\t\tif (diffSec < 60) {\n\t\t\t\treturn `${diffSec}s`\n\t\t\t}\n\t\t\tif (diffSec < 3600) {\n\t\t\t\treturn `${Math.floor(diffSec / 60)}m`\n\t\t\t}\n\t\t\tif (diffSec < 86400) {\n\t\t\t\treturn `${Math.floor(diffSec / 3600)}h`\n\t\t\t}\n\t\t\tif (diffSec < 2592000) {\n\t\t\t\treturn `${Math.floor(diffSec / 86400)}d`\n\t\t\t}\n\t\t\treturn created.toLocaleDateString()\n\t\t},\n\t},\n\n\tmethods: {\n\t\tsafeHref,\n\n\t\tchipStyle(label) {\n\t\t\tif (!label.color) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tbackgroundColor: '#' + label.color,\n\t\t\t\tcolor: this.contrastTextColor(label.color),\n\t\t\t}\n\t\t},\n\n\t\tcontrastTextColor(hexColor) {\n\t\t\t// Simple luminance check — dark text on bright bg, white on dark.\n\t\t\tconst r = parseInt(hexColor.slice(0, 2), 16)\n\t\t\tconst g = parseInt(hexColor.slice(2, 4), 16)\n\t\t\tconst b = parseInt(hexColor.slice(4, 6), 16)\n\t\t\tconst lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n\t\t\treturn lum > 0.55 ? '#000' : '#fff'\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-roadmap-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tpadding: 16px;\n\t/* Position anchor for the ::after overlay that expands the title link's\n\t click area to the whole card. Inner anchors stay above the overlay\n\t via z-index: 2 so the body's inline links still work. */\n\tposition: relative;\n}\n\n.cn-roadmap-item__title-link::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 1;\n\tborder-radius: inherit;\n}\n\n.cn-roadmap-item__body :deep(a),\n.cn-roadmap-item__labels {\n\tposition: relative;\n\tz-index: 2;\n}\n\n.cn-roadmap-item__header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tmargin-bottom: 8px;\n}\n\n.cn-roadmap-item__avatar {\n\twidth: 24px;\n\theight: 24px;\n\tborder-radius: 50%;\n\tflex-shrink: 0;\n\tobject-fit: cover;\n\tbackground: var(--color-background-darker);\n}\n\n.cn-roadmap-item__meta {\n\tflex: 1;\n}\n\n.cn-roadmap-item__title-link {\n\tdisplay: block;\n\tcolor: var(--color-main-text);\n\tfont-weight: 600;\n\ttext-decoration: none;\n}\n\n.cn-roadmap-item__title-link:hover {\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n}\n\n.cn-roadmap-item__submitter {\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-light);\n}\n\n.cn-roadmap-item__separator {\n\tmargin: 0 4px;\n}\n\n.cn-roadmap-item__reactions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 4px;\n\tcolor: var(--color-text-light);\n}\n\n.cn-roadmap-item__body {\n\tcolor: var(--color-main-text);\n\tfont-size: 0.95em;\n\tline-height: 1.4;\n\t/* Cap the rendered markdown so cards stay roughly feature-card-sized.\n\t Full body is reachable via the title link to the GitHub issue. */\n\tmax-height: 8.4em;\n\toverflow: hidden;\n\tposition: relative;\n\tmask-image: linear-gradient(to bottom, black 70%, transparent);\n\t-webkit-mask-image: linear-gradient(to bottom, black 70%, transparent);\n}\n\n.cn-roadmap-item__body :deep(p) { margin: 4px 0; }\n\n.cn-roadmap-item__body :deep(h1),\n.cn-roadmap-item__body :deep(h2),\n.cn-roadmap-item__body :deep(h3) {\n\tfont-size: 1em;\n\tmargin: 4px 0;\n\tfont-weight: 600;\n}\n\n.cn-roadmap-item__body :deep(pre) { background: var(--color-background-hover); padding: 8px; border-radius: 4px; overflow-x: auto; }\n\n.cn-roadmap-item__body :deep(code) { background: var(--color-background-hover); padding: 2px 4px; border-radius: 3px; }\n\n.cn-roadmap-item__labels {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n\tmargin-top: 8px;\n}\n\n.cn-roadmap-item__label-chip {\n\tpadding: 2px 8px;\n\tborder-radius: 10px;\n\tfont-size: 0.8em;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createVNode","_Fragment","_renderList","_normalizeStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnRoadmapItem.vue3.js","sources":["../../../../src/components/CnRoadmapItem/CnRoadmapItem.vue?vue&type=template&id=f352eb12&lang.js"],"sourcesContent":["<template>\n\t<article class=\"cn-roadmap-item\">\n\t\t<header class=\"cn-roadmap-item__header\">\n\t\t\t<img\n\t\t\t\tv-if=\"item.user && item.user.avatar_url\"\n\t\t\t\t:src=\"item.user.avatar_url\"\n\t\t\t\t:alt=\"item.user.login || ''\"\n\t\t\t\twidth=\"24\"\n\t\t\t\theight=\"24\"\n\t\t\t\treferrerpolicy=\"no-referrer\"\n\t\t\t\tclass=\"cn-roadmap-item__avatar\">\n\t\t\t<div class=\"cn-roadmap-item__meta\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"safeHref(item.html_url)\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclass=\"cn-roadmap-item__title-link\">\n\t\t\t\t\t{{ item.title }}\n\t\t\t\t</a>\n\t\t\t\t<div class=\"cn-roadmap-item__submitter\">\n\t\t\t\t\t<span v-if=\"item.user && item.user.login\">{{ item.user.login }}</span>\n\t\t\t\t\t<span class=\"cn-roadmap-item__separator\">·</span>\n\t\t\t\t\t<span>{{ relativeCreatedAt }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"cn-roadmap-item__reactions\">\n\t\t\t\t<ThumbUpOutline :size=\"16\" />\n\t\t\t\t<span>{{ thumbsUpCount }}</span>\n\t\t\t</div>\n\t\t</header>\n\n\t\t<div\n\t\t\tv-if=\"sanitizedBody !== ''\"\n\t\t\tclass=\"cn-roadmap-item__body\"\n\t\t\tv-html=\"sanitizedBody\" /><!-- eslint-disable-line vue/no-v-html -- sanitizedBody comes from cnRenderMarkdown(), which sanitises through DOMPurify -->\n\n\t\t<footer v-if=\"visibleLabels.length > 0\" class=\"cn-roadmap-item__labels\">\n\t\t\t<span\n\t\t\t\tv-for=\"label in visibleLabels\"\n\t\t\t\t:key=\"label.name\"\n\t\t\t\tclass=\"cn-roadmap-item__label-chip\"\n\t\t\t\t:style=\"chipStyle(label)\">\n\t\t\t\t{{ label.name }}\n\t\t\t</span>\n\t\t</footer>\n\t</article>\n</template>\n\n<script>\n/**\n * SPDX-License-Identifier: EUPL-1.2\n * SPDX-FileCopyrightText: 2026 Conduction B.V.\n *\n * RoadmapItem — single roadmap card. Renders an issue's title (linking to\n * the GitHub URL in a new tab), submitter avatar + login + relative time,\n * reaction count, sanitized markdown body, and filtered label chips.\n *\n * Markdown safety: the body flows through `cnRenderMarkdown` (existing\n * `marked` wrapper) → `DOMPurify.sanitize(html, SAFE_MARKDOWN_DOMPURIFY_CONFIG)`.\n * Labels are filtered through `ROADMAP_LABEL_BLOCKLIST` so hydra workflow\n * labels never appear on the card.\n *\n * Template notes (kept here, NOT as `<!-- -->` comments inside `<template>`:\n * the Vue 3 SFC compiler preserves template comments as real DOM comment\n * nodes in dev builds, where Vue 2's compiler stripped them — so anything\n * written there leaks into the rendered markup):\n *\n * - The avatar is a plain `<img>` rather than `<NcAvatar>`: the GitHub login\n * is not a Nextcloud user, and NcAvatar's resolution path triggers an\n * `/avatar/<user>` lookup that returns 404 + initials instead of using the\n * GitHub-hosted `avatar_url`. CSP `img-src *` allows external images here.\n * - The avatar is eager-loaded: `loading=\"lazy\"` deferred the fetch\n * indefinitely for cards below the fold, leaving a broken-image glyph.\n * These are 24px images, so eager is cheap.\n * - `v-html` on the body is intentional AND safe: `cnRenderMarkdown` runs\n * `marked` then sanitises with SAFE_MARKDOWN_DOMPURIFY_CONFIG (strips\n * script elements, `on...` handler attributes, `javascript:` URLs, and\n * iframe + style elements). Never bind raw `item.body`.\n *\n * Spec: features-roadmap-component — Requirement \"RoadmapItem\".\n */\nimport ThumbUpOutline from 'vue-material-design-icons/ThumbUpOutline.vue'\nimport { cnRenderMarkdown } from '../../composables/cnRenderMarkdown.js'\nimport { ROADMAP_LABEL_BLOCKLIST } from '../../utils/roadmapLabelBlocklist.js'\nimport { safeHref } from '../../utils/safeHref.js'\nimport { userLocale } from '../../utils/userLocale.js'\n\nexport default {\n\tname: 'CnRoadmapItem',\n\n\tcomponents: { ThumbUpOutline },\n\n\tprops: {\n\t\t/**\n\t\t * Sanitized issue object from the OpenRegister GitHub proxy.\n\t\t * Shape: {number, title, body, html_url, user.{login, avatar_url},\n\t\t * reactions.{total_count, +1}, created_at, updated_at,\n\t\t * labels[].{name, color}}.\n\t\t *\n\t\t * @type {object}\n\t\t */\n\t\titem: {\n\t\t\ttype: Object,\n\t\t\trequired: true,\n\t\t},\n\t},\n\n\tcomputed: {\n\t\tsanitizedBody() {\n\t\t\t// cnRenderMarkdown already sanitises via DOMPurify internally —\n\t\t\t// no second pass needed (L1: double-sanitisation removed).\n\t\t\treturn cnRenderMarkdown(this.item.body || '')\n\t\t},\n\n\t\tthumbsUpCount() {\n\t\t\treturn (this.item.reactions && this.item.reactions['+1']) || 0\n\t\t},\n\n\t\tvisibleLabels() {\n\t\t\tconst labels = Array.isArray(this.item.labels) ? this.item.labels : []\n\t\t\treturn labels.filter((label) => label && typeof label.name === 'string' && !ROADMAP_LABEL_BLOCKLIST.some((re) => re.test(label.name)))\n\t\t},\n\n\t\trelativeCreatedAt() {\n\t\t\tif (!this.item.created_at) {\n\t\t\t\treturn ''\n\t\t\t}\n\t\t\tconst created = new Date(this.item.created_at)\n\t\t\tconst diffSec = Math.floor((Date.now() - created.getTime()) / 1000)\n\t\t\tif (diffSec < 60) {\n\t\t\t\treturn `${diffSec}s`\n\t\t\t}\n\t\t\tif (diffSec < 3600) {\n\t\t\t\treturn `${Math.floor(diffSec / 60)}m`\n\t\t\t}\n\t\t\tif (diffSec < 86400) {\n\t\t\t\treturn `${Math.floor(diffSec / 3600)}h`\n\t\t\t}\n\t\t\tif (diffSec < 2592000) {\n\t\t\t\treturn `${Math.floor(diffSec / 86400)}d`\n\t\t\t}\n\t\t\treturn created.toLocaleDateString(userLocale())\n\t\t},\n\t},\n\n\tmethods: {\n\t\tsafeHref,\n\n\t\tchipStyle(label) {\n\t\t\tif (!label.color) {\n\t\t\t\treturn {}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tbackgroundColor: '#' + label.color,\n\t\t\t\tcolor: this.contrastTextColor(label.color),\n\t\t\t}\n\t\t},\n\n\t\tcontrastTextColor(hexColor) {\n\t\t\t// Simple luminance check — dark text on bright bg, white on dark.\n\t\t\tconst r = parseInt(hexColor.slice(0, 2), 16)\n\t\t\tconst g = parseInt(hexColor.slice(2, 4), 16)\n\t\t\tconst b = parseInt(hexColor.slice(4, 6), 16)\n\t\t\tconst lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n\t\t\treturn lum > 0.55 ? '#000' : '#fff'\n\t\t},\n\t},\n}\n</script>\n\n<style scoped>\n.cn-roadmap-item {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 8px;\n\tpadding: 16px;\n\t/* Position anchor for the ::after overlay that expands the title link's\n\t click area to the whole card. Inner anchors stay above the overlay\n\t via z-index: 2 so the body's inline links still work. */\n\tposition: relative;\n}\n\n.cn-roadmap-item__title-link::after {\n\tcontent: \"\";\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 1;\n\tborder-radius: inherit;\n}\n\n.cn-roadmap-item__body :deep(a),\n.cn-roadmap-item__labels {\n\tposition: relative;\n\tz-index: 2;\n}\n\n.cn-roadmap-item__header {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 12px;\n\tmargin-bottom: 8px;\n}\n\n.cn-roadmap-item__avatar {\n\twidth: 24px;\n\theight: 24px;\n\tborder-radius: 50%;\n\tflex-shrink: 0;\n\tobject-fit: cover;\n\tbackground: var(--color-background-darker);\n}\n\n.cn-roadmap-item__meta {\n\tflex: 1;\n}\n\n.cn-roadmap-item__title-link {\n\tdisplay: block;\n\tcolor: var(--color-main-text);\n\tfont-weight: 600;\n\ttext-decoration: none;\n}\n\n.cn-roadmap-item__title-link:hover {\n\tcolor: var(--color-primary-element);\n\ttext-decoration: underline;\n}\n\n.cn-roadmap-item__submitter {\n\tfont-size: 0.85em;\n\tcolor: var(--color-text-light);\n}\n\n.cn-roadmap-item__separator {\n\tmargin: 0 4px;\n}\n\n.cn-roadmap-item__reactions {\n\tdisplay: flex;\n\talign-items: center;\n\tgap: 4px;\n\tcolor: var(--color-text-light);\n}\n\n.cn-roadmap-item__body {\n\tcolor: var(--color-main-text);\n\tfont-size: 0.95em;\n\tline-height: 1.4;\n\t/* Cap the rendered markdown so cards stay roughly feature-card-sized.\n\t Full body is reachable via the title link to the GitHub issue. */\n\tmax-height: 8.4em;\n\toverflow: hidden;\n\tposition: relative;\n\tmask-image: linear-gradient(to bottom, black 70%, transparent);\n\t-webkit-mask-image: linear-gradient(to bottom, black 70%, transparent);\n}\n\n.cn-roadmap-item__body :deep(p) { margin: 4px 0; }\n\n.cn-roadmap-item__body :deep(h1),\n.cn-roadmap-item__body :deep(h2),\n.cn-roadmap-item__body :deep(h3) {\n\tfont-size: 1em;\n\tmargin: 4px 0;\n\tfont-weight: 600;\n}\n\n.cn-roadmap-item__body :deep(pre) { background: var(--color-background-hover); padding: 8px; border-radius: 4px; overflow-x: auto; }\n\n.cn-roadmap-item__body :deep(code) { background: var(--color-background-hover); padding: 2px 4px; border-radius: 3px; }\n\n.cn-roadmap-item__labels {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: 4px;\n\tmargin-top: 8px;\n}\n\n.cn-roadmap-item__label-chip {\n\tpadding: 2px 8px;\n\tborder-radius: 10px;\n\tfont-size: 0.8em;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_createVNode","_Fragment","_renderList","_normalizeStyle"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import __sfc_main$2 from './CnSchemaConfigurationTab.vue.js';
|
|
|
13
13
|
import __sfc_main$1 from './CnSchemaPropertiesTab.vue.js';
|
|
14
14
|
import __sfc_main$3 from './CnSchemaSecurityTab.vue.js';
|
|
15
15
|
import { dialogBoardMixin } from '../../mixins/dialogBoard.js';
|
|
16
|
+
import { userLocale } from '../../utils/userLocale.js';
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* CnSchemaFormDialog — Generic JSON Schema editor dialog.
|
|
@@ -361,6 +362,7 @@ var script = {
|
|
|
361
362
|
|
|
362
363
|
methods: {
|
|
363
364
|
t: translate,
|
|
365
|
+
userLocale,
|
|
364
366
|
findSchemaBySlug(schemaSlug) {
|
|
365
367
|
if (!schemaSlug) {
|
|
366
368
|
return undefined
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CnSchemaFormDialog.vue2.js","sources":["../../../../src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue"],"sourcesContent":["<template>\n\t<CnTabbedFormDialog\n\t\tref=\"dialog\"\n\t\t:look=\"look\"\n\t\t:width=\"width\"\n\t\t:eyebrow=\"eyebrow\"\n\t\t:subtitle=\"subtitle\"\n\t\t:tabs=\"dialogTabs\"\n\t\t:item=\"item\"\n\t\t:dialogTitle=\"dialogTitle\"\n\t\tentityName=\"Schema\"\n\t\t:size=\"size\"\n\t\t:disableSave=\"!!saveDisabledReason\"\n\t\t:disableSaveTooltip=\"saveDisabledReason\"\n\t\t:successText=\"resolvedSuccessText\"\n\t\t:cancelLabel=\"cancelLabel\"\n\t\t:closeLabel=\"closeLabel\"\n\t\t:confirmLabel=\"confirmLabel\"\n\t\t@confirm=\"handleConfirm\"\n\t\t@close=\"$emit('close')\">\n\t\t<!-- Metadata Display -->\n\t\t<template #above-tabs=\"{ loading: dialogLoading }\">\n\t\t\t<div class=\"cn-schema-form__detail-grid\">\n\t\t\t\t<div v-if=\"schemaItem.id\"\n\t\t\t\t\tclass=\"cn-schema-form__detail-item cn-schema-form__id-card\">\n\t\t\t\t\t<div class=\"cn-schema-form__id-card-header\">\n\t\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'ID / UUID:') }}</span>\n\t\t\t\t\t\t<NcButton class=\"cn-schema-form__copy-button\"\n\t\t\t\t\t\t\t@click=\"copyToClipboard(schemaItem.uuid || schemaItem.id)\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<Check v-if=\"isCopied\" :size=\"20\" />\n\t\t\t\t\t\t\t\t<ContentCopy v-else :size=\"20\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ isCopied ? t('nextcloud-vue', 'Copied') : t('nextcloud-vue', 'Copy') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ schemaItem.id }}</span>\n\t\t\t\t\t<span v-if=\"schemaItem.uuid && schemaItem.uuid !== schemaItem.id\"\n\t\t\t\t\t\tclass=\"cn-schema-form__detail-value cn-schema-form__uuid-value\">{{ schemaItem.uuid }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"cn-schema-form__detail-item cn-schema-form__title-with-badge\">\n\t\t\t\t\t<NcTextField v-model=\"schemaItem.title\"\n\t\t\t\t\t\t:disabled=\"dialogLoading\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Title *')\" />\n\t\t\t\t\t<span v-if=\"schemaItem.allOf && schemaItem.allOf.length > 0\"\n\t\t\t\t\t\tclass=\"cn-schema-form__statusPill cn-schema-form__statusPill--success\">\n\t\t\t\t\t\tallOf\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-if=\"schemaItem.oneOf && schemaItem.oneOf.length > 0\"\n\t\t\t\t\t\tclass=\"cn-schema-form__statusPill cn-schema-form__statusPill--info\">\n\t\t\t\t\t\toneOf\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-if=\"schemaItem.anyOf && schemaItem.anyOf.length > 0\"\n\t\t\t\t\t\tclass=\"cn-schema-form__statusPill cn-schema-form__statusPill--info\">\n\t\t\t\t\t\tanyOf\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"schemaItem.created\" class=\"cn-schema-form__detail-item\">\n\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'Created:') }}</span>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ new Date(schemaItem.created).toLocaleString() }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"schemaItem.updated\" class=\"cn-schema-form__detail-item\">\n\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'Updated:') }}</span>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ new Date(schemaItem.updated).toLocaleString() }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"cn-schema-form__detail-item\">\n\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'Version:') }}</span>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ schemaItem.version || t('nextcloud-vue', 'Not set') }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"cn-schema-form__detail-item\">\n\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'Owner:') }}</span>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ schemaItem.owner || t('nextcloud-vue', 'Not set') }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- Properties Tab -->\n\t\t<template #tab-properties=\"{ loading: dialogLoading }\">\n\t\t\t<CnSchemaPropertiesTab\n\t\t\t\t:schemaItem=\"schemaItem\"\n\t\t\t\t:loading=\"dialogLoading\"\n\t\t\t\t:selectedProperty=\"selectedProperty\"\n\t\t\t\t:propertiesModified=\"propertiesModified\"\n\t\t\t\t:originalProperties=\"originalProperties\"\n\t\t\t\t:inheritedProperties=\"inheritedProperties\"\n\t\t\t\t:typeOptionsForSelect=\"typeOptionsForSelect\"\n\t\t\t\t:availableSchemas=\"availableSchemas\"\n\t\t\t\t:availableRegisters=\"availableRegisters\"\n\t\t\t\t:availableTagsOptions=\"availableTagsOptions\"\n\t\t\t\t:userGroups=\"userGroups\"\n\t\t\t\t:sortedUserGroups=\"sortedUserGroups\"\n\t\t\t\t:loadingGroups=\"loadingGroups\"\n\t\t\t\t@addProperty=\"addProperty\"\n\t\t\t\t@update:selectedProperty=\"selectedProperty = $event\"\n\t\t\t\t@update:propertyKey=\"updatePropertyKey($event.oldKey, $event.newKey)\"\n\t\t\t\t@copyProperty=\"copyProperty\"\n\t\t\t\t@deleteProperty=\"deleteProperty\" />\n\t\t</template>\n\n\t\t<!-- Configuration Tab -->\n\t\t<template #tab-configuration=\"{ loading: dialogLoading }\">\n\t\t\t<CnSchemaConfigurationTab\n\t\t\t\t:schemaItem=\"schemaItem\"\n\t\t\t\t:loading=\"dialogLoading\"\n\t\t\t\t:availableSchemas=\"availableSchemas\"\n\t\t\t\t:propertyOptions=\"propertyOptions\"\n\t\t\t\t:allOfSchemaNames=\"allOfSchemaNames\" />\n\t\t</template>\n\n\t\t<!-- Security Tab -->\n\t\t<template #tab-security>\n\t\t\t<CnSchemaSecurityTab\n\t\t\t\t:schemaItem=\"schemaItem\"\n\t\t\t\t:userGroups=\"userGroups\"\n\t\t\t\t:sortedUserGroups=\"sortedUserGroups\"\n\t\t\t\t:loadingGroups=\"loadingGroups\"\n\t\t\t\t:hasAnyPermissions=\"hasAnyPermissions\"\n\t\t\t\t:isRestrictiveSchema=\"isRestrictiveSchema\"\n\t\t\t\t:inheritedProperties=\"inheritedProperties\" />\n\t\t</template>\n\n\t\t<!-- Optional Action Buttons (edit mode only) -->\n\t\t<template #actions-right=\"{ loading: dialogLoading, isCreateMode, result: dialogResult }\">\n\t\t\t<template v-if=\"!isCreateMode && dialogResult === null\">\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showExtendSchema\"\n\t\t\t\t\t:disabled=\"dialogLoading\"\n\t\t\t\t\t@click=\"$emit('extend-schema')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<CallSplit :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ extendSchemaLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showAnalyzeProperties\"\n\t\t\t\t\t:disabled=\"dialogLoading\"\n\t\t\t\t\t@click=\"$emit('analyze-properties')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<DatabaseSearch :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ analyzePropertiesLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showValidateObjects\"\n\t\t\t\t\t:disabled=\"dialogLoading\"\n\t\t\t\t\t@click=\"$emit('validate-objects')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<CheckCircle :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ validateObjectsLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showDeleteObjects\"\n\t\t\t\t\t:title=\"objectCount > 0 ? deleteObjectsTooltip : noDeleteObjectsTooltip\"\n\t\t\t\t\t:disabled=\"dialogLoading || objectCount === 0\"\n\t\t\t\t\t@click=\"$emit('delete-objects')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<DeleteSweep :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ deleteObjectsLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showPublishObjects\"\n\t\t\t\t\t:title=\"objectCount > 0 ? publishObjectsTooltip : noPublishObjectsTooltip\"\n\t\t\t\t\t:disabled=\"dialogLoading || objectCount === 0\"\n\t\t\t\t\t@click=\"$emit('publish-objects')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Upload :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ publishObjectsLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showDelete\"\n\t\t\t\t\t:title=\"objectCount > 0 ? cannotDeleteTooltip : ''\"\n\t\t\t\t\t:disabled=\"dialogLoading || objectCount > 0\"\n\t\t\t\t\tvariant=\"error\"\n\t\t\t\t\t@click=\"$emit('delete-schema')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ deleteLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</template>\n\t</CnTabbedFormDialog>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport {\n\tNcButton,\n\tNcTextField,\n} from '@nextcloud/vue'\nimport CallSplit from 'vue-material-design-icons/CallSplit.vue'\nimport Check from 'vue-material-design-icons/Check.vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport DatabaseSearch from 'vue-material-design-icons/DatabaseSearch.vue'\nimport DeleteSweep from 'vue-material-design-icons/DeleteSweep.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Upload from 'vue-material-design-icons/Upload.vue'\nimport CnTabbedFormDialog from '../CnTabbedFormDialog/CnTabbedFormDialog.vue'\nimport CnSchemaConfigurationTab from './CnSchemaConfigurationTab.vue'\nimport CnSchemaPropertiesTab from './CnSchemaPropertiesTab.vue'\nimport CnSchemaSecurityTab from './CnSchemaSecurityTab.vue'\nimport { dialogBoardMixin } from '../../mixins/dialogBoard.js'\n\n/**\n * CnSchemaFormDialog — Generic JSON Schema editor dialog.\n *\n * Provides a full-featured form for creating and editing JSON Schemas with\n * properties table, configuration, and security (RBAC) tabs. Uses CnTabbedFormDialog.\n *\n * The dialog does NOT perform saves — it emits a `confirm` event with the schema data.\n * The parent performs the actual API call and calls `setResult()` via a ref.\n *\n * @event confirm Emitted when the user confirms. Payload: cleaned schema data object.\n * @event close Emitted when the dialog should be closed.\n * @event extend-schema Emitted when the Extend Schema button is clicked.\n * @event analyze-properties Emitted when the Analyze Properties button is clicked.\n * @event validate-objects Emitted when the Validate Objects button is clicked.\n * @event delete-objects Emitted when the Delete Objects button is clicked.\n * @event publish-objects Emitted when the Publish Objects button is clicked.\n * @event delete-schema Emitted when the Delete button is clicked.\n */\nexport default {\n\tname: 'CnSchemaFormDialog',\n\tcomponents: {\n\t\tNcTextField,\n\t\tNcButton,\n\t\tCnTabbedFormDialog,\n\t\tCnSchemaPropertiesTab,\n\t\tCnSchemaConfigurationTab,\n\t\tCnSchemaSecurityTab,\n\t\t// Icons\n\t\tContentCopy,\n\t\tCheck,\n\t\tTrashCanOutline,\n\t\tCallSplit,\n\t\tDatabaseSearch,\n\t\tCheckCircle,\n\t\tDeleteSweep,\n\t\tUpload,\n\t},\n\n\tmixins: [dialogBoardMixin],\n\n\tprops: {\n\t\t/** Existing schema item for edit mode. Pass null for create mode. */\n\t\titem: { type: Object, default: null },\n\t\t/** Dialog title. Defaults to \"Create Schema\" or \"Edit Schema\". */\n\t\tdialogTitle: { type: String, default: '' },\n\t\t/** NcDialog size */\n\t\tsize: { type: String, default: 'large' },\n\t\t/** Available schemas for references and composition. Array of { id, title, description, reference } */\n\t\tavailableSchemas: { type: Array, default: () => [] },\n\t\t/** Available registers. Array of { id, label } */\n\t\tavailableRegisters: { type: Array, default: () => [] },\n\t\t/** User groups for RBAC. Array of { id, displayname } */\n\t\tuserGroups: { type: Array, default: () => [] },\n\t\t/** Available tags for file property configuration */\n\t\tavailableTags: { type: Array, default: () => [] },\n\t\t/** Whether user groups are still loading */\n\t\tloadingGroups: { type: Boolean, default: false },\n\t\t/** Properties inherited from parent schemas (allOf) — shown as locked rows in the properties tab */\n\t\tinheritedProperties: { type: Object, default: () => ({}) },\n\t\t/** Number of objects attached to this schema (used for action button disable logic) */\n\t\tobjectCount: { type: Number, default: 0 },\n\t\t// Optional action button visibility\n\t\t/** Show \"Extend Schema\" button */\n\t\tshowExtendSchema: { type: Boolean, default: false },\n\t\t/** Show \"Analyze Properties\" button */\n\t\tshowAnalyzeProperties: { type: Boolean, default: false },\n\t\t/** Show \"Validate Objects\" button */\n\t\tshowValidateObjects: { type: Boolean, default: false },\n\t\t/** Show \"Delete Objects\" button */\n\t\tshowDeleteObjects: { type: Boolean, default: false },\n\t\t/** Show \"Publish Objects\" button */\n\t\tshowPublishObjects: { type: Boolean, default: false },\n\t\t/** Show \"Delete\" button */\n\t\tshowDelete: { type: Boolean, default: false },\n\t\t// Labels (pre-translated strings with English defaults)\n\t\t/** Label for the cancel button shown while editing. */\n\t\tcancelLabel: { type: String, default: () => t('nextcloud-vue', 'Cancel') },\n\t\t/** Label for the close button shown after a save or error. */\n\t\tcloseLabel: { type: String, default: () => t('nextcloud-vue', 'Close') },\n\t\t/** Confirm button label. Defaults to \"Create\" or \"Save\". */\n\t\tconfirmLabel: { type: String, default: '' },\n\t\t/** Success message. Defaults to \"Schema saved successfully.\" */\n\t\tsuccessText: { type: String, default: '' },\n\t\t/** Label for the Extend Schema action button. */\n\t\textendSchemaLabel: { type: String, default: () => t('nextcloud-vue', 'Extend schema') },\n\t\t/** Label for the Analyze Properties action button. */\n\t\tanalyzePropertiesLabel: { type: String, default: () => t('nextcloud-vue', 'Analyze properties') },\n\t\t/** Label for the Validate Objects action button. */\n\t\tvalidateObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Validate objects') },\n\t\t/** Label for the Delete Objects action button. */\n\t\tdeleteObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Delete objects') },\n\t\t/** Label for the Publish Objects action button. */\n\t\tpublishObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Publish objects') },\n\t\t/** Label for the Delete schema button shown in edit mode. */\n\t\tdeleteLabel: { type: String, default: () => t('nextcloud-vue', 'Delete') },\n\t\t/** Tooltip for the Delete Objects button when objects exist. */\n\t\tdeleteObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'Delete all objects in this schema') },\n\t\t/** Tooltip for the Publish Objects button when objects exist. */\n\t\tpublishObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'Publish all objects in this schema') },\n\t\t/** Tooltip for the Delete Objects button when no objects exist */\n\t\tnoDeleteObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'No objects to delete') },\n\t\t/** Tooltip for the Publish Objects button when no objects exist */\n\t\tnoPublishObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'No objects to publish') },\n\t\t/** Tooltip for the Delete schema button while objects are still attached. */\n\t\tcannotDeleteTooltip: { type: String, default: () => t('nextcloud-vue', 'Cannot delete: objects are still attached') },\n\t},\n\n\temits: [\n\t\t'analyze-properties',\n\t\t'close',\n\t\t'confirm',\n\t\t'delete-objects',\n\t\t'delete-schema',\n\t\t'extend-schema',\n\t\t'publish-objects',\n\t\t'validate-objects',\n\t],\n\n\tdata() {\n\t\treturn {\n\t\t\tisCopied: false,\n\t\t\tselectedProperty: null,\n\t\t\tpropertiesModified: false,\n\t\t\toriginalProperties: null,\n\t\t\tschemaItem: {\n\t\t\t\ttitle: '',\n\t\t\t\tversion: '0.0.0',\n\t\t\t\tdescription: '',\n\t\t\t\tsummary: '',\n\t\t\t\tslug: '',\n\t\t\t\tproperties: {},\n\t\t\t\tconfiguration: {\n\t\t\t\t\tobjectNameField: '',\n\t\t\t\t\tobjectDescriptionField: '',\n\t\t\t\t\tobjectImageField: '',\n\t\t\t\t\tobjectSummaryField: '',\n\t\t\t\t\tallowFiles: false,\n\t\t\t\t\tallowedTags: [],\n\t\t\t\t\tautoPublish: false,\n\t\t\t\t\tdefaultAutoShare: false,\n\t\t\t\t},\n\n\t\t\t\tauthorization: {},\n\t\t\t\thardValidation: false,\n\t\t\t\timmutable: false,\n\t\t\t\tsearchable: true,\n\t\t\t\ticon: null,\n\t\t\t\tmaxDepth: 0,\n\t\t\t},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Tab definitions for CnTabbedFormDialog.\n\t\t *\n\t\t * @return {Array} Tab configuration\n\t\t */\n\t\tdialogTabs() {\n\t\t\treturn [\n\t\t\t\t{ id: 'properties', title: t('nextcloud-vue', 'Properties') },\n\t\t\t\t{ id: 'configuration', title: t('nextcloud-vue', 'Configuration') },\n\t\t\t\t{ id: 'security', title: t('nextcloud-vue', 'Security') },\n\t\t\t]\n\t\t},\n\n\t\tsortedUserGroups() {\n\t\t\treturn this.userGroups\n\t\t\t\t.filter((group) => group.id !== 'admin' && group.id !== 'public' && group.id !== 'authenticated')\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tconst nameA = a.displayname || a.id\n\t\t\t\t\tconst nameB = b.displayname || b.id\n\t\t\t\t\treturn nameA.localeCompare(nameB)\n\t\t\t\t})\n\t\t},\n\n\t\thasAnyPermissions() {\n\t\t\tconst auth = this.schemaItem.authorization || {}\n\t\t\treturn Object.keys(auth).some((action) => Array.isArray(auth[action]) && auth[action].length > 0)\n\t\t},\n\n\t\tisRestrictiveSchema() {\n\t\t\tconst auth = this.schemaItem.authorization || {}\n\t\t\tconst actions = ['create', 'read', 'update', 'delete']\n\t\t\treturn actions.some((action) => Array.isArray(auth[action]) && auth[action].length > 0\n\t\t\t\t&& !auth[action].includes('public'))\n\t\t},\n\n\t\ttypeOptionsForSelect() {\n\t\t\treturn [\n\t\t\t\t{ id: 'string', label: t('nextcloud-vue', 'String') },\n\t\t\t\t{ id: 'number', label: t('nextcloud-vue', 'Number') },\n\t\t\t\t{ id: 'integer', label: t('nextcloud-vue', 'Integer') },\n\t\t\t\t{ id: 'boolean', label: t('nextcloud-vue', 'Boolean') },\n\t\t\t\t{ id: 'array', label: t('nextcloud-vue', 'Array') },\n\t\t\t\t{ id: 'object', label: t('nextcloud-vue', 'Object') },\n\t\t\t\t{ id: 'dictionary', label: t('nextcloud-vue', 'Dictionary') },\n\t\t\t\t{ id: 'file', label: t('nextcloud-vue', 'File') },\n\t\t\t\t{ id: 'oneOf', label: t('nextcloud-vue', 'One of') },\n\t\t\t]\n\t\t},\n\n\t\tpropertyOptions() {\n\t\t\tconst ownKeys = Object.keys(this.schemaItem.properties || {}).filter((k) => k !== '')\n\t\t\tconst inheritedKeys = Object.keys(this.inheritedProperties || {}).filter((k) => k !== '')\n\t\t\treturn [...new Set([...inheritedKeys, ...ownKeys])]\n\t\t},\n\n\t\tavailableTagsOptions() {\n\t\t\treturn this.availableTags.map((tag) => ({\n\t\t\t\tid: tag,\n\t\t\t\tlabel: tag,\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Resolved success text for backwards compatibility (includes trailing period).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tresolvedSuccessText() {\n\t\t\tif (this.successText) {\n\t\t\t\treturn this.successText\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', '{title} saved successfully.', { title: t('nextcloud-vue', 'Schema') })\n\t\t},\n\n\t\t/**\n\t\t * Returns a human-readable reason the save button is disabled, or '' when saving is allowed.\n\t\t * Used for both :disable-save and the WCAG tooltip/aria-label on the button.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tsaveDisabledReason() {\n\t\t\tif (!this.schemaItem.title) {\n\t\t\t\treturn t('nextcloud-vue', 'A schema title is required before saving')\n\t\t\t}\n\t\t\tconst hasUnnamedProperty = Object.keys(this.schemaItem.properties || {}).some((key) => key === '')\n\t\t\tif (hasUnnamedProperty) {\n\t\t\t\treturn t('nextcloud-vue', 'All properties must have a name before saving')\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\n\t\tallOfSchemaNames() {\n\t\t\tif (!this.schemaItem.allOf || !Array.isArray(this.schemaItem.allOf) || this.schemaItem.allOf.length === 0) {\n\t\t\t\treturn []\n\t\t\t}\n\n\t\t\treturn this.schemaItem.allOf\n\t\t\t\t.map((ref) => {\n\t\t\t\t\tconst schemaId = typeof ref === 'object' ? ref.id : ref\n\t\t\t\t\tconst schema = this.availableSchemas.find((s) => s.id === schemaId)\n\t\t\t\t\treturn schema ? (schema.title || `Schema ${schema.id}`) : schemaId\n\t\t\t\t})\n\t\t\t\t.filter((name) => name)\n\t\t},\n\t},\n\n\twatch: {\n\t\titem: {\n\t\t\timmediate: true,\n\t\t\thandler() {\n\t\t\t\tthis.initializeSchemaItem()\n\t\t\t},\n\t\t},\n\n\t\t'schemaItem.properties': {\n\t\t\thandler(newProperties) {\n\t\t\t\tif (newProperties) {\n\t\t\t\t\tObject.keys(newProperties).forEach((key) => {\n\t\t\t\t\t\tconst property = newProperties[key]\n\t\t\t\t\t\tif (property) {\n\t\t\t\t\t\t\t// Initialize nested objects if they don't exist\n\t\t\t\t\t\t\tif (property.type === 'array' && !property.items) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items = { type: 'string' }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (property.type === 'object' && !property.objectConfiguration) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration = { handling: 'nested-object' }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (property.type === 'array' && property.items && property.items.type === 'object' && !property.items.objectConfiguration) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration = { handling: 'nested-object' }\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert property type from object to string\n\t\t\t\t\t\t\tif (property.type && typeof property.type === 'object' && property.type.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].type = property.type.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert property format from object to string\n\t\t\t\t\t\t\tif (property.format && typeof property.format === 'object' && property.format.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].format = property.format.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert array item type from object to string\n\t\t\t\t\t\t\tif (property.items && property.items.type && typeof property.items.type === 'object' && property.items.type.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.type = property.items.type.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert object handling from object to string\n\t\t\t\t\t\t\tif (property.objectConfiguration && property.objectConfiguration.handling\n\t\t\t\t\t\t\t\t&& typeof property.objectConfiguration.handling === 'object' && property.objectConfiguration.handling.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration.handling = property.objectConfiguration.handling.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert register from object to ID\n\t\t\t\t\t\t\tif (property.objectConfiguration && property.objectConfiguration.register\n\t\t\t\t\t\t\t\t&& typeof property.objectConfiguration.register === 'object' && property.objectConfiguration.register.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration.register = property.objectConfiguration.register.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert array item object handling from object to string\n\t\t\t\t\t\t\tif (property.items && property.items.objectConfiguration && property.items.objectConfiguration.handling\n\t\t\t\t\t\t\t\t&& typeof property.items.objectConfiguration.handling === 'object' && property.items.objectConfiguration.handling.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration.handling = property.items.objectConfiguration.handling.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert array item register from object to ID\n\t\t\t\t\t\t\tif (property.items && property.items.objectConfiguration && property.items.objectConfiguration.register\n\t\t\t\t\t\t\t\t&& typeof property.items.objectConfiguration.register === 'object' && property.items.objectConfiguration.register.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration.register = property.items.objectConfiguration.register.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Ensure $ref is always a string\n\t\t\t\t\t\t\tthis.ensureRefIsString(this.schemaItem.properties, key)\n\n\t\t\t\t\t\t\t// Ensure inversedBy is always a string for regular properties\n\t\t\t\t\t\t\tif (property.inversedBy && typeof property.inversedBy === 'object' && property.inversedBy.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].inversedBy = property.inversedBy.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Ensure inversedBy is always a string for array items\n\t\t\t\t\t\t\tif (property.items && property.items.inversedBy && typeof property.items.inversedBy === 'object' && property.items.inversedBy.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.inversedBy = property.items.inversedBy.id\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tthis.checkPropertiesModified()\n\t\t\t},\n\n\t\t\tdeep: true,\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tfindSchemaBySlug(schemaSlug) {\n\t\t\tif (!schemaSlug) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn this.availableSchemas.find((schema) => (schema.slug && schema.slug.toLowerCase() === schemaSlug.toLowerCase())\n\t\t\t\t|| schema.id === schemaSlug\n\t\t\t\t|| schema.title === schemaSlug)\n\t\t},\n\n\t\tensureRefIsString(obj, key) {\n\t\t\tif (!obj || !key) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (obj[key] && typeof obj[key].$ref === 'object' && obj[key].$ref !== null) {\n\t\t\t\tif (obj[key].$ref.id) {\n\t\t\t\t\tobj[key].$ref = obj[key].$ref.id\n\t\t\t\t} else {\n\t\t\t\t\tobj[key].$ref = ''\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (obj[key] && obj[key].items && typeof obj[key].items.$ref === 'object' && obj[key].items.$ref !== null) {\n\t\t\t\tif (obj[key].items.$ref.id) {\n\t\t\t\t\tobj[key].items.$ref = obj[key].items.$ref.id\n\t\t\t\t} else {\n\t\t\t\t\tobj[key].items.$ref = ''\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tinitializeSchemaItem() {\n\t\t\t// Reset CnTabbedFormDialog state if available (not yet mounted on first call)\n\t\t\tif (this.$refs.dialog) {\n\t\t\t\tthis.$refs.dialog.resetDialog()\n\t\t\t}\n\n\t\t\t// Always rebuild schemaItem from defaults + incoming item. This handles\n\t\t\t// create mode (item null), edit mode (item with id), and extend mode\n\t\t\t// (item non-null with no id) without leaking stale state across opens.\n\t\t\tconst defaults = {\n\t\t\t\ttitle: '',\n\t\t\t\tversion: '0.0.0',\n\t\t\t\tdescription: '',\n\t\t\t\tsummary: '',\n\t\t\t\tslug: '',\n\t\t\t\tproperties: {},\n\t\t\t\tconfiguration: {\n\t\t\t\t\tobjectNameField: '',\n\t\t\t\t\tobjectDescriptionField: '',\n\t\t\t\t\tobjectImageField: '',\n\t\t\t\t\tobjectSummaryField: '',\n\t\t\t\t\tallowFiles: false,\n\t\t\t\t\tallowedTags: [],\n\t\t\t\t\tautoPublish: false,\n\t\t\t\t\tdefaultAutoShare: false,\n\t\t\t\t},\n\n\t\t\t\tauthorization: {},\n\t\t\t\thardValidation: false,\n\t\t\t\timmutable: false,\n\t\t\t\tsearchable: true,\n\t\t\t\ticon: null,\n\t\t\t\tmaxDepth: 0,\n\t\t\t}\n\t\t\tthis.schemaItem = this.item\n\t\t\t\t? { ...defaults, ...JSON.parse(JSON.stringify(this.item)) }\n\t\t\t\t: { ...defaults }\n\n\t\t\t// Ensure configuration object has all expected keys (the spread above may\n\t\t\t// have replaced our defaults with a partial configuration from the item)\n\t\t\tif (!this.schemaItem.configuration) {\n\t\t\t\tthis.schemaItem.configuration = { ...defaults.configuration }\n\t\t\t} else {\n\t\t\t\tif (!this.schemaItem.configuration.objectNameField) {\n\t\t\t\t\tthis.schemaItem.configuration.objectNameField = ''\n\t\t\t\t}\n\t\t\t\tif (!this.schemaItem.configuration.objectDescriptionField) {\n\t\t\t\t\tthis.schemaItem.configuration.objectDescriptionField = ''\n\t\t\t\t}\n\t\t\t\tif (!this.schemaItem.configuration.objectImageField) {\n\t\t\t\t\tthis.schemaItem.configuration.objectImageField = ''\n\t\t\t\t}\n\t\t\t\tif (!this.schemaItem.configuration.objectSummaryField) {\n\t\t\t\t\tthis.schemaItem.configuration.objectSummaryField = ''\n\t\t\t\t}\n\t\t\t\tif (this.schemaItem.configuration.allowFiles === undefined) {\n\t\t\t\t\tthis.schemaItem.configuration.allowFiles = false\n\t\t\t\t}\n\t\t\t\tif (!this.schemaItem.configuration.allowedTags) {\n\t\t\t\t\tthis.schemaItem.configuration.allowedTags = []\n\t\t\t\t}\n\t\t\t\tif (this.schemaItem.configuration.autoPublish === undefined) {\n\t\t\t\t\tthis.schemaItem.configuration.autoPublish = false\n\t\t\t\t}\n\t\t\t\tif (this.schemaItem.configuration.defaultAutoShare === undefined) {\n\t\t\t\t\tthis.schemaItem.configuration.defaultAutoShare = false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure authorization object exists\n\t\t\tif (!this.schemaItem.authorization) {\n\t\t\t\tthis.schemaItem.authorization = {}\n\t\t\t}\n\n\t\t\t// Ensure existing properties have facetable set to false by default\n\t\t\tObject.keys(this.schemaItem.properties || {}).forEach((key) => {\n\t\t\t\tif (this.schemaItem.properties[key].facetable === undefined) {\n\t\t\t\t\tthis.schemaItem.properties[key].facetable = false\n\t\t\t\t}\n\n\t\t\t\tif (this.schemaItem.properties[key].enum && Array.isArray(this.schemaItem.properties[key].enum)) {\n\t\t\t\t\tthis.schemaItem.properties[key].enum = [...this.schemaItem.properties[key].enum]\n\t\t\t\t}\n\n\t\t\t\tconst property = this.schemaItem.properties[key]\n\t\t\t\tif (property.type === 'array' && property.items && property.items.type === 'object' && !property.items.objectConfiguration) {\n\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration = { handling: 'nested-object' }\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// Ensure all $ref values are strings and migrate old structure\n\t\t\tObject.keys(this.schemaItem.properties || {}).forEach((key) => {\n\t\t\t\tthis.ensureRefIsString(this.schemaItem.properties, key)\n\t\t\t\tthis.migratePropertyToNewStructure(key)\n\t\t\t})\n\n\t\t\t// Snapshot original properties for change detection. For new/extending\n\t\t\t// items (no id), there's no \"original\" — start empty so any added\n\t\t\t// properties register as modifications.\n\t\t\tthis.originalProperties = this.schemaItem.id\n\t\t\t\t? JSON.parse(JSON.stringify(this.schemaItem.properties || {}))\n\t\t\t\t: {}\n\n\t\t\tthis.propertiesModified = false\n\t\t},\n\n\t\tcheckPropertiesModified() {\n\t\t\tif (!this.originalProperties) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst currentProperties = JSON.stringify(this.schemaItem.properties || {})\n\t\t\tconst originalProperties = JSON.stringify(this.originalProperties)\n\n\t\t\tthis.propertiesModified = currentProperties !== originalProperties\n\t\t},\n\n\t\tasync copyToClipboard(text) {\n\t\t\ttry {\n\t\t\t\tawait navigator.clipboard.writeText(text)\n\t\t\t\tthis.isCopied = true\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isCopied = false\n\t\t\t\t}, 2000)\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console -- the failure is already handled; the console is the only channel a host app can read the detail on\n\t\t\t\tconsole.error('Failed to copy text:', err)\n\t\t\t}\n\t\t},\n\n\t\taddProperty() {\n\t\t\tthis.schemaItem.properties[''] = {\n\t\t\t\ttype: 'string',\n\t\t\t\tformat: '',\n\t\t\t\ttitle: '',\n\t\t\t\tdescription: '',\n\t\t\t\tfacetable: false,\n\t\t\t}\n\n\t\t\tthis.checkPropertiesModified()\n\t\t\tthis.selectedProperty = ''\n\t\t},\n\n\t\tupdatePropertyKey(oldKey, newKey) {\n\t\t\tif (newKey === oldKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.schemaItem.properties[newKey] !== undefined && newKey !== oldKey) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst propertyData = { ...this.schemaItem.properties[oldKey] }\n\n\t\t\tthis.schemaItem.properties[newKey] = propertyData\n\t\t\tdelete this.schemaItem.properties[oldKey]\n\n\t\t\tthis.selectedProperty = newKey\n\t\t\tthis.checkPropertiesModified()\n\t\t},\n\n\t\tdeleteProperty(key) {\n\t\t\tdelete this.schemaItem.properties[key]\n\n\t\t\tif (this.selectedProperty === key) {\n\t\t\t\tthis.selectedProperty = null\n\t\t\t}\n\n\t\t\tthis.checkPropertiesModified()\n\t\t},\n\n\t\tcopyProperty(key) {\n\t\t\tif (this.schemaItem.properties[key]) {\n\t\t\t\tconst originalProperty = JSON.parse(JSON.stringify(this.schemaItem.properties[key]))\n\n\t\t\t\tlet newPropertyName = `${key}_copy`\n\t\t\t\tlet counter = 1\n\n\t\t\t\twhile (this.schemaItem.properties[newPropertyName]) {\n\t\t\t\t\tcounter++\n\t\t\t\t\tnewPropertyName = `${key}_copy_${counter}`\n\t\t\t\t}\n\n\t\t\t\tconst originalTitle = originalProperty.title || key\n\t\t\t\tthis.schemaItem.properties[newPropertyName] = {\n\t\t\t\t\t...originalProperty,\n\t\t\t\t\ttitle: `${originalTitle} (copy)`,\n\t\t\t\t}\n\n\t\t\t\tthis.checkPropertiesModified()\n\t\t\t\tthis.selectedProperty = newPropertyName\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle confirm from CnTabbedFormDialog.\n\t\t * Cleans schema data and emits confirm with the cleaned payload.\n\t\t */\n\t\thandleConfirm() {\n\t\t\tconst cleanedSchemaItem = JSON.parse(JSON.stringify(this.schemaItem))\n\t\t\tObject.keys(cleanedSchemaItem.properties || {}).forEach((key) => {\n\t\t\t\tthis.ensureRefIsString(cleanedSchemaItem.properties, key)\n\n\t\t\t\tif (cleanedSchemaItem.properties[key].register\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].objectConfiguration\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].objectConfiguration.register) {\n\t\t\t\t\tdelete cleanedSchemaItem.properties[key].register\n\t\t\t\t}\n\n\t\t\t\tif (cleanedSchemaItem.properties[key].items\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].items.register\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].items.objectConfiguration\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].items.objectConfiguration.register) {\n\t\t\t\t\tdelete cleanedSchemaItem.properties[key].items.register\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// NcSelect (track-by=\"id\") can convert plain IDs to full option objects.\n\t\t\t// Normalise back to plain IDs before emitting so the backend always gets scalars.\n\t\t\tfor (const field of ['allOf', 'oneOf', 'anyOf']) {\n\t\t\t\tif (Array.isArray(cleanedSchemaItem[field])) {\n\t\t\t\t\tcleanedSchemaItem[field] = cleanedSchemaItem[field]\n\t\t\t\t\t\t.map((ref) => (typeof ref === 'object' && ref !== null ? ref.id : ref))\n\t\t\t\t\t\t.filter((id) => id !== null && id !== undefined && id !== '')\n\t\t\t\t\tif (cleanedSchemaItem[field].length === 0) {\n\t\t\t\t\t\tdelete cleanedSchemaItem[field]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.$emit('confirm', cleanedSchemaItem)\n\t\t},\n\n\t\t/**\n\t\t * Set the result of the save operation. Call this from the parent\n\t\t * after the API call completes.\n\t\t *\n\t\t * @param {{ success?: boolean, error?: string }} resultData - result data\n\t\t * @public\n\t\t */\n\t\tsetResult(resultData) {\n\t\t\tthis.$refs.dialog.setResult(resultData)\n\t\t\tif (resultData.success) {\n\t\t\t\tthis.originalProperties = JSON.parse(JSON.stringify(this.schemaItem.properties || {}))\n\t\t\t\tthis.propertiesModified = false\n\t\t\t}\n\t\t},\n\n\t\tmigratePropertyToNewStructure(key) {\n\t\t\tif (!this.schemaItem.properties[key]) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst property = this.schemaItem.properties[key]\n\n\t\t\tif (property.$ref && property.register && !property.objectConfiguration?.register) {\n\t\t\t\tif (!property.objectConfiguration) {\n\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration = { handling: 'related-object' }\n\t\t\t\t}\n\n\t\t\t\tconst registerId = typeof property.register === 'object' && property.register.id\n\t\t\t\t\t? property.register.id\n\t\t\t\t\t: property.register\n\n\t\t\t\tthis.schemaItem.properties[key].objectConfiguration.register = registerId\n\n\t\t\t\tif (property.$ref) {\n\t\t\t\t\tlet schemaSlug = property.$ref\n\t\t\t\t\tif (schemaSlug.includes('/')) {\n\t\t\t\t\t\tschemaSlug = schemaSlug.substring(schemaSlug.lastIndexOf('/') + 1)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst referencedSchema = this.findSchemaBySlug(schemaSlug)\n\t\t\t\t\tif (referencedSchema) {\n\t\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration.schema = referencedSchema.id\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (property.items && property.items.$ref && property.items.register && !property.items.objectConfiguration?.register) {\n\t\t\t\tif (!property.items.objectConfiguration) {\n\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration = { handling: 'related-object' }\n\t\t\t\t}\n\n\t\t\t\tconst registerId = typeof property.items.register === 'object' && property.items.register.id\n\t\t\t\t\t? property.items.register.id\n\t\t\t\t\t: property.items.register\n\n\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration.register = registerId\n\n\t\t\t\tif (property.items.$ref) {\n\t\t\t\t\tlet schemaSlug = property.items.$ref\n\t\t\t\t\tif (schemaSlug.includes('/')) {\n\t\t\t\t\t\tschemaSlug = schemaSlug.substring(schemaSlug.lastIndexOf('/') + 1)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst referencedSchema = this.findSchemaBySlug(schemaSlug)\n\t\t\t\t\tif (referencedSchema) {\n\t\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration.schema = referencedSchema.id\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n"],"names":["CnTabbedFormDialog","CnSchemaPropertiesTab","CnSchemaConfigurationTab","CnSchemaSecurityTab","t"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CnSchemaFormDialog.vue2.js","sources":["../../../../src/components/CnSchemaFormDialog/CnSchemaFormDialog.vue"],"sourcesContent":["<template>\n\t<CnTabbedFormDialog\n\t\tref=\"dialog\"\n\t\t:look=\"look\"\n\t\t:width=\"width\"\n\t\t:eyebrow=\"eyebrow\"\n\t\t:subtitle=\"subtitle\"\n\t\t:tabs=\"dialogTabs\"\n\t\t:item=\"item\"\n\t\t:dialogTitle=\"dialogTitle\"\n\t\tentityName=\"Schema\"\n\t\t:size=\"size\"\n\t\t:disableSave=\"!!saveDisabledReason\"\n\t\t:disableSaveTooltip=\"saveDisabledReason\"\n\t\t:successText=\"resolvedSuccessText\"\n\t\t:cancelLabel=\"cancelLabel\"\n\t\t:closeLabel=\"closeLabel\"\n\t\t:confirmLabel=\"confirmLabel\"\n\t\t@confirm=\"handleConfirm\"\n\t\t@close=\"$emit('close')\">\n\t\t<!-- Metadata Display -->\n\t\t<template #above-tabs=\"{ loading: dialogLoading }\">\n\t\t\t<div class=\"cn-schema-form__detail-grid\">\n\t\t\t\t<div v-if=\"schemaItem.id\"\n\t\t\t\t\tclass=\"cn-schema-form__detail-item cn-schema-form__id-card\">\n\t\t\t\t\t<div class=\"cn-schema-form__id-card-header\">\n\t\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'ID / UUID:') }}</span>\n\t\t\t\t\t\t<NcButton class=\"cn-schema-form__copy-button\"\n\t\t\t\t\t\t\t@click=\"copyToClipboard(schemaItem.uuid || schemaItem.id)\">\n\t\t\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t\t\t<Check v-if=\"isCopied\" :size=\"20\" />\n\t\t\t\t\t\t\t\t<ContentCopy v-else :size=\"20\" />\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t{{ isCopied ? t('nextcloud-vue', 'Copied') : t('nextcloud-vue', 'Copy') }}\n\t\t\t\t\t\t</NcButton>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ schemaItem.id }}</span>\n\t\t\t\t\t<span v-if=\"schemaItem.uuid && schemaItem.uuid !== schemaItem.id\"\n\t\t\t\t\t\tclass=\"cn-schema-form__detail-value cn-schema-form__uuid-value\">{{ schemaItem.uuid }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"cn-schema-form__detail-item cn-schema-form__title-with-badge\">\n\t\t\t\t\t<NcTextField v-model=\"schemaItem.title\"\n\t\t\t\t\t\t:disabled=\"dialogLoading\"\n\t\t\t\t\t\t:label=\"t('nextcloud-vue', 'Title *')\" />\n\t\t\t\t\t<span v-if=\"schemaItem.allOf && schemaItem.allOf.length > 0\"\n\t\t\t\t\t\tclass=\"cn-schema-form__statusPill cn-schema-form__statusPill--success\">\n\t\t\t\t\t\tallOf\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-if=\"schemaItem.oneOf && schemaItem.oneOf.length > 0\"\n\t\t\t\t\t\tclass=\"cn-schema-form__statusPill cn-schema-form__statusPill--info\">\n\t\t\t\t\t\toneOf\n\t\t\t\t\t</span>\n\t\t\t\t\t<span v-if=\"schemaItem.anyOf && schemaItem.anyOf.length > 0\"\n\t\t\t\t\t\tclass=\"cn-schema-form__statusPill cn-schema-form__statusPill--info\">\n\t\t\t\t\t\tanyOf\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"schemaItem.created\" class=\"cn-schema-form__detail-item\">\n\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'Created:') }}</span>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ new Date(schemaItem.created).toLocaleString(userLocale()) }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"schemaItem.updated\" class=\"cn-schema-form__detail-item\">\n\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'Updated:') }}</span>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ new Date(schemaItem.updated).toLocaleString(userLocale()) }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"cn-schema-form__detail-item\">\n\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'Version:') }}</span>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ schemaItem.version || t('nextcloud-vue', 'Not set') }}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"cn-schema-form__detail-item\">\n\t\t\t\t\t<span class=\"cn-schema-form__detail-label\">{{ t('nextcloud-vue', 'Owner:') }}</span>\n\t\t\t\t\t<span class=\"cn-schema-form__detail-value\">{{ schemaItem.owner || t('nextcloud-vue', 'Not set') }}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</template>\n\n\t\t<!-- Properties Tab -->\n\t\t<template #tab-properties=\"{ loading: dialogLoading }\">\n\t\t\t<CnSchemaPropertiesTab\n\t\t\t\t:schemaItem=\"schemaItem\"\n\t\t\t\t:loading=\"dialogLoading\"\n\t\t\t\t:selectedProperty=\"selectedProperty\"\n\t\t\t\t:propertiesModified=\"propertiesModified\"\n\t\t\t\t:originalProperties=\"originalProperties\"\n\t\t\t\t:inheritedProperties=\"inheritedProperties\"\n\t\t\t\t:typeOptionsForSelect=\"typeOptionsForSelect\"\n\t\t\t\t:availableSchemas=\"availableSchemas\"\n\t\t\t\t:availableRegisters=\"availableRegisters\"\n\t\t\t\t:availableTagsOptions=\"availableTagsOptions\"\n\t\t\t\t:userGroups=\"userGroups\"\n\t\t\t\t:sortedUserGroups=\"sortedUserGroups\"\n\t\t\t\t:loadingGroups=\"loadingGroups\"\n\t\t\t\t@addProperty=\"addProperty\"\n\t\t\t\t@update:selectedProperty=\"selectedProperty = $event\"\n\t\t\t\t@update:propertyKey=\"updatePropertyKey($event.oldKey, $event.newKey)\"\n\t\t\t\t@copyProperty=\"copyProperty\"\n\t\t\t\t@deleteProperty=\"deleteProperty\" />\n\t\t</template>\n\n\t\t<!-- Configuration Tab -->\n\t\t<template #tab-configuration=\"{ loading: dialogLoading }\">\n\t\t\t<CnSchemaConfigurationTab\n\t\t\t\t:schemaItem=\"schemaItem\"\n\t\t\t\t:loading=\"dialogLoading\"\n\t\t\t\t:availableSchemas=\"availableSchemas\"\n\t\t\t\t:propertyOptions=\"propertyOptions\"\n\t\t\t\t:allOfSchemaNames=\"allOfSchemaNames\" />\n\t\t</template>\n\n\t\t<!-- Security Tab -->\n\t\t<template #tab-security>\n\t\t\t<CnSchemaSecurityTab\n\t\t\t\t:schemaItem=\"schemaItem\"\n\t\t\t\t:userGroups=\"userGroups\"\n\t\t\t\t:sortedUserGroups=\"sortedUserGroups\"\n\t\t\t\t:loadingGroups=\"loadingGroups\"\n\t\t\t\t:hasAnyPermissions=\"hasAnyPermissions\"\n\t\t\t\t:isRestrictiveSchema=\"isRestrictiveSchema\"\n\t\t\t\t:inheritedProperties=\"inheritedProperties\" />\n\t\t</template>\n\n\t\t<!-- Optional Action Buttons (edit mode only) -->\n\t\t<template #actions-right=\"{ loading: dialogLoading, isCreateMode, result: dialogResult }\">\n\t\t\t<template v-if=\"!isCreateMode && dialogResult === null\">\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showExtendSchema\"\n\t\t\t\t\t:disabled=\"dialogLoading\"\n\t\t\t\t\t@click=\"$emit('extend-schema')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<CallSplit :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ extendSchemaLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showAnalyzeProperties\"\n\t\t\t\t\t:disabled=\"dialogLoading\"\n\t\t\t\t\t@click=\"$emit('analyze-properties')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<DatabaseSearch :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ analyzePropertiesLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showValidateObjects\"\n\t\t\t\t\t:disabled=\"dialogLoading\"\n\t\t\t\t\t@click=\"$emit('validate-objects')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<CheckCircle :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ validateObjectsLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showDeleteObjects\"\n\t\t\t\t\t:title=\"objectCount > 0 ? deleteObjectsTooltip : noDeleteObjectsTooltip\"\n\t\t\t\t\t:disabled=\"dialogLoading || objectCount === 0\"\n\t\t\t\t\t@click=\"$emit('delete-objects')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<DeleteSweep :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ deleteObjectsLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showPublishObjects\"\n\t\t\t\t\t:title=\"objectCount > 0 ? publishObjectsTooltip : noPublishObjectsTooltip\"\n\t\t\t\t\t:disabled=\"dialogLoading || objectCount === 0\"\n\t\t\t\t\t@click=\"$emit('publish-objects')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<Upload :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ publishObjectsLabel }}\n\t\t\t\t</NcButton>\n\t\t\t\t<NcButton\n\t\t\t\t\tv-if=\"showDelete\"\n\t\t\t\t\t:title=\"objectCount > 0 ? cannotDeleteTooltip : ''\"\n\t\t\t\t\t:disabled=\"dialogLoading || objectCount > 0\"\n\t\t\t\t\tvariant=\"error\"\n\t\t\t\t\t@click=\"$emit('delete-schema')\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<TrashCanOutline :size=\"20\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ deleteLabel }}\n\t\t\t\t</NcButton>\n\t\t\t</template>\n\t\t</template>\n\t</CnTabbedFormDialog>\n</template>\n\n<script>\nimport { translate as t } from '@nextcloud/l10n'\nimport {\n\tNcButton,\n\tNcTextField,\n} from '@nextcloud/vue'\nimport CallSplit from 'vue-material-design-icons/CallSplit.vue'\nimport Check from 'vue-material-design-icons/Check.vue'\nimport CheckCircle from 'vue-material-design-icons/CheckCircle.vue'\nimport ContentCopy from 'vue-material-design-icons/ContentCopy.vue'\nimport DatabaseSearch from 'vue-material-design-icons/DatabaseSearch.vue'\nimport DeleteSweep from 'vue-material-design-icons/DeleteSweep.vue'\nimport TrashCanOutline from 'vue-material-design-icons/TrashCanOutline.vue'\nimport Upload from 'vue-material-design-icons/Upload.vue'\nimport CnTabbedFormDialog from '../CnTabbedFormDialog/CnTabbedFormDialog.vue'\nimport CnSchemaConfigurationTab from './CnSchemaConfigurationTab.vue'\nimport CnSchemaPropertiesTab from './CnSchemaPropertiesTab.vue'\nimport CnSchemaSecurityTab from './CnSchemaSecurityTab.vue'\nimport { dialogBoardMixin } from '../../mixins/dialogBoard.js'\nimport { userLocale } from '../../utils/userLocale.js'\n\n/**\n * CnSchemaFormDialog — Generic JSON Schema editor dialog.\n *\n * Provides a full-featured form for creating and editing JSON Schemas with\n * properties table, configuration, and security (RBAC) tabs. Uses CnTabbedFormDialog.\n *\n * The dialog does NOT perform saves — it emits a `confirm` event with the schema data.\n * The parent performs the actual API call and calls `setResult()` via a ref.\n *\n * @event confirm Emitted when the user confirms. Payload: cleaned schema data object.\n * @event close Emitted when the dialog should be closed.\n * @event extend-schema Emitted when the Extend Schema button is clicked.\n * @event analyze-properties Emitted when the Analyze Properties button is clicked.\n * @event validate-objects Emitted when the Validate Objects button is clicked.\n * @event delete-objects Emitted when the Delete Objects button is clicked.\n * @event publish-objects Emitted when the Publish Objects button is clicked.\n * @event delete-schema Emitted when the Delete button is clicked.\n */\nexport default {\n\tname: 'CnSchemaFormDialog',\n\tcomponents: {\n\t\tNcTextField,\n\t\tNcButton,\n\t\tCnTabbedFormDialog,\n\t\tCnSchemaPropertiesTab,\n\t\tCnSchemaConfigurationTab,\n\t\tCnSchemaSecurityTab,\n\t\t// Icons\n\t\tContentCopy,\n\t\tCheck,\n\t\tTrashCanOutline,\n\t\tCallSplit,\n\t\tDatabaseSearch,\n\t\tCheckCircle,\n\t\tDeleteSweep,\n\t\tUpload,\n\t},\n\n\tmixins: [dialogBoardMixin],\n\n\tprops: {\n\t\t/** Existing schema item for edit mode. Pass null for create mode. */\n\t\titem: { type: Object, default: null },\n\t\t/** Dialog title. Defaults to \"Create Schema\" or \"Edit Schema\". */\n\t\tdialogTitle: { type: String, default: '' },\n\t\t/** NcDialog size */\n\t\tsize: { type: String, default: 'large' },\n\t\t/** Available schemas for references and composition. Array of { id, title, description, reference } */\n\t\tavailableSchemas: { type: Array, default: () => [] },\n\t\t/** Available registers. Array of { id, label } */\n\t\tavailableRegisters: { type: Array, default: () => [] },\n\t\t/** User groups for RBAC. Array of { id, displayname } */\n\t\tuserGroups: { type: Array, default: () => [] },\n\t\t/** Available tags for file property configuration */\n\t\tavailableTags: { type: Array, default: () => [] },\n\t\t/** Whether user groups are still loading */\n\t\tloadingGroups: { type: Boolean, default: false },\n\t\t/** Properties inherited from parent schemas (allOf) — shown as locked rows in the properties tab */\n\t\tinheritedProperties: { type: Object, default: () => ({}) },\n\t\t/** Number of objects attached to this schema (used for action button disable logic) */\n\t\tobjectCount: { type: Number, default: 0 },\n\t\t// Optional action button visibility\n\t\t/** Show \"Extend Schema\" button */\n\t\tshowExtendSchema: { type: Boolean, default: false },\n\t\t/** Show \"Analyze Properties\" button */\n\t\tshowAnalyzeProperties: { type: Boolean, default: false },\n\t\t/** Show \"Validate Objects\" button */\n\t\tshowValidateObjects: { type: Boolean, default: false },\n\t\t/** Show \"Delete Objects\" button */\n\t\tshowDeleteObjects: { type: Boolean, default: false },\n\t\t/** Show \"Publish Objects\" button */\n\t\tshowPublishObjects: { type: Boolean, default: false },\n\t\t/** Show \"Delete\" button */\n\t\tshowDelete: { type: Boolean, default: false },\n\t\t// Labels (pre-translated strings with English defaults)\n\t\t/** Label for the cancel button shown while editing. */\n\t\tcancelLabel: { type: String, default: () => t('nextcloud-vue', 'Cancel') },\n\t\t/** Label for the close button shown after a save or error. */\n\t\tcloseLabel: { type: String, default: () => t('nextcloud-vue', 'Close') },\n\t\t/** Confirm button label. Defaults to \"Create\" or \"Save\". */\n\t\tconfirmLabel: { type: String, default: '' },\n\t\t/** Success message. Defaults to \"Schema saved successfully.\" */\n\t\tsuccessText: { type: String, default: '' },\n\t\t/** Label for the Extend Schema action button. */\n\t\textendSchemaLabel: { type: String, default: () => t('nextcloud-vue', 'Extend schema') },\n\t\t/** Label for the Analyze Properties action button. */\n\t\tanalyzePropertiesLabel: { type: String, default: () => t('nextcloud-vue', 'Analyze properties') },\n\t\t/** Label for the Validate Objects action button. */\n\t\tvalidateObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Validate objects') },\n\t\t/** Label for the Delete Objects action button. */\n\t\tdeleteObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Delete objects') },\n\t\t/** Label for the Publish Objects action button. */\n\t\tpublishObjectsLabel: { type: String, default: () => t('nextcloud-vue', 'Publish objects') },\n\t\t/** Label for the Delete schema button shown in edit mode. */\n\t\tdeleteLabel: { type: String, default: () => t('nextcloud-vue', 'Delete') },\n\t\t/** Tooltip for the Delete Objects button when objects exist. */\n\t\tdeleteObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'Delete all objects in this schema') },\n\t\t/** Tooltip for the Publish Objects button when objects exist. */\n\t\tpublishObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'Publish all objects in this schema') },\n\t\t/** Tooltip for the Delete Objects button when no objects exist */\n\t\tnoDeleteObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'No objects to delete') },\n\t\t/** Tooltip for the Publish Objects button when no objects exist */\n\t\tnoPublishObjectsTooltip: { type: String, default: () => t('nextcloud-vue', 'No objects to publish') },\n\t\t/** Tooltip for the Delete schema button while objects are still attached. */\n\t\tcannotDeleteTooltip: { type: String, default: () => t('nextcloud-vue', 'Cannot delete: objects are still attached') },\n\t},\n\n\temits: [\n\t\t'analyze-properties',\n\t\t'close',\n\t\t'confirm',\n\t\t'delete-objects',\n\t\t'delete-schema',\n\t\t'extend-schema',\n\t\t'publish-objects',\n\t\t'validate-objects',\n\t],\n\n\tdata() {\n\t\treturn {\n\t\t\tisCopied: false,\n\t\t\tselectedProperty: null,\n\t\t\tpropertiesModified: false,\n\t\t\toriginalProperties: null,\n\t\t\tschemaItem: {\n\t\t\t\ttitle: '',\n\t\t\t\tversion: '0.0.0',\n\t\t\t\tdescription: '',\n\t\t\t\tsummary: '',\n\t\t\t\tslug: '',\n\t\t\t\tproperties: {},\n\t\t\t\tconfiguration: {\n\t\t\t\t\tobjectNameField: '',\n\t\t\t\t\tobjectDescriptionField: '',\n\t\t\t\t\tobjectImageField: '',\n\t\t\t\t\tobjectSummaryField: '',\n\t\t\t\t\tallowFiles: false,\n\t\t\t\t\tallowedTags: [],\n\t\t\t\t\tautoPublish: false,\n\t\t\t\t\tdefaultAutoShare: false,\n\t\t\t\t},\n\n\t\t\t\tauthorization: {},\n\t\t\t\thardValidation: false,\n\t\t\t\timmutable: false,\n\t\t\t\tsearchable: true,\n\t\t\t\ticon: null,\n\t\t\t\tmaxDepth: 0,\n\t\t\t},\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * Tab definitions for CnTabbedFormDialog.\n\t\t *\n\t\t * @return {Array} Tab configuration\n\t\t */\n\t\tdialogTabs() {\n\t\t\treturn [\n\t\t\t\t{ id: 'properties', title: t('nextcloud-vue', 'Properties') },\n\t\t\t\t{ id: 'configuration', title: t('nextcloud-vue', 'Configuration') },\n\t\t\t\t{ id: 'security', title: t('nextcloud-vue', 'Security') },\n\t\t\t]\n\t\t},\n\n\t\tsortedUserGroups() {\n\t\t\treturn this.userGroups\n\t\t\t\t.filter((group) => group.id !== 'admin' && group.id !== 'public' && group.id !== 'authenticated')\n\t\t\t\t.sort((a, b) => {\n\t\t\t\t\tconst nameA = a.displayname || a.id\n\t\t\t\t\tconst nameB = b.displayname || b.id\n\t\t\t\t\treturn nameA.localeCompare(nameB)\n\t\t\t\t})\n\t\t},\n\n\t\thasAnyPermissions() {\n\t\t\tconst auth = this.schemaItem.authorization || {}\n\t\t\treturn Object.keys(auth).some((action) => Array.isArray(auth[action]) && auth[action].length > 0)\n\t\t},\n\n\t\tisRestrictiveSchema() {\n\t\t\tconst auth = this.schemaItem.authorization || {}\n\t\t\tconst actions = ['create', 'read', 'update', 'delete']\n\t\t\treturn actions.some((action) => Array.isArray(auth[action]) && auth[action].length > 0\n\t\t\t\t&& !auth[action].includes('public'))\n\t\t},\n\n\t\ttypeOptionsForSelect() {\n\t\t\treturn [\n\t\t\t\t{ id: 'string', label: t('nextcloud-vue', 'String') },\n\t\t\t\t{ id: 'number', label: t('nextcloud-vue', 'Number') },\n\t\t\t\t{ id: 'integer', label: t('nextcloud-vue', 'Integer') },\n\t\t\t\t{ id: 'boolean', label: t('nextcloud-vue', 'Boolean') },\n\t\t\t\t{ id: 'array', label: t('nextcloud-vue', 'Array') },\n\t\t\t\t{ id: 'object', label: t('nextcloud-vue', 'Object') },\n\t\t\t\t{ id: 'dictionary', label: t('nextcloud-vue', 'Dictionary') },\n\t\t\t\t{ id: 'file', label: t('nextcloud-vue', 'File') },\n\t\t\t\t{ id: 'oneOf', label: t('nextcloud-vue', 'One of') },\n\t\t\t]\n\t\t},\n\n\t\tpropertyOptions() {\n\t\t\tconst ownKeys = Object.keys(this.schemaItem.properties || {}).filter((k) => k !== '')\n\t\t\tconst inheritedKeys = Object.keys(this.inheritedProperties || {}).filter((k) => k !== '')\n\t\t\treturn [...new Set([...inheritedKeys, ...ownKeys])]\n\t\t},\n\n\t\tavailableTagsOptions() {\n\t\t\treturn this.availableTags.map((tag) => ({\n\t\t\t\tid: tag,\n\t\t\t\tlabel: tag,\n\t\t\t}))\n\t\t},\n\n\t\t/**\n\t\t * Resolved success text for backwards compatibility (includes trailing period).\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tresolvedSuccessText() {\n\t\t\tif (this.successText) {\n\t\t\t\treturn this.successText\n\t\t\t}\n\t\t\treturn t('nextcloud-vue', '{title} saved successfully.', { title: t('nextcloud-vue', 'Schema') })\n\t\t},\n\n\t\t/**\n\t\t * Returns a human-readable reason the save button is disabled, or '' when saving is allowed.\n\t\t * Used for both :disable-save and the WCAG tooltip/aria-label on the button.\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tsaveDisabledReason() {\n\t\t\tif (!this.schemaItem.title) {\n\t\t\t\treturn t('nextcloud-vue', 'A schema title is required before saving')\n\t\t\t}\n\t\t\tconst hasUnnamedProperty = Object.keys(this.schemaItem.properties || {}).some((key) => key === '')\n\t\t\tif (hasUnnamedProperty) {\n\t\t\t\treturn t('nextcloud-vue', 'All properties must have a name before saving')\n\t\t\t}\n\t\t\treturn ''\n\t\t},\n\n\t\tallOfSchemaNames() {\n\t\t\tif (!this.schemaItem.allOf || !Array.isArray(this.schemaItem.allOf) || this.schemaItem.allOf.length === 0) {\n\t\t\t\treturn []\n\t\t\t}\n\n\t\t\treturn this.schemaItem.allOf\n\t\t\t\t.map((ref) => {\n\t\t\t\t\tconst schemaId = typeof ref === 'object' ? ref.id : ref\n\t\t\t\t\tconst schema = this.availableSchemas.find((s) => s.id === schemaId)\n\t\t\t\t\treturn schema ? (schema.title || `Schema ${schema.id}`) : schemaId\n\t\t\t\t})\n\t\t\t\t.filter((name) => name)\n\t\t},\n\t},\n\n\twatch: {\n\t\titem: {\n\t\t\timmediate: true,\n\t\t\thandler() {\n\t\t\t\tthis.initializeSchemaItem()\n\t\t\t},\n\t\t},\n\n\t\t'schemaItem.properties': {\n\t\t\thandler(newProperties) {\n\t\t\t\tif (newProperties) {\n\t\t\t\t\tObject.keys(newProperties).forEach((key) => {\n\t\t\t\t\t\tconst property = newProperties[key]\n\t\t\t\t\t\tif (property) {\n\t\t\t\t\t\t\t// Initialize nested objects if they don't exist\n\t\t\t\t\t\t\tif (property.type === 'array' && !property.items) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items = { type: 'string' }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (property.type === 'object' && !property.objectConfiguration) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration = { handling: 'nested-object' }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (property.type === 'array' && property.items && property.items.type === 'object' && !property.items.objectConfiguration) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration = { handling: 'nested-object' }\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert property type from object to string\n\t\t\t\t\t\t\tif (property.type && typeof property.type === 'object' && property.type.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].type = property.type.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert property format from object to string\n\t\t\t\t\t\t\tif (property.format && typeof property.format === 'object' && property.format.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].format = property.format.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert array item type from object to string\n\t\t\t\t\t\t\tif (property.items && property.items.type && typeof property.items.type === 'object' && property.items.type.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.type = property.items.type.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert object handling from object to string\n\t\t\t\t\t\t\tif (property.objectConfiguration && property.objectConfiguration.handling\n\t\t\t\t\t\t\t\t&& typeof property.objectConfiguration.handling === 'object' && property.objectConfiguration.handling.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration.handling = property.objectConfiguration.handling.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert register from object to ID\n\t\t\t\t\t\t\tif (property.objectConfiguration && property.objectConfiguration.register\n\t\t\t\t\t\t\t\t&& typeof property.objectConfiguration.register === 'object' && property.objectConfiguration.register.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration.register = property.objectConfiguration.register.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert array item object handling from object to string\n\t\t\t\t\t\t\tif (property.items && property.items.objectConfiguration && property.items.objectConfiguration.handling\n\t\t\t\t\t\t\t\t&& typeof property.items.objectConfiguration.handling === 'object' && property.items.objectConfiguration.handling.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration.handling = property.items.objectConfiguration.handling.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Convert array item register from object to ID\n\t\t\t\t\t\t\tif (property.items && property.items.objectConfiguration && property.items.objectConfiguration.register\n\t\t\t\t\t\t\t\t&& typeof property.items.objectConfiguration.register === 'object' && property.items.objectConfiguration.register.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration.register = property.items.objectConfiguration.register.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Ensure $ref is always a string\n\t\t\t\t\t\t\tthis.ensureRefIsString(this.schemaItem.properties, key)\n\n\t\t\t\t\t\t\t// Ensure inversedBy is always a string for regular properties\n\t\t\t\t\t\t\tif (property.inversedBy && typeof property.inversedBy === 'object' && property.inversedBy.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].inversedBy = property.inversedBy.id\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Ensure inversedBy is always a string for array items\n\t\t\t\t\t\t\tif (property.items && property.items.inversedBy && typeof property.items.inversedBy === 'object' && property.items.inversedBy.id) {\n\t\t\t\t\t\t\t\tthis.schemaItem.properties[key].items.inversedBy = property.items.inversedBy.id\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tthis.checkPropertiesModified()\n\t\t\t},\n\n\t\t\tdeep: true,\n\t\t},\n\t},\n\n\tmethods: {\n\t\tt,\n\t\tuserLocale,\n\t\tfindSchemaBySlug(schemaSlug) {\n\t\t\tif (!schemaSlug) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn this.availableSchemas.find((schema) => (schema.slug && schema.slug.toLowerCase() === schemaSlug.toLowerCase())\n\t\t\t\t|| schema.id === schemaSlug\n\t\t\t\t|| schema.title === schemaSlug)\n\t\t},\n\n\t\tensureRefIsString(obj, key) {\n\t\t\tif (!obj || !key) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (obj[key] && typeof obj[key].$ref === 'object' && obj[key].$ref !== null) {\n\t\t\t\tif (obj[key].$ref.id) {\n\t\t\t\t\tobj[key].$ref = obj[key].$ref.id\n\t\t\t\t} else {\n\t\t\t\t\tobj[key].$ref = ''\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (obj[key] && obj[key].items && typeof obj[key].items.$ref === 'object' && obj[key].items.$ref !== null) {\n\t\t\t\tif (obj[key].items.$ref.id) {\n\t\t\t\t\tobj[key].items.$ref = obj[key].items.$ref.id\n\t\t\t\t} else {\n\t\t\t\t\tobj[key].items.$ref = ''\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tinitializeSchemaItem() {\n\t\t\t// Reset CnTabbedFormDialog state if available (not yet mounted on first call)\n\t\t\tif (this.$refs.dialog) {\n\t\t\t\tthis.$refs.dialog.resetDialog()\n\t\t\t}\n\n\t\t\t// Always rebuild schemaItem from defaults + incoming item. This handles\n\t\t\t// create mode (item null), edit mode (item with id), and extend mode\n\t\t\t// (item non-null with no id) without leaking stale state across opens.\n\t\t\tconst defaults = {\n\t\t\t\ttitle: '',\n\t\t\t\tversion: '0.0.0',\n\t\t\t\tdescription: '',\n\t\t\t\tsummary: '',\n\t\t\t\tslug: '',\n\t\t\t\tproperties: {},\n\t\t\t\tconfiguration: {\n\t\t\t\t\tobjectNameField: '',\n\t\t\t\t\tobjectDescriptionField: '',\n\t\t\t\t\tobjectImageField: '',\n\t\t\t\t\tobjectSummaryField: '',\n\t\t\t\t\tallowFiles: false,\n\t\t\t\t\tallowedTags: [],\n\t\t\t\t\tautoPublish: false,\n\t\t\t\t\tdefaultAutoShare: false,\n\t\t\t\t},\n\n\t\t\t\tauthorization: {},\n\t\t\t\thardValidation: false,\n\t\t\t\timmutable: false,\n\t\t\t\tsearchable: true,\n\t\t\t\ticon: null,\n\t\t\t\tmaxDepth: 0,\n\t\t\t}\n\t\t\tthis.schemaItem = this.item\n\t\t\t\t? { ...defaults, ...JSON.parse(JSON.stringify(this.item)) }\n\t\t\t\t: { ...defaults }\n\n\t\t\t// Ensure configuration object has all expected keys (the spread above may\n\t\t\t// have replaced our defaults with a partial configuration from the item)\n\t\t\tif (!this.schemaItem.configuration) {\n\t\t\t\tthis.schemaItem.configuration = { ...defaults.configuration }\n\t\t\t} else {\n\t\t\t\tif (!this.schemaItem.configuration.objectNameField) {\n\t\t\t\t\tthis.schemaItem.configuration.objectNameField = ''\n\t\t\t\t}\n\t\t\t\tif (!this.schemaItem.configuration.objectDescriptionField) {\n\t\t\t\t\tthis.schemaItem.configuration.objectDescriptionField = ''\n\t\t\t\t}\n\t\t\t\tif (!this.schemaItem.configuration.objectImageField) {\n\t\t\t\t\tthis.schemaItem.configuration.objectImageField = ''\n\t\t\t\t}\n\t\t\t\tif (!this.schemaItem.configuration.objectSummaryField) {\n\t\t\t\t\tthis.schemaItem.configuration.objectSummaryField = ''\n\t\t\t\t}\n\t\t\t\tif (this.schemaItem.configuration.allowFiles === undefined) {\n\t\t\t\t\tthis.schemaItem.configuration.allowFiles = false\n\t\t\t\t}\n\t\t\t\tif (!this.schemaItem.configuration.allowedTags) {\n\t\t\t\t\tthis.schemaItem.configuration.allowedTags = []\n\t\t\t\t}\n\t\t\t\tif (this.schemaItem.configuration.autoPublish === undefined) {\n\t\t\t\t\tthis.schemaItem.configuration.autoPublish = false\n\t\t\t\t}\n\t\t\t\tif (this.schemaItem.configuration.defaultAutoShare === undefined) {\n\t\t\t\t\tthis.schemaItem.configuration.defaultAutoShare = false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Ensure authorization object exists\n\t\t\tif (!this.schemaItem.authorization) {\n\t\t\t\tthis.schemaItem.authorization = {}\n\t\t\t}\n\n\t\t\t// Ensure existing properties have facetable set to false by default\n\t\t\tObject.keys(this.schemaItem.properties || {}).forEach((key) => {\n\t\t\t\tif (this.schemaItem.properties[key].facetable === undefined) {\n\t\t\t\t\tthis.schemaItem.properties[key].facetable = false\n\t\t\t\t}\n\n\t\t\t\tif (this.schemaItem.properties[key].enum && Array.isArray(this.schemaItem.properties[key].enum)) {\n\t\t\t\t\tthis.schemaItem.properties[key].enum = [...this.schemaItem.properties[key].enum]\n\t\t\t\t}\n\n\t\t\t\tconst property = this.schemaItem.properties[key]\n\t\t\t\tif (property.type === 'array' && property.items && property.items.type === 'object' && !property.items.objectConfiguration) {\n\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration = { handling: 'nested-object' }\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// Ensure all $ref values are strings and migrate old structure\n\t\t\tObject.keys(this.schemaItem.properties || {}).forEach((key) => {\n\t\t\t\tthis.ensureRefIsString(this.schemaItem.properties, key)\n\t\t\t\tthis.migratePropertyToNewStructure(key)\n\t\t\t})\n\n\t\t\t// Snapshot original properties for change detection. For new/extending\n\t\t\t// items (no id), there's no \"original\" — start empty so any added\n\t\t\t// properties register as modifications.\n\t\t\tthis.originalProperties = this.schemaItem.id\n\t\t\t\t? JSON.parse(JSON.stringify(this.schemaItem.properties || {}))\n\t\t\t\t: {}\n\n\t\t\tthis.propertiesModified = false\n\t\t},\n\n\t\tcheckPropertiesModified() {\n\t\t\tif (!this.originalProperties) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tconst currentProperties = JSON.stringify(this.schemaItem.properties || {})\n\t\t\tconst originalProperties = JSON.stringify(this.originalProperties)\n\n\t\t\tthis.propertiesModified = currentProperties !== originalProperties\n\t\t},\n\n\t\tasync copyToClipboard(text) {\n\t\t\ttry {\n\t\t\t\tawait navigator.clipboard.writeText(text)\n\t\t\t\tthis.isCopied = true\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.isCopied = false\n\t\t\t\t}, 2000)\n\t\t\t} catch (err) {\n\t\t\t\t// eslint-disable-next-line no-console -- the failure is already handled; the console is the only channel a host app can read the detail on\n\t\t\t\tconsole.error('Failed to copy text:', err)\n\t\t\t}\n\t\t},\n\n\t\taddProperty() {\n\t\t\tthis.schemaItem.properties[''] = {\n\t\t\t\ttype: 'string',\n\t\t\t\tformat: '',\n\t\t\t\ttitle: '',\n\t\t\t\tdescription: '',\n\t\t\t\tfacetable: false,\n\t\t\t}\n\n\t\t\tthis.checkPropertiesModified()\n\t\t\tthis.selectedProperty = ''\n\t\t},\n\n\t\tupdatePropertyKey(oldKey, newKey) {\n\t\t\tif (newKey === oldKey) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (this.schemaItem.properties[newKey] !== undefined && newKey !== oldKey) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst propertyData = { ...this.schemaItem.properties[oldKey] }\n\n\t\t\tthis.schemaItem.properties[newKey] = propertyData\n\t\t\tdelete this.schemaItem.properties[oldKey]\n\n\t\t\tthis.selectedProperty = newKey\n\t\t\tthis.checkPropertiesModified()\n\t\t},\n\n\t\tdeleteProperty(key) {\n\t\t\tdelete this.schemaItem.properties[key]\n\n\t\t\tif (this.selectedProperty === key) {\n\t\t\t\tthis.selectedProperty = null\n\t\t\t}\n\n\t\t\tthis.checkPropertiesModified()\n\t\t},\n\n\t\tcopyProperty(key) {\n\t\t\tif (this.schemaItem.properties[key]) {\n\t\t\t\tconst originalProperty = JSON.parse(JSON.stringify(this.schemaItem.properties[key]))\n\n\t\t\t\tlet newPropertyName = `${key}_copy`\n\t\t\t\tlet counter = 1\n\n\t\t\t\twhile (this.schemaItem.properties[newPropertyName]) {\n\t\t\t\t\tcounter++\n\t\t\t\t\tnewPropertyName = `${key}_copy_${counter}`\n\t\t\t\t}\n\n\t\t\t\tconst originalTitle = originalProperty.title || key\n\t\t\t\tthis.schemaItem.properties[newPropertyName] = {\n\t\t\t\t\t...originalProperty,\n\t\t\t\t\ttitle: `${originalTitle} (copy)`,\n\t\t\t\t}\n\n\t\t\t\tthis.checkPropertiesModified()\n\t\t\t\tthis.selectedProperty = newPropertyName\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle confirm from CnTabbedFormDialog.\n\t\t * Cleans schema data and emits confirm with the cleaned payload.\n\t\t */\n\t\thandleConfirm() {\n\t\t\tconst cleanedSchemaItem = JSON.parse(JSON.stringify(this.schemaItem))\n\t\t\tObject.keys(cleanedSchemaItem.properties || {}).forEach((key) => {\n\t\t\t\tthis.ensureRefIsString(cleanedSchemaItem.properties, key)\n\n\t\t\t\tif (cleanedSchemaItem.properties[key].register\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].objectConfiguration\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].objectConfiguration.register) {\n\t\t\t\t\tdelete cleanedSchemaItem.properties[key].register\n\t\t\t\t}\n\n\t\t\t\tif (cleanedSchemaItem.properties[key].items\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].items.register\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].items.objectConfiguration\n\t\t\t\t\t&& cleanedSchemaItem.properties[key].items.objectConfiguration.register) {\n\t\t\t\t\tdelete cleanedSchemaItem.properties[key].items.register\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// NcSelect (track-by=\"id\") can convert plain IDs to full option objects.\n\t\t\t// Normalise back to plain IDs before emitting so the backend always gets scalars.\n\t\t\tfor (const field of ['allOf', 'oneOf', 'anyOf']) {\n\t\t\t\tif (Array.isArray(cleanedSchemaItem[field])) {\n\t\t\t\t\tcleanedSchemaItem[field] = cleanedSchemaItem[field]\n\t\t\t\t\t\t.map((ref) => (typeof ref === 'object' && ref !== null ? ref.id : ref))\n\t\t\t\t\t\t.filter((id) => id !== null && id !== undefined && id !== '')\n\t\t\t\t\tif (cleanedSchemaItem[field].length === 0) {\n\t\t\t\t\t\tdelete cleanedSchemaItem[field]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.$emit('confirm', cleanedSchemaItem)\n\t\t},\n\n\t\t/**\n\t\t * Set the result of the save operation. Call this from the parent\n\t\t * after the API call completes.\n\t\t *\n\t\t * @param {{ success?: boolean, error?: string }} resultData - result data\n\t\t * @public\n\t\t */\n\t\tsetResult(resultData) {\n\t\t\tthis.$refs.dialog.setResult(resultData)\n\t\t\tif (resultData.success) {\n\t\t\t\tthis.originalProperties = JSON.parse(JSON.stringify(this.schemaItem.properties || {}))\n\t\t\t\tthis.propertiesModified = false\n\t\t\t}\n\t\t},\n\n\t\tmigratePropertyToNewStructure(key) {\n\t\t\tif (!this.schemaItem.properties[key]) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst property = this.schemaItem.properties[key]\n\n\t\t\tif (property.$ref && property.register && !property.objectConfiguration?.register) {\n\t\t\t\tif (!property.objectConfiguration) {\n\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration = { handling: 'related-object' }\n\t\t\t\t}\n\n\t\t\t\tconst registerId = typeof property.register === 'object' && property.register.id\n\t\t\t\t\t? property.register.id\n\t\t\t\t\t: property.register\n\n\t\t\t\tthis.schemaItem.properties[key].objectConfiguration.register = registerId\n\n\t\t\t\tif (property.$ref) {\n\t\t\t\t\tlet schemaSlug = property.$ref\n\t\t\t\t\tif (schemaSlug.includes('/')) {\n\t\t\t\t\t\tschemaSlug = schemaSlug.substring(schemaSlug.lastIndexOf('/') + 1)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst referencedSchema = this.findSchemaBySlug(schemaSlug)\n\t\t\t\t\tif (referencedSchema) {\n\t\t\t\t\t\tthis.schemaItem.properties[key].objectConfiguration.schema = referencedSchema.id\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (property.items && property.items.$ref && property.items.register && !property.items.objectConfiguration?.register) {\n\t\t\t\tif (!property.items.objectConfiguration) {\n\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration = { handling: 'related-object' }\n\t\t\t\t}\n\n\t\t\t\tconst registerId = typeof property.items.register === 'object' && property.items.register.id\n\t\t\t\t\t? property.items.register.id\n\t\t\t\t\t: property.items.register\n\n\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration.register = registerId\n\n\t\t\t\tif (property.items.$ref) {\n\t\t\t\t\tlet schemaSlug = property.items.$ref\n\t\t\t\t\tif (schemaSlug.includes('/')) {\n\t\t\t\t\t\tschemaSlug = schemaSlug.substring(schemaSlug.lastIndexOf('/') + 1)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst referencedSchema = this.findSchemaBySlug(schemaSlug)\n\t\t\t\t\tif (referencedSchema) {\n\t\t\t\t\t\tthis.schemaItem.properties[key].items.objectConfiguration.schema = referencedSchema.id\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n"],"names":["CnTabbedFormDialog","CnSchemaPropertiesTab","CnSchemaConfigurationTab","CnSchemaSecurityTab","t"],"mappings":";;;;;;;;;;;;;;;;;AAgNA;;AAEC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGD,aAAe;CACd,IAAI,EAAE,oBAAoB;CAC1B,UAAU,EAAE;EACX,WAAW;AACX,EAAA,QAAQ;AACR,sBAAAA,UAAkB;AAClB,yBAAAC,YAAqB;4BACrBC,YAAwB;AACxB,uBAAAC,YAAmB;AACnB;EACA,WAAW;EACX,KAAK;AACL,EAAA,eAAe;AACf,EAAA,SAAS;AACT,EAAA,cAAc;EACd,WAAW;EACX,WAAW;AACX,EAAA,MAAM;EACN;;CAED,MAAM,EAAE,CAAC,gBAAgB,CAAC;;AAE1B,CAAA,KAAK,EAAE;;AAEN,EAAA,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;;AAErC,EAAA,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;AAC1C;AACA,EAAA,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS;AACxC;AACA,EAAA,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI;AACpD;EACA,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI;AACtD;AACA,EAAA,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI;AAC9C;AACA,EAAA,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI;AACjD;AACA,EAAA,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;AAChD;EACA,mBAAmB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA,EAAG;AAC1D;AACA,EAAA,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG;AACzC;;AAEA,EAAA,gBAAgB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;AACnD;EACA,qBAAqB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAI,EAAG;AACxD;EACA,mBAAmB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAI,EAAG;;EAEtD,iBAAiB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;AACpD;EACA,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAI,EAAG;;AAErD,EAAA,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;;AAE7C;AACA,EAAA,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMC,SAAC,CAAC,eAAe,EAAE,QAAQ,GAAG;;AAE1E,EAAA,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,OAAO,GAAG;;AAExE,EAAA,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;;AAE3C,EAAA,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI;AAC1C;AACA,EAAA,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,eAAe,GAAG;AACvF;AACA,EAAA,sBAAsB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,oBAAoB,GAAG;AACjG;AACA,EAAA,oBAAoB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,kBAAkB,GAAG;AAC7F;AACA,EAAA,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,gBAAgB,GAAG;AACzF;AACA,EAAA,mBAAmB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,iBAAiB,GAAG;;AAE3F,EAAA,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,QAAQ,GAAG;;EAE1E,oBAAoB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,mCAAmC,CAAA,EAAG;;EAE9G,qBAAqB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,oCAAoC,CAAA,EAAG;;AAEhH,EAAA,sBAAsB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,sBAAsB,GAAG;;AAEnG,EAAA,uBAAuB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,uBAAuB,GAAG;AACrG;EACA,mBAAmB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAMA,SAAC,CAAC,eAAe,EAAE,2CAA2C,CAAA,EAAG;EACrH;;AAED,CAAA,KAAK,EAAE;AACN,EAAA,oBAAoB;AACpB,EAAA,OAAO;AACP,EAAA,SAAS;AACT,EAAA,gBAAgB;AAChB,EAAA,eAAe;AACf,EAAA,eAAe;AACf,EAAA,iBAAiB;AACjB,EAAA,kBAAkB;EAClB;;AAED,CAAA,IAAI,GAAG;AACN,EAAA,OAAO;AACN,GAAA,QAAQ,EAAE,KAAK;AACf,GAAA,gBAAgB,EAAE,IAAI;GACtB,kBAAkB,EAAE,KAAK;GACzB,kBAAkB,EAAE,IAAI;GACxB,UAAU,EAAE;AACX,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,EAAE;AACX,IAAA,IAAI,EAAE,EAAE;IACR,UAAU,EAAE,EAAE;AACd,IAAA,aAAa,EAAE;AACd,KAAA,eAAe,EAAE,EAAE;KACnB,sBAAsB,EAAE,EAAE;AAC1B,KAAA,gBAAgB,EAAE,EAAE;AACpB,KAAA,kBAAkB,EAAE,EAAE;AACtB,KAAA,UAAU,EAAE,KAAK;AACjB,KAAA,WAAW,EAAE,EAAE;AACf,KAAA,WAAW,EAAE,KAAK;KAClB,gBAAgB,EAAE,KAAK;KACvB;;AAED,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,CAAC;IACX;AACF,GAAA;EACA;;AAED,CAAA,QAAQ,EAAE;AACT;AACC;AACA;AACA;;EAED,UAAU,GAAG;AACZ,GAAA,OAAO;IACN,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,YAAY,CAAA,EAAG;IAC7D,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,eAAe,CAAA,EAAG;IACnE,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,UAAU,CAAA,EAAG;AAC1D,IAAA;GACA;;AAED,EAAA,gBAAgB,GAAG;AAClB,GAAA,OAAO,IAAI,CAAC,UAAS;AACpB,KAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAC,KAAM,OAAQ,IAAG,KAAK,CAAC,OAAO,QAAS,IAAG,KAAK,CAAC,OAAO,eAAe,CAAA;KAC/F,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;KACf,MAAM,KAAI,GAAI,CAAC,CAAC,WAAU,IAAK,CAAC,CAAC,GAAC;KAClC,MAAM,KAAI,GAAI,CAAC,CAAC,WAAU,IAAK,CAAC,CAAC,GAAC;AAClC,KAAA,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAA;KAChC,CAAA;GACF;;AAED,EAAA,iBAAiB,GAAG;AACnB,GAAA,MAAM,IAAK,GAAE,IAAI,CAAC,UAAU,CAAC,aAAc,IAAG,GAAC;AAC/C,GAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAE,IAAG,IAAI,CAAC,MAAM,CAAC,CAAC,MAAK,GAAI,CAAC,CAAA;GAChG;;AAED,EAAA,mBAAmB,GAAG;AACrB,GAAA,MAAM,IAAK,GAAE,IAAI,CAAC,UAAU,CAAC,aAAc,IAAG,GAAC;GAC/C,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAA;AACrD,GAAA,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,IAAK,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAA;AACpF,OAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;GACpC;;EAED,oBAAoB,GAAG;AACtB,GAAA,OAAO;IACN,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAA,EAAG;IACrD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAA,EAAG;IACrD,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,SAAS,CAAA,EAAG;IACvD,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,SAAS,CAAA,EAAG;AACvD,IAAA,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,OAAO,GAAG;IACnD,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,QAAQ,CAAA,EAAG;IACrD,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,YAAY,CAAA,EAAG;AAC7D,IAAA,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,MAAM,GAAG;AACjD,IAAA,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,QAAQ,GAAG;AACrD,IAAA;GACA;;AAED,EAAA,eAAe,GAAG;AACjB,GAAA,MAAM,OAAQ,GAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAS,IAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAE,KAAI,EAAE,EAAA;AACpF,GAAA,MAAM,aAAc,GAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAoB,IAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA,KAAM,EAAE,EAAA;GACxF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC,CAAC,CAAA;GAClD;;EAED,oBAAoB,GAAG;AACtB,GAAA,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AACvC,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,KAAK,EAAE,GAAG;AACX,IAAC,CAAC,CAAA;GACF;;AAED;AACC;AACA;AACA;;AAED,EAAA,mBAAmB,GAAG;AACrB,GAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACrB,IAAA,OAAO,IAAI,CAAC,WAAU;AACvB,IAAA;AACA,GAAA,OAAOA,SAAC,CAAC,eAAe,EAAE,6BAA6B,EAAE,EAAE,KAAK,EAAEA,SAAC,CAAC,eAAe,EAAE,QAAQ,GAAG,CAAA;GAChG;;AAED;AACC;AACA;AACA;AACA;;AAED,EAAA,kBAAkB,GAAG;GACpB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;IAC3B,OAAOA,SAAC,CAAC,eAAe,EAAE,0CAA0C,CAAA;AACrE,IAAA;AACA,GAAA,MAAM,kBAAiB,GAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAW,IAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAE,KAAM,EAAE,EAAA;GACjG,IAAI,kBAAkB,EAAE;AACvB,IAAA,OAAOA,SAAC,CAAC,eAAe,EAAE,+CAA+C,CAAA;AAC1E,IAAA;AACA,GAAA,OAAO,EAAC;GACR;;AAED,EAAA,gBAAgB,GAAG;GAClB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAA,IAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;AAC1G,IAAA,OAAO,EAAC;AACT,IAAA;;GAEA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAI;KACzB,GAAG,CAAC,CAAC,GAAG,KAAK;AACb,KAAA,MAAM,QAAO,GAAI,OAAO,GAAI,KAAI,WAAW,GAAG,CAAC,EAAG,GAAE,IAAE;KACtD,MAAM,MAAO,GAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAC,KAAM,QAAQ,EAAA;KAClE,OAAO,MAAO,IAAG,MAAM,CAAC,KAAI,IAAK,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,QAAO;KACjE,CAAA;AACD,KAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAA;GACvB;EACD;;AAED,CAAA,KAAK,EAAE;EACN,IAAI,EAAE;AACL,GAAA,SAAS,EAAE,IAAI;AACf,GAAA,OAAO,GAAG;IACT,IAAI,CAAC,oBAAoB,GAAC;IAC1B;GACD;;EAED,uBAAuB,EAAE;GACxB,OAAO,CAAC,aAAa,EAAE;AACtB,IAAA,IAAI,aAAa,EAAE;AAClB,KAAA,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK;AAC3C,MAAA,MAAM,QAAO,GAAI,aAAa,CAAC,GAAG,EAAA;MAClC,IAAI,QAAQ,EAAE;AACb;AACA,OAAA,IAAI,QAAQ,CAAC,IAAG,KAAM,OAAQ,IAAG,CAAC,QAAQ,CAAC,KAAK,EAAE;QACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAI,GAAI,EAAE,IAAI,EAAE,QAAS,GAAA;AAC1D,QAAA;OACA,IAAI,QAAQ,CAAC,IAAK,KAAI,QAAO,IAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE;AAChE,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,sBAAsB,EAAE,QAAQ,EAAE,eAAgB,GAAA;AACnF,QAAA;OACA,IAAI,QAAQ,CAAC,IAAG,KAAM,OAAQ,IAAG,QAAQ,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,IAAG,KAAM,QAAS,IAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE;AAC3H,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,sBAAsB,EAAE,QAAQ,EAAE,eAAgB,GAAA;AACzF,QAAA;;AAEA;AACA,OAAA,IAAI,QAAQ,CAAC,IAAG,IAAK,OAAO,QAAQ,CAAC,IAAG,KAAM,YAAY,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE;QAC3E,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAK,GAAE,QAAQ,CAAC,IAAI,CAAC,GAAC;AACvD,QAAA;;AAEA;AACA,OAAA,IAAI,QAAQ,CAAC,MAAO,IAAG,OAAO,QAAQ,CAAC,MAAO,KAAI,QAAO,IAAK,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE;QACjF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,MAAK,GAAI,QAAQ,CAAC,MAAM,CAAC,GAAC;AAC3D,QAAA;;AAEA;OACA,IAAI,QAAQ,CAAC,KAAI,IAAK,QAAQ,CAAC,KAAK,CAAC,QAAQ,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAK,KAAI,QAAO,IAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;AAC/G,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAG,GAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAC;AACnE,QAAA;;AAEA;AACA,OAAA,IAAI,QAAQ,CAAC,mBAAkB,IAAK,QAAQ,CAAC,mBAAmB,CAAC,QAAO;WACpE,OAAO,QAAQ,CAAC,mBAAmB,CAAC,QAAO,KAAM,YAAY,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,EAAE;QAC1G,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC,WAAW,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAC;AACvG,QAAA;;AAEA;AACA,OAAA,IAAI,QAAQ,CAAC,mBAAkB,IAAK,QAAQ,CAAC,mBAAmB,CAAC,QAAO;WACpE,OAAO,QAAQ,CAAC,mBAAmB,CAAC,QAAO,KAAM,YAAY,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,EAAE;QAC1G,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC,WAAW,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAC;AACvG,QAAA;;;OAGA,IAAI,QAAQ,CAAC,KAAI,IAAK,QAAQ,CAAC,KAAK,CAAC,mBAAoB,IAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAO;WAClG,OAAO,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAO,KAAM,QAAO,IAAK,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,EAAE;QACtH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAO,GAAI,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAC;AACnH,QAAA;;AAEA;OACA,IAAI,QAAQ,CAAC,KAAI,IAAK,QAAQ,CAAC,KAAK,CAAC,mBAAoB,IAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAO;WAClG,OAAO,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAO,KAAM,QAAO,IAAK,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,EAAE;QACtH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAO,GAAI,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,GAAC;AACnH,QAAA;;;OAGA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,GAAG,EAAA;;;AAGtD,OAAA,IAAI,QAAQ,CAAC,UAAS,IAAK,OAAO,QAAQ,CAAC,UAAW,KAAI,QAAS,IAAG,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE;AAC7F,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,UAAS,GAAI,QAAQ,CAAC,UAAU,CAAC,GAAC;AACnE,QAAA;;AAEA;OACA,IAAI,QAAQ,CAAC,KAAI,IAAK,QAAQ,CAAC,KAAK,CAAC,UAAS,IAAK,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAS,KAAM,QAAS,IAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE;AACjI,QAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,UAAW,GAAE,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,GAAC;AAC/E,QAAA;AACD,OAAA;MACA,EAAA;AACF,KAAA;IACA,IAAI,CAAC,uBAAuB,GAAC;IAC7B;;AAED,GAAA,IAAI,EAAE,IAAI;GACV;EACD;;AAED,CAAA,OAAO,EAAE;KACRA,SAAC;EACD,UAAU;EACV,gBAAgB,CAAC,UAAU,EAAE;AAC5B,GAAA,IAAI,CAAC,UAAU,EAAE;AAChB,IAAA,OAAO,SAAQ;AAChB,IAAA;GACA,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,QAAQ,MAAM,CAAC,IAAI,CAAC,WAAW,EAAC,KAAM,UAAU,CAAC,WAAW,EAAE;OAChH,MAAM,CAAC,EAAC,KAAM,UAAS;OACvB,MAAM,CAAC,UAAU,UAAU,CAAA;GAC/B;;EAED,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE;AAC3B,GAAA,IAAI,CAAC,GAAE,IAAK,CAAC,GAAG,EAAE;IACjB,MAAK;AACN,IAAA;;AAEA,GAAA,IAAI,GAAG,CAAC,GAAG,CAAA,IAAK,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAK,KAAI,QAAO,IAAK,GAAG,CAAC,GAAG,CAAC,CAAC,IAAG,KAAM,IAAI,EAAE;AAC5E,IAAA,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE;KACrB,GAAG,CAAC,GAAG,CAAC,CAAC,IAAK,GAAE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAC;KAC9B,MAAK;AACN,KAAA,GAAG,CAAC,GAAG,CAAC,CAAC,IAAG,GAAI,GAAC;AAClB,KAAA;AACD,IAAA;;GAEA,IAAI,GAAG,CAAC,GAAG,CAAA,IAAK,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,QAAO,IAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAG,KAAM,IAAI,EAAE;IAC1G,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE;AAC3B,KAAA,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAK,GAAE,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAC;KAC1C,MAAK;AACN,KAAA,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAG,GAAI,GAAC;AACxB,KAAA;AACD,IAAA;GACA;;EAED,oBAAoB,GAAG;AACtB;AACA,GAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACtB,IAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,GAAC;AAC/B,IAAA;;;;;AAKA,GAAA,MAAM,QAAO,GAAI;AAChB,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,OAAO,EAAE,OAAO;AAChB,IAAA,WAAW,EAAE,EAAE;IACf,OAAO,EAAE,EAAE;AACX,IAAA,IAAI,EAAE,EAAE;IACR,UAAU,EAAE,EAAE;AACd,IAAA,aAAa,EAAE;AACd,KAAA,eAAe,EAAE,EAAE;KACnB,sBAAsB,EAAE,EAAE;AAC1B,KAAA,gBAAgB,EAAE,EAAE;AACpB,KAAA,kBAAkB,EAAE,EAAE;AACtB,KAAA,UAAU,EAAE,KAAK;AACjB,KAAA,WAAW,EAAE,EAAE;AACf,KAAA,WAAW,EAAE,KAAK;KAClB,gBAAgB,EAAE,KAAK;KACvB;;AAED,IAAA,aAAa,EAAE,EAAE;AACjB,IAAA,cAAc,EAAE,KAAK;AACrB,IAAA,SAAS,EAAE,KAAK;AAChB,IAAA,UAAU,EAAE,IAAI;AAChB,IAAA,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,CAAC;AACZ,KAAA;GACA,IAAI,CAAC,UAAS,GAAI,IAAI,CAAC,IAAG;MACvB,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAE,EAAA;MACxD,EAAE,GAAG,QAAS,GAAA;;AAEjB;;AAEA,GAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;IACnC,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,GAAG,QAAQ,CAAC,aAAc,GAAA;IAC3D,MAAK;IACN,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE;KACnD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAgB,GAAE,GAAC;AAClD,KAAA;IACA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,sBAAsB,EAAE;KAC1D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,sBAAuB,GAAE,GAAC;AACzD,KAAA;IACA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,EAAE;KACpD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAiB,GAAE,GAAC;AACnD,KAAA;IACA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,kBAAkB,EAAE;KACtD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,kBAAmB,GAAE,GAAC;AACrD,KAAA;IACA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,SAAS,EAAE;AAC3D,KAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAS,GAAI,MAAI;AAChD,KAAA;IACA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAW,EAAE;AAC/C,KAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAU,GAAI,GAAC;AAC9C,KAAA;IACA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,SAAS,EAAE;KAC5D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,WAAU,GAAI,MAAI;AACjD,KAAA;AACA,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAe,KAAM,SAAS,EAAE;KACjE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,mBAAmB,MAAI;AACtD,KAAA;AACD,IAAA;;AAEA;AACA,GAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;AACnC,IAAA,IAAI,CAAC,UAAU,CAAC,aAAY,GAAI,GAAC;AAClC,IAAA;;;GAGA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAS,IAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK;IAC9D,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,cAAc,SAAS,EAAE;KAC5D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAQ,GAAI,MAAI;AACjD,KAAA;;AAEA,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAK,IAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE;AAChG,KAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAA;AAChF,KAAA;;AAEA,IAAA,MAAM,QAAO,GAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAA;IAC/C,IAAI,QAAQ,CAAC,IAAG,KAAM,OAAQ,IAAG,QAAQ,CAAC,SAAS,QAAQ,CAAC,KAAK,CAAC,IAAG,KAAM,QAAS,IAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE;AAC3H,KAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,sBAAsB,EAAE,QAAQ,EAAE,eAAgB,GAAA;AACzF,KAAA;IACA,EAAA;;;GAGD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAS,IAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK;IAC9D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,GAAG,EAAA;AACtD,IAAA,IAAI,CAAC,6BAA6B,CAAC,GAAG,EAAA;IACtC,EAAA;;AAED;;AAEA;AACA,GAAA,IAAI,CAAC,qBAAqB,IAAI,CAAC,UAAU,CAAC,EAAC;MACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,UAAS,IAAK,EAAE,CAAC,CAAA;AAC7D,MAAE,GAAC;;GAEJ,IAAI,CAAC,kBAAiB,GAAI,MAAI;GAC9B;;EAED,uBAAuB,GAAG;GACzB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;IAC7B,OAAO,KAAI;AACZ,IAAA;;AAEA,GAAA,MAAM,iBAAgB,GAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,UAAS,IAAK,EAAE,EAAA;AACzE,GAAA,MAAM,kBAAiB,GAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAA;;GAEjE,IAAI,CAAC,kBAAmB,GAAE,iBAAkB,KAAI,mBAAiB;GACjE;;EAED,MAAM,eAAe,CAAC,IAAI,EAAE;AAC3B,GAAA,IAAI;AACH,IAAA,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAA;AACxC,IAAA,IAAI,CAAC,QAAO,GAAI,KAAG;AACnB,IAAA,UAAU,CAAC,MAAM;AAChB,KAAA,IAAI,CAAC,QAAS,GAAE,MAAI;AACrB,KAAC,EAAE,IAAI,EAAA;IACN,CAAA,OAAO,GAAG,EAAE;;AAEb,IAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,EAAA;AAC1C,IAAA;GACA;;EAED,WAAW,GAAG;AACb,GAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,IAAI;IAChC,IAAI,EAAE,QAAQ;AACd,IAAA,MAAM,EAAE,EAAE;AACV,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,SAAS,EAAE,KAAK;AACjB,KAAA;;GAEA,IAAI,CAAC,uBAAuB,GAAC;GAC7B,IAAI,CAAC,gBAAiB,GAAE,GAAC;GACzB;;AAED,EAAA,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE;AACjC,GAAA,IAAI,MAAK,KAAM,MAAM,EAAE;IACtB,MAAK;AACN,IAAA;AACA,GAAA,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAA,KAAM,SAAU,IAAG,WAAW,MAAM,EAAE;IAC1E,MAAK;AACN,IAAA;;GAEA,MAAM,YAAa,GAAE,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAE,GAAA;;GAE7D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,CAAE,GAAE,aAAW;AAChD,GAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM,EAAA;;GAExC,IAAI,CAAC,gBAAiB,GAAE,OAAK;GAC7B,IAAI,CAAC,uBAAuB,GAAC;GAC7B;;AAED,EAAA,cAAc,CAAC,GAAG,EAAE;AACnB,GAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAA;;AAErC,GAAA,IAAI,IAAI,CAAC,gBAAiB,KAAI,GAAG,EAAE;IAClC,IAAI,CAAC,gBAAiB,GAAE,KAAG;AAC5B,IAAA;;GAEA,IAAI,CAAC,uBAAuB,GAAC;GAC7B;;AAED,EAAA,YAAY,CAAC,GAAG,EAAE;AACjB,GAAA,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACpC,IAAA,MAAM,gBAAe,GAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAA;;AAEnF,IAAA,IAAI,eAAgB,GAAE,CAAC,EAAE,GAAG,CAAC,KAAK,EAAA;IAClC,IAAI,OAAM,GAAI,EAAA;;IAEd,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE;AACnD,KAAA,OAAO,GAAC;AACR,KAAA,eAAgB,GAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,EAAA;AAC1C,KAAA;;AAEA,IAAA,MAAM,aAAc,GAAE,gBAAgB,CAAC,SAAS,IAAE;AAClD,IAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,eAAe,IAAI;AAC7C,KAAA,GAAG,gBAAgB;AACnB,KAAA,KAAK,EAAE,CAAC,EAAE,aAAa,CAAA,OAAQ,CAAC;AACjC,MAAA;;IAEA,IAAI,CAAC,uBAAuB,GAAC;AAC7B,IAAA,IAAI,CAAC,gBAAiB,GAAE,gBAAc;AACvC,IAAA;GACA;;AAED;AACC;;;AAGD,EAAA,aAAa,GAAG;AACf,GAAA,MAAM,iBAAkB,GAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAA;GACpE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAS,IAAK,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK;IAChE,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,UAAU,EAAE,GAAG,EAAA;;AAExD,IAAA,IAAI,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,QAAO;QACzC,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,mBAAkB;AACvD,QAAG,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE;KACnE,OAAO,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAO;AACjD,KAAA;;AAEA,IAAA,IAAI,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAI;QACtC,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,QAAO;QAC/C,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,mBAAkB;AAC7D,QAAG,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAQ,EAAE;KACzE,OAAO,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,SAAO;AACvD,KAAA;IACA,EAAA;;AAED;AACA;AACA,GAAA,KAAK,MAAM,KAAM,IAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;AAChD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE;KAC5C,iBAAiB,CAAC,KAAK,CAAA,GAAI,iBAAiB,CAAC,KAAK,CAAA;OAChD,GAAG,CAAC,CAAC,GAAG,MAAM,OAAO,GAAE,KAAM,QAAO,IAAK,GAAI,KAAI,IAAK,GAAE,GAAG,CAAC,EAAC,GAAI,GAAG,CAAC,CAAA;OACrE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAG,KAAI,IAAK,IAAG,EAAC,KAAM,SAAQ,IAAK,OAAO,EAAE,EAAA;AAC7D,KAAA,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,MAAK,KAAM,CAAC,EAAE;MAC1C,OAAO,iBAAiB,CAAC,KAAK,EAAA;AAC/B,MAAA;AACD,KAAA;AACD,IAAA;;AAEA,GAAA,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAA;GACvC;;AAED;;;AAGC;;AAEA;;AAED,EAAA,SAAS,CAAC,UAAU,EAAE;AACrB,GAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAA;GACtC,IAAI,UAAU,CAAC,OAAO,EAAE;AACvB,IAAA,IAAI,CAAC,kBAAmB,GAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,UAAS,IAAK,EAAE,CAAC,EAAA;IACrF,IAAI,CAAC,kBAAiB,GAAI,MAAI;AAC/B,IAAA;GACA;;AAED,EAAA,6BAA6B,CAAC,GAAG,EAAE;AAClC,GAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;IACrC,MAAK;AACN,IAAA;;AAEA,GAAA,MAAM,QAAO,GAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAA;;AAE/C,GAAA,IAAI,QAAQ,CAAC,QAAQ,QAAQ,CAAC,QAAO,IAAK,CAAC,QAAQ,CAAC,mBAAmB,EAAE,QAAQ,EAAE;AAClF,IAAA,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE;AAClC,KAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,mBAAkB,GAAI,EAAE,QAAQ,EAAE,gBAAiB,GAAA;AACpF,KAAA;;AAEA,IAAA,MAAM,aAAa,OAAO,QAAQ,CAAC,QAAO,KAAM,QAAO,IAAK,QAAQ,CAAC,QAAQ,CAAC,EAAC;AAC9E,OAAE,QAAQ,CAAC,QAAQ,CAAC,EAAC;AACrB,OAAE,QAAQ,CAAC,SAAO;;AAEnB,IAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC,WAAW,WAAS;;AAExE,IAAA,IAAI,QAAQ,CAAC,IAAI,EAAE;KAClB,IAAI,UAAS,GAAI,QAAQ,CAAC,KAAG;KAC7B,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;MAC7B,UAAS,GAAI,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAE,GAAE,CAAC,EAAA;AAClE,MAAA;;KAEA,MAAM,mBAAmB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAA;AACzD,KAAA,IAAI,gBAAgB,EAAE;AACrB,MAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC,MAAK,GAAI,gBAAgB,CAAC,GAAC;AAChF,MAAA;AACD,KAAA;AACD,IAAA;;GAEA,IAAI,QAAQ,CAAC,KAAM,IAAG,QAAQ,CAAC,KAAK,CAAC,IAAK,IAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE,QAAQ,EAAE;AACtH,IAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,EAAE;AACxC,KAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,mBAAkB,GAAI,EAAE,QAAQ,EAAE,gBAAiB,GAAA;AAC1F,KAAA;;AAEA,IAAA,MAAM,aAAa,OAAO,QAAQ,CAAC,KAAK,CAAC,QAAS,KAAI,QAAO,IAAK,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAC;OACxF,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAC;OACzB,QAAQ,CAAC,KAAK,CAAC,SAAO;;AAEzB,IAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,QAAS,GAAE,WAAS;;IAE9E,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE;AACxB,KAAA,IAAI,UAAS,GAAI,QAAQ,CAAC,KAAK,CAAC,KAAG;KACnC,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;MAC7B,UAAS,GAAI,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,GAAG,CAAE,GAAE,CAAC,EAAA;AAClE,MAAA;;KAEA,MAAM,mBAAmB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAA;AACzD,KAAA,IAAI,gBAAgB,EAAE;AACrB,MAAA,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAK,GAAI,gBAAgB,CAAC,GAAC;AACtF,MAAA;AACD,KAAA;AACD,IAAA;GACA;EACD;AACF;;;;"}
|
|
@@ -133,13 +133,13 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
133
133
|
($data.schemaItem.created)
|
|
134
134
|
? (openBlock(), createElementBlock("div", _hoisted_11, [
|
|
135
135
|
createElementVNode("span", _hoisted_12, toDisplayString($options.t('nextcloud-vue', 'Created:')), 1 /* TEXT */),
|
|
136
|
-
createElementVNode("span", _hoisted_13, toDisplayString(new Date($data.schemaItem.created).toLocaleString()), 1 /* TEXT */)
|
|
136
|
+
createElementVNode("span", _hoisted_13, toDisplayString(new Date($data.schemaItem.created).toLocaleString($options.userLocale())), 1 /* TEXT */)
|
|
137
137
|
]))
|
|
138
138
|
: createCommentVNode("v-if", true),
|
|
139
139
|
($data.schemaItem.updated)
|
|
140
140
|
? (openBlock(), createElementBlock("div", _hoisted_14, [
|
|
141
141
|
createElementVNode("span", _hoisted_15, toDisplayString($options.t('nextcloud-vue', 'Updated:')), 1 /* TEXT */),
|
|
142
|
-
createElementVNode("span", _hoisted_16, toDisplayString(new Date($data.schemaItem.updated).toLocaleString()), 1 /* TEXT */)
|
|
142
|
+
createElementVNode("span", _hoisted_16, toDisplayString(new Date($data.schemaItem.updated).toLocaleString($options.userLocale())), 1 /* TEXT */)
|
|
143
143
|
]))
|
|
144
144
|
: createCommentVNode("v-if", true),
|
|
145
145
|
createElementVNode("div", _hoisted_17, [
|