@oneuptime/common 12.0.3 → 12.0.5
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/Models/DatabaseModels/AIRun.ts +38 -1
- package/Models/DatabaseModels/AlertFeed.ts +30 -0
- package/Models/DatabaseModels/CephCluster.ts +14 -0
- package/Models/DatabaseModels/CodeRepository.ts +14 -6
- package/Models/DatabaseModels/Dashboard.ts +28 -0
- package/Models/DatabaseModels/DockerHost.ts +14 -0
- package/Models/DatabaseModels/GlobalOidcProject.ts +18 -0
- package/Models/DatabaseModels/GlobalSsoProject.ts +18 -0
- package/Models/DatabaseModels/Incident.ts +2 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IncidentFeed.ts +30 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +1 -0
- package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
- package/Models/DatabaseModels/IoTFleet.ts +14 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +14 -0
- package/Models/DatabaseModels/LogSavedView.ts +33 -0
- package/Models/DatabaseModels/NetworkDevice.ts +14 -0
- package/Models/DatabaseModels/NetworkInterface.ts +18 -0
- package/Models/DatabaseModels/Project.ts +247 -11
- package/Models/DatabaseModels/ProxmoxCluster.ts +14 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
- package/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.ts +4 -4
- package/Models/DatabaseModels/Service.ts +30 -0
- package/Models/DatabaseModels/StatusPage.ts +28 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +1 -0
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +30 -0
- package/Models/DatabaseModels/User.ts +30 -0
- package/Server/API/AIAgentDataAPI.ts +75 -55
- package/Server/API/AIInvestigationAPI.ts +175 -17
- package/Server/API/DashboardAPI.ts +429 -22
- package/Server/API/GitHubAPI.ts +119 -283
- package/Server/API/StatusPageAPI.ts +38 -19
- package/Server/API/UserAPI.ts +263 -1
- package/Server/EnvironmentConfig.ts +23 -3
- package/Server/Infrastructure/ClickhouseConfig.ts +15 -1
- package/Server/Infrastructure/ClickhouseDatabase.ts +1 -1
- package/Server/Infrastructure/GlobalCache.ts +37 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.ts +21 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.ts +100 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.ts +89 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.ts +214 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.ts +69 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.ts +40 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +20 -0
- package/Server/Services/AIRunService.ts +78 -10
- package/Server/Services/AIService.ts +94 -22
- package/Server/Services/AlertFeedService.ts +5 -0
- package/Server/Services/AnalyticsDatabaseService.ts +101 -1
- package/Server/Services/CodeRepositoryService.ts +105 -2
- package/Server/Services/DatabaseService.ts +227 -3
- package/Server/Services/IncidentFeedService.ts +5 -0
- package/Server/Services/LlmLogService.ts +46 -2
- package/Server/Services/OpenTelemetryIngestService.ts +230 -26
- package/Server/Services/UserService.ts +184 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +6 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.ts +4 -0
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +8 -5
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +90 -16
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +2 -0
- package/Server/Utils/AI/Remediation/RemediationPlanRunner.ts +2 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +223 -22
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +25 -24
- package/Server/Utils/AI/SRE/ConfidenceSignal.ts +182 -71
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +252 -43
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +25 -24
- package/Server/Utils/AI/SRE/InstrumentationTaskTrigger.ts +47 -13
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +9 -5
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +141 -24
- package/Server/Utils/AI/SRE/InvestigationSubjectLock.ts +66 -0
- package/Server/Utils/AI/SRE/PostedRootCause.ts +94 -3
- package/Server/Utils/AI/SRE/README.md +1 -1
- package/Server/Utils/AI/SRE/SubjectCodeFixRun.ts +132 -10
- package/Server/Utils/AI/Toolbox/CodeTools.ts +45 -4
- package/Server/Utils/AnalyticsDatabase/ClusterConfig.ts +24 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +13 -0
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +157 -4
- package/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.ts +130 -0
- package/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +29 -0
- package/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.ts +56 -0
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +46 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/PasswordHash.ts +330 -0
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +251 -0
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +747 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +480 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1184 -0
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +500 -0
- package/Tests/App/Dashboard/OverviewCustomFields.test.tsx +333 -0
- package/Tests/App/Dashboard/PortMonitorCriteriaFilter.test.ts +93 -0
- package/Tests/App/Dashboard/UserCustomFields.test.tsx +392 -0
- package/Tests/App/StatusPage/PublicStatusPageAPIErrorHandling.test.ts +117 -0
- package/Tests/App/StatusPage/StatusPageModelAPIPolymorphism.test.ts +223 -0
- package/Tests/Models/DatabaseModels/PermissionCatalogueCoverage.test.ts +243 -0
- package/Tests/Server/API/AIAgentDataFixFromIncidentContext.test.ts +266 -0
- package/Tests/Server/API/AIAgentDataRepositoryToken.test.ts +381 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +594 -0
- package/Tests/Server/API/AIInvestigationCreateFixTask.test.ts +80 -0
- package/Tests/Server/API/DashboardMasterPasswordAPI.test.ts +172 -1
- package/Tests/Server/API/DashboardPublicAttributeValuesAPI.test.ts +943 -0
- package/Tests/Server/API/DashboardPublicMetricsAggregateAPI.test.ts +1296 -0
- package/Tests/Server/API/DashboardPublicTemplatePayloads.test.ts +598 -0
- package/Tests/Server/API/GitHubAppInstallationBindingAPI.test.ts +539 -0
- package/Tests/Server/API/Helpers.ts +6 -1
- package/Tests/Server/API/StatusPageMasterPasswordAPI.test.ts +335 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +852 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +128 -0
- package/Tests/Server/Infrastructure/SemaphoreMutex.test.ts +215 -0
- package/Tests/Server/Services/AIRunCodeFixClaim.test.ts +59 -5
- package/Tests/Server/Services/AIRunHumanVerdict.test.ts +127 -58
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +396 -20
- package/Tests/Server/Services/AddMasterPasswordSaltMigration.test.ts +283 -0
- package/Tests/Server/Services/AddPerUserPasswordSaltMigration.test.ts +178 -0
- package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +582 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +30 -1
- package/Tests/Server/Services/CodeRepositoryInstallationBinding.test.ts +305 -0
- package/Tests/Server/Services/CodeRepositoryResolutionBinding.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServicePerUserPasswordSalt.test.ts +880 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsWithoutHooks.test.ts +54 -0
- package/Tests/Server/Services/FeedAIRunAssociation.test.ts +125 -0
- package/Tests/Server/Services/FixFromIncidentTaskTrigger.test.ts +418 -57
- package/Tests/Server/Services/InstrumentationTaskTrigger.test.ts +173 -14
- package/Tests/Server/Services/MasterPasswordScrypt.test.ts +567 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +568 -0
- package/Tests/Server/Services/RestoreDroppedUniqueIndexesMigration.test.ts +386 -0
- package/Tests/Server/Services/RestoreServiceLowerNameIndexMigration.test.ts +240 -0
- package/Tests/Server/Services/SeparateIncidentAlertAiSettingsMigration.test.ts +194 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +885 -0
- package/Tests/Server/Services/WidenHashedStringColumnsForScryptMigration.test.ts +220 -0
- package/Tests/Server/Utils/AI/AIAlertGating.test.ts +37 -4
- package/Tests/Server/Utils/AI/AIConfidenceSignal.test.ts +330 -29
- package/Tests/Server/Utils/AI/AIIncidentGating.test.ts +25 -0
- package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +293 -5
- package/Tests/Server/Utils/AI/CodeFixAgentCompletion.test.ts +59 -1
- package/Tests/Server/Utils/AI/CodeTools.test.ts +47 -1
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +10 -0
- package/Tests/Server/Utils/AI/FixFromIncidentAutoTrigger.test.ts +342 -19
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +214 -30
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +2 -0
- package/Tests/Server/Utils/AI/InvestigationGrader.test.ts +65 -17
- package/Tests/Server/Utils/AI/InvestigationQueueRemediationExecution.test.ts +3 -0
- package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +313 -20
- package/Tests/Server/Utils/AI/PostedRootCause.test.ts +254 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +4 -0
- package/Tests/Server/Utils/AI/RemediationPlanRunner.test.ts +2 -0
- package/Tests/Server/Utils/AI/SubjectCodeFixRunDedupe.test.ts +44 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +30 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +120 -0
- package/Tests/Server/Utils/CodeRepository/GitHubInstallationBinding.test.ts +292 -0
- package/Tests/Server/Utils/GitHubInstallationOwnershipVerification.test.ts +340 -0
- package/Tests/Server/Utils/GitHubWebhookAndTreeCacheIsolation.test.ts +250 -0
- package/Tests/Server/Utils/Monitor/Criteria/APIRequestCriteriaPortTimings.test.ts +212 -0
- package/Tests/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.test.ts +401 -0
- package/Tests/Server/Utils/Monitor/MonitorMetricUtilPortTimings.test.ts +243 -0
- package/Tests/Server/Utils/PasswordHash.test.ts +585 -0
- package/Tests/Types/Dashboard/DashboardTemplates.test.ts +111 -0
- package/Tests/Types/Database/ColumnLength.test.ts +7 -1
- package/Tests/Types/HashedStringPerUserSalt.test.ts +476 -0
- package/Tests/Types/Monitor/CephMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +4 -0
- package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +293 -0
- package/Tests/Types/Monitor/DockerMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/DockerSwarmMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/HostAlertTemplates.test.ts +249 -0
- package/Tests/Types/Monitor/HostMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/IotAlertTemplates.test.ts +320 -0
- package/Tests/Types/Monitor/IotMetricCatalog.test.ts +104 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +118 -0
- package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +42 -0
- package/Tests/Types/Monitor/MonitorStep.test.ts +38 -0
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +75 -0
- package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +271 -0
- package/Tests/Types/Monitor/PodmanMetricCatalog.test.ts +109 -0
- package/Tests/Types/Monitor/ProxmoxMetricCatalog.test.ts +107 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.test.ts +151 -0
- package/Tests/Types/Permission.test.ts +137 -0
- package/Tests/Types/Rum/SessionReplayMaskingMode.test.ts +101 -0
- package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +5 -5
- package/Tests/UI/Components/CardModelDetailEdit.test.tsx +3 -5
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +696 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +158 -0
- package/Tests/UI/Components/FeedItemSafeMode.test.tsx +74 -0
- package/Tests/UI/Components/MoreMenu.test.tsx +756 -0
- package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +62 -0
- package/Tests/UI/Monitor/PortMonitorView.test.tsx +237 -0
- package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +91 -0
- package/Tests/UI/Utils/DownloadFile.test.ts +103 -0
- package/Tests/UI/Utils/ErrorSupportBundle.test.ts +582 -0
- package/Tests/UI/Utils/Project.test.ts +31 -0
- package/Tests/UI/Utils/StatusPageModelAPIInjection.test.ts +245 -0
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +820 -0
- package/Tests/UI/Utils/UserProjectsModelAPI.test.ts +714 -0
- package/Tests/Utils/Dashboard/DashboardViewConfig.test.ts +329 -0
- package/Tests/Utils/Dashboard/GridLayout.test.ts +951 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +117 -0
- package/Tests/Utils/RecordingRuleExpression.test.ts +327 -0
- package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +186 -0
- package/Tests/Utils/StatusPage/GroupTree.test.ts +456 -0
- package/Tests/Utils/StatusPage/OverviewGroupHierarchyVisibility.test.ts +588 -0
- package/Tests/Utils/TeamMembersByProject.test.ts +655 -0
- package/Tests/Utils/Telemetry/SavedViewTimeRange.test.ts +244 -0
- package/Tests/Utils/Telemetry/TelemetryQueryTimeRange.test.ts +825 -0
- package/Types/AI/AIRunCodeFixRecommendation.ts +17 -0
- package/Types/AI/CodeFixTaskContext.ts +63 -3
- package/Types/AI/CodeFixTaskType.ts +3 -3
- package/Types/Database/ColumnLength.ts +9 -1
- package/Types/Database/TableColumn.ts +11 -0
- package/Types/Database/UnsynchronizedIndex.ts +48 -0
- package/Types/HashedString.ts +140 -4
- package/Types/Monitor/CriteriaFilter.ts +4 -0
- package/Types/Monitor/DomainMonitor/DomainLookupMethod.ts +23 -0
- package/Types/Monitor/DomainMonitor/DomainMonitorResponse.ts +7 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +24 -7
- package/Types/Monitor/MonitorMetricType.ts +8 -0
- package/Types/Monitor/MonitorStep.ts +10 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +21 -0
- package/Types/Monitor/PortMonitor/PortMonitorTimings.ts +10 -0
- package/Types/Permission.ts +23 -175
- package/Types/Probe/ProbeMonitorResponse.ts +6 -0
- package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +2 -3
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +85 -11
- package/UI/Components/ErrorBoundary.tsx +138 -11
- package/UI/Components/Feed/FeedItem.tsx +9 -2
- package/UI/Components/ModelDetail/CardModelDetail.tsx +0 -12
- package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +12 -2
- package/UI/Components/MoreMenu/MoreMenu.tsx +285 -97
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +8 -5
- package/UI/Components/Navbar/NavBar.tsx +12 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +19 -7
- package/UI/Utils/DownloadFile.ts +16 -8
- package/UI/Utils/ErrorSupportBundle.ts +805 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +19 -8
- package/UI/Utils/ModelAPI/UserProjectsModelAPI.ts +257 -0
- package/UI/Utils/Project.ts +4 -0
- package/UI/Utils/StatusPage.ts +8 -2
- package/UI/Utils/UseDashboardGridDnd.ts +917 -0
- package/Utils/Dashboard/DashboardViewConfig.ts +80 -36
- package/Utils/Dashboard/GridLayout.ts +523 -0
- package/Utils/Metrics/RecordingRuleExpression.ts +19 -17
- package/Utils/Monitor/MonitorMetricType.ts +44 -2
- package/Utils/StatusPage/GroupNestingLayout.ts +69 -0
- package/Utils/StatusPage/GroupTree.ts +157 -66
- package/Utils/StatusPage/ResourceUptime.ts +37 -2
- package/Utils/TeamMembersByProject.ts +237 -0
- package/Utils/Telemetry/SavedViewTimeRange.ts +114 -0
- package/Utils/Telemetry/TelemetryQueryTimeRange.ts +334 -0
- package/build/dist/Models/DatabaseModels/AIRun.js +39 -1
- package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertFeed.js +32 -0
- package/build/dist/Models/DatabaseModels/AlertFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +14 -6
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Dashboard.js +29 -0
- package/build/dist/Models/DatabaseModels/Dashboard.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +16 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +16 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +16 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +2 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentFeed.js +32 -0
- package/build/dist/Models/DatabaseModels/IncidentFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js +16 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogSavedView.js +33 -0
- package/build/dist/Models/DatabaseModels/LogSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +16 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js +16 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +257 -13
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +16 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplateOwnerUser.js +4 -4
- package/build/dist/Models/DatabaseModels/Service.js +28 -1
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +29 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +1 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +32 -0
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +32 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +49 -48
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +111 -11
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +312 -15
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +94 -167
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +29 -11
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +187 -2
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +21 -3
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseDatabase.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +29 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786018109307-AddPerUserPasswordSalt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js +59 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786023262402-WidenHashedStringColumnsForScrypt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js +22 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786096660558-AddTimeRangeToLogSavedView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786100000000-RestoreServiceLowerNameIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786101798351-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786105470826-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js +101 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786200000000-RestoreDroppedUniqueIndexes.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js +66 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786300000000-QuarantineUnboundGitHubInstallations.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786400000000-AddMasterPasswordSalt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786500000000-AddInvestigationCodeFixRecommendation.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +58 -12
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +74 -21
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertFeedService.js +3 -0
- package/build/dist/Server/Services/AlertFeedService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +86 -2
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/CodeRepositoryService.js +90 -2
- package/build/dist/Server/Services/CodeRepositoryService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +180 -3
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFeedService.js +3 -0
- package/build/dist/Server/Services/IncidentFeedService.js.map +1 -1
- package/build/dist/Server/Services/LlmLogService.js +22 -1
- package/build/dist/Server/Services/LlmLogService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +155 -25
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +165 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js +4 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentCompletion.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +8 -5
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +63 -24
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +2 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js +2 -0
- package/build/dist/Server/Utils/AI/Remediation/RemediationPlanRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +156 -28
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +21 -19
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js +128 -49
- package/build/dist/Server/Utils/AI/SRE/ConfidenceSignal.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js +170 -31
- package/build/dist/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +21 -19
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js +33 -9
- package/build/dist/Server/Utils/AI/SRE/InstrumentationTaskTrigger.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +9 -5
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +121 -41
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js +46 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationSubjectLock.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js +61 -14
- package/build/dist/Server/Utils/AI/SRE/PostedRootCause.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js +79 -1
- package/build/dist/Server/Utils/AI/SRE/SubjectCodeFixRun.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js +31 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js +21 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/ClusterConfig.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +13 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +126 -4
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js +136 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubInstallationBinding.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js +20 -3
- package/build/dist/Server/Utils/Monitor/Criteria/APIRequestCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js +43 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DomainMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/PasswordHash.js +258 -0
- package/build/dist/Server/Utils/PasswordHash.js.map +1 -0
- package/build/dist/Types/AI/AIRunCodeFixRecommendation.js +18 -0
- package/build/dist/Types/AI/AIRunCodeFixRecommendation.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +23 -3
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +3 -3
- package/build/dist/Types/Database/ColumnLength.js +9 -1
- package/build/dist/Types/Database/ColumnLength.js.map +1 -1
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/Database/UnsynchronizedIndex.js +46 -0
- package/build/dist/Types/Database/UnsynchronizedIndex.js.map +1 -0
- package/build/dist/Types/HashedString.js +96 -5
- package/build/dist/Types/HashedString.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +4 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js +24 -0
- package/build/dist/Types/Monitor/DomainMonitor/DomainLookupMethod.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +24 -7
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -1
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +15 -0
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js +2 -0
- package/build/dist/Types/Monitor/PortMonitor/PortMonitorTimings.js.map +1 -0
- package/build/dist/Types/Permission.js +23 -155
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +2 -5
- package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +51 -10
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +67 -8
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +2 -2
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +0 -12
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +12 -2
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +193 -65
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +3 -1
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +19 -7
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Utils/DownloadFile.js +15 -8
- package/build/dist/UI/Utils/DownloadFile.js.map +1 -1
- package/build/dist/UI/Utils/ErrorSupportBundle.js +476 -0
- package/build/dist/UI/Utils/ErrorSupportBundle.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -8
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js +156 -0
- package/build/dist/UI/Utils/ModelAPI/UserProjectsModelAPI.js.map +1 -0
- package/build/dist/UI/Utils/Project.js +3 -0
- package/build/dist/UI/Utils/Project.js.map +1 -1
- package/build/dist/UI/Utils/StatusPage.js +4 -4
- package/build/dist/UI/Utils/StatusPage.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js +551 -0
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardViewConfig.js +42 -26
- package/build/dist/Utils/Dashboard/DashboardViewConfig.js.map +1 -1
- package/build/dist/Utils/Dashboard/GridLayout.js +338 -0
- package/build/dist/Utils/Dashboard/GridLayout.js.map +1 -0
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js +19 -17
- package/build/dist/Utils/Metrics/RecordingRuleExpression.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +38 -6
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js +46 -0
- package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -1
- package/build/dist/Utils/StatusPage/GroupTree.js +79 -34
- package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js +22 -1
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/TeamMembersByProject.js +145 -0
- package/build/dist/Utils/TeamMembersByProject.js.map +1 -0
- package/build/dist/Utils/Telemetry/SavedViewTimeRange.js +79 -0
- package/build/dist/Utils/Telemetry/SavedViewTimeRange.js.map +1 -0
- package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js +236 -0
- package/build/dist/Utils/Telemetry/TelemetryQueryTimeRange.js.map +1 -0
- package/package.json +1 -1
package/Types/Permission.ts
CHANGED
|
@@ -402,12 +402,24 @@ enum Permission {
|
|
|
402
402
|
EditScheduledMaintenanceOwnerUser = "EditScheduledMaintenanceOwnerUser",
|
|
403
403
|
ReadScheduledMaintenanceOwnerUser = "ReadScheduledMaintenanceOwnerUser",
|
|
404
404
|
|
|
405
|
-
|
|
405
|
+
/*
|
|
406
|
+
* The two Create members below shipped with the value of their non-template
|
|
407
|
+
* counterparts (2024-09-09, "Add new migration for ScheduledMaintenanceTemplate"),
|
|
408
|
+
* so `CreateScheduledMaintenanceTemplateOwnerUser === CreateScheduledMaintenanceOwnerUser`
|
|
409
|
+
* at runtime and the two capabilities were one permission wearing two names.
|
|
410
|
+
* Granting either conferred create on BOTH the template owner table and the
|
|
411
|
+
* real scheduled-maintenance owner table — and since owner rows drive the
|
|
412
|
+
* Owned permission scope, that widened access to events the holder did not
|
|
413
|
+
* own. Their Delete/Edit/Read siblings were always correct; only Create was
|
|
414
|
+
* mis-keyed. AddScheduledMaintenanceTemplateOwnerPermissions backfills the
|
|
415
|
+
* stored grants so no install loses access when these values changed.
|
|
416
|
+
*/
|
|
417
|
+
CreateScheduledMaintenanceTemplateOwnerUser = "CreateScheduledMaintenanceTemplateOwnerUser",
|
|
406
418
|
DeleteScheduledMaintenanceTemplateOwnerUser = "DeleteScheduledMaintenanceTemplateOwnerUser",
|
|
407
419
|
EditScheduledMaintenanceTemplateOwnerUser = "EditScheduledMaintenanceTemplateOwnerUser",
|
|
408
420
|
ReadScheduledMaintenanceTemplateOwnerUser = "ReadScheduledMaintenanceTemplateOwnerUser",
|
|
409
421
|
|
|
410
|
-
CreateScheduledMaintenanceTemplateOwnerTeam = "
|
|
422
|
+
CreateScheduledMaintenanceTemplateOwnerTeam = "CreateScheduledMaintenanceTemplateOwnerTeam",
|
|
411
423
|
DeleteScheduledMaintenanceTemplateOwnerTeam = "DeleteScheduledMaintenanceTemplateOwnerTeam",
|
|
412
424
|
EditScheduledMaintenanceTemplateOwnerTeam = "EditScheduledMaintenanceTemplateOwnerTeam",
|
|
413
425
|
ReadScheduledMaintenanceTemplateOwnerTeam = "ReadScheduledMaintenanceTemplateOwnerTeam",
|
|
@@ -3287,88 +3299,6 @@ export class PermissionHelper {
|
|
|
3287
3299
|
group: PermissionGroup.Monitor,
|
|
3288
3300
|
},
|
|
3289
3301
|
|
|
3290
|
-
{
|
|
3291
|
-
permission: Permission.CreateStatusPageAnnouncement,
|
|
3292
|
-
title: "Create Status Page Announcement",
|
|
3293
|
-
description:
|
|
3294
|
-
"This permission can create Status Page Announcement this project.",
|
|
3295
|
-
isAssignableToTenant: true,
|
|
3296
|
-
isAccessControlPermission: false,
|
|
3297
|
-
isRolePermission: false,
|
|
3298
|
-
group: PermissionGroup.StatusPage,
|
|
3299
|
-
},
|
|
3300
|
-
{
|
|
3301
|
-
permission: Permission.DeleteStatusPageAnnouncement,
|
|
3302
|
-
title: "Delete Status Page Announcement",
|
|
3303
|
-
description:
|
|
3304
|
-
"This permission can delete Status Page Announcement of this project.",
|
|
3305
|
-
isAssignableToTenant: true,
|
|
3306
|
-
isAccessControlPermission: false,
|
|
3307
|
-
isRolePermission: false,
|
|
3308
|
-
group: PermissionGroup.StatusPage,
|
|
3309
|
-
},
|
|
3310
|
-
{
|
|
3311
|
-
permission: Permission.EditStatusPageAnnouncement,
|
|
3312
|
-
title: "Edit Status Page Announcement",
|
|
3313
|
-
description:
|
|
3314
|
-
"This permission can edit Status Page Announcement of this project.",
|
|
3315
|
-
isAssignableToTenant: true,
|
|
3316
|
-
isAccessControlPermission: false,
|
|
3317
|
-
isRolePermission: false,
|
|
3318
|
-
group: PermissionGroup.StatusPage,
|
|
3319
|
-
},
|
|
3320
|
-
{
|
|
3321
|
-
permission: Permission.ReadStatusPageAnnouncement,
|
|
3322
|
-
title: "Read Status Page Announcement",
|
|
3323
|
-
description:
|
|
3324
|
-
"This permission can read Status Page Announcement of this project.",
|
|
3325
|
-
isAssignableToTenant: true,
|
|
3326
|
-
isAccessControlPermission: false,
|
|
3327
|
-
isRolePermission: false,
|
|
3328
|
-
group: PermissionGroup.StatusPage,
|
|
3329
|
-
},
|
|
3330
|
-
|
|
3331
|
-
{
|
|
3332
|
-
permission: Permission.CreateStatusPageAnnouncementTemplate,
|
|
3333
|
-
title: "Create Status Page Announcement Template",
|
|
3334
|
-
description:
|
|
3335
|
-
"This permission can create Status Page Announcement Templates in this project.",
|
|
3336
|
-
isAssignableToTenant: true,
|
|
3337
|
-
isAccessControlPermission: false,
|
|
3338
|
-
isRolePermission: false,
|
|
3339
|
-
group: PermissionGroup.StatusPage,
|
|
3340
|
-
},
|
|
3341
|
-
{
|
|
3342
|
-
permission: Permission.DeleteStatusPageAnnouncementTemplate,
|
|
3343
|
-
title: "Delete Status Page Announcement Template",
|
|
3344
|
-
description:
|
|
3345
|
-
"This permission can delete Status Page Announcement Templates of this project.",
|
|
3346
|
-
isAssignableToTenant: true,
|
|
3347
|
-
isAccessControlPermission: false,
|
|
3348
|
-
isRolePermission: false,
|
|
3349
|
-
group: PermissionGroup.StatusPage,
|
|
3350
|
-
},
|
|
3351
|
-
{
|
|
3352
|
-
permission: Permission.EditStatusPageAnnouncementTemplate,
|
|
3353
|
-
title: "Edit Status Page Announcement Template",
|
|
3354
|
-
description:
|
|
3355
|
-
"This permission can edit Status Page Announcement Templates of this project.",
|
|
3356
|
-
isAssignableToTenant: true,
|
|
3357
|
-
isAccessControlPermission: false,
|
|
3358
|
-
isRolePermission: false,
|
|
3359
|
-
group: PermissionGroup.StatusPage,
|
|
3360
|
-
},
|
|
3361
|
-
{
|
|
3362
|
-
permission: Permission.ReadStatusPageAnnouncementTemplate,
|
|
3363
|
-
title: "Read Status Page Announcement Template",
|
|
3364
|
-
description:
|
|
3365
|
-
"This permission can read Status Page Announcement Templates of this project.",
|
|
3366
|
-
isAssignableToTenant: true,
|
|
3367
|
-
isAccessControlPermission: false,
|
|
3368
|
-
isRolePermission: false,
|
|
3369
|
-
group: PermissionGroup.StatusPage,
|
|
3370
|
-
},
|
|
3371
|
-
|
|
3372
3302
|
{
|
|
3373
3303
|
permission: Permission.CreateStatusPageAnnouncement,
|
|
3374
3304
|
title: "Create Status Page Announcement",
|
|
@@ -4841,47 +4771,6 @@ export class PermissionHelper {
|
|
|
4841
4771
|
group: PermissionGroup.Settings,
|
|
4842
4772
|
},
|
|
4843
4773
|
|
|
4844
|
-
{
|
|
4845
|
-
permission: Permission.CreateStatusPageDomain,
|
|
4846
|
-
title: "Create Status Page Domain",
|
|
4847
|
-
description:
|
|
4848
|
-
"This permission can create Status Page Domain in this project.",
|
|
4849
|
-
isAssignableToTenant: true,
|
|
4850
|
-
isAccessControlPermission: false,
|
|
4851
|
-
isRolePermission: false,
|
|
4852
|
-
group: PermissionGroup.StatusPage,
|
|
4853
|
-
},
|
|
4854
|
-
{
|
|
4855
|
-
permission: Permission.DeleteStatusPageDomain,
|
|
4856
|
-
title: "Delete Status Page Domain",
|
|
4857
|
-
description:
|
|
4858
|
-
"This permission can delete Status Page Domain in this project.",
|
|
4859
|
-
isAssignableToTenant: true,
|
|
4860
|
-
isAccessControlPermission: false,
|
|
4861
|
-
isRolePermission: false,
|
|
4862
|
-
group: PermissionGroup.StatusPage,
|
|
4863
|
-
},
|
|
4864
|
-
{
|
|
4865
|
-
permission: Permission.EditStatusPageDomain,
|
|
4866
|
-
title: "Edit Status Page Domain",
|
|
4867
|
-
description:
|
|
4868
|
-
"This permission can edit Status Page Domain in this project.",
|
|
4869
|
-
isAssignableToTenant: true,
|
|
4870
|
-
isAccessControlPermission: false,
|
|
4871
|
-
isRolePermission: false,
|
|
4872
|
-
group: PermissionGroup.StatusPage,
|
|
4873
|
-
},
|
|
4874
|
-
{
|
|
4875
|
-
permission: Permission.ReadStatusPageDomain,
|
|
4876
|
-
title: "Read Status Page Domain",
|
|
4877
|
-
description:
|
|
4878
|
-
"This permission can read Status Page Domain in this project.",
|
|
4879
|
-
isAssignableToTenant: true,
|
|
4880
|
-
isAccessControlPermission: false,
|
|
4881
|
-
isRolePermission: false,
|
|
4882
|
-
group: PermissionGroup.StatusPage,
|
|
4883
|
-
},
|
|
4884
|
-
|
|
4885
4774
|
{
|
|
4886
4775
|
permission: Permission.CreateIncidentSeverity,
|
|
4887
4776
|
title: "Create Incident Severity",
|
|
@@ -10046,7 +9935,7 @@ export class PermissionHelper {
|
|
|
10046
9935
|
permission: Permission.CreateScheduledMaintenanceTemplateOwnerUser,
|
|
10047
9936
|
title: "Create Scheduled Maintenance Template User Owner",
|
|
10048
9937
|
description:
|
|
10049
|
-
"This permission can create Scheduled Maintenance Template User Owner this project.",
|
|
9938
|
+
"This permission can create Scheduled Maintenance Template User Owner in this project.",
|
|
10050
9939
|
isAssignableToTenant: true,
|
|
10051
9940
|
isAccessControlPermission: false,
|
|
10052
9941
|
isRolePermission: false,
|
|
@@ -10085,9 +9974,9 @@ export class PermissionHelper {
|
|
|
10085
9974
|
|
|
10086
9975
|
{
|
|
10087
9976
|
permission: Permission.CreateScheduledMaintenanceTemplateOwnerTeam,
|
|
10088
|
-
title: "Create Scheduled Maintenance Template
|
|
9977
|
+
title: "Create Scheduled Maintenance Template Team Owner",
|
|
10089
9978
|
description:
|
|
10090
|
-
"This permission can create Scheduled Maintenance Template
|
|
9979
|
+
"This permission can create Scheduled Maintenance Template Team Owner in this project.",
|
|
10091
9980
|
isAssignableToTenant: true,
|
|
10092
9981
|
isAccessControlPermission: false,
|
|
10093
9982
|
isRolePermission: false,
|
|
@@ -10095,9 +9984,9 @@ export class PermissionHelper {
|
|
|
10095
9984
|
},
|
|
10096
9985
|
{
|
|
10097
9986
|
permission: Permission.DeleteScheduledMaintenanceTemplateOwnerTeam,
|
|
10098
|
-
title: "Delete Scheduled Maintenance Template
|
|
9987
|
+
title: "Delete Scheduled Maintenance Template Team Owner",
|
|
10099
9988
|
description:
|
|
10100
|
-
"This permission can delete Scheduled Maintenance Template
|
|
9989
|
+
"This permission can delete Scheduled Maintenance Template Team Owner of this project.",
|
|
10101
9990
|
isAssignableToTenant: true,
|
|
10102
9991
|
isAccessControlPermission: false,
|
|
10103
9992
|
isRolePermission: false,
|
|
@@ -10105,9 +9994,9 @@ export class PermissionHelper {
|
|
|
10105
9994
|
},
|
|
10106
9995
|
{
|
|
10107
9996
|
permission: Permission.EditScheduledMaintenanceTemplateOwnerTeam,
|
|
10108
|
-
title: "Edit Scheduled Maintenance Template
|
|
9997
|
+
title: "Edit Scheduled Maintenance Template Team Owner",
|
|
10109
9998
|
description:
|
|
10110
|
-
"This permission can edit Scheduled Maintenance Template
|
|
9999
|
+
"This permission can edit Scheduled Maintenance Template Team Owner of this project.",
|
|
10111
10000
|
isAssignableToTenant: true,
|
|
10112
10001
|
isAccessControlPermission: false,
|
|
10113
10002
|
isRolePermission: false,
|
|
@@ -10115,9 +10004,9 @@ export class PermissionHelper {
|
|
|
10115
10004
|
},
|
|
10116
10005
|
{
|
|
10117
10006
|
permission: Permission.ReadScheduledMaintenanceTemplateOwnerTeam,
|
|
10118
|
-
title: "Read Scheduled Maintenance Template
|
|
10007
|
+
title: "Read Scheduled Maintenance Template Team Owner",
|
|
10119
10008
|
description:
|
|
10120
|
-
"This permission can read Scheduled Maintenance Template
|
|
10009
|
+
"This permission can read Scheduled Maintenance Template Team Owner of this project.",
|
|
10121
10010
|
isAssignableToTenant: true,
|
|
10122
10011
|
isAccessControlPermission: false,
|
|
10123
10012
|
isRolePermission: false,
|
|
@@ -10778,47 +10667,6 @@ export class PermissionHelper {
|
|
|
10778
10667
|
group: PermissionGroup.Incident,
|
|
10779
10668
|
},
|
|
10780
10669
|
|
|
10781
|
-
{
|
|
10782
|
-
permission: Permission.CreateStatusPageOwnerTeam,
|
|
10783
|
-
title: "Create Status Page Team Owner",
|
|
10784
|
-
description:
|
|
10785
|
-
"This permission can create Status Page Team Owner this project.",
|
|
10786
|
-
isAssignableToTenant: true,
|
|
10787
|
-
isAccessControlPermission: false,
|
|
10788
|
-
isRolePermission: false,
|
|
10789
|
-
group: PermissionGroup.StatusPage,
|
|
10790
|
-
},
|
|
10791
|
-
{
|
|
10792
|
-
permission: Permission.DeleteStatusPageOwnerTeam,
|
|
10793
|
-
title: "Delete Status Page Team Owner",
|
|
10794
|
-
description:
|
|
10795
|
-
"This permission can delete Status Page Team Owner of this project.",
|
|
10796
|
-
isAssignableToTenant: true,
|
|
10797
|
-
isAccessControlPermission: false,
|
|
10798
|
-
isRolePermission: false,
|
|
10799
|
-
group: PermissionGroup.StatusPage,
|
|
10800
|
-
},
|
|
10801
|
-
{
|
|
10802
|
-
permission: Permission.EditStatusPageOwnerTeam,
|
|
10803
|
-
title: "Edit Status Page Team Owner",
|
|
10804
|
-
description:
|
|
10805
|
-
"This permission can edit Status Page Team Owner of this project.",
|
|
10806
|
-
isAssignableToTenant: true,
|
|
10807
|
-
isAccessControlPermission: false,
|
|
10808
|
-
isRolePermission: false,
|
|
10809
|
-
group: PermissionGroup.StatusPage,
|
|
10810
|
-
},
|
|
10811
|
-
{
|
|
10812
|
-
permission: Permission.ReadStatusPageOwnerTeam,
|
|
10813
|
-
title: "Read Status Page Team Owner",
|
|
10814
|
-
description:
|
|
10815
|
-
"This permission can read Status Page Team Owner of this project.",
|
|
10816
|
-
isAssignableToTenant: true,
|
|
10817
|
-
isAccessControlPermission: false,
|
|
10818
|
-
isRolePermission: false,
|
|
10819
|
-
group: PermissionGroup.StatusPage,
|
|
10820
|
-
},
|
|
10821
|
-
|
|
10822
10670
|
{
|
|
10823
10671
|
permission: Permission.CreateStatusPageOwnerUser,
|
|
10824
10672
|
title: "Create Status Page User Owner",
|
|
@@ -17,6 +17,7 @@ import ExternalStatusPageMonitorResponse from "../Monitor/ExternalStatusPageMoni
|
|
|
17
17
|
import HttpPhaseTimings from "../Monitor/HttpPhaseTimings";
|
|
18
18
|
import MonitorEvaluationSummary from "../Monitor/MonitorEvaluationSummary";
|
|
19
19
|
import NetworkPathTrace from "../Monitor/NetworkMonitor/NetworkPathTrace";
|
|
20
|
+
import PortMonitorTimings from "../Monitor/PortMonitor/PortMonitorTimings";
|
|
20
21
|
import ObjectID from "../ObjectID";
|
|
21
22
|
import Port from "../Port";
|
|
22
23
|
import ProbeAttempt from "./ProbeAttempt";
|
|
@@ -58,6 +59,11 @@ export default interface ProbeMonitorResponse {
|
|
|
58
59
|
* checks. Absent when the request went through a proxy.
|
|
59
60
|
*/
|
|
60
61
|
httpTimings?: HttpPhaseTimings | undefined;
|
|
62
|
+
/*
|
|
63
|
+
* DNS / TCP / total connection timing for Port checks. DNS is absent for
|
|
64
|
+
* IP literals. Also present when Ping/IP checks use the Port fallback.
|
|
65
|
+
*/
|
|
66
|
+
portTimings?: PortMonitorTimings | undefined;
|
|
61
67
|
dnsResponse?: DnsMonitorResponse | undefined;
|
|
62
68
|
domainResponse?: DomainMonitorResponse | undefined;
|
|
63
69
|
dnssecResponse?: DnssecMonitorResponse | undefined;
|
|
@@ -201,9 +201,7 @@ const BulkUpdateForm: <T extends GenericObject>(
|
|
|
201
201
|
let itemClassName: string = "";
|
|
202
202
|
let iconClassName: string = "";
|
|
203
203
|
|
|
204
|
-
if (isDisabled) {
|
|
205
|
-
itemClassName = "opacity-50 cursor-not-allowed hover:bg-transparent";
|
|
206
|
-
} else if (isDanger) {
|
|
204
|
+
if (!isDisabled && isDanger) {
|
|
207
205
|
itemClassName = "text-red-700 hover:text-red-800 hover:bg-red-50";
|
|
208
206
|
iconClassName = "text-red-400 group-hover:text-red-500";
|
|
209
207
|
}
|
|
@@ -215,6 +213,7 @@ const BulkUpdateForm: <T extends GenericObject>(
|
|
|
215
213
|
icon={button.icon}
|
|
216
214
|
className={itemClassName}
|
|
217
215
|
iconClassName={iconClassName}
|
|
216
|
+
isDisabled={isDisabled}
|
|
218
217
|
onClick={() => {
|
|
219
218
|
triggerButtonClick(button);
|
|
220
219
|
}}
|
|
@@ -51,14 +51,41 @@ export interface ComponentProps {
|
|
|
51
51
|
customFieldType: DatabaseBaseModelType;
|
|
52
52
|
projectId: ObjectID;
|
|
53
53
|
name: string;
|
|
54
|
-
isEditable?: boolean;
|
|
54
|
+
isEditable?: boolean | undefined;
|
|
55
|
+
/*
|
|
56
|
+
* For call sites that mount this card unconditionally - the resource
|
|
57
|
+
* overview pages - where most projects have never defined a custom field.
|
|
58
|
+
*
|
|
59
|
+
* With this set the card renders NOTHING until it knows the project has at
|
|
60
|
+
* least one field of this type: no loader flash and no "no custom fields
|
|
61
|
+
* have been added" placeholder occupying a slot on a page the operator
|
|
62
|
+
* opened to look at something else.
|
|
63
|
+
*
|
|
64
|
+
* It also hides on a load failure, because reading the schema is gated on
|
|
65
|
+
* both a permission and a billing plan. Without that, every incident a
|
|
66
|
+
* project below the custom-fields plan opens would carry an error card it
|
|
67
|
+
* can do nothing about. The dedicated Custom Fields page mounts this same
|
|
68
|
+
* component WITHOUT the flag, so anyone who goes looking still sees the
|
|
69
|
+
* real reason.
|
|
70
|
+
*/
|
|
71
|
+
hideIfEmpty?: boolean | undefined;
|
|
55
72
|
}
|
|
56
73
|
|
|
57
74
|
const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
58
75
|
props: ComponentProps,
|
|
59
76
|
): ReactElement => {
|
|
60
77
|
const [schemaList, setSchemaList] = useState<Array<BaseModel>>([]);
|
|
61
|
-
|
|
78
|
+
/*
|
|
79
|
+
* Read failures and write failures are kept apart because hideIfEmpty
|
|
80
|
+
* treats them oppositely. Failing to READ the schema is something an
|
|
81
|
+
* overview page swallows - the project may simply not be on a plan that
|
|
82
|
+
* includes custom fields, and there is nothing the operator can do about it
|
|
83
|
+
* on an incident page. Failing to WRITE is the operator's own edit coming
|
|
84
|
+
* back rejected, and must be reported wherever it happens. Sharing one slot
|
|
85
|
+
* meant a rejected save made the whole card disappear.
|
|
86
|
+
*/
|
|
87
|
+
const [loadError, setLoadError] = useState<string>("");
|
|
88
|
+
const [saveError, setSaveError] = useState<string>("");
|
|
62
89
|
const [isLoading, setIsLoading] = useState<boolean>(false);
|
|
63
90
|
const [model, setModel] = useState<BaseModel | null>(null);
|
|
64
91
|
const [showModelForm, setShowModelForm] = useState<boolean>(false);
|
|
@@ -67,6 +94,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
67
94
|
try {
|
|
68
95
|
// load schema.
|
|
69
96
|
setIsLoading(true);
|
|
97
|
+
setLoadError("");
|
|
70
98
|
|
|
71
99
|
const schemaList: ListResult<BaseModel> =
|
|
72
100
|
await ModelAPI.getList<BaseModel>({
|
|
@@ -99,7 +127,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
99
127
|
setIsLoading(false);
|
|
100
128
|
} catch (err) {
|
|
101
129
|
setIsLoading(false);
|
|
102
|
-
|
|
130
|
+
setLoadError(API.getFriendlyMessage(err));
|
|
103
131
|
}
|
|
104
132
|
};
|
|
105
133
|
|
|
@@ -109,6 +137,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
109
137
|
try {
|
|
110
138
|
// load schema.
|
|
111
139
|
setIsLoading(true);
|
|
140
|
+
setSaveError("");
|
|
112
141
|
setShowModelForm(false);
|
|
113
142
|
|
|
114
143
|
await ModelAPI.updateById({
|
|
@@ -122,7 +151,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
122
151
|
await onLoad();
|
|
123
152
|
} catch (err) {
|
|
124
153
|
setIsLoading(false);
|
|
125
|
-
|
|
154
|
+
setSaveError(API.getFriendlyMessage(err));
|
|
126
155
|
}
|
|
127
156
|
};
|
|
128
157
|
|
|
@@ -132,12 +161,45 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
132
161
|
|
|
133
162
|
const isEditable: boolean = props.isEditable !== false;
|
|
134
163
|
|
|
164
|
+
/*
|
|
165
|
+
* schemaList is empty both before the first load finishes and when the
|
|
166
|
+
* project genuinely has no fields of this type, which is exactly when an
|
|
167
|
+
* overview page should show nothing - so one check covers both.
|
|
168
|
+
*
|
|
169
|
+
* `!model` covers the record itself coming back empty. On a page that is
|
|
170
|
+
* plainly displaying that record, a card announcing "Item not found" is a
|
|
171
|
+
* contradiction; showing nothing is the honest version.
|
|
172
|
+
*
|
|
173
|
+
* Deliberately NOT saveError: a rejected save has to stay on screen, and it
|
|
174
|
+
* leaves schemaList and model intact, so the card keeps rendering.
|
|
175
|
+
*/
|
|
176
|
+
if (
|
|
177
|
+
props.hideIfEmpty &&
|
|
178
|
+
(Boolean(loadError) || schemaList.length === 0 || !model)
|
|
179
|
+
) {
|
|
180
|
+
return <></>;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/*
|
|
184
|
+
* There has to be something to edit before the button is worth offering:
|
|
185
|
+
* the modal reads its initial values off the record and its inputs off the
|
|
186
|
+
* schema, so opening it mid-load threw on a null record, and opening it
|
|
187
|
+
* with no fields defined produced a form with nothing in it.
|
|
188
|
+
*
|
|
189
|
+
* A failed LOAD needs no term of its own - it leaves schemaList empty and
|
|
190
|
+
* model null, which the checks below already cover. A failed SAVE must not
|
|
191
|
+
* take the button away, or the error message is telling the operator to
|
|
192
|
+
* retry something they can no longer reach.
|
|
193
|
+
*/
|
|
194
|
+
const canEdit: boolean =
|
|
195
|
+
isEditable && !isLoading && schemaList.length > 0 && Boolean(model);
|
|
196
|
+
|
|
135
197
|
return (
|
|
136
198
|
<Card
|
|
137
199
|
title={props.title}
|
|
138
200
|
description={props.description}
|
|
139
201
|
buttons={
|
|
140
|
-
|
|
202
|
+
canEdit
|
|
141
203
|
? [
|
|
142
204
|
{
|
|
143
205
|
title: "Edit Fields",
|
|
@@ -152,14 +214,26 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
152
214
|
}
|
|
153
215
|
>
|
|
154
216
|
<div className="border-t border-gray-200 px-4 py-5 sm:px-6 -m-6 -mt-2">
|
|
155
|
-
{isLoading && !
|
|
156
|
-
{!isLoading && !
|
|
217
|
+
{isLoading && !loadError && <ComponentLoader />}
|
|
218
|
+
{!isLoading && !loadError && schemaList.length === 0 && (
|
|
157
219
|
<ErrorMessage message="No custom fields have been added for this resource. You may add custom fields in Project Settings." />
|
|
158
220
|
)}
|
|
159
|
-
{
|
|
160
|
-
{
|
|
221
|
+
{loadError && <ErrorMessage message={loadError} />}
|
|
222
|
+
{/*
|
|
223
|
+
* Above the values, which are still the ones on the record: the save
|
|
224
|
+
* did not happen, so what is on screen below is what is stored.
|
|
225
|
+
*/}
|
|
226
|
+
{saveError && <ErrorMessage message={saveError} />}
|
|
227
|
+
{/*
|
|
228
|
+
* Only once the fetch has settled: model is null on the very first
|
|
229
|
+
* render too, and announcing "Item not found" while the request is
|
|
230
|
+
* still in flight reads as a broken record rather than a pending one.
|
|
231
|
+
*/}
|
|
232
|
+
{!isLoading && !loadError && schemaList.length > 0 && !model && (
|
|
233
|
+
<ErrorMessage message={"Item not found"} />
|
|
234
|
+
)}
|
|
161
235
|
|
|
162
|
-
{!isLoading && !
|
|
236
|
+
{!isLoading && !loadError && schemaList.length > 0 && model && (
|
|
163
237
|
<Detail
|
|
164
238
|
id={props.name}
|
|
165
239
|
item={(model as any)["customFields"] || {}}
|
|
@@ -194,7 +268,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
|
|
|
194
268
|
await onSave(data).catch();
|
|
195
269
|
}}
|
|
196
270
|
formProps={{
|
|
197
|
-
initialValues: (model as any)["customFields"] || {},
|
|
271
|
+
initialValues: (model as any)?.["customFields"] || {},
|
|
198
272
|
fields: schemaList.map((schemaItem: BaseModel) => {
|
|
199
273
|
const isDropdown: boolean =
|
|
200
274
|
(schemaItem as any).customFieldType ===
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { downloadErrorSupportBundle } from "../Utils/ErrorSupportBundle";
|
|
2
|
+
import React, {
|
|
3
|
+
ErrorInfo,
|
|
4
|
+
FunctionComponent,
|
|
5
|
+
ReactElement,
|
|
6
|
+
ReactNode,
|
|
7
|
+
useRef,
|
|
8
|
+
useState,
|
|
9
|
+
} from "react";
|
|
2
10
|
import {
|
|
3
11
|
ErrorBoundary as NativeErrorBoundary,
|
|
4
12
|
FallbackProps,
|
|
@@ -14,7 +22,22 @@ export interface ComponentProps {
|
|
|
14
22
|
*/
|
|
15
23
|
resetKey?: string | undefined;
|
|
16
24
|
/** Notified for every caught error. Used by tests and by callers that report. */
|
|
17
|
-
onError?: ((error: Error) => void) | undefined;
|
|
25
|
+
onError?: ((error: Error, errorInfo: ErrorInfo) => void) | undefined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
interface CapturedErrorDetails {
|
|
29
|
+
error: unknown;
|
|
30
|
+
componentStack: string | null;
|
|
31
|
+
digest: string | null;
|
|
32
|
+
capturedAt: string;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
type GetCapturedErrorDetailsFunction = (
|
|
36
|
+
error: unknown,
|
|
37
|
+
) => CapturedErrorDetails | null;
|
|
38
|
+
|
|
39
|
+
interface FallbackComponentProps extends FallbackProps {
|
|
40
|
+
getCapturedErrorDetails?: GetCapturedErrorDetailsFunction | undefined;
|
|
18
41
|
}
|
|
19
42
|
|
|
20
43
|
/**
|
|
@@ -146,17 +169,45 @@ export const handleChunkLoadError: HandleChunkLoadErrorFunction = (
|
|
|
146
169
|
return true;
|
|
147
170
|
};
|
|
148
171
|
|
|
149
|
-
export const Fallback: FunctionComponent<
|
|
150
|
-
props:
|
|
172
|
+
export const Fallback: FunctionComponent<FallbackComponentProps> = (
|
|
173
|
+
props: FallbackComponentProps,
|
|
151
174
|
): ReactElement => {
|
|
175
|
+
const [supportBundleStatus, setSupportBundleStatus] = useState<string>("");
|
|
152
176
|
const errorMessage: string =
|
|
153
177
|
props.error && typeof props.error.message === "string"
|
|
154
178
|
? props.error.message
|
|
155
179
|
: "";
|
|
156
180
|
|
|
181
|
+
type DownloadSupportBundleFunction = () => void;
|
|
182
|
+
|
|
183
|
+
const downloadSupportBundle: DownloadSupportBundleFunction = (): void => {
|
|
184
|
+
setSupportBundleStatus("");
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
const capturedErrorDetails: CapturedErrorDetails | null =
|
|
188
|
+
props.getCapturedErrorDetails?.(props.error) || null;
|
|
189
|
+
|
|
190
|
+
downloadErrorSupportBundle({
|
|
191
|
+
error: props.error,
|
|
192
|
+
componentStack: capturedErrorDetails?.componentStack,
|
|
193
|
+
digest: capturedErrorDetails?.digest,
|
|
194
|
+
capturedAt: capturedErrorDetails?.capturedAt,
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
setSupportBundleStatus(
|
|
198
|
+
"Support bundle downloaded. Review it, then attach it when contacting OneUptime Support.",
|
|
199
|
+
);
|
|
200
|
+
} catch (error) {
|
|
201
|
+
// eslint-disable-next-line no-console
|
|
202
|
+
console.error("Unable to download the error support bundle:", error);
|
|
203
|
+
setSupportBundleStatus(
|
|
204
|
+
"The support bundle could not be downloaded. Please try again.",
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
|
|
157
209
|
return (
|
|
158
210
|
<div
|
|
159
|
-
role="alert"
|
|
160
211
|
data-testid="error-boundary-fallback"
|
|
161
212
|
style={{
|
|
162
213
|
minHeight: "60vh",
|
|
@@ -170,8 +221,8 @@ export const Fallback: FunctionComponent<FallbackProps> = (
|
|
|
170
221
|
textAlign: "center",
|
|
171
222
|
}}
|
|
172
223
|
>
|
|
173
|
-
<div style={{ maxWidth: "
|
|
174
|
-
<div style={{ fontWeight: 600, marginBottom: "0.5rem" }}>
|
|
224
|
+
<div style={{ maxWidth: "40rem" }}>
|
|
225
|
+
<div role="alert" style={{ fontWeight: 600, marginBottom: "0.5rem" }}>
|
|
175
226
|
An unexpected error has occurred. Please reload the page to continue
|
|
176
227
|
</div>
|
|
177
228
|
<div
|
|
@@ -189,6 +240,7 @@ export const Fallback: FunctionComponent<FallbackProps> = (
|
|
|
189
240
|
display: "flex",
|
|
190
241
|
gap: "0.75rem",
|
|
191
242
|
justifyContent: "center",
|
|
243
|
+
flexWrap: "wrap",
|
|
192
244
|
}}
|
|
193
245
|
>
|
|
194
246
|
<button
|
|
@@ -225,6 +277,45 @@ export const Fallback: FunctionComponent<FallbackProps> = (
|
|
|
225
277
|
>
|
|
226
278
|
Reload page
|
|
227
279
|
</button>
|
|
280
|
+
<button
|
|
281
|
+
type="button"
|
|
282
|
+
data-testid="error-boundary-download-support-bundle"
|
|
283
|
+
onClick={downloadSupportBundle}
|
|
284
|
+
style={{
|
|
285
|
+
padding: "0.5rem 1rem",
|
|
286
|
+
borderRadius: "0.375rem",
|
|
287
|
+
border: "1px solid var(--ou-border-primary, #d1d5db)",
|
|
288
|
+
backgroundColor: "transparent",
|
|
289
|
+
color: "inherit",
|
|
290
|
+
cursor: "pointer",
|
|
291
|
+
}}
|
|
292
|
+
>
|
|
293
|
+
Download support bundle
|
|
294
|
+
</button>
|
|
295
|
+
</div>
|
|
296
|
+
<div
|
|
297
|
+
style={{
|
|
298
|
+
marginTop: "1rem",
|
|
299
|
+
fontSize: "0.75rem",
|
|
300
|
+
color: "var(--ou-text-secondary, #6b7280)",
|
|
301
|
+
}}
|
|
302
|
+
>
|
|
303
|
+
Download a local diagnostics file with the error stack, component
|
|
304
|
+
stack, scrubbed page URL, browser details, and OneUptime build. It
|
|
305
|
+
never reads cookies, saved browser data, or form contents. Review it
|
|
306
|
+
before sharing it with OneUptime Support.
|
|
307
|
+
</div>
|
|
308
|
+
<div
|
|
309
|
+
role="status"
|
|
310
|
+
data-testid="error-boundary-support-bundle-status"
|
|
311
|
+
style={{
|
|
312
|
+
minHeight: "1rem",
|
|
313
|
+
marginTop: "0.75rem",
|
|
314
|
+
fontSize: "0.75rem",
|
|
315
|
+
color: "var(--ou-text-secondary, #6b7280)",
|
|
316
|
+
}}
|
|
317
|
+
>
|
|
318
|
+
{supportBundleStatus}
|
|
228
319
|
</div>
|
|
229
320
|
{errorMessage ? (
|
|
230
321
|
<div
|
|
@@ -249,9 +340,22 @@ export const Fallback: FunctionComponent<FallbackProps> = (
|
|
|
249
340
|
const ErrorBoundary: FunctionComponent<ComponentProps> = (
|
|
250
341
|
props: ComponentProps,
|
|
251
342
|
): ReactElement => {
|
|
252
|
-
|
|
343
|
+
const capturedErrorDetailsRef: React.MutableRefObject<CapturedErrorDetails | null> =
|
|
344
|
+
useRef<CapturedErrorDetails | null>(null);
|
|
345
|
+
|
|
346
|
+
type OnErrorFunction = (error: Error, errorInfo: ErrorInfo) => void;
|
|
347
|
+
|
|
348
|
+
const onError: OnErrorFunction = (
|
|
349
|
+
error: Error,
|
|
350
|
+
errorInfo: ErrorInfo,
|
|
351
|
+
): void => {
|
|
352
|
+
capturedErrorDetailsRef.current = {
|
|
353
|
+
error: error,
|
|
354
|
+
componentStack: errorInfo.componentStack || null,
|
|
355
|
+
digest: errorInfo.digest || null,
|
|
356
|
+
capturedAt: new Date().toISOString(),
|
|
357
|
+
};
|
|
253
358
|
|
|
254
|
-
const onError: OnErrorFunction = (error: Error): void => {
|
|
255
359
|
/*
|
|
256
360
|
* Surface the error. Without this the only trace of a crash is the blank
|
|
257
361
|
* screen itself, because the boundary swallows what React would otherwise
|
|
@@ -263,13 +367,36 @@ const ErrorBoundary: FunctionComponent<ComponentProps> = (
|
|
|
263
367
|
// A stale bundle recovers by reloading, so do that instead of blaming the user.
|
|
264
368
|
handleChunkLoadError(error);
|
|
265
369
|
|
|
266
|
-
props.onError?.(error);
|
|
370
|
+
props.onError?.(error, errorInfo);
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
const getCapturedErrorDetails: GetCapturedErrorDetailsFunction = (
|
|
374
|
+
error: unknown,
|
|
375
|
+
): CapturedErrorDetails | null => {
|
|
376
|
+
if (
|
|
377
|
+
!capturedErrorDetailsRef.current ||
|
|
378
|
+
!Object.is(capturedErrorDetailsRef.current.error, error)
|
|
379
|
+
) {
|
|
380
|
+
return null;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
return capturedErrorDetailsRef.current;
|
|
267
384
|
};
|
|
268
385
|
|
|
269
386
|
return (
|
|
270
387
|
<NativeErrorBoundary
|
|
271
|
-
|
|
388
|
+
fallbackRender={(fallbackProps: FallbackProps): ReactElement => {
|
|
389
|
+
return (
|
|
390
|
+
<Fallback
|
|
391
|
+
{...fallbackProps}
|
|
392
|
+
getCapturedErrorDetails={getCapturedErrorDetails}
|
|
393
|
+
/>
|
|
394
|
+
);
|
|
395
|
+
}}
|
|
272
396
|
onError={onError}
|
|
397
|
+
onReset={() => {
|
|
398
|
+
capturedErrorDetailsRef.current = null;
|
|
399
|
+
}}
|
|
273
400
|
resetKeys={[props.resetKey]}
|
|
274
401
|
>
|
|
275
402
|
{props.children}
|