@oneuptime/common 14.0.13 → 14.0.14
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/AlertGroupingRule.ts +10 -6
- package/Models/DatabaseModels/File.ts +41 -2
- package/Models/DatabaseModels/Form.ts +126 -0
- package/Models/DatabaseModels/IncidentGroupingRule.ts +10 -6
- package/Models/DatabaseModels/LogDropFilter.ts +1 -0
- package/Models/DatabaseModels/LogPipeline.ts +1 -0
- package/Models/DatabaseModels/LogScrubRule.ts +14 -8
- package/Models/DatabaseModels/MetricRecordingRule.ts +2 -1
- package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +4 -2
- package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +22 -9
- package/Models/DatabaseModels/ProjectCallSMSConfig.ts +6 -1
- package/Models/DatabaseModels/StatusPage.ts +8 -4
- package/Models/DatabaseModels/TraceDropFilter.ts +1 -0
- package/Models/DatabaseModels/TracePipeline.ts +1 -0
- package/Models/DatabaseModels/TraceRecordingRule.ts +2 -1
- package/Models/DatabaseModels/TraceScrubRule.ts +14 -8
- package/Models/DatabaseModels/UserOnCallLog.ts +4 -2
- package/Server/API/CustomDomainRoutes.ts +251 -0
- package/Server/API/DashboardAPI.ts +33 -4
- package/Server/API/DashboardDomainAPI.ts +63 -93
- package/Server/API/StatusPageAPI.ts +92 -0
- package/Server/API/StatusPageDomainAPI.ts +59 -96
- package/Server/Infrastructure/GlobalCache.ts +84 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Services/AlertGroupingEngineService.ts +48 -70
- package/Server/Services/AlertGroupingRuleService.ts +38 -0
- package/Server/Services/CephClusterService.ts +25 -0
- package/Server/Services/CloudResourceService.ts +42 -0
- package/Server/Services/DashboardDomainService.ts +640 -214
- package/Server/Services/DashboardService.ts +30 -8
- package/Server/Services/DatabaseService.ts +143 -12
- package/Server/Services/DockerHostService.ts +60 -0
- package/Server/Services/DockerSwarmClusterService.ts +25 -0
- package/Server/Services/FileService.ts +60 -0
- package/Server/Services/FormService.ts +212 -2
- package/Server/Services/GlobalOidcService.ts +10 -0
- package/Server/Services/GlobalSsoService.ts +10 -0
- package/Server/Services/HostService.ts +58 -0
- package/Server/Services/IncidentGroupingEngineService.ts +48 -70
- package/Server/Services/IncidentGroupingRuleService.ts +38 -0
- package/Server/Services/IoTFleetService.ts +26 -0
- package/Server/Services/KubernetesClusterService.ts +64 -0
- package/Server/Services/LabelService.ts +6 -17
- package/Server/Services/LogScrubRuleService.ts +50 -0
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +264 -0
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +9 -1
- package/Server/Services/OnCallNotificationAlertingService.ts +24 -29
- package/Server/Services/OnCallSetupReminderService.ts +41 -40
- package/Server/Services/PodmanHostService.ts +60 -0
- package/Server/Services/ProfileAggregationService.ts +38 -0
- package/Server/Services/ProjectCallSMSConfigService.ts +76 -3
- package/Server/Services/ProjectOidcService.ts +20 -0
- package/Server/Services/ProjectSsoService.ts +20 -0
- package/Server/Services/ProxmoxClusterService.ts +25 -0
- package/Server/Services/RumApplicationService.ts +45 -0
- package/Server/Services/ScheduledMaintenanceService.ts +9 -23
- package/Server/Services/ServerlessFunctionService.ts +47 -0
- package/Server/Services/ServiceService.ts +33 -10
- package/Server/Services/StatusPageDomainService.ts +622 -213
- package/Server/Services/StatusPageOidcService.ts +20 -0
- package/Server/Services/StatusPageResourceService.ts +89 -34
- package/Server/Services/StatusPageService.ts +270 -54
- package/Server/Services/StatusPageSsoService.ts +20 -0
- package/Server/Services/TraceScrubRuleService.ts +50 -0
- package/Server/Services/UserIncomingCallNumberService.ts +28 -14
- package/Server/Services/VMwareVCenterService.ts +25 -0
- package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +3 -3
- package/Server/Utils/Greenlock/CertificateOrder.ts +482 -0
- package/Server/Utils/Greenlock/CertificateOrderBudget.ts +134 -0
- package/Server/Utils/Greenlock/CertificateOrderFailures.ts +288 -0
- package/Server/Utils/Greenlock/CertificateOrderLock.ts +163 -0
- package/Server/Utils/Greenlock/CertificateOrderOutcome.ts +29 -0
- package/Server/Utils/Greenlock/CertificateOwners.ts +72 -0
- package/Server/Utils/Greenlock/CertificateReissueOrder.ts +99 -0
- package/Server/Utils/Greenlock/CustomDomainOrders.ts +397 -0
- package/Server/Utils/Greenlock/Greenlock.ts +839 -203
- package/Server/Utils/Rules/GroupingRuleEpisodeOwners.ts +551 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +8 -1
- package/Server/Utils/ScrubRuleValidation.ts +248 -0
- package/Server/Utils/StatusPage/AffectedStatusPageResources.ts +138 -0
- package/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.ts +294 -0
- package/Server/Utils/Telemetry/DiscoveredResourceCreate.ts +275 -0
- package/Server/Utils/Telemetry/DiscoveredResourceUpdate.ts +217 -0
- package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +8 -2
- package/Tests/App/Accounts/FormPage.test.tsx +238 -0
- package/Tests/App/Accounts/FormUtils.test.ts +108 -0
- package/Tests/App/AdminDashboard/AdminAddToProjectMembersTeam.test.tsx +1087 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +140 -138
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +144 -145
- package/Tests/App/AdminDashboard/AdminSettingsFormsOnePage.test.tsx +907 -0
- package/Tests/App/AdminDashboard/AdminSettingsSwitches.test.tsx +906 -0
- package/Tests/App/AdminDashboard/AdminSmtpSettingsForm.test.tsx +823 -0
- package/Tests/App/AdminDashboard/BulkAddUsersToProjectModal.test.tsx +341 -368
- package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +199 -54
- package/Tests/App/AdminDashboard/ProjectScopedTeamsPicker.test.tsx +991 -0
- package/Tests/App/Dashboard/AIInvestigationSettingsLimits.test.tsx +147 -90
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +224 -104
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +302 -0
- package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +408 -152
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +55 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +206 -115
- package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +32 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +206 -71
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +45 -9
- package/Tests/App/Dashboard/AnnouncementCreateForm.test.tsx +1208 -0
- package/Tests/App/Dashboard/AnnouncementEditAndTemplateForms.test.tsx +693 -0
- package/Tests/App/Dashboard/AnnouncementFormsStructure.test.ts +546 -0
- package/Tests/App/Dashboard/AnnouncementStatusPageSuggestions.test.tsx +425 -0
- package/Tests/App/Dashboard/AnnouncementsTableCreateLinks.test.tsx +267 -0
- package/Tests/App/Dashboard/ApiKeyCreateForm.test.ts +68 -51
- package/Tests/App/Dashboard/ApiKeyViewPermissions.test.tsx +11 -9
- package/Tests/App/Dashboard/ApiKeysCreateAccess.test.tsx +24 -16
- package/Tests/App/Dashboard/BulkChangeStateModalOnePage.test.tsx +333 -0
- package/Tests/App/Dashboard/CardDescriptionsSayWhatFor.test.tsx +307 -0
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +18 -4
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +7 -2
- package/Tests/App/Dashboard/ColorFieldsPrefilledPages.test.tsx +453 -0
- package/Tests/App/Dashboard/CreateFromRecordBreadcrumbs.test.ts +272 -0
- package/Tests/App/Dashboard/CreateFromRecordLinks.test.tsx +495 -0
- package/Tests/App/Dashboard/CreateFromRecordPages.test.tsx +1026 -0
- package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +65 -23
- package/Tests/App/Dashboard/CriteriaName.test.ts +5 -1
- package/Tests/App/Dashboard/CustomDomainCreateFlow.test.tsx +516 -0
- package/Tests/App/Dashboard/CustomDomainDnsSetupModal.test.tsx +547 -0
- package/Tests/App/Dashboard/CustomDomainsPages.test.tsx +1077 -0
- package/Tests/App/Dashboard/CustomFieldSimpleCreate.test.tsx +2 -2
- package/Tests/App/Dashboard/CustomFieldSimpleCreateRender.test.tsx +12 -6
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +1 -1
- package/Tests/App/Dashboard/CustomSmtpConfigForm.test.tsx +969 -0
- package/Tests/App/Dashboard/DashboardBlankCanvasAddWidget.test.tsx +425 -0
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +400 -0
- package/Tests/App/Dashboard/DashboardComponentsMRTranslation.test.tsx +4 -3
- package/Tests/App/Dashboard/DashboardCreateForm.test.ts +375 -0
- package/Tests/App/Dashboard/DashboardCreateFromTemplate.test.tsx +727 -0
- package/Tests/App/Dashboard/DashboardEmptyCanvasAddWidget.test.tsx +86 -0
- package/Tests/App/Dashboard/DashboardPhoneProductsMenu.test.tsx +99 -9
- package/Tests/App/Dashboard/DashboardSharingCard.test.tsx +1226 -0
- package/Tests/App/Dashboard/DashboardSharingEntryPoints.test.tsx +383 -0
- package/Tests/App/Dashboard/DashboardSharingPage.test.tsx +478 -0
- package/Tests/App/Dashboard/DeclareFormsAdvancedRender.test.tsx +90 -34
- package/Tests/App/Dashboard/DeclareIncidentMonitorsApart.test.tsx +1028 -0
- package/Tests/App/Dashboard/DefaultSsoTeams.test.tsx +215 -0
- package/Tests/App/Dashboard/DisabledWarningArchived.test.tsx +3 -3
- package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +15 -12
- package/Tests/App/Dashboard/DiscoveredResourceCreateForms.test.tsx +936 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardGroup.test.tsx +720 -0
- package/Tests/App/Dashboard/EpisodeMemberRoleAssignmentsFormField.test.tsx +331 -0
- package/Tests/App/Dashboard/EpisodePostmortemPage.test.tsx +327 -0
- package/Tests/App/Dashboard/EscalationRuleForm.test.ts +2 -2
- package/Tests/App/Dashboard/EscalationRuleFormGuard.test.ts +6 -2
- package/Tests/App/Dashboard/EscalationRuleOneStep.test.tsx +8 -4
- package/Tests/App/Dashboard/EventMeasurements.test.ts +1175 -0
- package/Tests/App/Dashboard/EventMeasurementsCard.test.tsx +993 -0
- package/Tests/App/Dashboard/EventNoteComposerDialog.test.tsx +939 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +34 -1
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +186 -1
- package/Tests/App/Dashboard/EventSettingsSwitchPages.test.tsx +625 -0
- package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +6 -2
- package/Tests/App/Dashboard/FeedNoteComposerDialog.test.tsx +1327 -0
- package/Tests/App/Dashboard/FeedNoteDialogHelpers.ts +109 -0
- package/Tests/App/Dashboard/FilterChipClearButton.test.tsx +356 -0
- package/Tests/App/Dashboard/FormBrandingSection.test.tsx +504 -0
- package/Tests/App/Dashboard/FormBrandingValues.test.ts +255 -0
- package/Tests/App/Dashboard/FormBuilderParts.test.tsx +38 -1
- package/Tests/App/Dashboard/FormBuilderUi.test.tsx +176 -2
- package/Tests/App/Dashboard/FormMappingCard.test.tsx +33 -13
- package/Tests/App/Dashboard/FormsMovedPagesAndSubmissions.test.tsx +1 -1
- package/Tests/App/Dashboard/GeneratedKeyForms.test.tsx +30 -7
- package/Tests/App/Dashboard/GlobalProbesOnNewMonitorsCard.test.tsx +258 -0
- package/Tests/App/Dashboard/GroupingRuleFormFlow.test.tsx +653 -37
- package/Tests/App/Dashboard/GroupingRulePages.test.tsx +218 -9
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +52 -4
- package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +230 -338
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +45 -9
- package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +227 -295
- package/Tests/App/Dashboard/IncidentLinkedAlertsSettingsPage.test.tsx +157 -181
- package/Tests/App/Dashboard/IncidentPostmortemPage.test.tsx +775 -0
- package/Tests/App/Dashboard/IncidentRoleFormField.test.tsx +379 -15
- package/Tests/App/Dashboard/IncidentRolesSettingsPage.test.tsx +148 -32
- package/Tests/App/Dashboard/IncidentTemplateInitialState.test.tsx +430 -0
- package/Tests/App/Dashboard/IncidentTemplateMonitorsApart.test.tsx +492 -0
- package/Tests/App/Dashboard/IncomingCallEscalationOneStep.test.tsx +830 -0
- package/Tests/App/Dashboard/IncomingCallEscalationRuleForm.test.ts +510 -0
- package/Tests/App/Dashboard/IncomingCallEscalationRuleFormGuard.test.ts +378 -0
- package/Tests/App/Dashboard/IngestionKeyForm.test.ts +664 -0
- package/Tests/App/Dashboard/IngestionKeySelectorCreate.test.tsx +523 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +130 -9
- package/Tests/App/Dashboard/IpAllowlistCopy.test.ts +122 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +19 -3
- package/Tests/App/Dashboard/KubernetesMetricsSetupEmptyState.test.tsx +275 -0
- package/Tests/App/Dashboard/KubernetesMetricsSetupHints.test.tsx +720 -0
- package/Tests/App/Dashboard/LabelsFormField.test.tsx +18 -13
- package/Tests/App/Dashboard/LegacyDefaultAssigneeNote.test.tsx +359 -0
- package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +10 -10
- package/Tests/App/Dashboard/MarkdownTemplateDialogsWide.test.tsx +42 -20
- package/Tests/App/Dashboard/MeasurementForms.test.tsx +191 -5
- package/Tests/App/Dashboard/MeasurementPagesI18n.test.ts +2 -0
- package/Tests/App/Dashboard/MeasurementSetup.test.ts +5 -2
- package/Tests/App/Dashboard/MenuSpecificFoldedSections.test.tsx +38 -12
- package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +34 -11
- package/Tests/App/Dashboard/MetricAndRecordingRuleFormsRender.test.tsx +1206 -0
- package/Tests/App/Dashboard/MetricResultsState.test.ts +248 -0
- package/Tests/App/Dashboard/MetricViewResultsState.test.tsx +404 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +1 -1
- package/Tests/App/Dashboard/MonitorCriteriaAdvancedOptions.test.tsx +77 -27
- package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +5 -8
- package/Tests/App/Dashboard/MonitorCriteriaHeaderControls.test.tsx +228 -0
- package/Tests/App/Dashboard/MonitorCriteriaIncidentRoles.test.tsx +411 -0
- package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +5 -1
- package/Tests/App/Dashboard/MonitorFormIncidentRoles.test.tsx +460 -0
- package/Tests/App/Dashboard/MonitorIntervalRedirect.test.tsx +299 -0
- package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +243 -2
- package/Tests/App/Dashboard/MonitorProbesAndIntervalPage.test.tsx +638 -0
- package/Tests/App/Dashboard/MonitorStepsDefaultStatusAdvanced.test.tsx +2 -2
- package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +2 -2
- package/Tests/App/Dashboard/MonitoringIntervalCard.test.tsx +493 -0
- package/Tests/App/Dashboard/MonitoringSwitch.test.tsx +597 -0
- package/Tests/App/Dashboard/MovedRunnerSettingsRedirects.test.tsx +4 -5
- package/Tests/App/Dashboard/NotificationChannelOffSwitchLists.test.tsx +636 -0
- package/Tests/App/Dashboard/OnCallPolicyCreateFormGuard.test.ts +8 -4
- package/Tests/App/Dashboard/OnCallPolicyFirstResponders.test.tsx +1 -1
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +54 -0
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +43 -24
- package/Tests/App/Dashboard/OnCallRulesRedirects.test.tsx +530 -0
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +158 -74
- package/Tests/App/Dashboard/OnCallRulesTabs.test.tsx +511 -0
- package/Tests/App/Dashboard/OnCallScheduleAddLayerDefaults.test.tsx +236 -0
- package/Tests/App/Dashboard/OnCallScheduleCreateFormGuard.test.ts +633 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +13 -2
- package/Tests/App/Dashboard/OnCallScheduleWhoTakesTurns.test.tsx +771 -0
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedSettingsForm.test.tsx +357 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +16 -6
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +112 -23
- package/Tests/App/Dashboard/PageSearchIndexCoversMenus.test.tsx +594 -0
- package/Tests/App/Dashboard/PageSearchIndexCoversRoutes.test.tsx +271 -0
- package/Tests/App/Dashboard/PageSearchRanking.test.tsx +373 -0
- package/Tests/App/Dashboard/PostmortemPageParts.test.tsx +548 -0
- package/Tests/App/Dashboard/ProbeAgreementCard.test.tsx +483 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +9 -2
- package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +282 -404
- package/Tests/App/Dashboard/ProjectAiSettingsSwitchPages.test.tsx +1414 -0
- package/Tests/App/Dashboard/ProjectNotificationChannels.test.tsx +1191 -0
- package/Tests/App/Dashboard/ProjectSettingsSwitchCards.test.tsx +603 -0
- package/Tests/App/Dashboard/RemindersCard.test.tsx +477 -0
- package/Tests/App/Dashboard/ResourceDetailsCard.test.tsx +458 -0
- package/Tests/App/Dashboard/ResourceRuleForm.test.ts +525 -0
- package/Tests/App/Dashboard/ResourceRuleFormsRender.test.tsx +803 -0
- package/Tests/App/Dashboard/RoleAccess.test.ts +753 -0
- package/Tests/App/Dashboard/RoleCardSelectOptions.test.ts +13 -6
- package/Tests/App/Dashboard/RouteUtilPageRoute.test.ts +116 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +1 -1
- package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +172 -219
- package/Tests/App/Dashboard/RunbookStepHeaderControls.test.tsx +269 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +45 -85
- package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +16 -23
- package/Tests/App/Dashboard/ScheduledMaintenanceAffectedResourcesEditForm.test.tsx +485 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +27 -2
- package/Tests/App/Dashboard/ScheduledMaintenanceCreateForm.test.tsx +65 -28
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +208 -309
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +36 -53
- package/Tests/App/Dashboard/ScheduledMaintenanceFormsStructure.test.ts +83 -14
- package/Tests/App/Dashboard/ScheduledMaintenanceMonitorsApart.test.tsx +1085 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +378 -25
- package/Tests/App/Dashboard/ScheduledMaintenanceStatusPageSuggestions.test.tsx +513 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceTemplateForm.test.tsx +31 -9
- package/Tests/App/Dashboard/ScheduledMaintenanceTemplateMonitorsApart.test.tsx +760 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +11 -13
- package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +228 -69
- package/Tests/App/Dashboard/SelectedProjectSwitches.test.tsx +359 -0
- package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1 -1
- package/Tests/App/Dashboard/SessionReplayAllowedCard.test.tsx +297 -0
- package/Tests/App/Dashboard/SetupGuideCard.test.tsx +7 -1
- package/Tests/App/Dashboard/ShortFormsOnePage.test.tsx +591 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +253 -6
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +99 -0
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +3 -1
- package/Tests/App/Dashboard/SloSettings.test.tsx +257 -4
- package/Tests/App/Dashboard/SsoPages.test.tsx +448 -52
- package/Tests/App/Dashboard/StateChangeDialogsFolded.test.tsx +695 -0
- package/Tests/App/Dashboard/StateChangeFormFields.test.ts +376 -0
- package/Tests/App/Dashboard/StatusPageAccessCard.test.tsx +1088 -0
- package/Tests/App/Dashboard/StatusPageAccessCopy.test.ts +450 -0
- package/Tests/App/Dashboard/StatusPageAccessMenu.test.tsx +137 -0
- package/Tests/App/Dashboard/StatusPageAccessPage.test.tsx +458 -0
- package/Tests/App/Dashboard/StatusPageAdvancedSettingsPage.test.tsx +30 -86
- package/Tests/App/Dashboard/StatusPageBrandingPage.test.tsx +28 -15
- package/Tests/App/Dashboard/StatusPageDisplaySettingsCard.test.tsx +949 -14
- package/Tests/App/Dashboard/StatusPagePrivateUsersNotice.test.tsx +233 -0
- package/Tests/App/Dashboard/StatusPageReportsCard.test.tsx +1001 -0
- package/Tests/App/Dashboard/StatusPageRequireSsoCard.test.tsx +247 -0
- package/Tests/App/Dashboard/StatusPageSubscriberSettingsPages.test.tsx +4 -17
- package/Tests/App/Dashboard/StatusPageSuggestions.test.tsx +930 -0
- package/Tests/App/Dashboard/StatusPageSwitchCardPages.test.tsx +335 -0
- package/Tests/App/Dashboard/TeamBlockPermissionsRedirect.test.tsx +332 -0
- package/Tests/App/Dashboard/TeamCreateForm.test.ts +206 -0
- package/Tests/App/Dashboard/TeamViewPermissions.test.tsx +713 -0
- package/Tests/App/Dashboard/TeamViewSideMenuBlockPermissions.test.tsx +113 -0
- package/Tests/App/Dashboard/TeamsCreateAccess.test.tsx +799 -0
- package/Tests/App/Dashboard/TelemetryDataRuleForms.test.ts +655 -0
- package/Tests/App/Dashboard/TelemetryDataRuleFormsRender.test.tsx +1014 -0
- package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +6 -3
- package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +446 -446
- package/Tests/App/Dashboard/TelemetryMonitorFiltersFold.test.tsx +613 -0
- package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +37 -2
- package/Tests/App/Dashboard/TemplateFormsNoInternalDataWarning.test.tsx +3 -3
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +338 -0
- package/Tests/App/Dashboard/TwilioConfigFirstDefault.test.tsx +786 -0
- package/Tests/App/Dashboard/UpcomingShiftGetCover.test.tsx +306 -0
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +36 -11
- package/Tests/App/Dashboard/UserOverrideForm.test.ts +505 -0
- package/Tests/App/Dashboard/UserOverrideFormGuard.test.ts +334 -0
- package/Tests/App/Dashboard/UserOverrideWhoIsAway.test.tsx +999 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +33 -11
- package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +49 -4
- package/Tests/App/Dashboard/UsersPageEmptyState.test.tsx +245 -0
- package/Tests/App/Dashboard/WorkflowVariableOAuthSettingsEditSteps.test.tsx +13 -6
- package/Tests/App/Dashboard/WorkspaceMenusConnected.test.tsx +0 -2
- package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +108 -86
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +397 -0
- package/Tests/App/StatusPage/StatusPageResourceForm.test.tsx +931 -0
- package/Tests/App/StatusPage/StatusPageSubscribeOnePage.test.tsx +686 -0
- package/Tests/DialogActionRules.ts +16 -5
- package/Tests/Helpers/CardHeaderScan.ts +258 -0
- package/Tests/Helpers/FormStepsScan.ts +576 -11
- package/Tests/Helpers/MonitorGroupStatusPageRows.ts +237 -0
- package/Tests/Helpers/NestedControls.ts +184 -0
- package/Tests/Helpers/NestedControlsScan.ts +414 -0
- package/Tests/Helpers/SteppedFooterScan.ts +722 -0
- package/Tests/Models/DatabaseModels/FormModel.test.ts +31 -7
- package/Tests/Models/DatabaseModels/UserOverrideColumnDescriptions.test.ts +123 -0
- package/Tests/Models/TelemetryDataRuleColumnDefaults.test.ts +239 -0
- package/Tests/ResponsiveFlexLayout.test.ts +111 -0
- package/Tests/ResponsiveFlexLayout.ts +165 -0
- package/Tests/Server/API/DashboardDomainOrderSslAPI.test.ts +372 -0
- package/Tests/Server/API/DashboardDomainVerifyCnameAPI.test.ts +921 -0
- package/Tests/Server/API/DashboardSharingPublicRoutes.test.ts +559 -0
- package/Tests/Server/API/FormBrandingPublicRoutes.test.ts +680 -0
- package/Tests/Server/API/ProjectAPICreateWithTenantHeader.test.ts +300 -0
- package/Tests/Server/API/ProjectCreateTestHelpers.ts +211 -0
- package/Tests/Server/API/ProjectCreateWithTenantHeaderPostgres.test.ts +387 -0
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +29 -12
- package/Tests/Server/API/StatusPageDomainVerifyCnameAPI.test.ts +1090 -0
- package/Tests/Server/API/StatusPageMasterPageAccess.test.ts +254 -0
- package/Tests/Server/API/StatusPageReportScheduleWrites.test.ts +829 -0
- package/Tests/Server/API/StatusPageUptimeSettingsWrites.test.ts +417 -0
- package/Tests/Server/API/StatusPagesListingMonitorsAPI.test.ts +1029 -0
- package/Tests/Server/API/StatusPagesListingMonitorsRoute.test.ts +286 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/MigrateIncidentFormsToFormsMigration.test.ts +52 -1
- package/Tests/Server/Services/CustomDomainCertificateLifecycle.test.ts +1559 -0
- package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +186 -16
- package/Tests/Server/Services/DashboardAccessChoice.test.ts +657 -0
- package/Tests/Server/Services/DashboardCreateFromTemplate.test.ts +200 -0
- package/Tests/Server/Services/DashboardDomainCertificateSweeps.test.ts +1142 -0
- package/Tests/Server/Services/DiscoveredResourceCreate.test.ts +864 -0
- package/Tests/Server/Services/DiscoveredResourceUpdate.test.ts +822 -0
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +3 -4
- package/Tests/Server/Services/FileServiceProject.test.ts +345 -0
- package/Tests/Server/Services/FormBranding.test.ts +982 -0
- package/Tests/Server/Services/FormPublicForm.test.ts +15 -0
- package/Tests/Server/Services/GroupingRuleEpisodeOwners.test.ts +857 -0
- package/Tests/Server/Services/IncidentFormPostgres.test.ts +297 -1
- package/Tests/Server/Services/MachinePickedColors.test.ts +202 -0
- package/Tests/Server/Services/OidcProviderCreateDefaults.test.ts +252 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayer.test.ts +799 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayerPlans.test.ts +172 -0
- package/Tests/Server/Services/OnCallDutyPolicyUserOverrideWhoIsAway.test.ts +571 -0
- package/Tests/Server/Services/OnCallSetupReminder.test.ts +35 -13
- package/Tests/Server/Services/OnCallUndeliverablePageRulesLink.test.ts +217 -0
- package/Tests/Server/Services/ProfileAggregationService.test.ts +213 -4
- package/Tests/Server/Services/ProjectCallSMSConfigFirstDefault.test.ts +699 -0
- package/Tests/Server/Services/ProjectCallSMSConfigFirstDefaultBilling.test.ts +247 -0
- package/Tests/Server/Services/SamlProviderCreateDefaults.test.ts +255 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberMonitorGroups.test.ts +333 -0
- package/Tests/Server/Services/ScrubRuleSaveValidation.test.ts +947 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +17 -4
- package/Tests/Server/Services/StatusPageAccessChoice.test.ts +548 -0
- package/Tests/Server/Services/StatusPageDomainCertificateSweeps.test.ts +1238 -0
- package/Tests/Server/Services/TeamCreateAccessGrant.test.ts +607 -0
- package/Tests/Server/Services/TwilioConfigSendersGuard.test.ts +249 -0
- package/Tests/Server/Services/VerificationCodesUseProjectTwilioConfig.test.ts +264 -0
- package/Tests/Server/Types/Database/Permissions/FormBrandingColumns.test.ts +270 -0
- package/Tests/Server/Utils/Greenlock/CertificateCleanup.test.ts +526 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrder.test.ts +1062 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderBudget.test.ts +243 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderFailures.test.ts +293 -0
- package/Tests/Server/Utils/Greenlock/CertificateOrderLock.test.ts +152 -0
- package/Tests/Server/Utils/Greenlock/CertificateOwnersGuard.test.ts +119 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalOwnership.test.ts +1170 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSafety.test.ts +368 -0
- package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +188 -11
- package/Tests/Server/Utils/Greenlock/CustomDomainOrders.test.ts +723 -0
- package/Tests/Server/Utils/Greenlock/InMemoryRedis.ts +189 -0
- package/Tests/Server/Utils/Greenlock/NginxAcmeCertificatesToDisk.test.ts +242 -0
- package/Tests/Server/Utils/Greenlock/NginxCustomCertificatesToDisk.test.ts +305 -0
- package/Tests/Server/Utils/Greenlock/OrderCertGuards.test.ts +583 -0
- package/Tests/Server/Utils/Greenlock/OrderCertStorage.test.ts +203 -0
- package/Tests/Server/Utils/StatusPage/AffectedStatusPageResources.test.ts +700 -0
- package/Tests/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.test.ts +744 -0
- package/Tests/Types/CustomDomain/CustomDomainCertificates.test.ts +106 -0
- package/Tests/Types/CustomDomain/CustomDomainVerification.test.ts +94 -0
- package/Tests/Types/Dashboard/DashboardAccess.test.ts +460 -0
- package/Tests/Types/Filter/FilterConditionUtil.test.ts +59 -0
- package/Tests/Types/Form/FormBranding.test.ts +760 -0
- package/Tests/Types/IncomingCall/IncomingCallRingTime.test.ts +80 -0
- package/Tests/Types/NotificationRule/OnCallRuleKind.test.ts +271 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleFirstLayer.test.ts +300 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleLayerDefaults.test.ts +316 -0
- package/Tests/Types/OnCallDutyPolicy/UserOverrideCoverRequest.test.ts +257 -0
- package/Tests/Types/SSO/OidcProviderDefaults.test.ts +474 -0
- package/Tests/Types/SSO/SamlProviderDefaults.test.ts +150 -0
- package/Tests/Types/SSO/SsoProviderDefaults.test.ts +181 -0
- package/Tests/Types/StatusPage/StatusPageAccess.test.ts +393 -0
- package/Tests/Types/StatusPage/StatusPagesListingMonitors.test.ts +149 -0
- package/Tests/Types/Telemetry/ScrubRule.test.ts +375 -0
- package/Tests/UI/Components/AdvancedPageSection.test.tsx +201 -61
- package/Tests/UI/Components/BasicFormModalSteps.test.tsx +129 -153
- package/Tests/UI/Components/Card.test.tsx +354 -367
- package/Tests/UI/Components/CardHeaderActionsGuard.test.tsx +605 -0
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +23 -8
- package/Tests/UI/Components/CardModelDetailOnBeforeUpdate.test.tsx +224 -0
- package/Tests/UI/Components/CardModelDetailPageButtons.test.tsx +231 -0
- package/Tests/UI/Components/ChoiceRows.test.tsx +365 -0
- package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +341 -5
- package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +655 -64
- package/Tests/UI/Components/Detail/DetailCreatedOnIdLine.test.tsx +669 -0
- package/Tests/UI/Components/Detail/DetailIdLineDarkMode.test.ts +34 -7
- package/Tests/UI/Components/Detail/DetailIdLineInLocale.test.tsx +71 -0
- package/Tests/UI/Components/Detail/DetailRecordIdLine.test.tsx +26 -7
- package/Tests/UI/Components/Detail/DetailRecordLine.test.tsx +326 -0
- package/Tests/UI/Components/Detail/DetailRecordTime.test.ts +324 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +7 -3
- package/Tests/UI/Components/Dropdown/DropdownChange.test.ts +163 -0
- package/Tests/UI/Components/EntityDropdown.test.tsx +103 -1
- package/Tests/UI/Components/EntityDropdownClearButton.test.tsx +638 -0
- package/Tests/UI/Components/EntityDropdownEscape.test.tsx +6 -6
- package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +21 -4
- package/Tests/UI/Components/EntityDropdownQuery.test.tsx +411 -0
- package/Tests/UI/Components/EntityDropdownQueryHelpers.test.ts +131 -0
- package/Tests/UI/Components/FilePicker.test.tsx +220 -1
- package/Tests/UI/Components/FoldedSection/FoldedSection.test.tsx +582 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionDarkMode.test.ts +197 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionItem.test.ts +247 -0
- package/Tests/UI/Components/FoldedSection/FoldedSectionQueries.ts +86 -0
- package/Tests/UI/Components/Forms/AdvancedStepsGuard.test.ts +358 -32
- package/Tests/UI/Components/Forms/AnchoredFieldPopupPlacement.test.tsx +195 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +187 -23
- package/Tests/UI/Components/Forms/BasicFormFillsInOnShow.test.tsx +246 -0
- package/Tests/UI/Components/Forms/BasicFormFooterSetValue.test.tsx +283 -0
- package/Tests/UI/Components/Forms/BasicFormPrimaryActionLastStep.test.tsx +780 -0
- package/Tests/UI/Components/Forms/BasicFormSingleStep.test.tsx +232 -0
- package/Tests/UI/Components/Forms/BasicFormStepValidation.test.tsx +7 -4
- package/Tests/UI/Components/Forms/BasicFormSubmitAllSteps.test.tsx +4 -3
- package/Tests/UI/Components/Forms/CreateFormDefaultsGuard.test.ts +252 -7
- package/Tests/UI/Components/Forms/DeclareAndCreateFormsGuard.test.ts +247 -7
- package/Tests/UI/Components/Forms/DiscoveredResourceCreateFormsGuard.test.ts +492 -0
- package/Tests/UI/Components/Forms/FilterConditionOnlyWithTwoFiltersGuard.test.ts +333 -0
- package/Tests/UI/Components/Forms/FoldedEditorWidthTiming.test.tsx +127 -0
- package/Tests/UI/Components/Forms/FoldedSectionsGuard.test.ts +523 -0
- package/Tests/UI/Components/Forms/FollowPickName.test.ts +88 -0
- package/Tests/UI/Components/Forms/FormFieldDropdownChange.test.tsx +294 -0
- package/Tests/UI/Components/Forms/FormModalWidth.test.tsx +237 -2
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +181 -0
- package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +110 -86
- package/Tests/UI/Components/Forms/LabelsFormFieldGuard.test.ts +101 -96
- package/Tests/UI/Components/Forms/LongFormStepsGuard.test.ts +559 -10
- package/Tests/UI/Components/Forms/MarkdownFormsAreWide.test.ts +56 -4
- package/Tests/UI/Components/Forms/MetricAndRecordingRuleFormsGuard.test.ts +400 -0
- package/Tests/UI/Components/Forms/ModelFormColorDefaults.test.tsx +659 -0
- package/Tests/UI/Components/Forms/ModelFormCreateDefaults.test.tsx +108 -4
- package/Tests/UI/Components/Forms/ModelFormDropdownQuery.test.tsx +403 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +126 -0
- package/Tests/UI/Components/Forms/ModelFormSinglePickPeoplePicker.test.tsx +453 -0
- package/Tests/UI/Components/Forms/OidcProviderFormsGuard.test.ts +321 -0
- package/Tests/UI/Components/Forms/OneIncidentRolePickerGuard.test.ts +823 -0
- package/Tests/UI/Components/Forms/OneSwitchCardsGuard.test.ts +739 -0
- package/Tests/UI/Components/Forms/OpenFormSections.test.tsx +169 -0
- package/Tests/UI/Components/Forms/OverloadedFormStepsGuard.test.ts +21 -9
- package/Tests/UI/Components/Forms/PrimaryActionLastStepGuard.test.ts +478 -0
- package/Tests/UI/Components/Forms/ProjectTeamFormsGuard.test.ts +240 -0
- package/Tests/UI/Components/Forms/ResourceDetailsOnePlaceGuard.test.ts +936 -0
- package/Tests/UI/Components/Forms/ResourceRuleFormsGuard.test.ts +527 -0
- package/Tests/UI/Components/Forms/SamlProviderFormsGuard.test.ts +387 -0
- package/Tests/UI/Components/Forms/SmallWizardsOnePageGuard.test.ts +331 -0
- package/Tests/UI/Components/Forms/SmtpConfigFormsGuard.test.ts +470 -0
- package/Tests/UI/Components/Forms/StateChangeDialogsFoldTheNote.test.ts +322 -0
- package/Tests/UI/Components/Forms/StatusPageResourceFormsGuard.test.ts +381 -0
- package/Tests/UI/Components/Forms/SteppedFormFooter.test.ts +225 -0
- package/Tests/UI/Components/Forms/SteppedFormFooterTiming.test.tsx +82 -40
- package/Tests/UI/Components/Forms/SwitchCardsGuard.test.ts +339 -0
- package/Tests/UI/Components/Forms/TelemetryDataRuleFormsGuard.test.ts +383 -0
- package/Tests/UI/Components/Forms/UniqueName.test.ts +163 -0
- package/Tests/UI/Components/Forms/Utils/AdvancedFormSection.test.ts +131 -11
- package/Tests/UI/Components/Forms/Utils/CreateFormColorDefaults.test.ts +373 -0
- package/Tests/UI/Components/Forms/Utils/FoldedFormFields.test.ts +482 -0
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +32 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +51 -7
- package/Tests/UI/Components/ModalSecondaryButton.test.tsx +60 -3
- package/Tests/UI/Components/ModelFormDraftValues.test.tsx +255 -0
- package/Tests/UI/Components/ModelPageHeaderChanged.test.tsx +293 -0
- package/Tests/UI/Components/ModelSwitchCard.test.tsx +813 -0
- package/Tests/UI/Components/ModelSwitchEvents.test.ts +188 -0
- package/Tests/UI/Components/ModelSwitchRow.test.tsx +861 -0
- package/Tests/UI/Components/ModelSwitchUtil.test.ts +239 -0
- package/Tests/UI/Components/ModelSwitchesCard.test.tsx +699 -0
- package/Tests/UI/Components/NavBar.test.tsx +41 -2
- package/Tests/UI/Components/NavBarCategoryToggleDarkMode.test.ts +12 -0
- package/Tests/UI/Components/NavBarMenuCatalog.test.tsx +197 -30
- package/Tests/UI/Components/NavBarMenuFolding.test.tsx +221 -39
- package/Tests/UI/Components/NavBarMenuSearch.test.tsx +15 -10
- package/Tests/UI/Components/NestedControlsGuard.test.ts +300 -0
- package/Tests/UI/Components/PageBreadcrumbOverride.test.tsx +202 -0
- package/Tests/UI/Components/PeoplePicker/OwnersFieldGuard.test.ts +269 -5
- package/Tests/UI/Components/PeoplePicker/PeoplePickerChange.test.tsx +414 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerExcludePicks.test.tsx +582 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePick.test.tsx +519 -0
- package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePickTypes.test.ts +174 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +8 -3
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaNamesGuard.test.ts +14 -6
- package/Tests/UI/Components/RuleRun/RuleViewDescription.test.tsx +107 -0
- package/Tests/UI/Components/SaveStatus.test.tsx +81 -0
- package/Tests/UI/Components/SmtpConfig/SmtpConfigFormFields.test.ts +1078 -0
- package/Tests/UI/Components/Sso/OidcProviderForm.test.tsx +608 -0
- package/Tests/UI/Components/Sso/OidcProviderFormFields.test.ts +698 -0
- package/Tests/UI/Components/Sso/SamlProviderForm.test.tsx +583 -0
- package/Tests/UI/Components/Sso/SamlProviderFormFields.test.ts +619 -0
- package/Tests/UI/Components/SteppedEditFormSave.test.tsx +199 -141
- package/Tests/UI/Components/Table/TableEmptyStateComponent.test.tsx +143 -0
- package/Tests/UI/Components/UseSaveModelSwitch.test.tsx +409 -0
- package/Tests/UI/Components/Workflow/ArgumentsForm.test.tsx +3 -3
- package/Tests/UI/Components/Workflow/ArgumentsFormAdvancedSettings.test.tsx +83 -27
- package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +7 -2
- package/Tests/UI/Components/useSaveOnChange.test.tsx +341 -0
- package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +75 -5
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +97 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +12 -39
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -6
- package/Tests/{App/Dashboard → UI/Utils}/DefaultInviteTeam.test.ts +126 -4
- package/Tests/UI/Utils/GrantablePermission.test.ts +172 -0
- package/Tests/UI/Utils/PermissionGateColumnUpdate.test.ts +211 -0
- package/Tests/UI/Utils/TranslateTemplate.test.ts +31 -0
- package/Tests/Utils/DistinctColor.test.ts +446 -0
- package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +14 -2
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +1 -1
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +2 -2
- package/Tests/Utils/Slo/SloHealth.test.ts +28 -6
- package/Tests/Utils/StatusPage/ReportSchedule.test.ts +867 -0
- package/Tests/Utils/Telemetry/DiscoveredResourceName.test.ts +189 -0
- package/Tests/Utils/WordMatch.test.ts +104 -0
- package/Types/BrandColors.ts +10 -0
- package/Types/CustomDomain/CustomDomainCertificates.ts +128 -0
- package/Types/CustomDomain/CustomDomainVerification.ts +78 -0
- package/Types/Dashboard/DashboardAccess.ts +250 -0
- package/Types/Dashboard/DashboardTemplates.ts +33 -0
- package/Types/Filter/FilterConditionUtil.ts +29 -0
- package/Types/Form/FormBranding.ts +475 -0
- package/Types/Form/FormPublic.ts +26 -0
- package/Types/IncomingCall/IncomingCallRingTime.ts +48 -0
- package/Types/Log/LogScrubField.ts +14 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +1 -1
- package/Types/NotificationRule/OnCallRuleKind.ts +194 -0
- package/Types/OnCallDutyPolicy/FirstResponders.ts +3 -32
- package/Types/OnCallDutyPolicy/MiscDataId.ts +38 -0
- package/Types/OnCallDutyPolicy/ScheduleFirstLayer.ts +165 -0
- package/Types/OnCallDutyPolicy/ScheduleLayerDefaults.ts +160 -0
- package/Types/OnCallDutyPolicy/UserOverrideCoverRequest.ts +148 -0
- package/Types/SSO/OidcProviderDefaults.ts +282 -0
- package/Types/SSO/SamlProviderDefaults.ts +77 -0
- package/Types/SSO/SsoProviderDefaults.ts +101 -0
- package/Types/StatusPage/StatusPageAccess.ts +215 -0
- package/Types/StatusPage/StatusPagesListingMonitors.ts +150 -0
- package/Types/Telemetry/ScrubRule.ts +240 -0
- package/UI/Components/AdvancedPageSection/AdvancedPageSection.tsx +59 -29
- package/UI/Components/Card/Card.tsx +139 -80
- package/UI/Components/ChoiceRows/ChoiceRows.tsx +249 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +28 -12
- package/UI/Components/CommandPalette/PaletteFilter.ts +962 -75
- package/UI/Components/CommandPalette/PaletteRow.tsx +35 -3
- package/UI/Components/CommandPalette/Types.ts +37 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +6 -0
- package/UI/Components/Detail/Detail.tsx +52 -15
- package/UI/Components/Detail/DetailRecordLine.tsx +96 -0
- package/UI/Components/Detail/DetailRecordTime.ts +196 -0
- package/UI/Components/Dropdown/DropdownChange.ts +198 -0
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +270 -106
- package/UI/Components/EntityDropdown/EntityDropdownQuery.ts +119 -0
- package/UI/Components/FilePicker/FilePicker.tsx +90 -6
- package/UI/Components/FoldedSection/FoldedSection.tsx +370 -0
- package/UI/Components/FoldedSection/FoldedSectionItem.ts +141 -0
- package/UI/Components/FoldedSection/FoldedSectionTitles.ts +39 -0
- package/UI/Components/FormModal/BasicFormModal.tsx +40 -67
- package/UI/Components/Forms/BasicForm.tsx +218 -119
- package/UI/Components/Forms/BasicModelForm.tsx +0 -2
- package/UI/Components/Forms/CollapsibleFormSection.tsx +108 -18
- package/UI/Components/Forms/Fields/FormField.tsx +62 -15
- package/UI/Components/Forms/Fields/GeneratedKeyField.tsx +1 -5
- package/UI/Components/Forms/FormSummary.tsx +5 -3
- package/UI/Components/Forms/ModelForm.tsx +123 -16
- package/UI/Components/Forms/Types/Field.ts +98 -16
- package/UI/Components/Forms/Utils/AdvancedFormSection.ts +102 -31
- package/UI/Components/Forms/Utils/CreateFormDefaults.ts +158 -17
- package/UI/Components/Forms/Utils/FoldedFormFields.ts +393 -0
- package/UI/Components/Forms/Utils/FollowPickName.ts +52 -0
- package/UI/Components/Forms/Utils/FormModalWidth.ts +35 -4
- package/UI/Components/Forms/Utils/OpenFormSections.ts +104 -0
- package/UI/Components/Forms/Utils/SteppedFormFooter.ts +151 -0
- package/UI/Components/Forms/Utils/UniqueName.ts +81 -0
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +22 -3
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +6 -5
- package/UI/Components/Modal/ModalFooter.tsx +10 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +33 -8
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +44 -58
- package/UI/Components/ModelSwitch/ModelSwitchCard.tsx +305 -0
- package/UI/Components/ModelSwitch/ModelSwitchEvents.ts +109 -0
- package/UI/Components/ModelSwitch/ModelSwitchRow.tsx +438 -0
- package/UI/Components/ModelSwitch/ModelSwitchUtil.ts +120 -0
- package/UI/Components/ModelSwitch/ModelSwitchesCard.tsx +265 -0
- package/UI/Components/ModelSwitch/useSaveModelSwitch.ts +144 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +6 -0
- package/UI/Components/ModelTable/ModelTable.tsx +5 -0
- package/UI/Components/Navbar/NavBar.tsx +10 -9
- package/UI/Components/Navbar/NavBarMenuCatalog.ts +57 -22
- package/UI/Components/Navbar/NavBarMenuModal.tsx +17 -13
- package/UI/Components/Navbar/NavBarMobileMenu.tsx +40 -23
- package/UI/Components/Page/ModelHeaderEvents.ts +75 -0
- package/UI/Components/Page/ModelPage.tsx +21 -1
- package/UI/Components/Page/Page.tsx +68 -13
- package/UI/Components/PeoplePicker/PeoplePicker.tsx +150 -45
- package/UI/Components/PeoplePicker/PeoplePickerTypes.ts +193 -4
- package/UI/Components/PeoplePicker/PeopleSearchPopup.tsx +37 -10
- package/UI/Components/PublicForm/PublicFormFavicon.ts +99 -0
- package/UI/Components/PublicForm/PublicFormLogo.tsx +81 -0
- package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +5 -3
- package/UI/Components/RuleRun/RuleView.tsx +2 -5
- package/UI/Components/SaveStatus/SaveStatus.tsx +76 -0
- package/UI/Components/SaveStatus/useSaveOnChange.ts +178 -0
- package/UI/Components/SmtpConfig/SmtpConfigFormFields.ts +815 -0
- package/UI/Components/Sso/OidcProviderFormFields.ts +481 -0
- package/UI/Components/Sso/SamlProviderFormFields.ts +322 -0
- package/UI/Components/Sso/SsoProviderFormFields.ts +331 -0
- package/UI/Components/Table/TableEmptyState.tsx +39 -5
- package/UI/Components/Workflow/ArgumentsForm.tsx +21 -78
- package/UI/Components/Workflow/ComponentPicker/ComponentSearch.ts +18 -145
- package/UI/Components/Workflow/WorkflowLogModal.tsx +1 -3
- package/UI/Types/UseAnchoredFieldPopup.ts +46 -4
- package/UI/Utils/DefaultInviteTeam.ts +306 -0
- package/UI/Utils/GrantablePermission.ts +46 -0
- package/UI/Utils/PermissionGate.ts +80 -7
- package/UI/Utils/TranslateTemplate.ts +22 -0
- package/Utils/DistinctColor.ts +223 -0
- package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +47 -2
- package/Utils/Slo/SloHealth.ts +9 -3
- package/Utils/StatusPage/ReportSchedule.ts +462 -0
- package/Utils/Telemetry/DiscoveredResourceName.ts +95 -0
- package/Utils/WordMatch.ts +185 -0
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +6 -6
- package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/File.js +47 -1
- package/build/dist/Models/DatabaseModels/File.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Form.js +125 -0
- package/build/dist/Models/DatabaseModels/Form.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +6 -6
- package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogDropFilter.js +1 -0
- package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogPipeline.js +1 -0
- package/build/dist/Models/DatabaseModels/LogPipeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/LogScrubRule.js +14 -8
- package/build/dist/Models/DatabaseModels/LogScrubRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js +1 -1
- package/build/dist/Models/DatabaseModels/MetricRecordingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -2
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +20 -9
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +6 -1
- package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js +1 -0
- package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TracePipeline.js +1 -0
- package/build/dist/Models/DatabaseModels/TracePipeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js +1 -1
- package/build/dist/Models/DatabaseModels/TraceRecordingRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js +14 -8
- package/build/dist/Models/DatabaseModels/TraceScrubRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -2
- package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
- package/build/dist/Server/API/CustomDomainRoutes.js +124 -0
- package/build/dist/Server/API/CustomDomainRoutes.js.map +1 -0
- package/build/dist/Server/API/DashboardAPI.js +22 -4
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardDomainAPI.js +56 -49
- package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +101 -39
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageDomainAPI.js +52 -51
- package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +63 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +44 -61
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingRuleService.js +45 -0
- package/build/dist/Server/Services/AlertGroupingRuleService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterService.js +23 -0
- package/build/dist/Server/Services/CephClusterService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceService.js +39 -0
- package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +510 -172
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DashboardService.js +22 -9
- package/build/dist/Server/Services/DashboardService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +114 -10
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostService.js +51 -0
- package/build/dist/Server/Services/DockerHostService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterService.js +23 -0
- package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
- package/build/dist/Server/Services/FileService.js +45 -0
- package/build/dist/Server/Services/FileService.js.map +1 -1
- package/build/dist/Server/Services/FormService.js +158 -14
- package/build/dist/Server/Services/FormService.js.map +1 -1
- package/build/dist/Server/Services/GlobalOidcService.js +9 -0
- package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
- package/build/dist/Server/Services/GlobalSsoService.js +9 -0
- package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +50 -0
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +45 -62
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingRuleService.js +45 -0
- package/build/dist/Server/Services/IncidentGroupingRuleService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetService.js +23 -0
- package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +54 -0
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +6 -16
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/LogScrubRuleService.js +31 -0
- package/build/dist/Server/Services/LogScrubRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +202 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +7 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js +17 -24
- package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
- package/build/dist/Server/Services/OnCallSetupReminderService.js +32 -38
- package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostService.js +51 -0
- package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
- package/build/dist/Server/Services/ProfileAggregationService.js +34 -0
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js +53 -3
- package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOidcService.js +28 -0
- package/build/dist/Server/Services/ProjectOidcService.js.map +1 -1
- package/build/dist/Server/Services/ProjectSsoService.js +28 -0
- package/build/dist/Server/Services/ProjectSsoService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterService.js +23 -0
- package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationService.js +42 -0
- package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +18 -26
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionService.js +44 -0
- package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +30 -4
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +495 -174
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOidcService.js +28 -0
- package/build/dist/Server/Services/StatusPageOidcService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageResourceService.js +82 -46
- package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +174 -45
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSsoService.js +28 -0
- package/build/dist/Server/Services/StatusPageSsoService.js.map +1 -1
- package/build/dist/Server/Services/TraceScrubRuleService.js +31 -0
- package/build/dist/Server/Services/TraceScrubRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserIncomingCallNumberService.js +20 -10
- package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterService.js +23 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +3 -3
- package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -1
- package/build/dist/Server/Utils/Greenlock/CertificateOrder.js +353 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrder.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js +119 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js +208 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js +111 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js +30 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOwners.js +52 -0
- package/build/dist/Server/Utils/Greenlock/CertificateOwners.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js +80 -0
- package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js +296 -0
- package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js.map +1 -0
- package/build/dist/Server/Utils/Greenlock/Greenlock.js +595 -146
- package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
- package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js +366 -0
- package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +7 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
- package/build/dist/Server/Utils/ScrubRuleValidation.js +127 -0
- package/build/dist/Server/Utils/ScrubRuleValidation.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js +97 -0
- package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js +195 -0
- package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js +177 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js +129 -0
- package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +8 -2
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -1
- package/build/dist/Types/BrandColors.js +9 -0
- package/build/dist/Types/BrandColors.js.map +1 -1
- package/build/dist/Types/CustomDomain/CustomDomainCertificates.js +71 -0
- package/build/dist/Types/CustomDomain/CustomDomainCertificates.js.map +1 -0
- package/build/dist/Types/CustomDomain/CustomDomainVerification.js +58 -0
- package/build/dist/Types/CustomDomain/CustomDomainVerification.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardAccess.js +157 -0
- package/build/dist/Types/Dashboard/DashboardAccess.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +26 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Filter/FilterConditionUtil.js +24 -0
- package/build/dist/Types/Filter/FilterConditionUtil.js.map +1 -0
- package/build/dist/Types/Form/FormBranding.js +266 -0
- package/build/dist/Types/Form/FormBranding.js.map +1 -0
- package/build/dist/Types/Form/FormPublic.js +6 -0
- package/build/dist/Types/Form/FormPublic.js.map +1 -1
- package/build/dist/Types/IncomingCall/IncomingCallRingTime.js +37 -0
- package/build/dist/Types/IncomingCall/IncomingCallRingTime.js.map +1 -0
- package/build/dist/Types/Log/LogScrubField.js +15 -0
- package/build/dist/Types/Log/LogScrubField.js.map +1 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NotificationRule/OnCallRuleKind.js +134 -0
- package/build/dist/Types/NotificationRule/OnCallRuleKind.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js +2 -23
- package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js +30 -0
- package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js +113 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js +95 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js +99 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js.map +1 -0
- package/build/dist/Types/SSO/OidcProviderDefaults.js +189 -0
- package/build/dist/Types/SSO/OidcProviderDefaults.js.map +1 -0
- package/build/dist/Types/SSO/SamlProviderDefaults.js +55 -0
- package/build/dist/Types/SSO/SamlProviderDefaults.js.map +1 -0
- package/build/dist/Types/SSO/SsoProviderDefaults.js +67 -0
- package/build/dist/Types/SSO/SsoProviderDefaults.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageAccess.js +132 -0
- package/build/dist/Types/StatusPage/StatusPageAccess.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js +84 -0
- package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js.map +1 -0
- package/build/dist/Types/Telemetry/ScrubRule.js +180 -0
- package/build/dist/Types/Telemetry/ScrubRule.js.map +1 -0
- package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js +9 -7
- package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +81 -35
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js +54 -0
- package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js.map +1 -0
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +25 -12
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +632 -64
- package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js +7 -1
- package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +7 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +26 -13
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Detail/DetailRecordLine.js +32 -0
- package/build/dist/UI/Components/Detail/DetailRecordLine.js.map +1 -0
- package/build/dist/UI/Components/Detail/DetailRecordTime.js +134 -0
- package/build/dist/UI/Components/Detail/DetailRecordTime.js.map +1 -0
- package/build/dist/UI/Components/Dropdown/DropdownChange.js +102 -0
- package/build/dist/UI/Components/Dropdown/DropdownChange.js.map +1 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +134 -57
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js +78 -0
- package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js.map +1 -0
- package/build/dist/UI/Components/FilePicker/FilePicker.js +55 -6
- package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
- package/build/dist/UI/Components/FoldedSection/FoldedSection.js +139 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSection.js.map +1 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js +58 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js.map +1 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js +34 -0
- package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js.map +1 -0
- package/build/dist/UI/Components/FormModal/BasicFormModal.js +29 -45
- package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +148 -89
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +49 -10
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +25 -11
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js +2 -5
- package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +5 -3
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +72 -14
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js +80 -23
- package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js +91 -9
- package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js +243 -0
- package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/FollowPickName.js +32 -0
- package/build/dist/UI/Components/Forms/Utils/FollowPickName.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js +25 -5
- package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js.map +1 -1
- package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js +32 -0
- package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js +71 -0
- package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js.map +1 -0
- package/build/dist/UI/Components/Forms/Utils/UniqueName.js +56 -0
- package/build/dist/UI/Components/Forms/Utils/UniqueName.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +17 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +8 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +19 -6
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +33 -43
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js +151 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js +54 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js +201 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js +60 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js +116 -0
- package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js.map +1 -0
- package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js +68 -0
- package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +3 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js +21 -10
- package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +10 -7
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js +17 -9
- package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelHeaderEvents.js +43 -0
- package/build/dist/UI/Components/Page/ModelHeaderEvents.js.map +1 -0
- package/build/dist/UI/Components/Page/ModelPage.js +19 -1
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +31 -13
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js +62 -20
- package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js +98 -1
- package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js.map +1 -1
- package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js +35 -14
- package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js.map +1 -1
- package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js +66 -0
- package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js.map +1 -0
- package/build/dist/UI/Components/PublicForm/PublicFormLogo.js +38 -0
- package/build/dist/UI/Components/PublicForm/PublicFormLogo.js.map +1 -0
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +5 -3
- package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleView.js +2 -2
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -1
- package/build/dist/UI/Components/SaveStatus/SaveStatus.js +46 -0
- package/build/dist/UI/Components/SaveStatus/SaveStatus.js.map +1 -0
- package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js +98 -0
- package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js.map +1 -0
- package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js +503 -0
- package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/OidcProviderFormFields.js +283 -0
- package/build/dist/UI/Components/Sso/OidcProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/SamlProviderFormFields.js +182 -0
- package/build/dist/UI/Components/Sso/SamlProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Sso/SsoProviderFormFields.js +208 -0
- package/build/dist/UI/Components/Sso/SsoProviderFormFields.js.map +1 -0
- package/build/dist/UI/Components/Table/TableEmptyState.js +17 -4
- package/build/dist/UI/Components/Table/TableEmptyState.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +17 -52
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js +7 -89
- package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js.map +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +1 -1
- package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +22 -3
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
- package/build/dist/UI/Utils/DefaultInviteTeam.js +207 -0
- package/build/dist/UI/Utils/DefaultInviteTeam.js.map +1 -0
- package/build/dist/UI/Utils/GrantablePermission.js +31 -0
- package/build/dist/UI/Utils/GrantablePermission.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +54 -3
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/TranslateTemplate.js +16 -0
- package/build/dist/UI/Utils/TranslateTemplate.js.map +1 -1
- package/build/dist/Utils/DistinctColor.js +151 -0
- package/build/dist/Utils/DistinctColor.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +12 -1
- package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +9 -3
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/StatusPage/ReportSchedule.js +304 -0
- package/build/dist/Utils/StatusPage/ReportSchedule.js.map +1 -0
- package/build/dist/Utils/Telemetry/DiscoveredResourceName.js +65 -0
- package/build/dist/Utils/Telemetry/DiscoveredResourceName.js.map +1 -0
- package/build/dist/Utils/WordMatch.js +115 -0
- package/build/dist/Utils/WordMatch.js.map +1 -0
- package/package.json +1 -1
- package/Tests/App/Dashboard/BulkChangeStateModalSteps.test.ts +0 -109
- package/Tests/App/StatusPage/StatusPageSubscribeFromFirstStep.test.tsx +0 -382
- package/Tests/UI/Components/Forms/BasicFormFinishFromAnyStep.test.tsx +0 -729
- package/Tests/UI/Components/Forms/FinishFromAnyStep.test.ts +0 -571
- package/Tests/UI/Components/Forms/FinishFromAnyStepGuard.test.ts +0 -566
- package/UI/Components/Forms/Utils/FinishFromAnyStep.ts +0 -284
- package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js +0 -132
- package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js.map +0 -1
|
@@ -7,8 +7,15 @@ import {
|
|
|
7
7
|
jest,
|
|
8
8
|
test,
|
|
9
9
|
} from "@jest/globals";
|
|
10
|
-
import {
|
|
11
|
-
|
|
10
|
+
import {
|
|
11
|
+
act,
|
|
12
|
+
cleanup,
|
|
13
|
+
fireEvent,
|
|
14
|
+
render,
|
|
15
|
+
screen,
|
|
16
|
+
waitFor,
|
|
17
|
+
} from "@testing-library/react";
|
|
18
|
+
import React, { ReactElement, useEffect } from "react";
|
|
12
19
|
import {
|
|
13
20
|
Location,
|
|
14
21
|
MemoryRouter,
|
|
@@ -19,7 +26,7 @@ import {
|
|
|
19
26
|
import getJestMockFunction, { MockFunction } from "../../MockType";
|
|
20
27
|
|
|
21
28
|
/*
|
|
22
|
-
* THE
|
|
29
|
+
* THE SECTION'S SHAPE.
|
|
23
30
|
*
|
|
24
31
|
* Users > View > Notification Rules was one route that rendered, in one scroll:
|
|
25
32
|
* a readiness summary with four stat tiles and a prose consequence, a masked
|
|
@@ -28,38 +35,42 @@ import getJestMockFunction, { MockFunction } from "../../MockType";
|
|
|
28
35
|
* incident and six alert severities that is around fifty cards under a
|
|
29
36
|
* diagnosis nobody could still see by the time they reached the controls.
|
|
30
37
|
*
|
|
31
|
-
* It
|
|
32
|
-
* are
|
|
33
|
-
*
|
|
34
|
-
*
|
|
38
|
+
* It was split into six pages, four of them one per kind of rule. Those four
|
|
39
|
+
* are one On-Call Rules page now, with a tab per kind - the same page, drawn by
|
|
40
|
+
* the same component, as the member's own User Settings. So the section is
|
|
41
|
+
* three pages: Readiness, Notification Methods, On-Call Rules.
|
|
42
|
+
*
|
|
43
|
+
* The failures worth writing down are the ones that make the change silently
|
|
44
|
+
* WORSE than what it replaced:
|
|
35
45
|
*
|
|
36
|
-
* - A DEAD BOOKMARK. The old
|
|
37
|
-
*
|
|
38
|
-
*
|
|
46
|
+
* - A DEAD BOOKMARK. The old URLs - the combined one and the four per kind -
|
|
47
|
+
* are in tickets, chat scrollback and at least one runbook. They have to
|
|
48
|
+
* keep landing somewhere useful: the combined one on the overview, each
|
|
49
|
+
* per-kind one on its own tab (OnCallRulesRedirects.test.tsx follows those
|
|
50
|
+
* through the real routes).
|
|
39
51
|
*
|
|
40
|
-
* - A PAGE THAT STILL RENDERS EVERYTHING.
|
|
41
|
-
*
|
|
42
|
-
*
|
|
52
|
+
* - A PAGE THAT STILL RENDERS EVERYTHING. One page for four kinds is only
|
|
53
|
+
* better than four pages if it draws one kind at a time. The assertion
|
|
54
|
+
* counts the tables that are MOUNTED, tab by tab.
|
|
43
55
|
*
|
|
44
|
-
* - THE WRONG SEVERITY AXIS ON ONE
|
|
56
|
+
* - THE WRONG SEVERITY AXIS ON ONE TAB. A rule is tied to its band by
|
|
45
57
|
* `incidentSeverityId` or `alertSeverityId`, and the severity MODEL does
|
|
46
58
|
* not follow from the rule type the way the names suggest: an alert episode
|
|
47
59
|
* is banded by AlertSeverity, an incident episode by IncidentSeverity.
|
|
48
|
-
*
|
|
49
|
-
* of them gets the other's props, and nothing throws — the table just lists
|
|
60
|
+
* Nothing throws when a tab gets the other's props — the table just lists
|
|
50
61
|
* every severity's rules at once. The two severity models here return
|
|
51
62
|
* DISJOINT id sets, which is the only fixture shape in which that is
|
|
52
63
|
* visible.
|
|
53
64
|
*
|
|
54
|
-
* - A SECTION THAT REFETCHES PER PAGE. The
|
|
55
|
-
*
|
|
56
|
-
*
|
|
65
|
+
* - A SECTION THAT REFETCHES PER PAGE. The pages share one layout that loads
|
|
66
|
+
* the target user and their readiness once. If a page reached for its own
|
|
67
|
+
* copy, moving between them would issue a fresh pair of reads each time
|
|
57
68
|
* and — much worse — two pages could disagree about WHO they are editing,
|
|
58
69
|
* which is the failure this whole surface is written to avoid.
|
|
59
70
|
*
|
|
60
|
-
* - AN UNREACHABLE PAGE.
|
|
61
|
-
* so the side menu is asserted against the route table rather than
|
|
62
|
-
* a list of strings copied out of the component.
|
|
71
|
+
* - AN UNREACHABLE PAGE. Three routes are worth nothing if the menu names
|
|
72
|
+
* two, so the side menu is asserted against the route table rather than
|
|
73
|
+
* against a list of strings copied out of the component.
|
|
63
74
|
*/
|
|
64
75
|
|
|
65
76
|
const PROJECT_ID_STRING: string = "10000000-0000-4000-8000-000000000001";
|
|
@@ -152,28 +163,18 @@ jest.mock("react-i18next", () => {
|
|
|
152
163
|
* The rule tables are stubbed down to the two facts this file is about: which
|
|
153
164
|
* rule type a table filters on, and which severity band it was mounted for.
|
|
154
165
|
* Rendering the real ModelTable would drag in the pager and the facet bar, none
|
|
155
|
-
* of which says anything about how the
|
|
166
|
+
* of which says anything about how the page draws its kinds.
|
|
167
|
+
*
|
|
168
|
+
* The stub keeps the tables that are MOUNTED right now, keyed by identity, and
|
|
169
|
+
* forgets one when it unmounts - so "only the open tab is drawn" is asserted
|
|
170
|
+
* against what is on screen, not against everything ever rendered.
|
|
156
171
|
*/
|
|
157
172
|
interface CapturedTableProps {
|
|
158
173
|
query: Record<string, ObjectID | NotificationRuleType | undefined>;
|
|
159
174
|
userPreferencesKey: string;
|
|
160
175
|
}
|
|
161
176
|
|
|
162
|
-
let
|
|
163
|
-
|
|
164
|
-
type GetCapturedTablesFunction = () => Array<CapturedTableProps>;
|
|
165
|
-
|
|
166
|
-
/*
|
|
167
|
-
* The captured list is REPLACED between tests rather than emptied in place, so
|
|
168
|
-
* a closure built inside the `for` loops below would otherwise read whichever
|
|
169
|
-
* array happened to be bound when the loop ran. Going through a stable function
|
|
170
|
-
* makes each test see the list as it stands when that test executes, which is
|
|
171
|
-
* also what stops eslint's no-loop-func from being right about it.
|
|
172
|
-
*/
|
|
173
|
-
const getCapturedTables: GetCapturedTablesFunction =
|
|
174
|
-
(): Array<CapturedTableProps> => {
|
|
175
|
-
return capturedTables;
|
|
176
|
-
};
|
|
177
|
+
let mountedTables: Map<string, CapturedTableProps> = new Map();
|
|
177
178
|
|
|
178
179
|
type TableIdentityFunction = (props: CapturedTableProps) => string;
|
|
179
180
|
|
|
@@ -188,23 +189,33 @@ const tableIdentity: TableIdentityFunction = (
|
|
|
188
189
|
}`;
|
|
189
190
|
};
|
|
190
191
|
|
|
192
|
+
type GetMountedTablesFunction = () => Array<CapturedTableProps>;
|
|
193
|
+
|
|
194
|
+
/*
|
|
195
|
+
* Through a stable function, because the map is REPLACED between tests and a
|
|
196
|
+
* closure built in a loop below would otherwise read whichever one was bound
|
|
197
|
+
* when the loop ran.
|
|
198
|
+
*/
|
|
199
|
+
const getMountedTables: GetMountedTablesFunction =
|
|
200
|
+
(): Array<CapturedTableProps> => {
|
|
201
|
+
return Array.from(mountedTables.values());
|
|
202
|
+
};
|
|
203
|
+
|
|
191
204
|
jest.mock("../../../UI/Components/ModelTable/ModelTable", () => {
|
|
192
205
|
return {
|
|
193
206
|
__esModule: true,
|
|
194
207
|
default: (props: CapturedTableProps) => {
|
|
195
208
|
const identity: string = tableIdentity(props);
|
|
196
209
|
|
|
197
|
-
|
|
198
|
-
(candidate: CapturedTableProps): boolean => {
|
|
199
|
-
return tableIdentity(candidate) === identity;
|
|
200
|
-
},
|
|
201
|
-
);
|
|
210
|
+
mountedTables.set(identity, props);
|
|
202
211
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
mountedTables.set(identity, props);
|
|
214
|
+
|
|
215
|
+
return (): void => {
|
|
216
|
+
mountedTables.delete(identity);
|
|
217
|
+
};
|
|
218
|
+
}, [identity]);
|
|
208
219
|
|
|
209
220
|
return null;
|
|
210
221
|
},
|
|
@@ -216,12 +227,7 @@ import UserViewSideMenu from "../../../../App/FeatureSet/Dashboard/src/Pages/Use
|
|
|
216
227
|
import UserViewOnCallLayout from "../../../../App/FeatureSet/Dashboard/src/Pages/Users/View/OnCall/Layout";
|
|
217
228
|
import UserViewNotificationMethods from "../../../../App/FeatureSet/Dashboard/src/Pages/Users/View/OnCall/NotificationMethods";
|
|
218
229
|
import UserViewOnCallReadiness from "../../../../App/FeatureSet/Dashboard/src/Pages/Users/View/OnCall/Readiness";
|
|
219
|
-
import UserViewOnCallRules
|
|
220
|
-
ALERT_EPISODE_RULES_PROPS,
|
|
221
|
-
ALERT_RULES_PROPS,
|
|
222
|
-
INCIDENT_EPISODE_RULES_PROPS,
|
|
223
|
-
INCIDENT_RULES_PROPS,
|
|
224
|
-
} from "../../../../App/FeatureSet/Dashboard/src/Pages/Users/View/OnCall/Rules";
|
|
230
|
+
import UserViewOnCallRules from "../../../../App/FeatureSet/Dashboard/src/Pages/Users/View/OnCall/Rules";
|
|
225
231
|
import PageComponentProps from "../../../../App/FeatureSet/Dashboard/src/Pages/PageComponentProps";
|
|
226
232
|
import PageMap from "../../../../App/FeatureSet/Dashboard/src/Utils/PageMap";
|
|
227
233
|
import RouteMap, {
|
|
@@ -240,12 +246,14 @@ import { JSONObject } from "../../../Types/JSON";
|
|
|
240
246
|
import Link from "../../../Types/Link";
|
|
241
247
|
import Name from "../../../Types/Name";
|
|
242
248
|
import NotificationRuleType from "../../../Types/NotificationRule/NotificationRuleType";
|
|
249
|
+
import OnCallRuleKind from "../../../Types/NotificationRule/OnCallRuleKind";
|
|
243
250
|
import ObjectID from "../../../Types/ObjectID";
|
|
244
251
|
import Permission from "../../../Types/Permission";
|
|
245
252
|
import Navigation from "../../../UI/Utils/Navigation";
|
|
246
253
|
import PermissionUtil from "../../../UI/Utils/Permission";
|
|
247
254
|
import ProjectUtil from "../../../UI/Utils/Project";
|
|
248
255
|
import UserUtil from "../../../UI/Utils/User";
|
|
256
|
+
import { activeLinkTitles } from "./SideMenuHarness";
|
|
249
257
|
|
|
250
258
|
const PROJECT_ID: ObjectID = new ObjectID(PROJECT_ID_STRING);
|
|
251
259
|
const SIGNED_IN_USER_ID: ObjectID = new ObjectID(SIGNED_IN_USER_ID_STRING);
|
|
@@ -315,8 +323,8 @@ const READINESS_PAYLOAD: JSONObject = {
|
|
|
315
323
|
};
|
|
316
324
|
|
|
317
325
|
/*
|
|
318
|
-
* The
|
|
319
|
-
* component each route mounts. Everything below reads this rather than a
|
|
326
|
+
* The three pages of the section, as the ROUTE TABLE spells them, paired with
|
|
327
|
+
* the component each route mounts. Everything below reads this rather than a
|
|
320
328
|
* hand-written list of paths, so a page whose route is renamed is a compile
|
|
321
329
|
* error or a failing render rather than a test that quietly stops covering it.
|
|
322
330
|
*/
|
|
@@ -325,12 +333,6 @@ interface SectionPage {
|
|
|
325
333
|
menuTitle: string;
|
|
326
334
|
breadcrumbTitle: string;
|
|
327
335
|
element: ReactElement;
|
|
328
|
-
/* The rule type this page is expected to mount tables for, if any. */
|
|
329
|
-
ruleType?: NotificationRuleType | undefined;
|
|
330
|
-
/* The severity ids the tables on this page must be banded by. */
|
|
331
|
-
severityIds?: Array<string> | undefined;
|
|
332
|
-
/* Ids from the OTHER severity model, which must never appear on it. */
|
|
333
|
-
foreignSeverityIds?: Array<string> | undefined;
|
|
334
336
|
}
|
|
335
337
|
|
|
336
338
|
const SECTION_PAGES: Array<SectionPage> = [
|
|
@@ -347,48 +349,78 @@ const SECTION_PAGES: Array<SectionPage> = [
|
|
|
347
349
|
element: <UserViewNotificationMethods {...pageProps} />,
|
|
348
350
|
},
|
|
349
351
|
{
|
|
350
|
-
pageMapKey: PageMap.
|
|
351
|
-
menuTitle: "
|
|
352
|
-
breadcrumbTitle: "
|
|
353
|
-
element: <UserViewOnCallRules {...
|
|
352
|
+
pageMapKey: PageMap.USER_VIEW_ON_CALL_RULES,
|
|
353
|
+
menuTitle: "On-Call Rules",
|
|
354
|
+
breadcrumbTitle: "On-Call Rules",
|
|
355
|
+
element: <UserViewOnCallRules {...pageProps} />,
|
|
356
|
+
},
|
|
357
|
+
];
|
|
358
|
+
|
|
359
|
+
const RULES_PAGE: SectionPage = SECTION_PAGES[2]!;
|
|
360
|
+
|
|
361
|
+
/*
|
|
362
|
+
* The four tabs of the On-Call Rules page: the kind in its address, the tab's
|
|
363
|
+
* name, the rule type of its tables, and the severity band ids they must be
|
|
364
|
+
* drawn for - with the OTHER model's ids, which must never appear on it.
|
|
365
|
+
*/
|
|
366
|
+
interface TabCase {
|
|
367
|
+
kind: OnCallRuleKind;
|
|
368
|
+
tabName: string;
|
|
369
|
+
ruleType: NotificationRuleType;
|
|
370
|
+
severityIds: Array<string>;
|
|
371
|
+
foreignSeverityIds: Array<string>;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
const INCIDENT_IDS: Array<string> = [
|
|
375
|
+
INCIDENT_SEVERITY_ONE_ID,
|
|
376
|
+
INCIDENT_SEVERITY_TWO_ID,
|
|
377
|
+
];
|
|
378
|
+
const ALERT_IDS: Array<string> = [ALERT_SEVERITY_ONE_ID, ALERT_SEVERITY_TWO_ID];
|
|
379
|
+
|
|
380
|
+
const TAB_CASES: Array<TabCase> = [
|
|
381
|
+
{
|
|
382
|
+
kind: OnCallRuleKind.Incidents,
|
|
383
|
+
tabName: "Incidents",
|
|
354
384
|
ruleType: NotificationRuleType.ON_CALL_EXECUTED_INCIDENT,
|
|
355
|
-
severityIds:
|
|
356
|
-
foreignSeverityIds:
|
|
385
|
+
severityIds: INCIDENT_IDS,
|
|
386
|
+
foreignSeverityIds: ALERT_IDS,
|
|
357
387
|
},
|
|
388
|
+
/*
|
|
389
|
+
* The crossed pair: an incident EPISODE is banded by IncidentSeverity while
|
|
390
|
+
* an alert episode is banded by AlertSeverity. Deriving one axis from the
|
|
391
|
+
* other — "is this an episode?" — gets exactly this row wrong.
|
|
392
|
+
*/
|
|
358
393
|
{
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
breadcrumbTitle: "Incident Episode On-Call Rules",
|
|
362
|
-
element: <UserViewOnCallRules {...INCIDENT_EPISODE_RULES_PROPS} />,
|
|
394
|
+
kind: OnCallRuleKind.IncidentEpisodes,
|
|
395
|
+
tabName: "Incident Episodes",
|
|
363
396
|
ruleType: NotificationRuleType.ON_CALL_EXECUTED_INCIDENT_EPISODE,
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
* an alert episode is banded by AlertSeverity. Deriving one axis from the
|
|
367
|
-
* other — "is this an episode?" — gets exactly this row wrong.
|
|
368
|
-
*/
|
|
369
|
-
severityIds: [INCIDENT_SEVERITY_ONE_ID, INCIDENT_SEVERITY_TWO_ID],
|
|
370
|
-
foreignSeverityIds: [ALERT_SEVERITY_ONE_ID, ALERT_SEVERITY_TWO_ID],
|
|
397
|
+
severityIds: INCIDENT_IDS,
|
|
398
|
+
foreignSeverityIds: ALERT_IDS,
|
|
371
399
|
},
|
|
372
400
|
{
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
breadcrumbTitle: "Alert On-Call Rules",
|
|
376
|
-
element: <UserViewOnCallRules {...ALERT_RULES_PROPS} />,
|
|
401
|
+
kind: OnCallRuleKind.Alerts,
|
|
402
|
+
tabName: "Alerts",
|
|
377
403
|
ruleType: NotificationRuleType.ON_CALL_EXECUTED_ALERT,
|
|
378
|
-
severityIds:
|
|
379
|
-
foreignSeverityIds:
|
|
404
|
+
severityIds: ALERT_IDS,
|
|
405
|
+
foreignSeverityIds: INCIDENT_IDS,
|
|
380
406
|
},
|
|
381
407
|
{
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
breadcrumbTitle: "Alert Episode On-Call Rules",
|
|
385
|
-
element: <UserViewOnCallRules {...ALERT_EPISODE_RULES_PROPS} />,
|
|
408
|
+
kind: OnCallRuleKind.AlertEpisodes,
|
|
409
|
+
tabName: "Alert Episodes",
|
|
386
410
|
ruleType: NotificationRuleType.ON_CALL_EXECUTED_ALERT_EPISODE,
|
|
387
|
-
severityIds:
|
|
388
|
-
foreignSeverityIds:
|
|
411
|
+
severityIds: ALERT_IDS,
|
|
412
|
+
foreignSeverityIds: INCIDENT_IDS,
|
|
389
413
|
},
|
|
390
414
|
];
|
|
391
415
|
|
|
416
|
+
// The four pages the tabs replaced, as their URLs ended.
|
|
417
|
+
const RETIRED_RULE_PAGE_PATHS: Array<string> = [
|
|
418
|
+
"incident-on-call-rules",
|
|
419
|
+
"incident-episode-on-call-rules",
|
|
420
|
+
"alert-on-call-rules",
|
|
421
|
+
"alert-episode-on-call-rules",
|
|
422
|
+
];
|
|
423
|
+
|
|
392
424
|
type LastPathForFunction = (pageMapKey: PageMap) => string;
|
|
393
425
|
|
|
394
426
|
/*
|
|
@@ -401,7 +433,7 @@ const lastPathFor: LastPathForFunction = (pageMapKey: PageMap): string => {
|
|
|
401
433
|
return RouteUtil.getLastPathForKey(pageMapKey);
|
|
402
434
|
};
|
|
403
435
|
|
|
404
|
-
type RenderPageFunction = (page: SectionPage) => HTMLElement;
|
|
436
|
+
type RenderPageFunction = (page: SectionPage, search?: string) => HTMLElement;
|
|
405
437
|
|
|
406
438
|
/*
|
|
407
439
|
* The real nesting: the `:id` parent, the pathless section layout, then the
|
|
@@ -409,15 +441,19 @@ type RenderPageFunction = (page: SectionPage) => HTMLElement;
|
|
|
409
441
|
* pins "the section knows whose configuration it is showing" to the URL rather
|
|
410
442
|
* than to a stub.
|
|
411
443
|
*/
|
|
412
|
-
const renderPage: RenderPageFunction = (
|
|
444
|
+
const renderPage: RenderPageFunction = (
|
|
445
|
+
page: SectionPage,
|
|
446
|
+
search: string = "",
|
|
447
|
+
): HTMLElement => {
|
|
413
448
|
const path: string = lastPathFor(page.pageMapKey);
|
|
414
449
|
|
|
450
|
+
const address: string = `/dashboard/${PROJECT_ID_STRING}/users/${TARGET_USER_ID_STRING}/${path}${search}`;
|
|
451
|
+
|
|
452
|
+
// The rules page reads its open tab from the browser's address.
|
|
453
|
+
window.history.replaceState({}, "", address);
|
|
454
|
+
|
|
415
455
|
const { container } = render(
|
|
416
|
-
<MemoryRouter
|
|
417
|
-
initialEntries={[
|
|
418
|
-
`/dashboard/${PROJECT_ID_STRING}/users/${TARGET_USER_ID_STRING}/${path}`,
|
|
419
|
-
]}
|
|
420
|
-
>
|
|
456
|
+
<MemoryRouter initialEntries={[address]}>
|
|
421
457
|
<RouterRoutes>
|
|
422
458
|
<RouterRoute
|
|
423
459
|
path="/dashboard/:projectId/users/:id"
|
|
@@ -468,8 +504,38 @@ const settle: SettleFunction = async (): Promise<void> => {
|
|
|
468
504
|
);
|
|
469
505
|
};
|
|
470
506
|
|
|
507
|
+
type WaitForTablesOfFunction = (tabCase: TabCase) => Promise<void>;
|
|
508
|
+
|
|
509
|
+
// Until the open tab's tables, and only they, are on screen.
|
|
510
|
+
const waitForTablesOf: WaitForTablesOfFunction = async (
|
|
511
|
+
tabCase: TabCase,
|
|
512
|
+
): Promise<void> => {
|
|
513
|
+
await waitFor(
|
|
514
|
+
(): void => {
|
|
515
|
+
expect(pendingRequestCount).toBe(0);
|
|
516
|
+
expect(getMountedTables()).toHaveLength(tabCase.severityIds.length);
|
|
517
|
+
|
|
518
|
+
for (const table of getMountedTables()) {
|
|
519
|
+
expect(table.query["ruleType"]).toBe(tabCase.ruleType);
|
|
520
|
+
}
|
|
521
|
+
},
|
|
522
|
+
{ timeout: 4000 },
|
|
523
|
+
);
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
type BandedIdsFunction = () => Array<string>;
|
|
527
|
+
|
|
528
|
+
const bandedIds: BandedIdsFunction = (): Array<string> => {
|
|
529
|
+
return getMountedTables().map((table: CapturedTableProps): string => {
|
|
530
|
+
const severityId: ObjectID | NotificationRuleType | undefined =
|
|
531
|
+
table.query["incidentSeverityId"] ?? table.query["alertSeverityId"];
|
|
532
|
+
|
|
533
|
+
return severityId ? severityId.toString() : "";
|
|
534
|
+
});
|
|
535
|
+
};
|
|
536
|
+
|
|
471
537
|
beforeEach((): void => {
|
|
472
|
-
|
|
538
|
+
mountedTables = new Map();
|
|
473
539
|
pendingRequestCount = 0;
|
|
474
540
|
|
|
475
541
|
getListMock.mockReset();
|
|
@@ -602,64 +668,115 @@ describe("the old combined route", () => {
|
|
|
602
668
|
});
|
|
603
669
|
});
|
|
604
670
|
|
|
605
|
-
describe("
|
|
606
|
-
for (const
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
test(`${page.menuTitle} mounts tables for one rule type only`, async () => {
|
|
612
|
-
renderPage(page);
|
|
671
|
+
describe("the On-Call Rules page draws one kind at a time", () => {
|
|
672
|
+
for (const tabCase of TAB_CASES) {
|
|
673
|
+
test(`?type=${tabCase.kind} opens the ${tabCase.tabName} tab, and only its tables are drawn`, async () => {
|
|
674
|
+
renderPage(RULES_PAGE, `?type=${tabCase.kind}`);
|
|
613
675
|
|
|
614
|
-
await
|
|
676
|
+
await waitForTablesOf(tabCase);
|
|
615
677
|
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
678
|
+
expect(screen.getByTestId(`tab-${tabCase.tabName}`)).toHaveAttribute(
|
|
679
|
+
"aria-selected",
|
|
680
|
+
"true",
|
|
681
|
+
);
|
|
619
682
|
|
|
620
683
|
/*
|
|
621
|
-
* The point of the
|
|
622
|
-
* eight tables
|
|
623
|
-
* of them was on screen at once.
|
|
684
|
+
* The point of the tabs, counted. The single page the section started
|
|
685
|
+
* as mounted eight tables here - four rule types times two severity
|
|
686
|
+
* bands - and every one of them was on screen at once.
|
|
624
687
|
*/
|
|
625
|
-
expect(
|
|
626
|
-
|
|
627
|
-
for (const table of getCapturedTables()) {
|
|
628
|
-
expect(table.query["ruleType"]).toBe(page.ruleType);
|
|
629
|
-
}
|
|
688
|
+
expect(getMountedTables()).toHaveLength(tabCase.severityIds.length);
|
|
630
689
|
});
|
|
631
690
|
|
|
632
|
-
test(
|
|
633
|
-
renderPage(
|
|
634
|
-
|
|
635
|
-
await settle();
|
|
636
|
-
|
|
637
|
-
await waitFor((): void => {
|
|
638
|
-
expect(getCapturedTables()).toHaveLength(page.severityIds!.length);
|
|
639
|
-
});
|
|
691
|
+
test(`the ${tabCase.tabName} tab bands its tables by the right severity model`, async () => {
|
|
692
|
+
renderPage(RULES_PAGE, `?type=${tabCase.kind}`);
|
|
640
693
|
|
|
641
|
-
|
|
642
|
-
(table: CapturedTableProps): string => {
|
|
643
|
-
const severityId: ObjectID | NotificationRuleType | undefined =
|
|
644
|
-
table.query["incidentSeverityId"] ?? table.query["alertSeverityId"];
|
|
694
|
+
await waitForTablesOf(tabCase);
|
|
645
695
|
|
|
646
|
-
|
|
647
|
-
},
|
|
648
|
-
);
|
|
649
|
-
|
|
650
|
-
expect(bandedIds.sort()).toEqual([...page.severityIds!].sort());
|
|
696
|
+
expect(bandedIds().sort()).toEqual([...tabCase.severityIds].sort());
|
|
651
697
|
|
|
652
698
|
/*
|
|
653
|
-
* The disjoint fixture doing its job: a
|
|
699
|
+
* The disjoint fixture doing its job: a tab handed the other model's
|
|
654
700
|
* props would list these ids instead, and nothing else in the render
|
|
655
701
|
* would look wrong.
|
|
656
702
|
*/
|
|
657
|
-
for (const foreignId of
|
|
658
|
-
expect(bandedIds).not.toContain(foreignId);
|
|
703
|
+
for (const foreignId of tabCase.foreignSeverityIds) {
|
|
704
|
+
expect(bandedIds()).not.toContain(foreignId);
|
|
659
705
|
}
|
|
660
706
|
});
|
|
661
707
|
}
|
|
662
708
|
|
|
709
|
+
test("a bare address opens Incidents", async () => {
|
|
710
|
+
renderPage(RULES_PAGE);
|
|
711
|
+
|
|
712
|
+
await waitForTablesOf(TAB_CASES[0]!);
|
|
713
|
+
|
|
714
|
+
expect(screen.getByTestId("tab-Incidents")).toHaveAttribute(
|
|
715
|
+
"aria-selected",
|
|
716
|
+
"true",
|
|
717
|
+
);
|
|
718
|
+
});
|
|
719
|
+
|
|
720
|
+
test("an address naming no tab we have opens Incidents rather than nothing", async () => {
|
|
721
|
+
renderPage(RULES_PAGE, "?type=everything");
|
|
722
|
+
|
|
723
|
+
await waitForTablesOf(TAB_CASES[0]!);
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
test("opening another tab draws its kind and drops the one before", async () => {
|
|
727
|
+
renderPage(RULES_PAGE);
|
|
728
|
+
|
|
729
|
+
await waitForTablesOf(TAB_CASES[0]!);
|
|
730
|
+
|
|
731
|
+
for (const tabCase of TAB_CASES.slice(1)) {
|
|
732
|
+
fireEvent.click(screen.getByTestId(`tab-${tabCase.tabName}`));
|
|
733
|
+
|
|
734
|
+
await waitForTablesOf(tabCase);
|
|
735
|
+
|
|
736
|
+
expect(bandedIds().sort()).toEqual([...tabCase.severityIds].sort());
|
|
737
|
+
}
|
|
738
|
+
});
|
|
739
|
+
|
|
740
|
+
test("the address follows the open tab, and the first tab is the bare address", async () => {
|
|
741
|
+
renderPage(RULES_PAGE);
|
|
742
|
+
|
|
743
|
+
await waitForTablesOf(TAB_CASES[0]!);
|
|
744
|
+
|
|
745
|
+
fireEvent.click(screen.getByTestId("tab-Alert Episodes"));
|
|
746
|
+
|
|
747
|
+
await waitForTablesOf(TAB_CASES[3]!);
|
|
748
|
+
|
|
749
|
+
/*
|
|
750
|
+
* In place, with no history entry: a reload or a copied link opens the
|
|
751
|
+
* same tab, and Back still leaves the page rather than walking its tabs.
|
|
752
|
+
*/
|
|
753
|
+
expect(new URLSearchParams(window.location.search).get("type")).toBe(
|
|
754
|
+
"alert-episodes",
|
|
755
|
+
);
|
|
756
|
+
|
|
757
|
+
fireEvent.click(screen.getByTestId("tab-Incidents"));
|
|
758
|
+
|
|
759
|
+
await waitForTablesOf(TAB_CASES[0]!);
|
|
760
|
+
|
|
761
|
+
expect(new URLSearchParams(window.location.search).get("type")).toBeNull();
|
|
762
|
+
});
|
|
763
|
+
|
|
764
|
+
test("the four tabs are the four kinds, in order", async () => {
|
|
765
|
+
renderPage(RULES_PAGE);
|
|
766
|
+
|
|
767
|
+
await waitForTablesOf(TAB_CASES[0]!);
|
|
768
|
+
|
|
769
|
+
expect(
|
|
770
|
+
screen.getAllByRole("tab").map((tab: HTMLElement): string => {
|
|
771
|
+
return tab.textContent?.trim() || "";
|
|
772
|
+
}),
|
|
773
|
+
).toEqual(
|
|
774
|
+
TAB_CASES.map((tabCase: TabCase): string => {
|
|
775
|
+
return tabCase.tabName;
|
|
776
|
+
}),
|
|
777
|
+
);
|
|
778
|
+
});
|
|
779
|
+
|
|
663
780
|
test("the readiness page mounts no rule table at all", async () => {
|
|
664
781
|
renderPage(SECTION_PAGES[0]!);
|
|
665
782
|
|
|
@@ -667,18 +784,24 @@ describe("each route renders its own page and nothing else", () => {
|
|
|
667
784
|
|
|
668
785
|
/*
|
|
669
786
|
* The overview diagnoses and does not repair. A readiness page that also
|
|
670
|
-
* drew the rule tables would be the page this split
|
|
671
|
-
* wearing a new name.
|
|
787
|
+
* drew the rule tables would be the page this section was split to break
|
|
788
|
+
* up, wearing a new name.
|
|
672
789
|
*/
|
|
673
|
-
expect(
|
|
790
|
+
expect(getMountedTables()).toHaveLength(0);
|
|
674
791
|
});
|
|
675
792
|
});
|
|
676
793
|
|
|
677
794
|
describe("the section shares one load of the person it is about", () => {
|
|
678
|
-
test("
|
|
679
|
-
renderPage(
|
|
795
|
+
test("the rules page reads identity and readiness exactly once, however many tabs are opened", async () => {
|
|
796
|
+
renderPage(RULES_PAGE);
|
|
680
797
|
|
|
681
|
-
await
|
|
798
|
+
await waitForTablesOf(TAB_CASES[0]!);
|
|
799
|
+
|
|
800
|
+
for (const tabCase of TAB_CASES.slice(1)) {
|
|
801
|
+
fireEvent.click(screen.getByTestId(`tab-${tabCase.tabName}`));
|
|
802
|
+
|
|
803
|
+
await waitForTablesOf(tabCase);
|
|
804
|
+
}
|
|
682
805
|
|
|
683
806
|
const teamMemberReads: number = getListMock.mock.calls.filter(
|
|
684
807
|
(call: Array<any>): boolean => {
|
|
@@ -692,7 +815,7 @@ describe("the section shares one load of the person it is about", () => {
|
|
|
692
815
|
|
|
693
816
|
test("every page asks about the user in the URL, never the signed-in admin", async () => {
|
|
694
817
|
for (const page of SECTION_PAGES) {
|
|
695
|
-
|
|
818
|
+
mountedTables = new Map();
|
|
696
819
|
getListMock.mockClear();
|
|
697
820
|
apiGetMock.mockClear();
|
|
698
821
|
|
|
@@ -724,6 +847,24 @@ describe("the section shares one load of the person it is about", () => {
|
|
|
724
847
|
}
|
|
725
848
|
});
|
|
726
849
|
|
|
850
|
+
test("the rule tables are about the user in the URL, on every tab", async () => {
|
|
851
|
+
renderPage(RULES_PAGE);
|
|
852
|
+
|
|
853
|
+
await waitForTablesOf(TAB_CASES[0]!);
|
|
854
|
+
|
|
855
|
+
for (const tabCase of TAB_CASES) {
|
|
856
|
+
if (tabCase !== TAB_CASES[0]) {
|
|
857
|
+
fireEvent.click(screen.getByTestId(`tab-${tabCase.tabName}`));
|
|
858
|
+
|
|
859
|
+
await waitForTablesOf(tabCase);
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
for (const table of getMountedTables()) {
|
|
863
|
+
expect(table.query["userId"]?.toString()).toBe(TARGET_USER_ID_STRING);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
});
|
|
867
|
+
|
|
727
868
|
test("the on-behalf-of banner is on every page in the section", async () => {
|
|
728
869
|
for (const page of SECTION_PAGES) {
|
|
729
870
|
const container: HTMLElement = renderPage(page);
|
|
@@ -761,7 +902,7 @@ describe("the section shares one load of the person it is about", () => {
|
|
|
761
902
|
* Not merely "nothing drawn": nothing requested either. A refused page
|
|
762
903
|
* that still fetches a colleague's readiness has already disclosed the
|
|
763
904
|
* thing it declined to render — and because the refusal lives in the
|
|
764
|
-
* LAYOUT, one check covers all
|
|
905
|
+
* LAYOUT, one check covers all three rather than two plus whichever one
|
|
765
906
|
* somebody forgets.
|
|
766
907
|
*/
|
|
767
908
|
expect(apiGetMock).not.toHaveBeenCalled();
|
|
@@ -795,7 +936,7 @@ describe("every page is reachable", () => {
|
|
|
795
936
|
);
|
|
796
937
|
};
|
|
797
938
|
|
|
798
|
-
test("the side menu names all
|
|
939
|
+
test("the side menu names all three pages, pointing at the route table's own paths", () => {
|
|
799
940
|
const links: Array<{ title: string; href: string }> = renderMenu();
|
|
800
941
|
|
|
801
942
|
for (const page of SECTION_PAGES) {
|
|
@@ -815,6 +956,55 @@ describe("every page is reachable", () => {
|
|
|
815
956
|
}
|
|
816
957
|
});
|
|
817
958
|
|
|
959
|
+
test("the On-Call section is those three entries, in order, and no rule page of its own per kind", () => {
|
|
960
|
+
render(
|
|
961
|
+
<MemoryRouter>
|
|
962
|
+
<UserViewSideMenu modelId={TARGET_USER_ID} hasCustomFields={false} />
|
|
963
|
+
</MemoryRouter>,
|
|
964
|
+
);
|
|
965
|
+
|
|
966
|
+
const onCallHeading: HTMLElement | undefined = Array.from(
|
|
967
|
+
document.querySelectorAll("h6"),
|
|
968
|
+
).find((heading: HTMLElement): boolean => {
|
|
969
|
+
return heading.textContent?.trim() === "On-Call";
|
|
970
|
+
});
|
|
971
|
+
|
|
972
|
+
expect(onCallHeading).toBeDefined();
|
|
973
|
+
|
|
974
|
+
const allTitles: Array<string> = Array.from(
|
|
975
|
+
document.querySelectorAll("a"),
|
|
976
|
+
).map((anchor: HTMLAnchorElement): string => {
|
|
977
|
+
return anchor.textContent?.trim() || "";
|
|
978
|
+
});
|
|
979
|
+
|
|
980
|
+
const readinessIndex: number = allTitles.indexOf("Readiness");
|
|
981
|
+
|
|
982
|
+
expect(allTitles.slice(readinessIndex, readinessIndex + 3)).toEqual([
|
|
983
|
+
"Readiness",
|
|
984
|
+
"Notification Methods",
|
|
985
|
+
"On-Call Rules",
|
|
986
|
+
]);
|
|
987
|
+
|
|
988
|
+
for (const retiredTitle of [
|
|
989
|
+
"Incident On-Call Rules",
|
|
990
|
+
"Incident Episode On-Call Rules",
|
|
991
|
+
"Alert On-Call Rules",
|
|
992
|
+
"Alert Episode On-Call Rules",
|
|
993
|
+
]) {
|
|
994
|
+
expect(allTitles).not.toContain(retiredTitle);
|
|
995
|
+
}
|
|
996
|
+
|
|
997
|
+
for (const href of Array.from(document.querySelectorAll("a")).map(
|
|
998
|
+
(anchor: HTMLAnchorElement): string => {
|
|
999
|
+
return anchor.getAttribute("href") || "";
|
|
1000
|
+
},
|
|
1001
|
+
)) {
|
|
1002
|
+
for (const retiredPath of RETIRED_RULE_PAGE_PATHS) {
|
|
1003
|
+
expect(href.endsWith(`/${retiredPath}`)).toBe(false);
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
});
|
|
1007
|
+
|
|
818
1008
|
test("the menu hides the section from somebody who may not read it", () => {
|
|
819
1009
|
jest.spyOn(PermissionUtil, "getAllPermissions").mockReturnValue([]);
|
|
820
1010
|
|
|
@@ -849,7 +1039,7 @@ describe("every page is reachable", () => {
|
|
|
849
1039
|
/*
|
|
850
1040
|
* Your own configuration needs no grant at all — Permission.CurrentUser
|
|
851
1041
|
* already carries it — so an ordinary member reaching their own row sees
|
|
852
|
-
* the same
|
|
1042
|
+
* the same three pages.
|
|
853
1043
|
*/
|
|
854
1044
|
for (const page of SECTION_PAGES) {
|
|
855
1045
|
expect(
|
|
@@ -860,6 +1050,46 @@ describe("every page is reachable", () => {
|
|
|
860
1050
|
}
|
|
861
1051
|
});
|
|
862
1052
|
|
|
1053
|
+
test("the On-Call Rules entry stays marked whichever tab is open", async () => {
|
|
1054
|
+
const rulesHref: string = RouteUtil.populateRouteParams(
|
|
1055
|
+
RouteMap[PageMap.USER_VIEW_ON_CALL_RULES] as Route,
|
|
1056
|
+
{ modelId: TARGET_USER_ID },
|
|
1057
|
+
).toString();
|
|
1058
|
+
|
|
1059
|
+
for (const search of ["", "?type=alerts", "?type=incident-episodes"]) {
|
|
1060
|
+
window.history.pushState({}, "", `${rulesHref}${search}`);
|
|
1061
|
+
Navigation.setLocation({
|
|
1062
|
+
pathname: rulesHref,
|
|
1063
|
+
search: search,
|
|
1064
|
+
hash: "",
|
|
1065
|
+
state: null,
|
|
1066
|
+
key: "test",
|
|
1067
|
+
} as Location);
|
|
1068
|
+
|
|
1069
|
+
await act(async (): Promise<void> => {
|
|
1070
|
+
render(
|
|
1071
|
+
<MemoryRouter>
|
|
1072
|
+
<UserViewSideMenu
|
|
1073
|
+
modelId={TARGET_USER_ID}
|
|
1074
|
+
hasCustomFields={false}
|
|
1075
|
+
/>
|
|
1076
|
+
</MemoryRouter>,
|
|
1077
|
+
);
|
|
1078
|
+
});
|
|
1079
|
+
|
|
1080
|
+
expect(activeLinkTitles()).toEqual(["On-Call Rules"]);
|
|
1081
|
+
|
|
1082
|
+
const rulesLink: HTMLElement | null = screen
|
|
1083
|
+
.getByText("On-Call Rules")
|
|
1084
|
+
.closest("a");
|
|
1085
|
+
|
|
1086
|
+
// The bare address: a menu link never pins a tab.
|
|
1087
|
+
expect(rulesLink!.getAttribute("href")).toBe(rulesHref);
|
|
1088
|
+
|
|
1089
|
+
cleanup();
|
|
1090
|
+
}
|
|
1091
|
+
});
|
|
1092
|
+
|
|
863
1093
|
test("every page has a breadcrumb of its own", () => {
|
|
864
1094
|
for (const page of SECTION_PAGES) {
|
|
865
1095
|
const route: Route = RouteMap[page.pageMapKey] as Route;
|
|
@@ -876,15 +1106,15 @@ describe("every page is reachable", () => {
|
|
|
876
1106
|
|
|
877
1107
|
/*
|
|
878
1108
|
* A page with no breadcrumb entry renders a bare title and no way back up
|
|
879
|
-
* — survivable on one route,
|
|
880
|
-
*
|
|
1109
|
+
* — survivable on one route, worse once a single page became a section
|
|
1110
|
+
* somebody navigates around inside.
|
|
881
1111
|
*/
|
|
882
1112
|
expect(titles).toContain(page.breadcrumbTitle);
|
|
883
1113
|
expect(titles[0]).toBe("Project");
|
|
884
1114
|
}
|
|
885
1115
|
});
|
|
886
1116
|
|
|
887
|
-
test("the
|
|
1117
|
+
test("the three routes are distinct URLs", () => {
|
|
888
1118
|
const paths: Array<string> = SECTION_PAGES.map(
|
|
889
1119
|
(page: SectionPage): string => {
|
|
890
1120
|
return (RouteMap[page.pageMapKey] as Route).toString();
|
|
@@ -902,4 +1132,30 @@ describe("every page is reachable", () => {
|
|
|
902
1132
|
(RouteMap[PageMap.USER_VIEW_NOTIFICATION_RULES] as Route).toString(),
|
|
903
1133
|
);
|
|
904
1134
|
});
|
|
1135
|
+
|
|
1136
|
+
test("the route table no longer has a page per kind of rule", () => {
|
|
1137
|
+
const routes: Array<string> = Object.values(RouteMap).map(
|
|
1138
|
+
(route: Route): string => {
|
|
1139
|
+
return route.toString();
|
|
1140
|
+
},
|
|
1141
|
+
);
|
|
1142
|
+
|
|
1143
|
+
for (const retiredPath of RETIRED_RULE_PAGE_PATHS) {
|
|
1144
|
+
expect(
|
|
1145
|
+
routes.filter((route: string): boolean => {
|
|
1146
|
+
return route.endsWith(`/${retiredPath}`);
|
|
1147
|
+
}),
|
|
1148
|
+
).toEqual([]);
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
expect(
|
|
1152
|
+
Object.keys(PageMap).filter((key: string): boolean => {
|
|
1153
|
+
return (
|
|
1154
|
+
key.startsWith("USER_VIEW_") &&
|
|
1155
|
+
key.endsWith("_ON_CALL_RULES") &&
|
|
1156
|
+
key !== "USER_VIEW_ON_CALL_RULES"
|
|
1157
|
+
);
|
|
1158
|
+
}),
|
|
1159
|
+
).toEqual([]);
|
|
1160
|
+
});
|
|
905
1161
|
});
|