@oneuptime/common 14.0.1 → 14.0.2
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/AlertEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/AutoRemediationSuggestion.ts +63 -0
- package/Models/DatabaseModels/IncidentEpisodeMember.ts +8 -1
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +9 -2
- package/Models/DatabaseModels/IncidentPublicNote.ts +9 -2
- package/Models/DatabaseModels/KubernetesCluster.ts +429 -0
- package/Models/DatabaseModels/Monitor.ts +48 -0
- package/Models/DatabaseModels/Runner.ts +5 -4
- package/Models/DatabaseModels/RunnerJob.ts +66 -0
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +10 -2
- package/Models/DatabaseModels/WorkflowVariable.ts +479 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +79 -25
- package/Server/API/AIInvestigationAPI.ts +341 -0
- package/Server/API/AutoRemediationAPI.ts +184 -2
- package/Server/API/CommonAPI.ts +70 -0
- package/Server/API/KubernetesClusterAiAccessAPI.ts +793 -0
- package/Server/API/MicrosoftTeamsAPI.ts +770 -315
- package/Server/API/MonitorAPI.ts +140 -0
- package/Server/API/OnCallScheduleTimelineAPI.ts +5 -21
- package/Server/API/SlackAPI.ts +447 -99
- package/Server/API/StatusPageAPI.ts +146 -26
- package/Server/API/TelemetryAPI.ts +216 -5
- package/Server/API/UserTwoFactorBackupCodeAPI.ts +1 -0
- package/Server/API/WorkflowVariableAPI.ts +156 -0
- package/Server/Infrastructure/GlobalCache.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.ts +20 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +28 -0
- package/Server/Middleware/TelemetryIngest.ts +47 -2
- package/Server/Middleware/UserAuthorization.ts +56 -2
- package/Server/Services/AIAgentService.ts +1 -0
- package/Server/Services/AccessTokenService.ts +121 -48
- package/Server/Services/AlertEpisodeMemberService.ts +9 -0
- package/Server/Services/AlertEpisodeService.ts +14 -1
- package/Server/Services/AlertService.ts +134 -22
- package/Server/Services/AutoRemediationRuleEngineService.ts +968 -39
- package/Server/Services/AutoRemediationRuleService.ts +118 -0
- package/Server/Services/BillingService.ts +1 -0
- package/Server/Services/InboundEmail/Providers/SendGridInboundProvider.ts +16 -22
- package/Server/Services/IncidentEpisodeMemberService.ts +9 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +66 -0
- package/Server/Services/IncidentEpisodeRoleMemberService.ts +27 -0
- package/Server/Services/IncidentEpisodeService.ts +14 -1
- package/Server/Services/IncidentGroupingEngineService.ts +11 -0
- package/Server/Services/IncidentMemberService.ts +21 -0
- package/Server/Services/IncidentPublicNoteService.ts +63 -0
- package/Server/Services/IncidentService.ts +120 -20
- package/Server/Services/IncidentStateTimelineService.ts +15 -0
- package/Server/Services/IncidentTemplateService.ts +83 -3
- package/Server/Services/KubernetesClusterAiAccessService.ts +1943 -0
- package/Server/Services/KubernetesClusterService.ts +1570 -1
- package/Server/Services/LogAggregationService.ts +14 -6
- package/Server/Services/MonitorService.ts +651 -52
- package/Server/Services/MonitorStatusTimelineService.ts +639 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +3 -0
- package/Server/Services/OnCallNotificationAlertingService.ts +36 -12
- package/Server/Services/OnCallSetupReminderService.ts +1 -0
- package/Server/Services/ProbeService.ts +7 -1
- package/Server/Services/ProjectService.ts +11 -1
- package/Server/Services/RunbookCredentialService.ts +26 -1
- package/Server/Services/RunbookSecretService.ts +36 -0
- package/Server/Services/RunnerJobService.ts +941 -23
- package/Server/Services/RunnerService.ts +439 -6
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +66 -0
- package/Server/Services/ScheduledMaintenanceService.ts +124 -19
- package/Server/Services/ScheduledMaintenanceTemplateService.ts +82 -3
- package/Server/Services/ServiceLevelObjectiveService.ts +14 -1
- package/Server/Services/StatusPagePrivateUserService.ts +1 -0
- package/Server/Services/StatusPageService.ts +301 -74
- package/Server/Services/StatusPageSubscriberService.ts +4 -0
- package/Server/Services/TeamMemberService.ts +309 -7
- package/Server/Services/TraceAggregationService.ts +10 -6
- package/Server/Services/UserEmailService.ts +1 -0
- package/Server/Services/UserNotificationMethodAdminService.ts +1 -0
- package/Server/Services/UserNotificationRuleAdminService.ts +1 -0
- package/Server/Services/UserNotificationRuleService.ts +4 -0
- package/Server/Services/UserService.ts +122 -1
- package/Server/Services/WorkflowVariableService.ts +593 -8
- package/Server/Services/WorkspaceNotificationRuleService.ts +588 -8
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +170 -1
- package/Server/Types/Database/QueryHelper.ts +22 -0
- package/Server/Types/Markdown.ts +502 -27
- package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +182 -0
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +525 -0
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +854 -0
- package/Server/Utils/AI/CodeFix/CodeFixAgentAuth.ts +22 -2
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +1916 -307
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +1601 -74
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +139 -7
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +58 -1
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +54 -1
- package/Server/Utils/AI/Toolbox/AIActionTools.ts +14 -6
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +4 -2
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +1341 -150
- package/Server/Utils/AutoRemediation/RemediationVerifier.ts +375 -4
- package/Server/Utils/Database/AffectedResourceRelations.ts +127 -0
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +240 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +1 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +83 -9
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +5 -1
- package/Server/Utils/Monitor/MonitorIncident.ts +104 -9
- package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +124 -7
- package/Server/Utils/Monitor/ProbeMonitorsNotification.ts +407 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +1 -0
- package/Server/Utils/PushNotificationUtil.ts +45 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +40 -3
- package/Server/Utils/Runbook/RunbookExecutePermission.ts +56 -6
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +223 -33
- package/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.ts +559 -0
- package/Server/Utils/StartServer.ts +4 -3
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +528 -0
- package/Server/Utils/TwoFactorBackupCodeNotification.ts +1 -0
- package/Server/Utils/UserPermission/UserPermission.ts +16 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +704 -0
- package/Server/Utils/Workflow/WorkflowVariableOAuthToken.ts +318 -0
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.ts +47 -7
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.ts +57 -16
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +193 -214
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +57 -13
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.ts +54 -17
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.ts +179 -161
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +281 -167
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.ts +114 -0
- package/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.ts +895 -0
- package/Server/Utils/Workspace/Slack/Actions/ActionTypes.ts +7 -9
- package/Server/Utils/Workspace/Slack/Actions/Alert.ts +96 -227
- package/Server/Utils/Workspace/Slack/Actions/AlertEpisode.ts +93 -214
- package/Server/Utils/Workspace/Slack/Actions/Auth.ts +30 -3
- package/Server/Utils/Workspace/Slack/Actions/Authorization.ts +99 -0
- package/Server/Utils/Workspace/Slack/Actions/Incident.ts +117 -283
- package/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.ts +101 -196
- package/Server/Utils/Workspace/Slack/Actions/ReactionNote.ts +329 -0
- package/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.ts +111 -287
- package/Server/Utils/Workspace/Slack/Slack.ts +86 -17
- package/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
- package/Server/Utils/Workspace/Workspace.ts +171 -54
- package/Server/Utils/Workspace/WorkspaceActionAuthorization.ts +252 -0
- package/Server/Utils/Workspace/WorkspaceBase.ts +39 -0
- package/Server/Utils/Workspace/WorkspaceOAuthState.ts +280 -0
- package/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.ts +96 -0
- package/Server/Utils/Workspace/WorkspaceReactionNote.ts +620 -0
- package/Tests/App/Dashboard/AttributesJSONDashboardSurfaces.test.tsx +496 -0
- package/Tests/App/Dashboard/AutoRemediationRulesTableCommandRunners.test.tsx +152 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +32 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +794 -0
- package/Tests/App/Dashboard/CreateOAuthWorkflowVariableModal.test.tsx +840 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +653 -0
- package/Tests/App/Dashboard/DatabaseMonitorStepForm.test.tsx +197 -0
- package/Tests/App/Dashboard/DatabaseMonitorView.test.tsx +376 -0
- package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +262 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +2080 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +486 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +933 -0
- package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +218 -0
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +665 -0
- package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +494 -0
- package/Tests/App/Dashboard/IncidentEpisodeOverviewNotifyDefault.test.tsx +706 -0
- package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +472 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +858 -0
- package/Tests/App/Dashboard/IncomingEmailAddressSettings.test.tsx +567 -0
- package/Tests/App/Dashboard/InvestigationClusterToolFormat.test.ts +241 -0
- package/Tests/App/Dashboard/InvestigationEvidenceKubectl.test.tsx +322 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +12 -0
- package/Tests/App/Dashboard/InvestigationPanelClusterAccess.test.tsx +476 -0
- package/Tests/App/Dashboard/InvestigationRunDetailsKubectl.test.tsx +383 -0
- package/Tests/App/Dashboard/KubectlActivitySummary.test.tsx +366 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +2886 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +2688 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +915 -0
- package/Tests/App/Dashboard/LayerDateTimeFieldTimezoneName.test.tsx +66 -0
- package/Tests/App/Dashboard/LogMonitorPreview.test.tsx +174 -0
- package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/MonitorMetricQueryConfig.test.ts +244 -0
- package/Tests/App/Dashboard/MonitorOpenWorkCard.test.tsx +381 -0
- package/Tests/App/Dashboard/MonitorOpenWorkHook.test.tsx +784 -0
- package/Tests/App/Dashboard/MonitorOverviewData.test.tsx +2199 -0
- package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +1169 -0
- package/Tests/App/Dashboard/MonitorOverviewInput.test.ts +1127 -0
- package/Tests/App/Dashboard/MonitorOverviewPage.test.tsx +2136 -0
- package/Tests/App/Dashboard/MonitorOverviewSelectReadable.test.ts +368 -0
- package/Tests/App/Dashboard/MonitorOverviewStatBar.test.tsx +526 -0
- package/Tests/App/Dashboard/MonitorOverviewSupportingCards.test.tsx +542 -0
- package/Tests/App/Dashboard/MonitorOwnersCombine.test.ts +299 -0
- package/Tests/App/Dashboard/MonitorProbesCard.test.tsx +602 -0
- package/Tests/App/Dashboard/MonitorResponseTimeCard.test.tsx +386 -0
- package/Tests/App/Dashboard/MonitorSetupAndConnectionCards.test.tsx +612 -0
- package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +257 -0
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +360 -1
- package/Tests/App/Dashboard/MonitorUptimeHistoryCard.test.tsx +835 -0
- package/Tests/App/Dashboard/MonitorUptimeSummaryHook.test.tsx +971 -0
- package/Tests/App/Dashboard/MonitorViewLayout.test.tsx +580 -0
- package/Tests/App/Dashboard/OnCallLayerRestrictionTimesPreserved.test.tsx +441 -0
- package/Tests/App/Dashboard/OnCallNavbar.test.tsx +214 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewCalendarDisplay.test.tsx +1389 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +205 -1
- package/Tests/App/Dashboard/OnCallScheduleTimeInputsSettingsZone.test.tsx +198 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +524 -0
- package/Tests/App/Dashboard/RemediationSuggestionCardApproval.test.tsx +702 -0
- package/Tests/App/Dashboard/RemoveUserFromProject.test.tsx +427 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +4 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +3 -1
- package/Tests/App/Dashboard/RunbookStepTypeMaps.test.ts +166 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +622 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +1491 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +489 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewNotifyDefault.test.tsx +909 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +14 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceWindowStatsTranslation.test.tsx +307 -0
- package/Tests/App/Dashboard/SecurityEventAttributeColumnPicker.test.tsx +542 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +174 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +973 -212
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +491 -52
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +301 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +158 -1
- package/Tests/App/Dashboard/SecurityEventProviderTile.test.tsx +869 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +959 -94
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +2 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +274 -1
- package/Tests/App/Dashboard/TeamMembershipRemoval.test.ts +900 -0
- package/Tests/App/Dashboard/TeamMembershipRemovalPages.test.tsx +460 -0
- package/Tests/App/Dashboard/TimezoneElements.test.tsx +321 -0
- package/Tests/App/Dashboard/TimezoneSelectButton.test.tsx +634 -0
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +260 -0
- package/Tests/App/Dashboard/TraceMonitorPreview.test.tsx +182 -0
- package/Tests/App/Dashboard/UserTimezoneInit.test.tsx +544 -0
- package/Tests/App/Dashboard/WorkflowVariableModals.test.tsx +1630 -0
- package/Tests/App/Dashboard/WorkflowVariableRoutes.test.tsx +603 -0
- package/Tests/App/Dashboard/WorkflowVariableTokenStatus.test.tsx +589 -0
- package/Tests/App/Dashboard/WorkflowVariableUtil.test.ts +1543 -0
- package/Tests/App/Dashboard/WorkflowVariableView.test.tsx +3227 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +1277 -395
- package/Tests/App/StatusPage/StatusPageOverviewMonitorGroupUptime.test.tsx +714 -0
- package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.NewYork.test.tsx +1009 -0
- package/Tests/App/StatusPage/StatusPageOverviewUptimeBars.test.tsx +1092 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -0
- package/Tests/Models/DatabaseModels/KubernetesClusterAiAccessColumns.test.ts +520 -0
- package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +66 -2
- package/Tests/Models/DatabaseModels/WorkspaceProjectAuthTokenAccessControl.test.ts +236 -0
- package/Tests/Models/IncidentEpisodePublicNoteNotifyColumnContract.test.ts +103 -0
- package/Tests/Models/IncidentPublicNoteNotifyColumnContract.test.ts +96 -0
- package/Tests/Models/ScheduledMaintenancePublicNoteNotifyColumnContract.test.ts +111 -0
- package/Tests/Server/API/AIInvestigationAPI.test.ts +976 -0
- package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +836 -0
- package/Tests/Server/API/CommonAPIAssertCanCreateTable.test.ts +565 -0
- package/Tests/Server/API/CommonAPIAssertCanReadTable.test.ts +282 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +1744 -0
- package/Tests/Server/API/LogHistogramAPI.test.ts +371 -0
- package/Tests/Server/API/MicrosoftTeamsLegacyWebhookRemoval.test.ts +125 -30
- package/Tests/Server/API/MicrosoftTeamsOAuthState.test.ts +1121 -0
- package/Tests/Server/API/MonitorUptimeSummaryAPI.test.ts +685 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +602 -1
- package/Tests/Server/API/SlackChannelCacheAPI.test.ts +358 -0
- package/Tests/Server/API/SlackOAuthState.test.ts +688 -0
- package/Tests/Server/API/StatusPageOverviewMonitorGroupUptime.test.ts +527 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +2 -0
- package/Tests/Server/API/StatusPageUptimeAPI.test.ts +427 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +4 -0
- package/Tests/Server/API/WorkflowVariableAPI.test.ts +404 -0
- package/Tests/Server/API/WorkspaceOAuthTestHelpers.ts +289 -0
- package/Tests/Server/API/WorkspaceSendTestNotificationRoutes.test.ts +2064 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +86 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOAuth2WorkflowVariablesMigration.test.ts +254 -0
- package/Tests/Server/Middleware/BlockedUserMiddleware.test.ts +403 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +13 -0
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +2 -0
- package/Tests/Server/Middleware/RemovedProjectMemberAuthorization.test.ts +469 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +77 -1
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +211 -0
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +358 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +97 -0
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +2 -0
- package/Tests/Server/Services/AccessTokenProjectUserGrant.test.ts +14 -2
- package/Tests/Server/Services/AccessTokenRemovedMemberAccess.test.ts +1044 -0
- package/Tests/Server/Services/AddOwnersIdempotency.test.ts +5 -0
- package/Tests/Server/Services/AlertEpisodeMemberCreatePermission.test.ts +139 -0
- package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +1361 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +375 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +2384 -0
- package/Tests/Server/Services/FindOwnersProjectMembership.test.ts +267 -0
- package/Tests/Server/Services/InboundEmail/SendGridInboundProviderAddress.test.ts +90 -0
- package/Tests/Server/Services/IncidentEpisodeMemberCreatePermission.test.ts +143 -0
- package/Tests/Server/Services/IncidentEpisodePublicNoteNotifyDefault.test.ts +805 -0
- package/Tests/Server/Services/IncidentPublicNoteNotifyDefault.test.ts +724 -0
- package/Tests/Server/Services/IncidentRoleProjectMembership.test.ts +233 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessAgentRunnerAssignments.test.ts +372 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessBindingGuard.test.ts +1876 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +620 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +421 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +3662 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessSubjectClusters.test.ts +405 -0
- package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +975 -0
- package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +497 -0
- package/Tests/Server/Services/KubernetesClusterServiceDeleteSettlesRemediation.test.ts +328 -0
- package/Tests/Server/Services/LogAggregationService.test.ts +99 -0
- package/Tests/Server/Services/MonitorServiceIncomingEmailCustomAddress.test.ts +447 -0
- package/Tests/Server/Services/MonitorServiceProbeFlagSync.test.ts +1334 -0
- package/Tests/Server/Services/MonitorServiceProbeStatusGrouping.test.ts +1640 -0
- package/Tests/Server/Services/MonitorServiceRefreshCurrentStatus.test.ts +225 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +8 -8
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +264 -1
- package/Tests/Server/Services/MonitorStatusTimelineMergedDowntime.test.ts +284 -0
- package/Tests/Server/Services/MonitorUptimeSummaryService.test.ts +1043 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +5 -0
- package/Tests/Server/Services/OnCallUndeliverablePageOwnerMembership.test.ts +359 -0
- package/Tests/Server/Services/ProbeServiceDashboardLink.test.ts +191 -0
- package/Tests/Server/Services/ProjectOwnersProjectMembership.test.ts +221 -0
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +5 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +28 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +9 -1
- package/Tests/Server/Services/RunnerJobEnqueueAiCommandAgentRunner.test.ts +230 -0
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +978 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +866 -0
- package/Tests/Server/Services/RunnerJobSubmitResultRedaction.test.ts +322 -0
- package/Tests/Server/Services/RunnerJobSubmitResultUnstorableText.test.ts +357 -0
- package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +227 -0
- package/Tests/Server/Services/RunnerServiceAgentName.test.ts +581 -0
- package/Tests/Server/Services/ScheduledMaintenancePublicNoteNotifyDefault.test.ts +802 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +53 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +5 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +12 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +1176 -1
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +9 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +18 -0
- package/Tests/Server/Services/TeamMemberProjectMembership.test.ts +255 -0
- package/Tests/Server/Services/TeamMemberRemovalRevokesProjectAccess.test.ts +600 -0
- package/Tests/Server/Services/TeamMemberResourceCleanup.test.ts +731 -0
- package/Tests/Server/Services/TeamMemberWorkspaceAccountCleanup.test.ts +164 -0
- package/Tests/Server/Services/TraceAggregationService.test.ts +64 -0
- package/Tests/Server/Services/UserServiceBlockedUser.test.ts +293 -0
- package/Tests/Server/Services/WorkflowVariableOAuthHooks.test.ts +1016 -0
- package/Tests/Server/Services/WorkflowVariableOAuthPostgres.test.ts +543 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +16 -5
- package/Tests/Server/Services/WorkspaceNotificationRuleNoteDelivery.test.ts +473 -0
- package/Tests/Server/Services/WorkspaceNotificationRuleSendTestNotification.test.ts +3690 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenMiscDataSecrets.test.ts +374 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenSlackChannelCache.test.ts +143 -0
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableOAuthColumnPermission.test.ts +250 -0
- package/Tests/Server/Types/Database/QueryHelperJsonContains.test.ts +96 -0
- package/Tests/Server/Types/Markdown.test.ts +1033 -0
- package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +285 -0
- package/Tests/Server/Utils/AI/CodeFix/CodeFixAgentAuth.test.ts +159 -1
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +752 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +1840 -0
- package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +1067 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +355 -0
- package/Tests/Server/Utils/AI/PostIncidentStatusUpdateTool.test.ts +496 -0
- package/Tests/Server/Utils/AI/RemediationCommandTools.test.ts +305 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +1365 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +639 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +1585 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +1065 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +2138 -1
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +1035 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +517 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +27 -1
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +1371 -24
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorRollbackRace.test.ts +962 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +518 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +939 -2
- package/Tests/Server/Utils/Database/ProjectScopedRelationReferences.test.ts +371 -0
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +64 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricObservationRemediation.test.ts +102 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +362 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +55 -0
- package/Tests/Server/Utils/Monitor/MonitorEmailAddressRedaction.test.ts +255 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +347 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +203 -0
- package/Tests/Server/Utils/Monitor/ProbeMonitorsNotification.test.ts +1147 -0
- package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +79 -0
- package/Tests/Server/Utils/ResourceFeed/ResourceFeedUtil.test.ts +21 -1
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +155 -1
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +288 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.test.ts +304 -0
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +40 -3
- package/Tests/Server/Utils/Workflow/OAuth2TokenClient.test.ts +702 -0
- package/Tests/Server/Utils/Workflow/OAuth2TokenClientHttpIntegration.test.ts +507 -0
- package/Tests/Server/Utils/Workflow/WorkflowVariableOAuthToken.test.ts +831 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsActionAuthorization.test.ts +63 -1
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsAppAccessToken.test.ts +256 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +60 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChatActionAuthorization.test.ts +442 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +44 -2
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +55 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsReactionNoteSync.test.ts +1522 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsServiceUrl.test.ts +130 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +4 -4
- package/Tests/Server/Utils/Workspace/Slack/SlackActionAuthorization.test.ts +691 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMessageByTimestamp.test.ts +253 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackReactionNote.test.ts +574 -0
- package/Tests/Server/Utils/Workspace/WorkspaceActionAuthorization.test.ts +488 -0
- package/Tests/Server/Utils/Workspace/WorkspaceCreateProjectReferences.test.ts +861 -0
- package/Tests/Server/Utils/Workspace/WorkspaceMessageAuthor.test.ts +635 -0
- package/Tests/Server/Utils/Workspace/WorkspaceOAuthState.test.ts +548 -0
- package/Tests/Server/Utils/Workspace/WorkspaceReactionNote.test.ts +839 -0
- package/Tests/Server/Utils/Workspace/WorkspaceSendErrorMessage.test.ts +725 -0
- package/Tests/Types/AutoRemediation/AiRemediationCommandPlan.test.ts +283 -9
- package/Tests/Types/DateBrowserLocalWallClock.test.ts +280 -0
- package/Tests/Types/DateLocalShortMonthNameFallback.test.ts +389 -0
- package/Tests/Types/DateUserTimezone.test.ts +177 -4
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +306 -0
- package/Tests/Types/Kubernetes/KubernetesClusterAiAccess.test.ts +283 -0
- package/Tests/Types/Kubernetes/KubernetesRunnerPostureWriteScope.test.ts +68 -0
- package/Tests/Types/Monitor/DatabaseMonitor/SqlServerPlatform.test.ts +144 -0
- package/Tests/Types/Monitor/MonitorStepExceptionMonitor.test.ts +160 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +53 -0
- package/Tests/Types/Runbook/RunbookStepType.test.ts +91 -16
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +14 -3
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +15 -0
- package/Tests/Types/StatusPage/PublicNoteSubscriberNotificationDefault.test.ts +1868 -0
- package/Tests/Types/Timezone.test.ts +5 -0
- package/Tests/Types/TimezoneAlias.test.ts +1034 -0
- package/Tests/Types/Workflow/JiraTemplateFixtures.ts +833 -0
- package/Tests/Types/Workflow/JiraTemplateScripts.test.ts +5414 -0
- package/Tests/Types/Workflow/JiraTemplateSimulation.test.ts +4803 -0
- package/Tests/Types/Workflow/JiraTemplates.test.ts +5429 -0
- package/Tests/Types/Workflow/Templates.test.ts +79 -4
- package/Tests/Types/Workflow/WorkflowVariableOAuth.test.ts +520 -0
- package/Tests/Types/Workspace/WorkspaceNoteReaction.test.ts +177 -0
- package/Tests/UI/Components/AttributesJSON/AttributesJSONView.test.tsx +390 -0
- package/Tests/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.test.tsx +566 -0
- package/Tests/UI/Components/AttributesJSON/JSONHighlight.test.ts +131 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +276 -1
- package/Tests/UI/Components/Calendar/Calendar.test.tsx +1611 -0
- package/Tests/UI/Components/Calendar/CalendarDayLayout.test.ts +1486 -0
- package/Tests/UI/Components/Calendar/CalendarDayLayoutDst.test.ts +632 -0
- package/Tests/UI/Components/Calendar/CalendarDst.test.tsx +388 -0
- package/Tests/UI/Components/Charts/ChartGroupPlotFloor.test.tsx +170 -0
- package/Tests/UI/Components/Charts/HistogramSelection.test.ts +282 -0
- package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +6 -0
- package/Tests/UI/Components/CustomTimeRangeModalTimezoneTranslation.test.tsx +285 -0
- package/Tests/UI/Components/Dropdown.test.tsx +999 -2
- package/Tests/UI/Components/Forms/FormFieldCheckboxTranslation.test.tsx +216 -0
- package/Tests/UI/Components/Forms/FormFieldTimezoneDescriptionTranslation.test.tsx +461 -0
- package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +641 -0
- package/Tests/UI/Components/Forms/IncidentPublicNoteNotifyPayload.test.tsx +346 -0
- package/Tests/UI/Components/Forms/ScheduledMaintenancePublicNoteNotifyPayload.test.tsx +493 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +911 -2
- package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.NewYork.test.tsx +730 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraphTimezone.Tokyo.test.tsx +506 -0
- package/Tests/UI/Components/HistogramClickToZoom.test.tsx +619 -0
- package/Tests/UI/Components/LogDetailsPanelAttributesJSON.test.tsx +248 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +47 -1
- package/Tests/UI/Components/LogsViewerSmallScreens.test.tsx +620 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +242 -3
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteConfirmation.test.tsx +521 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +406 -2
- package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +169 -2
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +266 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerSmallScreens.test.tsx +439 -0
- package/Tests/UI/Components/TimezoneDropdownLegacyValues.test.tsx +704 -0
- package/Tests/UI/Components/UseHistogramZoom.test.tsx +89 -1
- package/Tests/UI/Components/UseLogsHistogram.test.tsx +175 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +5 -5
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +28 -0
- package/Tests/UI/Utils/ProjectUsersModelAPI.test.ts +51 -0
- package/Tests/UI/Utils/Timezone.test.ts +747 -33
- package/Tests/UI/Workspace/SendTestNotificationButton.test.tsx +1854 -0
- package/Tests/UI/Workspace/WorkspaceCardsSendTestNotification.test.tsx +1864 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +435 -7
- package/Tests/Utils/AiRemediation/KubectlAllowlistValidatorParity.test.ts +1084 -0
- package/Tests/Utils/AiRemediation/KubectlOutputRedactor.test.ts +2531 -0
- package/Tests/Utils/AiRemediation/KubectlPolicy.test.ts +1895 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyAllowlist.test.ts +428 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +828 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyCustomResourceScope.test.ts +573 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyDenials.test.ts +1525 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyExposeOverrides.test.ts +275 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyNodePatch.test.ts +428 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyObjectWords.test.ts +195 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyPatchParents.test.ts +637 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyPodSecurityBaseline.test.ts +322 -0
- package/Tests/Utils/AiRemediation/KubectlPolicySafeWriteScope.test.ts +1026 -0
- package/Tests/Utils/AiRemediation/KubectlWaitBudget.test.ts +267 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScope.test.ts +390 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +777 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeClusterScoped.test.ts +613 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeEntryPoint.test.ts +576 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeKubectlSpellings.test.ts +752 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeObjectWords.test.ts +358 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeOverrides.test.ts +293 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopeParityCases.ts +598 -0
- package/Tests/Utils/AiRemediation/KubectlWriteScopePolicyParity.test.ts +403 -0
- package/Tests/Utils/Dashboard/DashboardClockComponent.test.ts +154 -5
- package/Tests/Utils/Monitor/IncomingEmailMonitorAddress.test.ts +478 -0
- package/Tests/Utils/Monitor/MonitorCheckScheduleUtil.test.ts +646 -0
- package/Tests/Utils/Monitor/MonitorOverviewCriteriaUtil.test.ts +292 -0
- package/Tests/Utils/Monitor/MonitorOverviewFamily.test.ts +274 -0
- package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +3100 -0
- package/Tests/Utils/Monitor/MonitorOverviewProbeUtil.test.ts +1412 -0
- package/Tests/Utils/Monitor/MonitorOverviewTargetUtil.test.ts +374 -0
- package/Tests/Utils/Monitor/MonitorStatusHistoryUtil.test.ts +332 -0
- package/Tests/Utils/Monitor/MonitorUptimeSummaryUtil.test.ts +946 -0
- package/Tests/Utils/Rum/SessionIdentity.test.ts +94 -0
- package/Tests/Utils/Rum/SessionReplayWafCompatibility.test.ts +840 -0
- package/Tests/Utils/Rum/SessionReplayWireEncoding.test.ts +208 -0
- package/Tests/Utils/Rum/UserFlow.test.ts +1010 -0
- package/Tests/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.test.ts +217 -0
- package/Tests/Utils/StatusPage/ResourceUptime.test.ts +1272 -1
- package/Tests/Utils/StatusPage/UptimeDailyAggregateTotals.test.ts +298 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +649 -1
- package/Tests/Utils/StatusPage/UptimeDailyAggregateWindow.test.ts +314 -0
- package/Tests/Utils/Telemetry/AttributesJSON.test.ts +454 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +418 -2
- package/Tests/Utils/Uptime/DayUptimeGraphUtilMidnightDst.test.ts +160 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Auckland.test.ts +45 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Kolkata.test.ts +40 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.London.test.ts +147 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.NewYork.test.ts +48 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezone.Tokyo.test.ts +39 -0
- package/Tests/Utils/Uptime/DayUptimeGraphUtilTimezoneCases.ts +1015 -0
- package/Tests/Utils/Uptime/UptimeUtil.test.ts +75 -0
- package/Tests/Utils/Uptime/UptimeUtilChronologicalOrder.test.ts +1279 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +203 -5
- package/Types/Date.ts +121 -7
- package/Types/Email/EmailMessage.ts +8 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Exception/ExceptionMessages.ts +1 -0
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +488 -0
- package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +54 -0
- package/Types/Kubernetes/KubernetesClusterAiAccessToolNames.ts +17 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +9 -0
- package/Types/Monitor/DatabaseMonitor/SqlServerPlatform.ts +117 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +6 -5
- package/Types/Monitor/MonitorStepExceptionMonitor.ts +56 -0
- package/Types/Monitor/MonitorUptimeSummary.ts +113 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +11 -0
- package/Types/Rum/SessionReplay.ts +55 -2
- package/Types/Rum/SessionReplayApi.ts +44 -1
- package/Types/Rum/UserFlow.ts +187 -0
- package/Types/Runbook/RunbookStepType.ts +10 -0
- package/Types/Runbook/RunnerJobOrigin.ts +15 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +6 -2
- package/Types/StatusPage/MergedDowntimeTotals.ts +17 -0
- package/Types/StatusPage/PublicNoteSubscriberNotificationDefault.ts +148 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +15 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +9 -0
- package/Types/Timezone.ts +5 -0
- package/Types/TimezoneAlias.ts +385 -0
- package/Types/Workflow/Templates.ts +3041 -2
- package/Types/Workflow/WorkflowVariableOAuth.ts +476 -0
- package/Types/Workspace/WorkspaceNoteReaction.ts +132 -0
- package/Typings/Index.d.ts +24 -0
- package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +175 -0
- package/UI/Components/AttributesJSON/AttributesJSONView.tsx +138 -0
- package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +79 -0
- package/UI/Components/AttributesJSON/BracesGlyph.tsx +30 -0
- package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +491 -0
- package/UI/Components/AttributesJSON/JSONHighlight.ts +77 -0
- package/UI/Components/Calendar/Calendar.css +83 -0
- package/UI/Components/Calendar/Calendar.tsx +136 -7
- package/UI/Components/Calendar/CalendarDayLayout.ts +236 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +23 -1
- package/UI/Components/Charts/Utils/HistogramSelection.ts +117 -0
- package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +269 -0
- package/UI/Components/Charts/Utils/useHistogramZoom.ts +26 -2
- package/UI/Components/Date/CustomTimeRangeModal.tsx +26 -3
- package/UI/Components/Dropdown/Dropdown.tsx +58 -9
- package/UI/Components/Forms/Fields/FormField.tsx +49 -14
- package/UI/Components/Graphs/DayUptimeGraph.tsx +166 -25
- package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
- package/UI/Components/Graphs/UptimeDaySummary.tsx +8 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +52 -5
- package/UI/Components/LogsViewer/components/ColumnSelector.tsx +13 -2
- package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +13 -1
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +91 -76
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +15 -1
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +28 -106
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +54 -6
- package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +8 -2
- package/UI/Components/LogsViewer/useLogsHistogram.ts +39 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +66 -14
- package/UI/Components/MonitorGraphs/Uptime.tsx +12 -0
- package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +10 -2
- package/UI/Components/Page/ModelPage.tsx +59 -3
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +69 -5
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +12 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +15 -1
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +36 -104
- package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -1
- package/UI/Utils/ModelAPI/ProjectUsersModelAPI.ts +19 -1
- package/UI/Utils/Timezone.ts +69 -28
- package/Utils/AI/InvestigationReport.ts +195 -25
- package/Utils/AiRemediation/KubectlOutputRedactor.ts +1724 -0
- package/Utils/AiRemediation/KubectlPolicy.ts +4136 -0
- package/Utils/AiRemediation/KubectlWaitBudget.ts +156 -0
- package/Utils/AiRemediation/KubectlWriteScope.ts +1964 -0
- package/Utils/Dashboard/Components/DashboardClockComponent.ts +7 -6
- package/Utils/Monitor/IncomingEmailMonitorAddress.ts +292 -0
- package/Utils/Monitor/MonitorCheckScheduleUtil.ts +654 -0
- package/Utils/Monitor/MonitorOverviewCriteriaUtil.ts +188 -0
- package/Utils/Monitor/MonitorOverviewFamily.ts +263 -0
- package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +1958 -0
- package/Utils/Monitor/MonitorOverviewProbeUtil.ts +979 -0
- package/Utils/Monitor/MonitorOverviewTargetUtil.ts +299 -0
- package/Utils/Monitor/MonitorStatusHistoryUtil.ts +201 -0
- package/Utils/Monitor/MonitorUptimeSummaryUtil.ts +638 -0
- package/Utils/Rum/SessionIdentity.ts +44 -0
- package/Utils/Rum/SessionReplayWireEncoding.ts +137 -0
- package/Utils/Rum/UserFlow.ts +1527 -0
- package/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.ts +107 -0
- package/Utils/StatusPage/ResourceUptime.ts +99 -0
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +197 -0
- package/Utils/Telemetry/AttributesJSON.ts +367 -0
- package/Utils/Uptime/DayUptimeGraphUtil.ts +165 -0
- package/Utils/Uptime/UptimeUtil.ts +122 -38
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js +8 -1
- package/build/dist/Models/DatabaseModels/AlertEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js +62 -0
- package/build/dist/Models/DatabaseModels/AutoRemediationSuggestion.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js +8 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodeMember.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +10 -3
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +434 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +49 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Runner.js +4 -4
- package/build/dist/Models/DatabaseModels/Runner.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerJob.js +66 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +11 -3
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +487 -3
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js +64 -16
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +205 -0
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +115 -2
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +49 -0
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +564 -0
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -0
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +465 -176
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/MonitorAPI.js +107 -1
- package/build/dist/Server/API/MonitorAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +5 -16
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -1
- package/build/dist/Server/API/SlackAPI.js +322 -78
- package/build/dist/Server/API/SlackAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +123 -17
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +144 -5
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js +1 -0
- package/build/dist/Server/API/UserTwoFactorBackupCodeAPI.js.map +1 -1
- package/build/dist/Server/API/WorkflowVariableAPI.js +109 -0
- package/build/dist/Server/API/WorkflowVariableAPI.js.map +1 -0
- 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/1794300000000-AddOAuth2WorkflowVariables.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794300000000-AddOAuth2WorkflowVariables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js +54 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794400000000-AddKubernetesClusterAiAccess.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794500000000-AddIncomingEmailCustomAddressToMonitor.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794600000000-AddAuthTokenExpiresAtToWorkspaceProjectAuthToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js +32 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794700000000-RemoveAppAccessTokenFromWorkspaceProjectAuthTokenMiscData.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +21 -0
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +32 -2
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +39 -6
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +1 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/AccessTokenService.js +87 -42
- package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeMemberService.js +4 -0
- package/build/dist/Server/Services/AlertEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeService.js +12 -1
- package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +110 -23
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +716 -30
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js +100 -0
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +1 -0
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js +11 -16
- package/build/dist/Server/Services/InboundEmail/Providers/SendGridInboundProvider.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +4 -0
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +48 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js +21 -0
- package/build/dist/Server/Services/IncidentEpisodeRoleMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +12 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentMemberService.js +14 -0
- package/build/dist/Server/Services/IncidentMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +48 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +99 -21
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +68 -4
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +1470 -0
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterService.js +1097 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +14 -6
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +487 -48
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +540 -3
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +3 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +29 -7
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
- package/build/dist/Server/Services/OnCallSetupReminderService.js +1 -0
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +7 -1
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +11 -1
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RunbookCredentialService.js +24 -0
- package/build/dist/Server/Services/RunbookCredentialService.js.map +1 -1
- package/build/dist/Server/Services/RunbookSecretService.js +44 -0
- package/build/dist/Server/Services/RunbookSecretService.js.map +1 -1
- package/build/dist/Server/Services/RunnerJobService.js +641 -21
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/RunnerService.js +344 -5
- package/build/dist/Server/Services/RunnerService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +48 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +102 -20
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +67 -4
- package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +12 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -0
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +230 -32
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +4 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +270 -11
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +10 -6
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserEmailService.js +1 -0
- package/build/dist/Server/Services/UserEmailService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +1 -0
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +4 -0
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +107 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowVariableService.js +396 -7
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +463 -7
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +144 -2
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +20 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +394 -27
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +123 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +344 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +587 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js +18 -2
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixAgentAuth.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +1380 -239
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +1099 -68
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +88 -6
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +45 -11
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +41 -11
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js +11 -4
- package/build/dist/Server/Utils/AI/Toolbox/AIActionTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +4 -2
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +997 -141
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js +299 -4
- package/build/dist/Server/Utils/AutoRemediation/RemediationVerifier.js.map +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +120 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +160 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +59 -12
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +5 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +84 -22
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +70 -5
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js +249 -0
- package/build/dist/Server/Utils/Monitor/ProbeMonitorsNotification.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -1
- package/build/dist/Server/Utils/PushNotificationUtil.js +27 -0
- package/build/dist/Server/Utils/PushNotificationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +26 -3
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js +38 -3
- package/build/dist/Server/Utils/Runbook/RunbookExecutePermission.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +143 -23
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js +406 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayUserFlowReadService.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +4 -3
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +382 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js +1 -0
- package/build/dist/Server/Utils/TwoFactorBackupCodeNotification.js.map +1 -1
- package/build/dist/Server/Utils/UserPermission/UserPermission.js +10 -0
- package/build/dist/Server/Utils/UserPermission/UserPermission.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +447 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -0
- package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js +202 -0
- package/build/dist/Server/Utils/Workflow/WorkflowVariableOAuthToken.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js +39 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js +44 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +150 -191
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +44 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js +39 -17
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Monitor.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js +151 -145
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +221 -127
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js +91 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeamsServiceUrl.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js +673 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/ReactionNoteSync.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js +3 -9
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ActionTypes.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js +65 -166
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Alert.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js +63 -157
- package/build/dist/Server/Utils/Workspace/Slack/Actions/AlertEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js +23 -3
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Auth.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js +92 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Authorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js +81 -210
- package/build/dist/Server/Utils/Workspace/Slack/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js +68 -138
- package/build/dist/Server/Utils/Workspace/Slack/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js +240 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ReactionNote.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js +85 -212
- package/build/dist/Server/Utils/Workspace/Slack/Actions/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +60 -17
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/app-manifest.json +2 -0
- package/build/dist/Server/Utils/Workspace/Workspace.js +134 -41
- package/build/dist/Server/Utils/Workspace/Workspace.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js +197 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceActionAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js +32 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js +199 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceOAuthState.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js +91 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceProjectReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js +450 -0
- package/build/dist/Server/Utils/Workspace/WorkspaceReactionNote.js.map +1 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +103 -5
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/Date.js +97 -7
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Exception/ExceptionMessages.js +1 -0
- package/build/dist/Types/Exception/ExceptionMessages.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +245 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +49 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js +16 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessToolNames.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js +104 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/SqlServerPlatform.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +6 -5
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +32 -0
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorUptimeSummary.js +52 -0
- package/build/dist/Types/Monitor/MonitorUptimeSummary.js.map +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +9 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +52 -2
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js +11 -0
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/Rum/UserFlow.js +115 -0
- package/build/dist/Types/Rum/UserFlow.js.map +1 -0
- package/build/dist/Types/Runbook/RunbookStepType.js +10 -0
- package/build/dist/Types/Runbook/RunbookStepType.js.map +1 -1
- package/build/dist/Types/Runbook/RunnerJobOrigin.js +14 -0
- package/build/dist/Types/Runbook/RunnerJobOrigin.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +2 -2
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -1
- package/build/dist/Types/StatusPage/MergedDowntimeTotals.js +2 -0
- package/build/dist/Types/StatusPage/MergedDowntimeTotals.js.map +1 -0
- package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js +65 -0
- package/build/dist/Types/StatusPage/PublicNoteSubscriberNotificationDefault.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +8 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/Types/Timezone.js +5 -0
- package/build/dist/Types/Timezone.js.map +1 -1
- package/build/dist/Types/TimezoneAlias.js +340 -0
- package/build/dist/Types/TimezoneAlias.js.map +1 -0
- package/build/dist/Types/Workflow/Templates.js +2694 -2
- package/build/dist/Types/Workflow/Templates.js.map +1 -1
- package/build/dist/Types/Workflow/WorkflowVariableOAuth.js +314 -0
- package/build/dist/Types/Workflow/WorkflowVariableOAuth.js.map +1 -0
- package/build/dist/Types/Workspace/WorkspaceNoteReaction.js +98 -0
- package/build/dist/Types/Workspace/WorkspaceNoteReaction.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +95 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +44 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +27 -0
- package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js +9 -0
- package/build/dist/UI/Components/AttributesJSON/BracesGlyph.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +260 -0
- package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -0
- package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js +56 -0
- package/build/dist/UI/Components/AttributesJSON/JSONHighlight.js.map +1 -0
- package/build/dist/UI/Components/Calendar/Calendar.js +94 -7
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/Calendar/CalendarDayLayout.js +136 -0
- package/build/dist/UI/Components/Calendar/CalendarDayLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js +72 -0
- package/build/dist/UI/Components/Charts/Utils/HistogramSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +178 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js +13 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramZoom.js.map +1 -1
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +20 -4
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -9
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +36 -13
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +117 -11
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -1
- package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
- package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +36 -8
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +10 -2
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +9 -1
- package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +16 -15
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +14 -74
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +22 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +9 -2
- package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js +16 -5
- package/build/dist/UI/Components/LogsViewer/useLogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +23 -8
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +7 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +5 -1
- package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +37 -3
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +27 -6
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +7 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +17 -77
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +10 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js +15 -1
- package/build/dist/UI/Utils/ModelAPI/ProjectUsersModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Timezone.js +52 -17
- package/build/dist/UI/Utils/Timezone.js.map +1 -1
- package/build/dist/Utils/AI/InvestigationReport.js +116 -21
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -1
- package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js +1209 -0
- package/build/dist/Utils/AiRemediation/KubectlOutputRedactor.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js +2973 -0
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js +99 -0
- package/build/dist/Utils/AiRemediation/KubectlWaitBudget.js.map +1 -0
- package/build/dist/Utils/AiRemediation/KubectlWriteScope.js +1429 -0
- package/build/dist/Utils/AiRemediation/KubectlWriteScope.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js +7 -6
- package/build/dist/Utils/Dashboard/Components/DashboardClockComponent.js.map +1 -1
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js +214 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorAddress.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js +471 -0
- package/build/dist/Utils/Monitor/MonitorCheckScheduleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js +107 -0
- package/build/dist/Utils/Monitor/MonitorOverviewCriteriaUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewFamily.js +191 -0
- package/build/dist/Utils/Monitor/MonitorOverviewFamily.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +1259 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js +593 -0
- package/build/dist/Utils/Monitor/MonitorOverviewProbeUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js +195 -0
- package/build/dist/Utils/Monitor/MonitorOverviewTargetUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorStatusHistoryUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js +464 -0
- package/build/dist/Utils/Monitor/MonitorUptimeSummaryUtil.js.map +1 -0
- package/build/dist/Utils/Rum/SessionIdentity.js +31 -1
- package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayWireEncoding.js +128 -0
- package/build/dist/Utils/Rum/SessionReplayWireEncoding.js.map +1 -0
- package/build/dist/Utils/Rum/UserFlow.js +941 -0
- package/build/dist/Utils/Rum/UserFlow.js.map +1 -0
- package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js +82 -0
- package/build/dist/Utils/StatusPage/MonitorGroupMergedDowntimeUtil.js.map +1 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js +46 -0
- package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/AttributesJSON.js +245 -0
- package/build/dist/Utils/Telemetry/AttributesJSON.js.map +1 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +103 -0
- package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -1
- package/build/dist/Utils/Uptime/UptimeUtil.js +91 -27
- package/build/dist/Utils/Uptime/UptimeUtil.js.map +1 -1
- package/jest.config.json +2 -1
- package/package.json +2 -1
- package/tsconfig.tests.json +36 -0
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +0 -337
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +0 -124
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +0 -47
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +0 -1
|
@@ -0,0 +1,1491 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import {
|
|
3
|
+
afterEach,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
jest,
|
|
8
|
+
test,
|
|
9
|
+
} from "@jest/globals";
|
|
10
|
+
import {
|
|
11
|
+
act,
|
|
12
|
+
cleanup,
|
|
13
|
+
fireEvent,
|
|
14
|
+
render,
|
|
15
|
+
RenderResult,
|
|
16
|
+
screen,
|
|
17
|
+
waitFor,
|
|
18
|
+
} from "@testing-library/react";
|
|
19
|
+
import React, { ReactElement } from "react";
|
|
20
|
+
import getJestMockFunction, { MockFunction } from "../../MockType";
|
|
21
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
22
|
+
import Permission from "../../../Types/Permission";
|
|
23
|
+
|
|
24
|
+
const getListMock: MockFunction = getJestMockFunction();
|
|
25
|
+
const modelFormModalMock: MockFunction = getJestMockFunction();
|
|
26
|
+
|
|
27
|
+
// What the real state change form would POST, captured by createOrUpdate.
|
|
28
|
+
let capturedPayload: JSONObject | null = null;
|
|
29
|
+
let capturedMiscDataProps: JSONObject | null = null;
|
|
30
|
+
let capturedModel: ScheduledMaintenanceStateTimeline | null = null;
|
|
31
|
+
|
|
32
|
+
jest.mock("react-i18next", () => {
|
|
33
|
+
return {
|
|
34
|
+
useTranslation: () => {
|
|
35
|
+
return {
|
|
36
|
+
t: (key: string, options?: { defaultValue?: string }): string => {
|
|
37
|
+
return options?.defaultValue ?? key;
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* The arrow wrappers are load bearing: jest.mock is hoisted above the compiled
|
|
46
|
+
* requires, so the mock consts above are still unassigned when the factory
|
|
47
|
+
* runs. Dereferencing them lazily, at call time, is what makes this work.
|
|
48
|
+
*
|
|
49
|
+
* createOrUpdate serializes the model the way ModelAPI does before it goes on
|
|
50
|
+
* the wire, and then through JSON, so an unset value is exactly as absent as
|
|
51
|
+
* it would be in the request body. Only the real form tests at the bottom
|
|
52
|
+
* reach it.
|
|
53
|
+
*/
|
|
54
|
+
jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
|
|
55
|
+
return {
|
|
56
|
+
__esModule: true,
|
|
57
|
+
default: {
|
|
58
|
+
getList: (...args: Array<unknown>) => {
|
|
59
|
+
return getListMock(...args);
|
|
60
|
+
},
|
|
61
|
+
getItem: async (): Promise<null> => {
|
|
62
|
+
return null;
|
|
63
|
+
},
|
|
64
|
+
getCommonHeaders: (): JSONObject => {
|
|
65
|
+
return {};
|
|
66
|
+
},
|
|
67
|
+
createOrUpdate: async (data: {
|
|
68
|
+
model: ScheduledMaintenanceStateTimeline;
|
|
69
|
+
modelType: typeof BaseModel;
|
|
70
|
+
miscDataProps?: JSONObject | undefined;
|
|
71
|
+
}): Promise<{ data: JSONObject }> => {
|
|
72
|
+
capturedModel = data.model;
|
|
73
|
+
capturedPayload = JSON.parse(
|
|
74
|
+
JSON.stringify(BaseModel.toJSON(data.model, data.modelType)),
|
|
75
|
+
) as JSONObject;
|
|
76
|
+
capturedMiscDataProps = data.miscDataProps || {};
|
|
77
|
+
return { data: {} };
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// The real form filters its fields by the viewer's permissions.
|
|
84
|
+
jest.mock("../../../UI/Utils/Permission", () => {
|
|
85
|
+
return {
|
|
86
|
+
__esModule: true,
|
|
87
|
+
default: {
|
|
88
|
+
getAllPermissions: (): Array<Permission> => {
|
|
89
|
+
return [Permission.ProjectOwner, Permission.User, Permission.Public];
|
|
90
|
+
},
|
|
91
|
+
getProjectPermissions: (): null => {
|
|
92
|
+
return null;
|
|
93
|
+
},
|
|
94
|
+
getGlobalPermissions: (): { globalPermissions: Array<Permission> } => {
|
|
95
|
+
return {
|
|
96
|
+
globalPermissions: [
|
|
97
|
+
Permission.ProjectOwner,
|
|
98
|
+
Permission.User,
|
|
99
|
+
Permission.Public,
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
jest.mock("../../../UI/Utils/User", () => {
|
|
108
|
+
return {
|
|
109
|
+
__esModule: true,
|
|
110
|
+
default: {
|
|
111
|
+
isMasterAdmin: (): boolean => {
|
|
112
|
+
return false;
|
|
113
|
+
},
|
|
114
|
+
getUserId: (): null => {
|
|
115
|
+
return null;
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
/*
|
|
122
|
+
* The state-change modal is a full model form with its own API traffic. These
|
|
123
|
+
* tests are about what the header hands it, so the stub records its props and
|
|
124
|
+
* renders the title. The payload tests at the bottom then build the real form
|
|
125
|
+
* from exactly those props.
|
|
126
|
+
*/
|
|
127
|
+
jest.mock("../../../UI/Components/ModelFormModal/ModelFormModal", () => {
|
|
128
|
+
return {
|
|
129
|
+
__esModule: true,
|
|
130
|
+
default: (props: {
|
|
131
|
+
title: string;
|
|
132
|
+
submitButtonText: string;
|
|
133
|
+
}): ReactElement => {
|
|
134
|
+
modelFormModalMock(props);
|
|
135
|
+
return React.createElement(
|
|
136
|
+
"div",
|
|
137
|
+
{ "data-testid": "state-change-modal" },
|
|
138
|
+
`${props.title} / ${props.submitButtonText}`,
|
|
139
|
+
);
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
import ChangeScheduledMaintenanceState from "../../../../App/FeatureSet/Dashboard/src/Components/ScheduledMaintenance/ChangeState";
|
|
145
|
+
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
146
|
+
import Project from "../../../Models/DatabaseModels/Project";
|
|
147
|
+
import ScheduledMaintenanceNoteTemplate from "../../../Models/DatabaseModels/ScheduledMaintenanceNoteTemplate";
|
|
148
|
+
import ScheduledMaintenanceState from "../../../Models/DatabaseModels/ScheduledMaintenanceState";
|
|
149
|
+
import ScheduledMaintenanceStateTimeline from "../../../Models/DatabaseModels/ScheduledMaintenanceStateTimeline";
|
|
150
|
+
import Color from "../../../Types/Color";
|
|
151
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
152
|
+
import PublicNoteSubscriberNotificationDefault, {
|
|
153
|
+
ScheduledMaintenanceStateChangeSubscriberNotificationSetting,
|
|
154
|
+
} from "../../../Types/StatusPage/PublicNoteSubscriberNotificationDefault";
|
|
155
|
+
import ModelForm, {
|
|
156
|
+
ComponentProps as ModelFormComponentProps,
|
|
157
|
+
FormType,
|
|
158
|
+
} from "../../../UI/Components/Forms/ModelForm";
|
|
159
|
+
import FormFieldSchemaType from "../../../UI/Components/Forms/Types/FormFieldSchemaType";
|
|
160
|
+
import FormValues from "../../../UI/Components/Forms/Types/FormValues";
|
|
161
|
+
import ProjectUtil from "../../../UI/Utils/Project";
|
|
162
|
+
|
|
163
|
+
/*
|
|
164
|
+
* A scheduled maintenance event created without notifying status page
|
|
165
|
+
* subscribers ("Event Created: Notify Status Page Subscribers" unticked)
|
|
166
|
+
* should not have a later state change be what tells them - unless the event
|
|
167
|
+
* is set to announce that change. The header's state change form, whose
|
|
168
|
+
* checkbox decides both whether the state change notifies and whether its
|
|
169
|
+
* public note does, starts "Notify Status Page Subscribers" from the state it
|
|
170
|
+
* moves the event to:
|
|
171
|
+
*
|
|
172
|
+
* - an event created with subscribers notified (or with the setting unknown)
|
|
173
|
+
* starts ticked, as before;
|
|
174
|
+
* - a quiet event moved to an ongoing state starts ticked only when its
|
|
175
|
+
* "Event Ongoing: Notify Status Page Subscribers" is on, and one moved to
|
|
176
|
+
* an ended or resolved state only when "Event Ended: Notify Status Page
|
|
177
|
+
* Subscribers" is on - the automatic change would have announced it;
|
|
178
|
+
* - a quiet event moved to any other state starts unticked.
|
|
179
|
+
*
|
|
180
|
+
* The flag is seeded through initialValues as well as the field's
|
|
181
|
+
* defaultValue, because the form drops a false defaultValue and an unsent
|
|
182
|
+
* flag falls back to the database default of notifying. These tests drive the
|
|
183
|
+
* real header against a fake API and pin both, for every way the form opens,
|
|
184
|
+
* and then submit the real form to check what is actually sent.
|
|
185
|
+
*/
|
|
186
|
+
|
|
187
|
+
const PROJECT_ID: string = "22222222-2222-4222-8222-222222222222";
|
|
188
|
+
const EVENT_ID: string = "33333333-3333-4333-8333-333333333333";
|
|
189
|
+
const SCHEDULED_STATE_ID: string = "44444444-4444-4444-8444-444444444441";
|
|
190
|
+
const ONGOING_STATE_ID: string = "44444444-4444-4444-8444-444444444442";
|
|
191
|
+
const VERIFYING_STATE_ID: string = "44444444-4444-4444-8444-444444444443";
|
|
192
|
+
const ENDED_STATE_ID: string = "44444444-4444-4444-8444-444444444444";
|
|
193
|
+
const COMPLETED_STATE_ID: string = "44444444-4444-4444-8444-444444444445";
|
|
194
|
+
const DRAFT_STATE_ID: string = "44444444-4444-4444-8444-444444444446";
|
|
195
|
+
const TEMPLATE_ID: string = "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbb1";
|
|
196
|
+
const TEMPLATE_NOTE: string =
|
|
197
|
+
"The failover drill has started. Writes may pause for a few seconds.";
|
|
198
|
+
const NOTE_TEXT: string =
|
|
199
|
+
"Failover complete. Writes are back to normal on the new primary.";
|
|
200
|
+
|
|
201
|
+
const HOUR: number = 60 * 60 * 1000;
|
|
202
|
+
const DAY: number = 24 * HOUR;
|
|
203
|
+
|
|
204
|
+
/*
|
|
205
|
+
* A window well in the future, so the header shows a plain countdown: no
|
|
206
|
+
* overdue notice and no background timeline rechecks to muddle the request
|
|
207
|
+
* counts below.
|
|
208
|
+
*/
|
|
209
|
+
const STARTS_AT: Date = new Date(Date.now() + DAY);
|
|
210
|
+
const ENDS_AT: Date = new Date(Date.now() + DAY + 2 * HOUR);
|
|
211
|
+
const SCHEDULED_AT: Date = new Date(Date.now() - DAY);
|
|
212
|
+
|
|
213
|
+
const TITLE: string = "Primary database failover drill";
|
|
214
|
+
|
|
215
|
+
const NOTIFY_FIELD_KEY: string = "shouldStatusPageSubscribersBeNotified";
|
|
216
|
+
const ORIGINAL_DESCRIPTION: string = "Notify subscribers of this state change.";
|
|
217
|
+
const QUIET_DESCRIPTION: string =
|
|
218
|
+
PublicNoteSubscriberNotificationDefault.quietScheduledMaintenanceDescription;
|
|
219
|
+
const CHECKBOX_TITLE: string = "Notify Status Page Subscribers";
|
|
220
|
+
|
|
221
|
+
type Settings = ScheduledMaintenanceStateChangeSubscriberNotificationSetting;
|
|
222
|
+
|
|
223
|
+
// Created quietly, and set to announce neither going ongoing nor ending.
|
|
224
|
+
const QUIET_EVENT: Settings = {
|
|
225
|
+
shouldStatusPageSubscribersBeNotifiedOnEventCreated: false,
|
|
226
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToOngoing: false,
|
|
227
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToEnded: false,
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
// Created quietly, but set to announce that it has started.
|
|
231
|
+
const QUIET_ANNOUNCES_ONGOING: Settings = {
|
|
232
|
+
shouldStatusPageSubscribersBeNotifiedOnEventCreated: false,
|
|
233
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToOngoing: true,
|
|
234
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToEnded: false,
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// Created quietly, but set to announce that it has ended.
|
|
238
|
+
const QUIET_ANNOUNCES_ENDED: Settings = {
|
|
239
|
+
shouldStatusPageSubscribersBeNotifiedOnEventCreated: false,
|
|
240
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToOngoing: false,
|
|
241
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToEnded: true,
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// Created quietly, but set to announce both changes.
|
|
245
|
+
const QUIET_ANNOUNCES_BOTH: Settings = {
|
|
246
|
+
shouldStatusPageSubscribersBeNotifiedOnEventCreated: false,
|
|
247
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToOngoing: true,
|
|
248
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToEnded: true,
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
const NOTIFYING_EVENT: Settings = {
|
|
252
|
+
shouldStatusPageSubscribersBeNotifiedOnEventCreated: true,
|
|
253
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToOngoing: true,
|
|
254
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToEnded: true,
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
// Announced when created, but set to announce neither later change.
|
|
258
|
+
const NOTIFIED_ANNOUNCES_NOTHING: Settings = {
|
|
259
|
+
shouldStatusPageSubscribersBeNotifiedOnEventCreated: true,
|
|
260
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToOngoing: false,
|
|
261
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToEnded: false,
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
// The created setting not known (a row from before it existed).
|
|
265
|
+
const CREATED_UNKNOWN_ANNOUNCES_NOTHING: Settings = {
|
|
266
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToOngoing: false,
|
|
267
|
+
shouldStatusPageSubscribersBeNotifiedWhenEventChangedToEnded: false,
|
|
268
|
+
};
|
|
269
|
+
|
|
270
|
+
interface StateSpec {
|
|
271
|
+
id: string;
|
|
272
|
+
name: string;
|
|
273
|
+
color: string;
|
|
274
|
+
flag?:
|
|
275
|
+
| "isScheduledState"
|
|
276
|
+
| "isOngoingState"
|
|
277
|
+
| "isEndedState"
|
|
278
|
+
| "isResolvedState";
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const SCHEDULED_SPEC: StateSpec = {
|
|
282
|
+
id: SCHEDULED_STATE_ID,
|
|
283
|
+
name: "Scheduled",
|
|
284
|
+
color: "#6366f1",
|
|
285
|
+
flag: "isScheduledState",
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
const ONGOING_SPEC: StateSpec = {
|
|
289
|
+
id: ONGOING_STATE_ID,
|
|
290
|
+
name: "Ongoing",
|
|
291
|
+
color: "#f59e0b",
|
|
292
|
+
flag: "isOngoingState",
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
// A custom state with no flags.
|
|
296
|
+
const VERIFYING_SPEC: StateSpec = {
|
|
297
|
+
id: VERIFYING_STATE_ID,
|
|
298
|
+
name: "Verifying",
|
|
299
|
+
color: "#0ea5e9",
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
const ENDED_SPEC: StateSpec = {
|
|
303
|
+
id: ENDED_STATE_ID,
|
|
304
|
+
name: "Ended",
|
|
305
|
+
color: "#10b981",
|
|
306
|
+
flag: "isEndedState",
|
|
307
|
+
};
|
|
308
|
+
|
|
309
|
+
const COMPLETED_SPEC: StateSpec = {
|
|
310
|
+
id: COMPLETED_STATE_ID,
|
|
311
|
+
name: "Completed",
|
|
312
|
+
color: "#16a34a",
|
|
313
|
+
flag: "isResolvedState",
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
// A custom state ordered before Scheduled.
|
|
317
|
+
const DRAFT_SPEC: StateSpec = {
|
|
318
|
+
id: DRAFT_STATE_ID,
|
|
319
|
+
name: "Draft",
|
|
320
|
+
color: "#9ca3af",
|
|
321
|
+
};
|
|
322
|
+
|
|
323
|
+
// A project's default states, plus a custom one between Ongoing and Ended.
|
|
324
|
+
const STATE_SPECS: Array<StateSpec> = [
|
|
325
|
+
SCHEDULED_SPEC,
|
|
326
|
+
ONGOING_SPEC,
|
|
327
|
+
VERIFYING_SPEC,
|
|
328
|
+
ENDED_SPEC,
|
|
329
|
+
COMPLETED_SPEC,
|
|
330
|
+
];
|
|
331
|
+
|
|
332
|
+
// No ended state, so the header's "Mark as" button targets the resolved one.
|
|
333
|
+
const STATES_WITHOUT_ENDED: Array<StateSpec> = [
|
|
334
|
+
SCHEDULED_SPEC,
|
|
335
|
+
ONGOING_SPEC,
|
|
336
|
+
COMPLETED_SPEC,
|
|
337
|
+
];
|
|
338
|
+
|
|
339
|
+
/*
|
|
340
|
+
* An event sitting in a custom state before Scheduled, so Scheduled is a
|
|
341
|
+
* forward move offered under More actions.
|
|
342
|
+
*/
|
|
343
|
+
const STATES_WITH_DRAFT: Array<StateSpec> = [
|
|
344
|
+
DRAFT_SPEC,
|
|
345
|
+
SCHEDULED_SPEC,
|
|
346
|
+
ONGOING_SPEC,
|
|
347
|
+
ENDED_SPEC,
|
|
348
|
+
COMPLETED_SPEC,
|
|
349
|
+
];
|
|
350
|
+
|
|
351
|
+
interface StateChangeField {
|
|
352
|
+
field: Record<string, boolean>;
|
|
353
|
+
fieldType: FormFieldSchemaType;
|
|
354
|
+
title: string;
|
|
355
|
+
description?: string | undefined;
|
|
356
|
+
defaultValue?: unknown;
|
|
357
|
+
required?: boolean | undefined;
|
|
358
|
+
overrideFieldKey?: string | undefined;
|
|
359
|
+
dropdownOptions?: Array<{ value: string; label: string }> | undefined;
|
|
360
|
+
showIf?: (() => boolean) | undefined;
|
|
361
|
+
onChange?:
|
|
362
|
+
| ((
|
|
363
|
+
value: string,
|
|
364
|
+
currentValues: Record<string, unknown>,
|
|
365
|
+
setNewFormValues: (values: Record<string, unknown>) => void,
|
|
366
|
+
) => void)
|
|
367
|
+
| undefined;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
interface StateChangeModalProps {
|
|
371
|
+
name: string;
|
|
372
|
+
title: string;
|
|
373
|
+
submitButtonText: string;
|
|
374
|
+
modelType: unknown;
|
|
375
|
+
initialValues?: Record<string, unknown> | undefined;
|
|
376
|
+
onClose: () => void;
|
|
377
|
+
onBeforeCreate: (
|
|
378
|
+
model: ScheduledMaintenanceStateTimeline,
|
|
379
|
+
) => Promise<unknown>;
|
|
380
|
+
formProps: {
|
|
381
|
+
fields: Array<StateChangeField>;
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
interface ListResultShape {
|
|
386
|
+
data: Array<unknown>;
|
|
387
|
+
count: number;
|
|
388
|
+
skip: number;
|
|
389
|
+
limit: number;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const listResult: (data: Array<unknown>) => ListResultShape = (
|
|
393
|
+
data: Array<unknown>,
|
|
394
|
+
): ListResultShape => {
|
|
395
|
+
return { data: data, count: data.length, skip: 0, limit: 99 };
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
interface FakeApiOptions {
|
|
399
|
+
withTemplate?: boolean | undefined;
|
|
400
|
+
// The project's states, in order. Defaults to STATE_SPECS.
|
|
401
|
+
states?: Array<StateSpec> | undefined;
|
|
402
|
+
// The state the event is in. Defaults to Scheduled.
|
|
403
|
+
currentStateId?: string | undefined;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
const buildStates: (
|
|
407
|
+
specs: Array<StateSpec>,
|
|
408
|
+
) => Array<ScheduledMaintenanceState> = (
|
|
409
|
+
specs: Array<StateSpec>,
|
|
410
|
+
): Array<ScheduledMaintenanceState> => {
|
|
411
|
+
return specs.map((spec: StateSpec): ScheduledMaintenanceState => {
|
|
412
|
+
const state: ScheduledMaintenanceState = new ScheduledMaintenanceState();
|
|
413
|
+
state.id = new ObjectID(spec.id);
|
|
414
|
+
state.name = spec.name;
|
|
415
|
+
state.color = new Color(spec.color);
|
|
416
|
+
|
|
417
|
+
if (spec.flag) {
|
|
418
|
+
state[spec.flag] = true;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return state;
|
|
422
|
+
});
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const respondWith: (options?: FakeApiOptions) => void = (
|
|
426
|
+
options?: FakeApiOptions,
|
|
427
|
+
): void => {
|
|
428
|
+
getListMock.mockImplementation((...args: Array<unknown>) => {
|
|
429
|
+
const request: { modelType: unknown } = args[0] as { modelType: unknown };
|
|
430
|
+
|
|
431
|
+
if (request.modelType === ScheduledMaintenanceState) {
|
|
432
|
+
return Promise.resolve(
|
|
433
|
+
listResult(buildStates(options?.states || STATE_SPECS)),
|
|
434
|
+
);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
if (request.modelType === ScheduledMaintenanceStateTimeline) {
|
|
438
|
+
const timeline: ScheduledMaintenanceStateTimeline =
|
|
439
|
+
new ScheduledMaintenanceStateTimeline();
|
|
440
|
+
timeline.scheduledMaintenanceStateId = new ObjectID(
|
|
441
|
+
options?.currentStateId || SCHEDULED_STATE_ID,
|
|
442
|
+
);
|
|
443
|
+
timeline.startsAt = SCHEDULED_AT;
|
|
444
|
+
return Promise.resolve(listResult([timeline]));
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
if (request.modelType === ScheduledMaintenanceNoteTemplate) {
|
|
448
|
+
if (!options?.withTemplate) {
|
|
449
|
+
return Promise.resolve(listResult([]));
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
const template: ScheduledMaintenanceNoteTemplate =
|
|
453
|
+
new ScheduledMaintenanceNoteTemplate();
|
|
454
|
+
template.id = new ObjectID(TEMPLATE_ID);
|
|
455
|
+
template.templateName = "Drill started";
|
|
456
|
+
template.note = TEMPLATE_NOTE;
|
|
457
|
+
return Promise.resolve(listResult([template]));
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
return Promise.reject(new Error("Unexpected list request"));
|
|
461
|
+
});
|
|
462
|
+
};
|
|
463
|
+
|
|
464
|
+
const headerElement: (settings?: Settings | undefined) => ReactElement = (
|
|
465
|
+
settings?: Settings | undefined,
|
|
466
|
+
): ReactElement => {
|
|
467
|
+
return (
|
|
468
|
+
<ChangeScheduledMaintenanceState
|
|
469
|
+
scheduledMaintenanceId={new ObjectID(EVENT_ID)}
|
|
470
|
+
eventNumber="#58"
|
|
471
|
+
title={TITLE}
|
|
472
|
+
eventStartsAt={STARTS_AT}
|
|
473
|
+
eventEndsAt={ENDS_AT}
|
|
474
|
+
onActionComplete={jest.fn()}
|
|
475
|
+
subscriberNotificationSettings={settings}
|
|
476
|
+
/>
|
|
477
|
+
);
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
const renderHeader: (settings?: Settings | undefined) => RenderResult = (
|
|
481
|
+
settings?: Settings | undefined,
|
|
482
|
+
): RenderResult => {
|
|
483
|
+
return render(headerElement(settings));
|
|
484
|
+
};
|
|
485
|
+
|
|
486
|
+
const waitForHeader: () => Promise<HTMLElement> =
|
|
487
|
+
async (): Promise<HTMLElement> => {
|
|
488
|
+
return screen.findByRole("heading", {
|
|
489
|
+
level: 2,
|
|
490
|
+
name: TITLE,
|
|
491
|
+
});
|
|
492
|
+
};
|
|
493
|
+
|
|
494
|
+
const modalPropsHistory: () => Array<StateChangeModalProps> =
|
|
495
|
+
(): Array<StateChangeModalProps> => {
|
|
496
|
+
return (
|
|
497
|
+
modelFormModalMock.mock.calls as Array<Array<StateChangeModalProps>>
|
|
498
|
+
).map((call: Array<StateChangeModalProps>): StateChangeModalProps => {
|
|
499
|
+
return call[0]!;
|
|
500
|
+
});
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
const lastModalProps: () => StateChangeModalProps =
|
|
504
|
+
(): StateChangeModalProps => {
|
|
505
|
+
const history: Array<StateChangeModalProps> = modalPropsHistory();
|
|
506
|
+
|
|
507
|
+
return history[history.length - 1]!;
|
|
508
|
+
};
|
|
509
|
+
|
|
510
|
+
const fieldByKey: (
|
|
511
|
+
props: StateChangeModalProps,
|
|
512
|
+
key: string,
|
|
513
|
+
) => StateChangeField = (
|
|
514
|
+
props: StateChangeModalProps,
|
|
515
|
+
key: string,
|
|
516
|
+
): StateChangeField => {
|
|
517
|
+
const field: StateChangeField | undefined = props.formProps.fields.find(
|
|
518
|
+
(candidate: StateChangeField): boolean => {
|
|
519
|
+
return (
|
|
520
|
+
Boolean(candidate.field[key]) || candidate.overrideFieldKey === key
|
|
521
|
+
);
|
|
522
|
+
},
|
|
523
|
+
);
|
|
524
|
+
|
|
525
|
+
if (!field) {
|
|
526
|
+
throw new Error(`The state change form has no ${key} field`);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
return field;
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
type OpenModalFunction = () => void;
|
|
533
|
+
|
|
534
|
+
const clickMarkAsOngoing: OpenModalFunction = (): void => {
|
|
535
|
+
fireEvent.click(document.getElementById("sm-mark-ongoing-btn")!);
|
|
536
|
+
};
|
|
537
|
+
|
|
538
|
+
const clickMarkAsEnded: OpenModalFunction = (): void => {
|
|
539
|
+
fireEvent.click(document.getElementById("sm-mark-complete-btn")!);
|
|
540
|
+
};
|
|
541
|
+
|
|
542
|
+
const chooseFromMoreActions: (stateName: string) => OpenModalFunction = (
|
|
543
|
+
stateName: string,
|
|
544
|
+
): OpenModalFunction => {
|
|
545
|
+
return (): void => {
|
|
546
|
+
fireEvent.click(screen.getByRole("button", { name: "More actions" }));
|
|
547
|
+
|
|
548
|
+
const choice: HTMLElement | undefined = Array.from(
|
|
549
|
+
screen
|
|
550
|
+
.getByRole("menu")
|
|
551
|
+
.querySelectorAll<HTMLElement>('[role="menuitem"]'),
|
|
552
|
+
)
|
|
553
|
+
.filter((element: HTMLElement): boolean => {
|
|
554
|
+
return !element.querySelector('[role="menuitem"]');
|
|
555
|
+
})
|
|
556
|
+
.find((element: HTMLElement): boolean => {
|
|
557
|
+
return element.textContent?.trim() === stateName;
|
|
558
|
+
});
|
|
559
|
+
|
|
560
|
+
if (!choice) {
|
|
561
|
+
throw new Error(`${stateName} is not offered under More actions`);
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
fireEvent.click(choice);
|
|
565
|
+
};
|
|
566
|
+
};
|
|
567
|
+
|
|
568
|
+
interface OpenCase {
|
|
569
|
+
label: string;
|
|
570
|
+
open: OpenModalFunction;
|
|
571
|
+
expectedTitle: string;
|
|
572
|
+
expectedSubmitButtonText: string;
|
|
573
|
+
expectedStateId: string;
|
|
574
|
+
// The project's states and the event's current state for this way in.
|
|
575
|
+
apiOptions?: FakeApiOptions | undefined;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
const MARK_AS_ONGOING: OpenCase = {
|
|
579
|
+
label: "Mark as Ongoing",
|
|
580
|
+
open: clickMarkAsOngoing,
|
|
581
|
+
expectedTitle: "Mark Scheduled Maintenance as Ongoing",
|
|
582
|
+
expectedSubmitButtonText: "Mark as Ongoing",
|
|
583
|
+
expectedStateId: ONGOING_STATE_ID,
|
|
584
|
+
};
|
|
585
|
+
|
|
586
|
+
const MARK_AS_ENDED: OpenCase = {
|
|
587
|
+
label: "Mark as Ended",
|
|
588
|
+
open: clickMarkAsEnded,
|
|
589
|
+
expectedTitle: "Mark Scheduled Maintenance as Ended",
|
|
590
|
+
expectedSubmitButtonText: "Mark as Ended",
|
|
591
|
+
expectedStateId: ENDED_STATE_ID,
|
|
592
|
+
};
|
|
593
|
+
|
|
594
|
+
const CUSTOM_STATE_FROM_MENU: OpenCase = {
|
|
595
|
+
label: "a custom state from More actions",
|
|
596
|
+
open: chooseFromMoreActions("Verifying"),
|
|
597
|
+
expectedTitle: "Mark Scheduled Maintenance as Verifying",
|
|
598
|
+
expectedSubmitButtonText: "Mark as Verifying",
|
|
599
|
+
expectedStateId: VERIFYING_STATE_ID,
|
|
600
|
+
};
|
|
601
|
+
|
|
602
|
+
const RESOLVED_STATE_FROM_MENU: OpenCase = {
|
|
603
|
+
label: "the resolved state from More actions",
|
|
604
|
+
open: chooseFromMoreActions("Completed"),
|
|
605
|
+
expectedTitle: "Mark Scheduled Maintenance as Completed",
|
|
606
|
+
expectedSubmitButtonText: "Mark as Completed",
|
|
607
|
+
expectedStateId: COMPLETED_STATE_ID,
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
const RESOLVED_STATE_BUTTON: OpenCase = {
|
|
611
|
+
label: "Mark as Completed, with no ended state in the project",
|
|
612
|
+
open: clickMarkAsEnded,
|
|
613
|
+
expectedTitle: "Mark Scheduled Maintenance as Completed",
|
|
614
|
+
expectedSubmitButtonText: "Mark as Completed",
|
|
615
|
+
expectedStateId: COMPLETED_STATE_ID,
|
|
616
|
+
apiOptions: { states: STATES_WITHOUT_ENDED },
|
|
617
|
+
};
|
|
618
|
+
|
|
619
|
+
const SCHEDULED_STATE_FROM_MENU: OpenCase = {
|
|
620
|
+
label: "the scheduled state from More actions",
|
|
621
|
+
open: chooseFromMoreActions("Scheduled"),
|
|
622
|
+
expectedTitle: "Mark Scheduled Maintenance as Scheduled",
|
|
623
|
+
expectedSubmitButtonText: "Mark as Scheduled",
|
|
624
|
+
expectedStateId: SCHEDULED_STATE_ID,
|
|
625
|
+
apiOptions: { states: STATES_WITH_DRAFT, currentStateId: DRAFT_STATE_ID },
|
|
626
|
+
};
|
|
627
|
+
|
|
628
|
+
const OPEN_CASES: Array<OpenCase> = [
|
|
629
|
+
MARK_AS_ONGOING,
|
|
630
|
+
MARK_AS_ENDED,
|
|
631
|
+
CUSTOM_STATE_FROM_MENU,
|
|
632
|
+
];
|
|
633
|
+
|
|
634
|
+
/*
|
|
635
|
+
* Opens the form and checks it is the one for the chosen state. Every render
|
|
636
|
+
* of the form since it opened must carry the same starting value: the form
|
|
637
|
+
* reads it once when it mounts, so a first render that still saw the
|
|
638
|
+
* previous (or no) target state would already have used the wrong one.
|
|
639
|
+
*/
|
|
640
|
+
const openModal: (
|
|
641
|
+
openCase: OpenCase,
|
|
642
|
+
settings?: Settings | undefined,
|
|
643
|
+
options?: FakeApiOptions,
|
|
644
|
+
) => Promise<StateChangeModalProps> = async (
|
|
645
|
+
openCase: OpenCase,
|
|
646
|
+
settings?: Settings | undefined,
|
|
647
|
+
options?: FakeApiOptions,
|
|
648
|
+
): Promise<StateChangeModalProps> => {
|
|
649
|
+
respondWith({ ...openCase.apiOptions, ...options });
|
|
650
|
+
renderHeader(settings);
|
|
651
|
+
await waitForHeader();
|
|
652
|
+
|
|
653
|
+
const rendersBefore: number = modalPropsHistory().length;
|
|
654
|
+
|
|
655
|
+
openCase.open();
|
|
656
|
+
|
|
657
|
+
expect(screen.getByTestId("state-change-modal")).toBeInTheDocument();
|
|
658
|
+
|
|
659
|
+
const props: StateChangeModalProps = lastModalProps();
|
|
660
|
+
|
|
661
|
+
expect(props.title).toBe(openCase.expectedTitle);
|
|
662
|
+
expect(props.submitButtonText).toBe(openCase.expectedSubmitButtonText);
|
|
663
|
+
|
|
664
|
+
const rendersSinceOpening: Array<StateChangeModalProps> =
|
|
665
|
+
modalPropsHistory().slice(rendersBefore);
|
|
666
|
+
|
|
667
|
+
expect(rendersSinceOpening.length).toBeGreaterThan(0);
|
|
668
|
+
|
|
669
|
+
for (const modalRender of rendersSinceOpening) {
|
|
670
|
+
expect(modalRender.title).toBe(openCase.expectedTitle);
|
|
671
|
+
expect(modalRender.initialValues).toEqual(props.initialValues);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
return props;
|
|
675
|
+
};
|
|
676
|
+
|
|
677
|
+
// The checkbox's starting state, as the header handed it to the form.
|
|
678
|
+
interface NotifyStart {
|
|
679
|
+
seededValue: unknown;
|
|
680
|
+
defaultValue: unknown;
|
|
681
|
+
description: string | undefined;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
const notifyStartOf: (props: StateChangeModalProps) => NotifyStart = (
|
|
685
|
+
props: StateChangeModalProps,
|
|
686
|
+
): NotifyStart => {
|
|
687
|
+
const field: StateChangeField = fieldByKey(props, NOTIFY_FIELD_KEY);
|
|
688
|
+
|
|
689
|
+
return {
|
|
690
|
+
seededValue: props.initialValues?.[NOTIFY_FIELD_KEY],
|
|
691
|
+
defaultValue: field.defaultValue,
|
|
692
|
+
description: field.description,
|
|
693
|
+
};
|
|
694
|
+
};
|
|
695
|
+
|
|
696
|
+
const expectedNotifyStart: (notify: boolean) => NotifyStart = (
|
|
697
|
+
notify: boolean,
|
|
698
|
+
): NotifyStart => {
|
|
699
|
+
return {
|
|
700
|
+
seededValue: notify,
|
|
701
|
+
defaultValue: notify,
|
|
702
|
+
description: notify ? ORIGINAL_DESCRIPTION : QUIET_DESCRIPTION,
|
|
703
|
+
};
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
beforeEach(() => {
|
|
707
|
+
const project: Project = new Project();
|
|
708
|
+
project.id = new ObjectID(PROJECT_ID);
|
|
709
|
+
|
|
710
|
+
jest.spyOn(ProjectUtil, "getCurrentProject").mockReturnValue(project);
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
afterEach(() => {
|
|
714
|
+
cleanup();
|
|
715
|
+
getListMock.mockReset();
|
|
716
|
+
modelFormModalMock.mockReset();
|
|
717
|
+
capturedPayload = null;
|
|
718
|
+
capturedMiscDataProps = null;
|
|
719
|
+
capturedModel = null;
|
|
720
|
+
jest.restoreAllMocks();
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
describe.each(OPEN_CASES)(
|
|
724
|
+
"ChangeScheduledMaintenanceState via $label",
|
|
725
|
+
(openCase: OpenCase) => {
|
|
726
|
+
describe("event created quietly and set to announce neither ongoing nor ended", () => {
|
|
727
|
+
test("seeds the form value with notify off, so a false flag is actually sent", async () => {
|
|
728
|
+
const props: StateChangeModalProps = await openModal(
|
|
729
|
+
openCase,
|
|
730
|
+
QUIET_EVENT,
|
|
731
|
+
);
|
|
732
|
+
|
|
733
|
+
expect(props.modelType).toBe(ScheduledMaintenanceStateTimeline);
|
|
734
|
+
expect(props.initialValues).toEqual({
|
|
735
|
+
[NOTIFY_FIELD_KEY]: false,
|
|
736
|
+
});
|
|
737
|
+
expect(props.initialValues![NOTIFY_FIELD_KEY]).toBe(false);
|
|
738
|
+
});
|
|
739
|
+
|
|
740
|
+
test("starts the notify checkbox unticked and says why", async () => {
|
|
741
|
+
const field: StateChangeField = fieldByKey(
|
|
742
|
+
await openModal(openCase, QUIET_EVENT),
|
|
743
|
+
NOTIFY_FIELD_KEY,
|
|
744
|
+
);
|
|
745
|
+
|
|
746
|
+
expect(field.fieldType).toBe(FormFieldSchemaType.Checkbox);
|
|
747
|
+
expect(field.title).toBe(CHECKBOX_TITLE);
|
|
748
|
+
expect(field.required).toBe(false);
|
|
749
|
+
expect(field.defaultValue).toBe(false);
|
|
750
|
+
expect(field.description).toBe(QUIET_DESCRIPTION);
|
|
751
|
+
expect(field.description).toBe(
|
|
752
|
+
"Unticked by default because status page subscribers were not notified when this scheduled maintenance event was created.",
|
|
753
|
+
);
|
|
754
|
+
expect(field.description).not.toBe(ORIGINAL_DESCRIPTION);
|
|
755
|
+
// Not the incident copy: this event was created, not declared.
|
|
756
|
+
expect(field.description).not.toBe(
|
|
757
|
+
PublicNoteSubscriberNotificationDefault.quietIncidentDescription,
|
|
758
|
+
);
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
test("keeps the public note next to the checkbox that governs it", async () => {
|
|
762
|
+
const props: StateChangeModalProps = await openModal(
|
|
763
|
+
openCase,
|
|
764
|
+
QUIET_EVENT,
|
|
765
|
+
);
|
|
766
|
+
|
|
767
|
+
expect(
|
|
768
|
+
props.formProps.fields.map((field: StateChangeField): string => {
|
|
769
|
+
return field.title;
|
|
770
|
+
}),
|
|
771
|
+
).toEqual(["Select Note Template", "Public Note", CHECKBOX_TITLE]);
|
|
772
|
+
expect(fieldByKey(props, "publicNote").fieldType).toBe(
|
|
773
|
+
FormFieldSchemaType.Markdown,
|
|
774
|
+
);
|
|
775
|
+
expect(fieldByKey(props, "publicNote").required).toBe(false);
|
|
776
|
+
});
|
|
777
|
+
|
|
778
|
+
test("still records the change on this event, in the chosen state", async () => {
|
|
779
|
+
const props: StateChangeModalProps = await openModal(
|
|
780
|
+
openCase,
|
|
781
|
+
QUIET_EVENT,
|
|
782
|
+
);
|
|
783
|
+
const timeline: ScheduledMaintenanceStateTimeline =
|
|
784
|
+
new ScheduledMaintenanceStateTimeline();
|
|
785
|
+
|
|
786
|
+
const created: ScheduledMaintenanceStateTimeline =
|
|
787
|
+
(await props.onBeforeCreate(
|
|
788
|
+
timeline,
|
|
789
|
+
)) as ScheduledMaintenanceStateTimeline;
|
|
790
|
+
|
|
791
|
+
expect(created).toBe(timeline);
|
|
792
|
+
expect(created.projectId?.toString()).toBe(PROJECT_ID);
|
|
793
|
+
expect(created.scheduledMaintenanceId?.toString()).toBe(EVENT_ID);
|
|
794
|
+
expect(created.scheduledMaintenanceStateId?.toString()).toBe(
|
|
795
|
+
openCase.expectedStateId,
|
|
796
|
+
);
|
|
797
|
+
// The form's own choice is not overridden on the way out.
|
|
798
|
+
expect(created.shouldStatusPageSubscribersBeNotified).toBe(undefined);
|
|
799
|
+
});
|
|
800
|
+
|
|
801
|
+
test("onBeforeCreate never rewrites a flag the user set", async () => {
|
|
802
|
+
const props: StateChangeModalProps = await openModal(
|
|
803
|
+
openCase,
|
|
804
|
+
QUIET_EVENT,
|
|
805
|
+
);
|
|
806
|
+
const timeline: ScheduledMaintenanceStateTimeline =
|
|
807
|
+
new ScheduledMaintenanceStateTimeline();
|
|
808
|
+
timeline.shouldStatusPageSubscribersBeNotified = true;
|
|
809
|
+
|
|
810
|
+
const created: ScheduledMaintenanceStateTimeline =
|
|
811
|
+
(await props.onBeforeCreate(
|
|
812
|
+
timeline,
|
|
813
|
+
)) as ScheduledMaintenanceStateTimeline;
|
|
814
|
+
|
|
815
|
+
expect(created.shouldStatusPageSubscribersBeNotified).toBe(true);
|
|
816
|
+
});
|
|
817
|
+
});
|
|
818
|
+
|
|
819
|
+
describe("event created with subscribers notified", () => {
|
|
820
|
+
test("seeds the form value with notify on", async () => {
|
|
821
|
+
const props: StateChangeModalProps = await openModal(
|
|
822
|
+
openCase,
|
|
823
|
+
NOTIFYING_EVENT,
|
|
824
|
+
);
|
|
825
|
+
|
|
826
|
+
expect(props.initialValues).toEqual({
|
|
827
|
+
[NOTIFY_FIELD_KEY]: true,
|
|
828
|
+
});
|
|
829
|
+
});
|
|
830
|
+
|
|
831
|
+
test("starts the checkbox ticked with the original description", async () => {
|
|
832
|
+
const field: StateChangeField = fieldByKey(
|
|
833
|
+
await openModal(openCase, NOTIFYING_EVENT),
|
|
834
|
+
NOTIFY_FIELD_KEY,
|
|
835
|
+
);
|
|
836
|
+
|
|
837
|
+
expect(field.defaultValue).toBe(true);
|
|
838
|
+
expect(field.description).toBe(ORIGINAL_DESCRIPTION);
|
|
839
|
+
expect(field.description).not.toBe(QUIET_DESCRIPTION);
|
|
840
|
+
});
|
|
841
|
+
|
|
842
|
+
test("records the change on this event, in the chosen state", async () => {
|
|
843
|
+
const props: StateChangeModalProps = await openModal(
|
|
844
|
+
openCase,
|
|
845
|
+
NOTIFYING_EVENT,
|
|
846
|
+
);
|
|
847
|
+
|
|
848
|
+
const created: ScheduledMaintenanceStateTimeline =
|
|
849
|
+
(await props.onBeforeCreate(
|
|
850
|
+
new ScheduledMaintenanceStateTimeline(),
|
|
851
|
+
)) as ScheduledMaintenanceStateTimeline;
|
|
852
|
+
|
|
853
|
+
expect(created.projectId?.toString()).toBe(PROJECT_ID);
|
|
854
|
+
expect(created.scheduledMaintenanceId?.toString()).toBe(EVENT_ID);
|
|
855
|
+
expect(created.scheduledMaintenanceStateId?.toString()).toBe(
|
|
856
|
+
openCase.expectedStateId,
|
|
857
|
+
);
|
|
858
|
+
});
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
describe("no settings passed (backwards compatible)", () => {
|
|
862
|
+
test("seeds the form value with notify on", async () => {
|
|
863
|
+
const props: StateChangeModalProps = await openModal(
|
|
864
|
+
openCase,
|
|
865
|
+
undefined,
|
|
866
|
+
);
|
|
867
|
+
|
|
868
|
+
expect(props.initialValues).toEqual({
|
|
869
|
+
[NOTIFY_FIELD_KEY]: true,
|
|
870
|
+
});
|
|
871
|
+
});
|
|
872
|
+
|
|
873
|
+
test("starts the checkbox ticked with the original description", async () => {
|
|
874
|
+
const field: StateChangeField = fieldByKey(
|
|
875
|
+
await openModal(openCase, undefined),
|
|
876
|
+
NOTIFY_FIELD_KEY,
|
|
877
|
+
);
|
|
878
|
+
|
|
879
|
+
expect(field.defaultValue).toBe(true);
|
|
880
|
+
expect(field.description).toBe(ORIGINAL_DESCRIPTION);
|
|
881
|
+
});
|
|
882
|
+
});
|
|
883
|
+
},
|
|
884
|
+
);
|
|
885
|
+
|
|
886
|
+
describe("ChangeScheduledMaintenanceState: the default follows the state the event moves to", () => {
|
|
887
|
+
interface TargetCase {
|
|
888
|
+
name: string;
|
|
889
|
+
settings: Settings | undefined;
|
|
890
|
+
target: OpenCase;
|
|
891
|
+
expected: boolean;
|
|
892
|
+
}
|
|
893
|
+
|
|
894
|
+
const cases: Array<TargetCase> = [
|
|
895
|
+
/*
|
|
896
|
+
* Created quietly: moving it to ongoing or ended follows the event's own
|
|
897
|
+
* setting for that change, like the worker that would otherwise make it.
|
|
898
|
+
*/
|
|
899
|
+
{
|
|
900
|
+
name: "quiet event set to announce going ongoing: Mark as Ongoing starts ticked",
|
|
901
|
+
settings: QUIET_ANNOUNCES_ONGOING,
|
|
902
|
+
target: MARK_AS_ONGOING,
|
|
903
|
+
expected: true,
|
|
904
|
+
},
|
|
905
|
+
{
|
|
906
|
+
name: "quiet event set to announce both: Mark as Ongoing starts ticked",
|
|
907
|
+
settings: QUIET_ANNOUNCES_BOTH,
|
|
908
|
+
target: MARK_AS_ONGOING,
|
|
909
|
+
expected: true,
|
|
910
|
+
},
|
|
911
|
+
{
|
|
912
|
+
name: "quiet event set to announce only ending: Mark as Ongoing starts unticked",
|
|
913
|
+
settings: QUIET_ANNOUNCES_ENDED,
|
|
914
|
+
target: MARK_AS_ONGOING,
|
|
915
|
+
expected: false,
|
|
916
|
+
},
|
|
917
|
+
{
|
|
918
|
+
name: "quiet event set to announce neither: Mark as Ongoing starts unticked",
|
|
919
|
+
settings: QUIET_EVENT,
|
|
920
|
+
target: MARK_AS_ONGOING,
|
|
921
|
+
expected: false,
|
|
922
|
+
},
|
|
923
|
+
{
|
|
924
|
+
name: "quiet event set to announce ending: Mark as Ended starts ticked",
|
|
925
|
+
settings: QUIET_ANNOUNCES_ENDED,
|
|
926
|
+
target: MARK_AS_ENDED,
|
|
927
|
+
expected: true,
|
|
928
|
+
},
|
|
929
|
+
{
|
|
930
|
+
name: "quiet event set to announce both: Mark as Ended starts ticked",
|
|
931
|
+
settings: QUIET_ANNOUNCES_BOTH,
|
|
932
|
+
target: MARK_AS_ENDED,
|
|
933
|
+
expected: true,
|
|
934
|
+
},
|
|
935
|
+
{
|
|
936
|
+
name: "quiet event set to announce only going ongoing: Mark as Ended starts unticked",
|
|
937
|
+
settings: QUIET_ANNOUNCES_ONGOING,
|
|
938
|
+
target: MARK_AS_ENDED,
|
|
939
|
+
expected: false,
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
name: "quiet event set to announce ending: the resolved state from More actions starts ticked",
|
|
943
|
+
settings: QUIET_ANNOUNCES_ENDED,
|
|
944
|
+
target: RESOLVED_STATE_FROM_MENU,
|
|
945
|
+
expected: true,
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
name: "quiet event set to announce only going ongoing: the resolved state from More actions starts unticked",
|
|
949
|
+
settings: QUIET_ANNOUNCES_ONGOING,
|
|
950
|
+
target: RESOLVED_STATE_FROM_MENU,
|
|
951
|
+
expected: false,
|
|
952
|
+
},
|
|
953
|
+
{
|
|
954
|
+
name: "quiet event set to announce ending: Mark as Completed (resolved) starts ticked",
|
|
955
|
+
settings: QUIET_ANNOUNCES_ENDED,
|
|
956
|
+
target: RESOLVED_STATE_BUTTON,
|
|
957
|
+
expected: true,
|
|
958
|
+
},
|
|
959
|
+
{
|
|
960
|
+
name: "quiet event set to announce only going ongoing: Mark as Completed (resolved) starts unticked",
|
|
961
|
+
settings: QUIET_ANNOUNCES_ONGOING,
|
|
962
|
+
target: RESOLVED_STATE_BUTTON,
|
|
963
|
+
expected: false,
|
|
964
|
+
},
|
|
965
|
+
// Any other state has no setting of its own, so it stays quiet.
|
|
966
|
+
{
|
|
967
|
+
name: "quiet event set to announce both: a custom state starts unticked",
|
|
968
|
+
settings: QUIET_ANNOUNCES_BOTH,
|
|
969
|
+
target: CUSTOM_STATE_FROM_MENU,
|
|
970
|
+
expected: false,
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
name: "quiet event set to announce both: the scheduled state starts unticked",
|
|
974
|
+
settings: QUIET_ANNOUNCES_BOTH,
|
|
975
|
+
target: SCHEDULED_STATE_FROM_MENU,
|
|
976
|
+
expected: false,
|
|
977
|
+
},
|
|
978
|
+
// Announced when created: every change starts ticked, as before.
|
|
979
|
+
{
|
|
980
|
+
name: "notified event set to announce neither: Mark as Ongoing still starts ticked",
|
|
981
|
+
settings: NOTIFIED_ANNOUNCES_NOTHING,
|
|
982
|
+
target: MARK_AS_ONGOING,
|
|
983
|
+
expected: true,
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
name: "notified event set to announce neither: Mark as Ended still starts ticked",
|
|
987
|
+
settings: NOTIFIED_ANNOUNCES_NOTHING,
|
|
988
|
+
target: MARK_AS_ENDED,
|
|
989
|
+
expected: true,
|
|
990
|
+
},
|
|
991
|
+
{
|
|
992
|
+
name: "notified event set to announce neither: the resolved state still starts ticked",
|
|
993
|
+
settings: NOTIFIED_ANNOUNCES_NOTHING,
|
|
994
|
+
target: RESOLVED_STATE_FROM_MENU,
|
|
995
|
+
expected: true,
|
|
996
|
+
},
|
|
997
|
+
{
|
|
998
|
+
name: "notified event set to announce neither: a custom state still starts ticked",
|
|
999
|
+
settings: NOTIFIED_ANNOUNCES_NOTHING,
|
|
1000
|
+
target: CUSTOM_STATE_FROM_MENU,
|
|
1001
|
+
expected: true,
|
|
1002
|
+
},
|
|
1003
|
+
{
|
|
1004
|
+
name: "notified event set to announce neither: the scheduled state still starts ticked",
|
|
1005
|
+
settings: NOTIFIED_ANNOUNCES_NOTHING,
|
|
1006
|
+
target: SCHEDULED_STATE_FROM_MENU,
|
|
1007
|
+
expected: true,
|
|
1008
|
+
},
|
|
1009
|
+
// An unknown created setting keeps the long-standing default.
|
|
1010
|
+
{
|
|
1011
|
+
name: "created setting unknown, set to announce neither: Mark as Ongoing starts ticked",
|
|
1012
|
+
settings: CREATED_UNKNOWN_ANNOUNCES_NOTHING,
|
|
1013
|
+
target: MARK_AS_ONGOING,
|
|
1014
|
+
expected: true,
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
name: "created setting unknown, set to announce neither: Mark as Ended starts ticked",
|
|
1018
|
+
settings: CREATED_UNKNOWN_ANNOUNCES_NOTHING,
|
|
1019
|
+
target: MARK_AS_ENDED,
|
|
1020
|
+
expected: true,
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
name: "created setting unknown, set to announce neither: a custom state starts ticked",
|
|
1024
|
+
settings: CREATED_UNKNOWN_ANNOUNCES_NOTHING,
|
|
1025
|
+
target: CUSTOM_STATE_FROM_MENU,
|
|
1026
|
+
expected: true,
|
|
1027
|
+
},
|
|
1028
|
+
// No settings passed at all: notifying, whatever the target.
|
|
1029
|
+
{
|
|
1030
|
+
name: "no settings passed: the resolved state starts ticked",
|
|
1031
|
+
settings: undefined,
|
|
1032
|
+
target: RESOLVED_STATE_FROM_MENU,
|
|
1033
|
+
expected: true,
|
|
1034
|
+
},
|
|
1035
|
+
{
|
|
1036
|
+
name: "no settings passed: the scheduled state starts ticked",
|
|
1037
|
+
settings: undefined,
|
|
1038
|
+
target: SCHEDULED_STATE_FROM_MENU,
|
|
1039
|
+
expected: true,
|
|
1040
|
+
},
|
|
1041
|
+
];
|
|
1042
|
+
|
|
1043
|
+
test.each(cases)("$name", async (targetCase: TargetCase) => {
|
|
1044
|
+
const props: StateChangeModalProps = await openModal(
|
|
1045
|
+
targetCase.target,
|
|
1046
|
+
targetCase.settings,
|
|
1047
|
+
);
|
|
1048
|
+
|
|
1049
|
+
expect(props.initialValues).toEqual({
|
|
1050
|
+
[NOTIFY_FIELD_KEY]: targetCase.expected,
|
|
1051
|
+
});
|
|
1052
|
+
expect(notifyStartOf(props)).toEqual(
|
|
1053
|
+
expectedNotifyStart(targetCase.expected),
|
|
1054
|
+
);
|
|
1055
|
+
|
|
1056
|
+
// Still recorded against the state that was chosen.
|
|
1057
|
+
const created: ScheduledMaintenanceStateTimeline =
|
|
1058
|
+
(await props.onBeforeCreate(
|
|
1059
|
+
new ScheduledMaintenanceStateTimeline(),
|
|
1060
|
+
)) as ScheduledMaintenanceStateTimeline;
|
|
1061
|
+
|
|
1062
|
+
expect(created.scheduledMaintenanceStateId?.toString()).toBe(
|
|
1063
|
+
targetCase.target.expectedStateId,
|
|
1064
|
+
);
|
|
1065
|
+
});
|
|
1066
|
+
|
|
1067
|
+
test("each form opened in one visit starts from its own target", async () => {
|
|
1068
|
+
const props: StateChangeModalProps = await openModal(
|
|
1069
|
+
MARK_AS_ONGOING,
|
|
1070
|
+
QUIET_ANNOUNCES_ONGOING,
|
|
1071
|
+
);
|
|
1072
|
+
|
|
1073
|
+
expect(notifyStartOf(props)).toEqual(expectedNotifyStart(true));
|
|
1074
|
+
|
|
1075
|
+
const closeAndOpen: (openCase: OpenCase) => StateChangeModalProps = (
|
|
1076
|
+
openCase: OpenCase,
|
|
1077
|
+
): StateChangeModalProps => {
|
|
1078
|
+
act(() => {
|
|
1079
|
+
lastModalProps().onClose();
|
|
1080
|
+
});
|
|
1081
|
+
|
|
1082
|
+
expect(screen.queryByTestId("state-change-modal")).toBeNull();
|
|
1083
|
+
|
|
1084
|
+
const rendersBefore: number = modalPropsHistory().length;
|
|
1085
|
+
|
|
1086
|
+
openCase.open();
|
|
1087
|
+
|
|
1088
|
+
const rendersSinceOpening: Array<StateChangeModalProps> =
|
|
1089
|
+
modalPropsHistory().slice(rendersBefore);
|
|
1090
|
+
|
|
1091
|
+
expect(rendersSinceOpening.length).toBeGreaterThan(0);
|
|
1092
|
+
|
|
1093
|
+
// Not one render with the previous target's value.
|
|
1094
|
+
for (const modalRender of rendersSinceOpening) {
|
|
1095
|
+
expect(modalRender.title).toBe(openCase.expectedTitle);
|
|
1096
|
+
expect(modalRender.initialValues).toEqual(
|
|
1097
|
+
lastModalProps().initialValues,
|
|
1098
|
+
);
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
return lastModalProps();
|
|
1102
|
+
};
|
|
1103
|
+
|
|
1104
|
+
expect(notifyStartOf(closeAndOpen(MARK_AS_ENDED))).toEqual(
|
|
1105
|
+
expectedNotifyStart(false),
|
|
1106
|
+
);
|
|
1107
|
+
expect(notifyStartOf(closeAndOpen(CUSTOM_STATE_FROM_MENU))).toEqual(
|
|
1108
|
+
expectedNotifyStart(false),
|
|
1109
|
+
);
|
|
1110
|
+
expect(notifyStartOf(closeAndOpen(MARK_AS_ONGOING))).toEqual(
|
|
1111
|
+
expectedNotifyStart(true),
|
|
1112
|
+
);
|
|
1113
|
+
});
|
|
1114
|
+
});
|
|
1115
|
+
|
|
1116
|
+
describe("ChangeScheduledMaintenanceState note template", () => {
|
|
1117
|
+
test("offers the project's templates in the form", async () => {
|
|
1118
|
+
const props: StateChangeModalProps = await openModal(
|
|
1119
|
+
MARK_AS_ONGOING,
|
|
1120
|
+
QUIET_EVENT,
|
|
1121
|
+
{ withTemplate: true },
|
|
1122
|
+
);
|
|
1123
|
+
const templateField: StateChangeField = fieldByKey(
|
|
1124
|
+
props,
|
|
1125
|
+
"publicNoteTemplate",
|
|
1126
|
+
);
|
|
1127
|
+
|
|
1128
|
+
expect(templateField.showIf!()).toBe(true);
|
|
1129
|
+
expect(templateField.dropdownOptions).toEqual([
|
|
1130
|
+
{ value: TEMPLATE_ID, label: "Drill started" },
|
|
1131
|
+
]);
|
|
1132
|
+
});
|
|
1133
|
+
|
|
1134
|
+
test("picking a template fills the public note and keeps notify off", async () => {
|
|
1135
|
+
const props: StateChangeModalProps = await openModal(
|
|
1136
|
+
MARK_AS_ONGOING,
|
|
1137
|
+
QUIET_EVENT,
|
|
1138
|
+
{ withTemplate: true },
|
|
1139
|
+
);
|
|
1140
|
+
const templateField: StateChangeField = fieldByKey(
|
|
1141
|
+
props,
|
|
1142
|
+
"publicNoteTemplate",
|
|
1143
|
+
);
|
|
1144
|
+
const setNewFormValues: MockFunction = getJestMockFunction();
|
|
1145
|
+
|
|
1146
|
+
templateField.onChange!(
|
|
1147
|
+
TEMPLATE_ID,
|
|
1148
|
+
{
|
|
1149
|
+
[NOTIFY_FIELD_KEY]: props.initialValues![NOTIFY_FIELD_KEY],
|
|
1150
|
+
publicNote: "",
|
|
1151
|
+
},
|
|
1152
|
+
setNewFormValues,
|
|
1153
|
+
);
|
|
1154
|
+
|
|
1155
|
+
expect(setNewFormValues).toHaveBeenCalledTimes(1);
|
|
1156
|
+
expect(setNewFormValues).toHaveBeenCalledWith({
|
|
1157
|
+
[NOTIFY_FIELD_KEY]: false,
|
|
1158
|
+
publicNote: TEMPLATE_NOTE,
|
|
1159
|
+
});
|
|
1160
|
+
});
|
|
1161
|
+
|
|
1162
|
+
test("picking a template keeps a ticked box ticked", async () => {
|
|
1163
|
+
const props: StateChangeModalProps = await openModal(
|
|
1164
|
+
MARK_AS_ENDED,
|
|
1165
|
+
NOTIFYING_EVENT,
|
|
1166
|
+
{
|
|
1167
|
+
withTemplate: true,
|
|
1168
|
+
},
|
|
1169
|
+
);
|
|
1170
|
+
const setNewFormValues: MockFunction = getJestMockFunction();
|
|
1171
|
+
|
|
1172
|
+
fieldByKey(props, "publicNoteTemplate").onChange!(
|
|
1173
|
+
TEMPLATE_ID,
|
|
1174
|
+
{ [NOTIFY_FIELD_KEY]: true },
|
|
1175
|
+
setNewFormValues,
|
|
1176
|
+
);
|
|
1177
|
+
|
|
1178
|
+
expect(setNewFormValues).toHaveBeenCalledWith({
|
|
1179
|
+
[NOTIFY_FIELD_KEY]: true,
|
|
1180
|
+
publicNote: TEMPLATE_NOTE,
|
|
1181
|
+
});
|
|
1182
|
+
});
|
|
1183
|
+
|
|
1184
|
+
test("picking a template keeps a box the user ticked by hand", async () => {
|
|
1185
|
+
const props: StateChangeModalProps = await openModal(
|
|
1186
|
+
MARK_AS_ONGOING,
|
|
1187
|
+
QUIET_EVENT,
|
|
1188
|
+
{ withTemplate: true },
|
|
1189
|
+
);
|
|
1190
|
+
const setNewFormValues: MockFunction = getJestMockFunction();
|
|
1191
|
+
|
|
1192
|
+
// Notify was ticked by hand before the template was picked.
|
|
1193
|
+
fieldByKey(props, "publicNoteTemplate").onChange!(
|
|
1194
|
+
TEMPLATE_ID,
|
|
1195
|
+
{ [NOTIFY_FIELD_KEY]: true, publicNote: "draft" },
|
|
1196
|
+
setNewFormValues,
|
|
1197
|
+
);
|
|
1198
|
+
|
|
1199
|
+
expect(setNewFormValues).toHaveBeenCalledWith({
|
|
1200
|
+
[NOTIFY_FIELD_KEY]: true,
|
|
1201
|
+
publicNote: TEMPLATE_NOTE,
|
|
1202
|
+
});
|
|
1203
|
+
});
|
|
1204
|
+
|
|
1205
|
+
test("an unknown template changes nothing", async () => {
|
|
1206
|
+
const props: StateChangeModalProps = await openModal(
|
|
1207
|
+
MARK_AS_ONGOING,
|
|
1208
|
+
QUIET_EVENT,
|
|
1209
|
+
{ withTemplate: true },
|
|
1210
|
+
);
|
|
1211
|
+
const setNewFormValues: MockFunction = getJestMockFunction();
|
|
1212
|
+
|
|
1213
|
+
fieldByKey(props, "publicNoteTemplate").onChange!(
|
|
1214
|
+
"cccccccc-cccc-4ccc-8ccc-ccccccccccc1",
|
|
1215
|
+
{ [NOTIFY_FIELD_KEY]: false },
|
|
1216
|
+
setNewFormValues,
|
|
1217
|
+
);
|
|
1218
|
+
|
|
1219
|
+
expect(setNewFormValues).not.toHaveBeenCalled();
|
|
1220
|
+
});
|
|
1221
|
+
|
|
1222
|
+
test("with no templates the picker stays hidden and notify still starts off", async () => {
|
|
1223
|
+
const props: StateChangeModalProps = await openModal(
|
|
1224
|
+
MARK_AS_ONGOING,
|
|
1225
|
+
QUIET_EVENT,
|
|
1226
|
+
);
|
|
1227
|
+
|
|
1228
|
+
expect(fieldByKey(props, "publicNoteTemplate").showIf!()).toBe(false);
|
|
1229
|
+
expect(props.initialValues).toEqual({ [NOTIFY_FIELD_KEY]: false });
|
|
1230
|
+
});
|
|
1231
|
+
});
|
|
1232
|
+
|
|
1233
|
+
describe("ChangeScheduledMaintenanceState: the default follows the page", () => {
|
|
1234
|
+
/*
|
|
1235
|
+
* The page passes the event's settings once it has loaded, and again after
|
|
1236
|
+
* each refresh. A form opened after that must use the current values,
|
|
1237
|
+
* without the header reloading.
|
|
1238
|
+
*/
|
|
1239
|
+
type RerenderToFunction = (
|
|
1240
|
+
first: Settings | undefined,
|
|
1241
|
+
next: Settings | undefined,
|
|
1242
|
+
) => Promise<number>;
|
|
1243
|
+
|
|
1244
|
+
// Returns how many list requests the header made before the rerender.
|
|
1245
|
+
const rerenderTo: RerenderToFunction = async (
|
|
1246
|
+
first: Settings | undefined,
|
|
1247
|
+
next: Settings | undefined,
|
|
1248
|
+
): Promise<number> => {
|
|
1249
|
+
respondWith();
|
|
1250
|
+
|
|
1251
|
+
const view: RenderResult = renderHeader(first);
|
|
1252
|
+
await waitForHeader();
|
|
1253
|
+
|
|
1254
|
+
const listCallsBefore: number = getListMock.mock.calls.length;
|
|
1255
|
+
|
|
1256
|
+
view.rerender(headerElement(next));
|
|
1257
|
+
|
|
1258
|
+
clickMarkAsOngoing();
|
|
1259
|
+
|
|
1260
|
+
return listCallsBefore;
|
|
1261
|
+
};
|
|
1262
|
+
|
|
1263
|
+
test("a form opened after the event turns quiet starts unticked", async () => {
|
|
1264
|
+
const listCallsBefore: number = await rerenderTo(
|
|
1265
|
+
NOTIFYING_EVENT,
|
|
1266
|
+
QUIET_EVENT,
|
|
1267
|
+
);
|
|
1268
|
+
|
|
1269
|
+
await waitFor(() => {
|
|
1270
|
+
expect(lastModalProps().initialValues).toEqual({
|
|
1271
|
+
[NOTIFY_FIELD_KEY]: false,
|
|
1272
|
+
});
|
|
1273
|
+
});
|
|
1274
|
+
|
|
1275
|
+
expect(notifyStartOf(lastModalProps())).toEqual(expectedNotifyStart(false));
|
|
1276
|
+
expect(getListMock.mock.calls.length).toBe(listCallsBefore);
|
|
1277
|
+
});
|
|
1278
|
+
|
|
1279
|
+
test("a form opened after the event notifies again starts ticked", async () => {
|
|
1280
|
+
const listCallsBefore: number = await rerenderTo(
|
|
1281
|
+
QUIET_EVENT,
|
|
1282
|
+
NOTIFYING_EVENT,
|
|
1283
|
+
);
|
|
1284
|
+
|
|
1285
|
+
await waitFor(() => {
|
|
1286
|
+
expect(lastModalProps().initialValues).toEqual({
|
|
1287
|
+
[NOTIFY_FIELD_KEY]: true,
|
|
1288
|
+
});
|
|
1289
|
+
});
|
|
1290
|
+
|
|
1291
|
+
expect(notifyStartOf(lastModalProps())).toEqual(expectedNotifyStart(true));
|
|
1292
|
+
expect(getListMock.mock.calls.length).toBe(listCallsBefore);
|
|
1293
|
+
});
|
|
1294
|
+
|
|
1295
|
+
test("a form opened after only the Event Ongoing setting turns on starts ticked", async () => {
|
|
1296
|
+
const listCallsBefore: number = await rerenderTo(
|
|
1297
|
+
QUIET_EVENT,
|
|
1298
|
+
QUIET_ANNOUNCES_ONGOING,
|
|
1299
|
+
);
|
|
1300
|
+
|
|
1301
|
+
await waitFor(() => {
|
|
1302
|
+
expect(lastModalProps().initialValues).toEqual({
|
|
1303
|
+
[NOTIFY_FIELD_KEY]: true,
|
|
1304
|
+
});
|
|
1305
|
+
});
|
|
1306
|
+
|
|
1307
|
+
expect(notifyStartOf(lastModalProps())).toEqual(expectedNotifyStart(true));
|
|
1308
|
+
expect(getListMock.mock.calls.length).toBe(listCallsBefore);
|
|
1309
|
+
});
|
|
1310
|
+
});
|
|
1311
|
+
|
|
1312
|
+
/*
|
|
1313
|
+
* The real form, built from exactly the props the header handed the modal
|
|
1314
|
+
* (ModelFormModal passes them straight to ModelForm), submitted down to the
|
|
1315
|
+
* request it would send. The state change form has no checkbox of its own
|
|
1316
|
+
* for its public note: the server posts the note with Boolean(the state
|
|
1317
|
+
* change's flag). So the one checkbox's starting value is what decides
|
|
1318
|
+
* whether both the change and its note reach subscribers.
|
|
1319
|
+
*/
|
|
1320
|
+
describe("ChangeScheduledMaintenanceState: what the real form sends", () => {
|
|
1321
|
+
const renderRealForm: (
|
|
1322
|
+
props: StateChangeModalProps,
|
|
1323
|
+
) => Promise<void> = async (props: StateChangeModalProps): Promise<void> => {
|
|
1324
|
+
const formProps: ModelFormComponentProps<ScheduledMaintenanceStateTimeline> =
|
|
1325
|
+
props.formProps as unknown as ModelFormComponentProps<ScheduledMaintenanceStateTimeline>;
|
|
1326
|
+
|
|
1327
|
+
expect(formProps.formType).toBe(FormType.Create);
|
|
1328
|
+
|
|
1329
|
+
render(
|
|
1330
|
+
<ModelForm<ScheduledMaintenanceStateTimeline>
|
|
1331
|
+
{...formProps}
|
|
1332
|
+
modelType={ScheduledMaintenanceStateTimeline}
|
|
1333
|
+
initialValues={
|
|
1334
|
+
props.initialValues as FormValues<ScheduledMaintenanceStateTimeline>
|
|
1335
|
+
}
|
|
1336
|
+
onBeforeCreate={
|
|
1337
|
+
props.onBeforeCreate as (
|
|
1338
|
+
item: ScheduledMaintenanceStateTimeline,
|
|
1339
|
+
) => Promise<ScheduledMaintenanceStateTimeline>
|
|
1340
|
+
}
|
|
1341
|
+
onSuccess={(): void => {
|
|
1342
|
+
// Not asserted on.
|
|
1343
|
+
}}
|
|
1344
|
+
submitButtonText="Save"
|
|
1345
|
+
/>,
|
|
1346
|
+
);
|
|
1347
|
+
|
|
1348
|
+
await screen.findByRole("checkbox", { name: CHECKBOX_TITLE });
|
|
1349
|
+
};
|
|
1350
|
+
|
|
1351
|
+
const openRealForm: (
|
|
1352
|
+
openCase: OpenCase,
|
|
1353
|
+
settings: Settings | undefined,
|
|
1354
|
+
) => Promise<void> = async (
|
|
1355
|
+
openCase: OpenCase,
|
|
1356
|
+
settings: Settings | undefined,
|
|
1357
|
+
): Promise<void> => {
|
|
1358
|
+
await renderRealForm(await openModal(openCase, settings));
|
|
1359
|
+
};
|
|
1360
|
+
|
|
1361
|
+
const notifyCheckbox: () => HTMLInputElement = (): HTMLInputElement => {
|
|
1362
|
+
return screen.getByRole("checkbox", {
|
|
1363
|
+
name: CHECKBOX_TITLE,
|
|
1364
|
+
}) as HTMLInputElement;
|
|
1365
|
+
};
|
|
1366
|
+
|
|
1367
|
+
const writeNote: () => Promise<void> = async (): Promise<void> => {
|
|
1368
|
+
// The markdown source view is a plain textarea.
|
|
1369
|
+
fireEvent.click(screen.getByTitle("Switch to markdown source"));
|
|
1370
|
+
|
|
1371
|
+
fireEvent.change(
|
|
1372
|
+
await screen.findByPlaceholderText("Type your markdown here..."),
|
|
1373
|
+
{
|
|
1374
|
+
target: { value: NOTE_TEXT },
|
|
1375
|
+
},
|
|
1376
|
+
);
|
|
1377
|
+
};
|
|
1378
|
+
|
|
1379
|
+
const toggleNotify: () => void = (): void => {
|
|
1380
|
+
fireEvent.click(notifyCheckbox());
|
|
1381
|
+
};
|
|
1382
|
+
|
|
1383
|
+
const submit: () => Promise<JSONObject> = async (): Promise<JSONObject> => {
|
|
1384
|
+
fireEvent.click(screen.getByRole("button", { name: "Save" }));
|
|
1385
|
+
|
|
1386
|
+
await waitFor(() => {
|
|
1387
|
+
expect(capturedPayload).not.toBeNull();
|
|
1388
|
+
});
|
|
1389
|
+
|
|
1390
|
+
return capturedPayload!;
|
|
1391
|
+
};
|
|
1392
|
+
|
|
1393
|
+
test("quiet event set to announce going ongoing: Mark as Ongoing sends true, so the change and its note notify", async () => {
|
|
1394
|
+
await openRealForm(MARK_AS_ONGOING, QUIET_ANNOUNCES_ONGOING);
|
|
1395
|
+
|
|
1396
|
+
expect(notifyCheckbox()).toBeChecked();
|
|
1397
|
+
expect(screen.getByText(ORIGINAL_DESCRIPTION)).toBeInTheDocument();
|
|
1398
|
+
expect(screen.queryByText(QUIET_DESCRIPTION)).toBeNull();
|
|
1399
|
+
|
|
1400
|
+
await writeNote();
|
|
1401
|
+
const payload: JSONObject = await submit();
|
|
1402
|
+
|
|
1403
|
+
expect(payload[NOTIFY_FIELD_KEY]).toBe(true);
|
|
1404
|
+
// The note travels beside the timeline row, not inside it.
|
|
1405
|
+
expect(capturedMiscDataProps?.["publicNote"]).toBe(NOTE_TEXT);
|
|
1406
|
+
expect(payload["publicNote"]).toBeUndefined();
|
|
1407
|
+
expect(capturedModel?.scheduledMaintenanceStateId?.toString()).toBe(
|
|
1408
|
+
ONGOING_STATE_ID,
|
|
1409
|
+
);
|
|
1410
|
+
expect(capturedModel?.scheduledMaintenanceId?.toString()).toBe(EVENT_ID);
|
|
1411
|
+
});
|
|
1412
|
+
|
|
1413
|
+
test("quiet event set to announce only going ongoing: Mark as Ended sends an explicit false, so the change and its note stay quiet", async () => {
|
|
1414
|
+
await openRealForm(MARK_AS_ENDED, QUIET_ANNOUNCES_ONGOING);
|
|
1415
|
+
|
|
1416
|
+
expect(notifyCheckbox()).not.toBeChecked();
|
|
1417
|
+
expect(screen.getByText(QUIET_DESCRIPTION)).toBeInTheDocument();
|
|
1418
|
+
expect(screen.queryByText(ORIGINAL_DESCRIPTION)).toBeNull();
|
|
1419
|
+
|
|
1420
|
+
await writeNote();
|
|
1421
|
+
const payload: JSONObject = await submit();
|
|
1422
|
+
|
|
1423
|
+
expect(Object.keys(payload)).toContain(NOTIFY_FIELD_KEY);
|
|
1424
|
+
expect(payload[NOTIFY_FIELD_KEY]).toBe(false);
|
|
1425
|
+
expect(capturedMiscDataProps?.["publicNote"]).toBe(NOTE_TEXT);
|
|
1426
|
+
expect(capturedModel?.scheduledMaintenanceStateId?.toString()).toBe(
|
|
1427
|
+
ENDED_STATE_ID,
|
|
1428
|
+
);
|
|
1429
|
+
});
|
|
1430
|
+
|
|
1431
|
+
test("quiet event: ticking the box by hand sends true with the note", async () => {
|
|
1432
|
+
await openRealForm(MARK_AS_ENDED, QUIET_EVENT);
|
|
1433
|
+
|
|
1434
|
+
expect(notifyCheckbox()).not.toBeChecked();
|
|
1435
|
+
|
|
1436
|
+
await writeNote();
|
|
1437
|
+
toggleNotify();
|
|
1438
|
+
|
|
1439
|
+
expect(notifyCheckbox()).toBeChecked();
|
|
1440
|
+
|
|
1441
|
+
const payload: JSONObject = await submit();
|
|
1442
|
+
|
|
1443
|
+
expect(payload[NOTIFY_FIELD_KEY]).toBe(true);
|
|
1444
|
+
expect(capturedMiscDataProps?.["publicNote"]).toBe(NOTE_TEXT);
|
|
1445
|
+
});
|
|
1446
|
+
|
|
1447
|
+
test("quiet event set to announce going ongoing: unticking the box by hand sends false with the note", async () => {
|
|
1448
|
+
await openRealForm(MARK_AS_ONGOING, QUIET_ANNOUNCES_ONGOING);
|
|
1449
|
+
|
|
1450
|
+
expect(notifyCheckbox()).toBeChecked();
|
|
1451
|
+
|
|
1452
|
+
await writeNote();
|
|
1453
|
+
toggleNotify();
|
|
1454
|
+
|
|
1455
|
+
expect(notifyCheckbox()).not.toBeChecked();
|
|
1456
|
+
|
|
1457
|
+
const payload: JSONObject = await submit();
|
|
1458
|
+
|
|
1459
|
+
expect(Object.keys(payload)).toContain(NOTIFY_FIELD_KEY);
|
|
1460
|
+
expect(payload[NOTIFY_FIELD_KEY]).toBe(false);
|
|
1461
|
+
expect(capturedMiscDataProps?.["publicNote"]).toBe(NOTE_TEXT);
|
|
1462
|
+
});
|
|
1463
|
+
|
|
1464
|
+
test("quiet event set to announce both: a custom state sends an explicit false", async () => {
|
|
1465
|
+
await openRealForm(CUSTOM_STATE_FROM_MENU, QUIET_ANNOUNCES_BOTH);
|
|
1466
|
+
|
|
1467
|
+
expect(notifyCheckbox()).not.toBeChecked();
|
|
1468
|
+
|
|
1469
|
+
await writeNote();
|
|
1470
|
+
const payload: JSONObject = await submit();
|
|
1471
|
+
|
|
1472
|
+
expect(Object.keys(payload)).toContain(NOTIFY_FIELD_KEY);
|
|
1473
|
+
expect(payload[NOTIFY_FIELD_KEY]).toBe(false);
|
|
1474
|
+
expect(capturedMiscDataProps?.["publicNote"]).toBe(NOTE_TEXT);
|
|
1475
|
+
expect(capturedModel?.scheduledMaintenanceStateId?.toString()).toBe(
|
|
1476
|
+
VERIFYING_STATE_ID,
|
|
1477
|
+
);
|
|
1478
|
+
});
|
|
1479
|
+
|
|
1480
|
+
test("notified event set to announce neither: Mark as Ongoing still sends true", async () => {
|
|
1481
|
+
await openRealForm(MARK_AS_ONGOING, NOTIFIED_ANNOUNCES_NOTHING);
|
|
1482
|
+
|
|
1483
|
+
expect(notifyCheckbox()).toBeChecked();
|
|
1484
|
+
|
|
1485
|
+
await writeNote();
|
|
1486
|
+
const payload: JSONObject = await submit();
|
|
1487
|
+
|
|
1488
|
+
expect(payload[NOTIFY_FIELD_KEY]).toBe(true);
|
|
1489
|
+
expect(capturedMiscDataProps?.["publicNote"]).toBe(NOTE_TEXT);
|
|
1490
|
+
});
|
|
1491
|
+
});
|