@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
|
@@ -0,0 +1,815 @@
|
|
|
1
|
+
import GlobalConfig from "../../../Models/DatabaseModels/GlobalConfig";
|
|
2
|
+
import ProjectSmtpConfig from "../../../Models/DatabaseModels/ProjectSmtpConfig";
|
|
3
|
+
import MailTransportType from "../../../Types/Email/MailTransportType";
|
|
4
|
+
import OAuthProviderType from "../../../Types/Email/OAuthProviderType";
|
|
5
|
+
import SMTPAuthenticationType from "../../../Types/Email/SMTPAuthenticationType";
|
|
6
|
+
import SelectFormFields from "../../Types/SelectEntityField";
|
|
7
|
+
import DropdownUtil from "../../Utils/Dropdown";
|
|
8
|
+
import { translationKey } from "../../Utils/TranslateTemplate";
|
|
9
|
+
import Field, { FormFieldCollapsibleSection } from "../Forms/Types/Field";
|
|
10
|
+
import FormFieldSchemaType from "../Forms/Types/FormFieldSchemaType";
|
|
11
|
+
import { FormStep } from "../Forms/Types/FormStep";
|
|
12
|
+
import FormValues from "../Forms/Types/FormValues";
|
|
13
|
+
import {
|
|
14
|
+
getAdvancedFormSection,
|
|
15
|
+
normalizeFormValue,
|
|
16
|
+
} from "../Forms/Utils/AdvancedFormSection";
|
|
17
|
+
|
|
18
|
+
/*
|
|
19
|
+
* ADDING A MAIL SERVER ASKS FOR THE SERVER, THE SIGN-IN AND THE SENDER;
|
|
20
|
+
* TRANSPORT, OAUTH AND TLS WAIT UNDER ADVANCED.
|
|
21
|
+
*
|
|
22
|
+
* "The idea is to make software as simple as possible to use and reduce
|
|
23
|
+
* decision paralysis." - the maintainer.
|
|
24
|
+
*
|
|
25
|
+
* A project's Custom SMTP config (Settings > Notification Settings) walked
|
|
26
|
+
* six steps - Basic, Transport, SMTP Server, Authentication, OAuth Settings,
|
|
27
|
+
* Email - and the Admin Dashboard's instance mail server (Settings > Emails,
|
|
28
|
+
* the Custom Email and SMTP Settings card) the same five but Basic. The
|
|
29
|
+
* Transport step was one dropdown, already
|
|
30
|
+
* on SMTP. "Use SSL / TLS" was asked although the mail service decides TLS
|
|
31
|
+
* from the port on its own (port 465 is always TLS) and only reads the
|
|
32
|
+
* switch as "require it" everywhere else, and the port had no value to
|
|
33
|
+
* start from. Both forms are now this one builder, given each one's column
|
|
34
|
+
* names, in two steps:
|
|
35
|
+
*
|
|
36
|
+
* Server Name (a project's config), Hostname, Port, Username and
|
|
37
|
+
* Password - what a provider's SMTP settings page lists
|
|
38
|
+
* together - and one folded Advanced section:
|
|
39
|
+
* Transport (SMTP, or Microsoft Graph for a Microsoft 365
|
|
40
|
+
* tenant with SMTP AUTH turned off), Require TLS, the
|
|
41
|
+
* Authentication type, the OAuth fields (shown once OAuth or
|
|
42
|
+
* Microsoft Graph is picked) and, for a project's config, the
|
|
43
|
+
* Description.
|
|
44
|
+
* Sender From Email and From Name: who the mail comes from.
|
|
45
|
+
*
|
|
46
|
+
* Picking Microsoft Graph hides the hostname, port, username and password,
|
|
47
|
+
* which Graph does not use, and shows the OAuth fields it needs, right below
|
|
48
|
+
* the Transport it was picked in. While folded, the Advanced header says in
|
|
49
|
+
* a sentence how mail is sent ("Mail is sent over SMTP, signing in with the
|
|
50
|
+
* username and password. TLS is required."), so someone looking for
|
|
51
|
+
* Microsoft Graph or TLS can tell where they went without opening it.
|
|
52
|
+
*
|
|
53
|
+
* Only the layout changed. The columns, the API and the mail service are as
|
|
54
|
+
* they were: an existing config opens with its own values, and saves them
|
|
55
|
+
* unchanged. A new project config starts on port 587 (the form's own start:
|
|
56
|
+
* the column has no default, so an API caller still sends a port) with TLS
|
|
57
|
+
* required (the column's default, which ModelForm starts every create form
|
|
58
|
+
* from). The instance's mail server is an edit form of the one GlobalConfig
|
|
59
|
+
* row, so nothing is filled in there: 587 is only its placeholder.
|
|
60
|
+
*
|
|
61
|
+
* React-free: the Dashboard and the Admin Dashboard both build their forms
|
|
62
|
+
* from it. The step ids are written as strings on every field, so
|
|
63
|
+
* Tests/Helpers/FormStepsScan places each field on its step, and the
|
|
64
|
+
* Advanced section is built once per form and handed to every folded field,
|
|
65
|
+
* so the scan counts it as one row.
|
|
66
|
+
*/
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* What the form has to know of a surface: the column it keeps each value in,
|
|
70
|
+
* and how its mail service treats a blank sign-in.
|
|
71
|
+
*/
|
|
72
|
+
export interface SmtpConfigFormColumns<TEntity> {
|
|
73
|
+
transportType: Extract<keyof TEntity, string>;
|
|
74
|
+
hostname: Extract<keyof TEntity, string>;
|
|
75
|
+
port: Extract<keyof TEntity, string>;
|
|
76
|
+
username: Extract<keyof TEntity, string>;
|
|
77
|
+
password: Extract<keyof TEntity, string>;
|
|
78
|
+
// The "Require TLS" switch.
|
|
79
|
+
secure: Extract<keyof TEntity, string>;
|
|
80
|
+
authType: Extract<keyof TEntity, string>;
|
|
81
|
+
oauthProviderType: Extract<keyof TEntity, string>;
|
|
82
|
+
clientId: Extract<keyof TEntity, string>;
|
|
83
|
+
clientSecret: Extract<keyof TEntity, string>;
|
|
84
|
+
tokenUrl: Extract<keyof TEntity, string>;
|
|
85
|
+
scope: Extract<keyof TEntity, string>;
|
|
86
|
+
fromEmail: Extract<keyof TEntity, string>;
|
|
87
|
+
fromName: Extract<keyof TEntity, string>;
|
|
88
|
+
/*
|
|
89
|
+
* A project's config only: the note about it, folded under Advanced. (Its
|
|
90
|
+
* name, the first field, is getProjectSmtpConfigFormFields' own.)
|
|
91
|
+
*/
|
|
92
|
+
configDescription?: Extract<keyof TEntity, string> | undefined;
|
|
93
|
+
/*
|
|
94
|
+
* The instance's server signs in with a username and password only when
|
|
95
|
+
* both are set, and sends without signing in otherwise
|
|
96
|
+
* (Notification/Config.ts, then MailService.createTransporter) - which is
|
|
97
|
+
* how a self-hosted relay that needs no sign-in has always run. A
|
|
98
|
+
* project's config is refused without them instead
|
|
99
|
+
* (ProjectSmtpConfigService.toEmailServer), so its header keeps saying
|
|
100
|
+
* what it signs in with.
|
|
101
|
+
*/
|
|
102
|
+
sendsWithoutSignInWhenCredentialsAreBlank?: boolean | undefined;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Settings > Notification Settings > Custom SMTP Configs.
|
|
106
|
+
export const PROJECT_SMTP_CONFIG_FORM_COLUMNS: SmtpConfigFormColumns<ProjectSmtpConfig> =
|
|
107
|
+
{
|
|
108
|
+
transportType: "transportType",
|
|
109
|
+
hostname: "hostname",
|
|
110
|
+
port: "port",
|
|
111
|
+
username: "username",
|
|
112
|
+
password: "password",
|
|
113
|
+
secure: "secure",
|
|
114
|
+
authType: "authType",
|
|
115
|
+
oauthProviderType: "oauthProviderType",
|
|
116
|
+
clientId: "clientId",
|
|
117
|
+
clientSecret: "clientSecret",
|
|
118
|
+
tokenUrl: "tokenUrl",
|
|
119
|
+
scope: "scope",
|
|
120
|
+
fromEmail: "fromEmail",
|
|
121
|
+
fromName: "fromName",
|
|
122
|
+
configDescription: "description",
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/*
|
|
126
|
+
* Admin Dashboard > Settings > Emails, the Custom Email and SMTP Settings
|
|
127
|
+
* card: the server the instance itself sends from.
|
|
128
|
+
*/
|
|
129
|
+
export const GLOBAL_SMTP_CONFIG_FORM_COLUMNS: SmtpConfigFormColumns<GlobalConfig> =
|
|
130
|
+
{
|
|
131
|
+
transportType: "smtpTransportType",
|
|
132
|
+
hostname: "smtpHost",
|
|
133
|
+
port: "smtpPort",
|
|
134
|
+
username: "smtpUsername",
|
|
135
|
+
password: "smtpPassword",
|
|
136
|
+
secure: "isSMTPSecure",
|
|
137
|
+
authType: "smtpAuthType",
|
|
138
|
+
oauthProviderType: "smtpOAuthProviderType",
|
|
139
|
+
clientId: "smtpClientId",
|
|
140
|
+
clientSecret: "smtpClientSecret",
|
|
141
|
+
tokenUrl: "smtpTokenUrl",
|
|
142
|
+
scope: "smtpScope",
|
|
143
|
+
fromEmail: "smtpFromEmail",
|
|
144
|
+
fromName: "smtpFromName",
|
|
145
|
+
sendsWithoutSignInWhenCredentialsAreBlank: true,
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
/*
|
|
149
|
+
* The two steps' ids. The fields write them out as strings, which is what
|
|
150
|
+
* Tests/Helpers/FormStepsScan reads a field's step from; the builder's
|
|
151
|
+
* tests hold every field to these two.
|
|
152
|
+
*/
|
|
153
|
+
export const SMTP_SERVER_STEP_ID: string = "server";
|
|
154
|
+
|
|
155
|
+
export const SMTP_SENDER_STEP_ID: string = "sender";
|
|
156
|
+
|
|
157
|
+
/*
|
|
158
|
+
* The port a new project config starts on: the submission port (STARTTLS)
|
|
159
|
+
* nearly every provider gives. Only a create form's start - the column has
|
|
160
|
+
* no default. Every form's Port placeholder says the same.
|
|
161
|
+
*/
|
|
162
|
+
export const DEFAULT_SMTP_PORT: number = 587;
|
|
163
|
+
|
|
164
|
+
/*
|
|
165
|
+
* The port the mail service speaks TLS on from the first byte, whatever
|
|
166
|
+
* Require TLS says (App/Tests/Notification/SmtpRequireTlsMeaning pins it).
|
|
167
|
+
*/
|
|
168
|
+
export const IMPLICIT_TLS_SMTP_PORT: number = 465;
|
|
169
|
+
|
|
170
|
+
export const SMTP_PORT_DESCRIPTION: string = translationKey(
|
|
171
|
+
"The port your provider gives you, usually 587. Port 465 is always encrypted.",
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
export const SMTP_USERNAME_DESCRIPTION: string = translationKey(
|
|
175
|
+
"The account OneUptime signs in as, often the email address you send from. With OAuth, enter the email address of the mailbox that sends.",
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
export const SMTP_PASSWORD_DESCRIPTION: string = translationKey(
|
|
179
|
+
"The account's password, or the API key your provider gives you for SMTP.",
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
export const SMTP_TRANSPORT_DESCRIPTION: string = translationKey(
|
|
183
|
+
"SMTP works with most mail servers. Choose Microsoft Graph if your Microsoft 365 tenant has SMTP AUTH turned off: mail then goes through the Graph API with an app that has the Mail.Send permission, and the hostname, port and password are not used.",
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
/*
|
|
187
|
+
* What the switch does, from the mail service: on, a connection that is not
|
|
188
|
+
* encrypted with a valid certificate is refused (STARTTLS is required on
|
|
189
|
+
* every port but 465); off, STARTTLS is used when the server offers it and
|
|
190
|
+
* the certificate is not checked. Port 465 is TLS from the first byte either
|
|
191
|
+
* way. "Use SSL / TLS" said none of that, and the instance form's "Do not
|
|
192
|
+
* enable this if you use port 587" was the opposite of the advice now.
|
|
193
|
+
*/
|
|
194
|
+
export const SMTP_REQUIRE_TLS_DESCRIPTION: string = translationKey(
|
|
195
|
+
"Mail is sent only over an encrypted connection with a valid certificate. When this is off, mail is encrypted only if the server offers it, and the certificate is not checked. Port 465 is always encrypted.",
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
export const SMTP_FROM_EMAIL_DESCRIPTION: string = translationKey(
|
|
199
|
+
"The address your emails come from. Your server must allow sending from it; with Microsoft Graph, it is the mailbox that sends.",
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* What the folded Advanced header says: how mail is sent, then (over SMTP)
|
|
204
|
+
* whether TLS is required. Whole sentences, each looked up on its own.
|
|
205
|
+
*/
|
|
206
|
+
export const SMTP_SUMMARY_PASSWORD: string = translationKey(
|
|
207
|
+
"Mail is sent over SMTP, signing in with the username and password.",
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
export const SMTP_SUMMARY_OAUTH: string = translationKey(
|
|
211
|
+
"Mail is sent over SMTP, signing in with OAuth.",
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
export const SMTP_SUMMARY_NO_SIGN_IN: string = translationKey(
|
|
215
|
+
"Mail is sent over SMTP without signing in.",
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
export const SMTP_SUMMARY_MICROSOFT_GRAPH: string = translationKey(
|
|
219
|
+
"Mail is sent through Microsoft Graph, signing in with OAuth.",
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
export const SMTP_SUMMARY_TLS_REQUIRED: string =
|
|
223
|
+
translationKey("TLS is required.");
|
|
224
|
+
|
|
225
|
+
export const SMTP_SUMMARY_TLS_OPTIONAL: string = translationKey(
|
|
226
|
+
"TLS is used only if the server offers it.",
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
// Port 465 speaks TLS from the first byte; off only skips the certificate.
|
|
230
|
+
export const SMTP_SUMMARY_TLS_PORT_465_UNCHECKED: string = translationKey(
|
|
231
|
+
"Port 465 is always encrypted, but the certificate is not checked.",
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
type ReadValueFunction = (values: unknown, key: string | undefined) => unknown;
|
|
235
|
+
|
|
236
|
+
/*
|
|
237
|
+
* One value of a form's values, whatever the form's model. A dropdown can
|
|
238
|
+
* hold the option it was picked as ({ label, value }); its value is read.
|
|
239
|
+
*/
|
|
240
|
+
export const readSmtpFormValue: ReadValueFunction = (
|
|
241
|
+
values: unknown,
|
|
242
|
+
key: string | undefined,
|
|
243
|
+
): unknown => {
|
|
244
|
+
if (!key || !values || typeof values !== "object") {
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return normalizeFormValue((values as Record<string, unknown>)[key]);
|
|
249
|
+
};
|
|
250
|
+
|
|
251
|
+
/*
|
|
252
|
+
* The port as a number, however the form holds it: typed text, a number, a
|
|
253
|
+
* Port, or a Port as JSON. Null while there is none.
|
|
254
|
+
*/
|
|
255
|
+
export const readSmtpPort: <TEntity>(
|
|
256
|
+
values: unknown,
|
|
257
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
258
|
+
) => number | null = <TEntity>(
|
|
259
|
+
values: unknown,
|
|
260
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
261
|
+
): number | null => {
|
|
262
|
+
let port: unknown = readSmtpFormValue(values, columns.port);
|
|
263
|
+
|
|
264
|
+
if (
|
|
265
|
+
port &&
|
|
266
|
+
typeof port === "object" &&
|
|
267
|
+
Object.prototype.hasOwnProperty.call(port, "_type") &&
|
|
268
|
+
Object.prototype.hasOwnProperty.call(port, "value")
|
|
269
|
+
) {
|
|
270
|
+
port = (port as { value: unknown }).value;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (port === undefined || port === null || String(port).trim() === "") {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const portNumber: number = Number(String(port).trim());
|
|
278
|
+
|
|
279
|
+
return Number.isFinite(portNumber) ? portNumber : null;
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
type IsFilledFunction = (value: unknown) => boolean;
|
|
283
|
+
|
|
284
|
+
const isFilled: IsFilledFunction = (value: unknown): boolean => {
|
|
285
|
+
return value !== undefined && value !== null && String(value).trim() !== "";
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
/*
|
|
289
|
+
* How mail is sent. Anything but Microsoft Graph - an empty value included -
|
|
290
|
+
* is SMTP, as the mail service reads it.
|
|
291
|
+
*/
|
|
292
|
+
export const getSmtpTransport: <TEntity>(
|
|
293
|
+
values: unknown,
|
|
294
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
295
|
+
) => MailTransportType = <TEntity>(
|
|
296
|
+
values: unknown,
|
|
297
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
298
|
+
): MailTransportType => {
|
|
299
|
+
return readSmtpFormValue(values, columns.transportType) ===
|
|
300
|
+
MailTransportType.MicrosoftGraph
|
|
301
|
+
? MailTransportType.MicrosoftGraph
|
|
302
|
+
: MailTransportType.SMTP;
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
/*
|
|
306
|
+
* How an SMTP server is signed in to. An empty value is Username and
|
|
307
|
+
* Password, as the mail service reads it. (Microsoft Graph always signs in
|
|
308
|
+
* with OAuth, whatever this says.)
|
|
309
|
+
*/
|
|
310
|
+
export const getSmtpAuthType: <TEntity>(
|
|
311
|
+
values: unknown,
|
|
312
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
313
|
+
) => SMTPAuthenticationType = <TEntity>(
|
|
314
|
+
values: unknown,
|
|
315
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
316
|
+
): SMTPAuthenticationType => {
|
|
317
|
+
const authType: unknown = readSmtpFormValue(values, columns.authType);
|
|
318
|
+
|
|
319
|
+
if (
|
|
320
|
+
authType === SMTPAuthenticationType.OAuth ||
|
|
321
|
+
authType === SMTPAuthenticationType.None
|
|
322
|
+
) {
|
|
323
|
+
return authType;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
return SMTPAuthenticationType.UsernamePassword;
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
type ShowsFunction = <TEntity>(
|
|
330
|
+
values: unknown,
|
|
331
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
332
|
+
) => boolean;
|
|
333
|
+
|
|
334
|
+
// The hostname, port, Require TLS and Authentication type: SMTP only.
|
|
335
|
+
export const showsSmtpServerFields: ShowsFunction = <TEntity>(
|
|
336
|
+
values: unknown,
|
|
337
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
338
|
+
): boolean => {
|
|
339
|
+
return getSmtpTransport(values, columns) === MailTransportType.SMTP;
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
/*
|
|
343
|
+
* The username: what an SMTP server is signed in to as - with a password,
|
|
344
|
+
* or the mailbox OAuth signs in as. Not without signing in, and not for
|
|
345
|
+
* Microsoft Graph, which sends as the From Email.
|
|
346
|
+
*/
|
|
347
|
+
export const showsSmtpUsername: ShowsFunction = <TEntity>(
|
|
348
|
+
values: unknown,
|
|
349
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
350
|
+
): boolean => {
|
|
351
|
+
return (
|
|
352
|
+
showsSmtpServerFields(values, columns) &&
|
|
353
|
+
getSmtpAuthType(values, columns) !== SMTPAuthenticationType.None
|
|
354
|
+
);
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
// The password: signing in to an SMTP server with a username and password.
|
|
358
|
+
export const showsSmtpPassword: ShowsFunction = <TEntity>(
|
|
359
|
+
values: unknown,
|
|
360
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
361
|
+
): boolean => {
|
|
362
|
+
return (
|
|
363
|
+
showsSmtpServerFields(values, columns) &&
|
|
364
|
+
getSmtpAuthType(values, columns) === SMTPAuthenticationType.UsernamePassword
|
|
365
|
+
);
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
/*
|
|
369
|
+
* The OAuth grant: SMTP with OAuth. Microsoft Graph always uses Client
|
|
370
|
+
* Credentials, so it is not asked there.
|
|
371
|
+
*/
|
|
372
|
+
export const showsSmtpOAuthProviderType: ShowsFunction = <TEntity>(
|
|
373
|
+
values: unknown,
|
|
374
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
375
|
+
): boolean => {
|
|
376
|
+
return (
|
|
377
|
+
showsSmtpServerFields(values, columns) &&
|
|
378
|
+
getSmtpAuthType(values, columns) === SMTPAuthenticationType.OAuth
|
|
379
|
+
);
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
// The OAuth app: Microsoft Graph, or SMTP with OAuth.
|
|
383
|
+
export const showsSmtpOAuthCredentials: ShowsFunction = <TEntity>(
|
|
384
|
+
values: unknown,
|
|
385
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
386
|
+
): boolean => {
|
|
387
|
+
return (
|
|
388
|
+
getSmtpTransport(values, columns) === MailTransportType.MicrosoftGraph ||
|
|
389
|
+
getSmtpAuthType(values, columns) === SMTPAuthenticationType.OAuth
|
|
390
|
+
);
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
/*
|
|
394
|
+
* How an SMTP server is signed in to, as the mail service will: OAuth, no
|
|
395
|
+
* sign-in, or the username and password - which the instance's server
|
|
396
|
+
* uses only when both are set (sendsWithoutSignInWhenCredentialsAreBlank).
|
|
397
|
+
*/
|
|
398
|
+
export const getSmtpSignInSentence: <TEntity>(
|
|
399
|
+
values: unknown,
|
|
400
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
401
|
+
) => string = <TEntity>(
|
|
402
|
+
values: unknown,
|
|
403
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
404
|
+
): string => {
|
|
405
|
+
const authType: SMTPAuthenticationType = getSmtpAuthType(values, columns);
|
|
406
|
+
|
|
407
|
+
if (authType === SMTPAuthenticationType.OAuth) {
|
|
408
|
+
return SMTP_SUMMARY_OAUTH;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
if (authType === SMTPAuthenticationType.None) {
|
|
412
|
+
return SMTP_SUMMARY_NO_SIGN_IN;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if (
|
|
416
|
+
columns.sendsWithoutSignInWhenCredentialsAreBlank &&
|
|
417
|
+
!(
|
|
418
|
+
isFilled(readSmtpFormValue(values, columns.username)) &&
|
|
419
|
+
isFilled(readSmtpFormValue(values, columns.password))
|
|
420
|
+
)
|
|
421
|
+
) {
|
|
422
|
+
return SMTP_SUMMARY_NO_SIGN_IN;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return SMTP_SUMMARY_PASSWORD;
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
/*
|
|
429
|
+
* What Require TLS comes to on this port: required (with the certificate
|
|
430
|
+
* checked); port 465's TLS without the certificate checked; or STARTTLS
|
|
431
|
+
* only when the server offers it.
|
|
432
|
+
*/
|
|
433
|
+
export const getSmtpTlsSentence: <TEntity>(
|
|
434
|
+
values: unknown,
|
|
435
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
436
|
+
) => string = <TEntity>(
|
|
437
|
+
values: unknown,
|
|
438
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
439
|
+
): string => {
|
|
440
|
+
if (readSmtpFormValue(values, columns.secure) === true) {
|
|
441
|
+
return SMTP_SUMMARY_TLS_REQUIRED;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if (readSmtpPort(values, columns) === IMPLICIT_TLS_SMTP_PORT) {
|
|
445
|
+
return SMTP_SUMMARY_TLS_PORT_465_UNCHECKED;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return SMTP_SUMMARY_TLS_OPTIONAL;
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* What the folded Advanced header says, in sentences that follow the form's
|
|
453
|
+
* values: how mail is sent and signed in with, then - over SMTP - whether
|
|
454
|
+
* TLS is required. It takes the place of the "Configured" badge: it says
|
|
455
|
+
* what is set, a Microsoft Graph config included.
|
|
456
|
+
*/
|
|
457
|
+
export const getSmtpAdvancedSummary: <TEntity>(
|
|
458
|
+
values: unknown,
|
|
459
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
460
|
+
) => Array<string> = <TEntity>(
|
|
461
|
+
values: unknown,
|
|
462
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
463
|
+
): Array<string> => {
|
|
464
|
+
if (getSmtpTransport(values, columns) === MailTransportType.MicrosoftGraph) {
|
|
465
|
+
return [SMTP_SUMMARY_MICROSOFT_GRAPH];
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
return [
|
|
469
|
+
getSmtpSignInSentence(values, columns),
|
|
470
|
+
getSmtpTlsSentence(values, columns),
|
|
471
|
+
];
|
|
472
|
+
};
|
|
473
|
+
|
|
474
|
+
export type GetSmtpConfigFormStepsFunction = <TEntity>() => Array<
|
|
475
|
+
FormStep<TEntity>
|
|
476
|
+
>;
|
|
477
|
+
|
|
478
|
+
// Server, then Sender: a fresh list per form.
|
|
479
|
+
export const getSmtpConfigFormSteps: GetSmtpConfigFormStepsFunction = <
|
|
480
|
+
TEntity,
|
|
481
|
+
>(): Array<FormStep<TEntity>> => {
|
|
482
|
+
return [
|
|
483
|
+
{ title: "Server", id: "server" },
|
|
484
|
+
{ title: "Sender", id: "sender" },
|
|
485
|
+
];
|
|
486
|
+
};
|
|
487
|
+
|
|
488
|
+
export type GetSmtpAdvancedSectionFunction = <TEntity>(
|
|
489
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
490
|
+
) => FormFieldCollapsibleSection<TEntity>;
|
|
491
|
+
|
|
492
|
+
/*
|
|
493
|
+
* The Server step's Advanced section: folded on create and edit alike, its
|
|
494
|
+
* header saying how mail is sent; it opens by itself when a field in it
|
|
495
|
+
* fails validation (the OAuth fields of a Microsoft Graph config, say).
|
|
496
|
+
*/
|
|
497
|
+
export const getSmtpAdvancedSection: GetSmtpAdvancedSectionFunction = <TEntity>(
|
|
498
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
499
|
+
): FormFieldCollapsibleSection<TEntity> => {
|
|
500
|
+
return getAdvancedFormSection<TEntity>({
|
|
501
|
+
getSummary: (values: FormValues<TEntity>): Array<string> => {
|
|
502
|
+
return getSmtpAdvancedSummary(values, columns);
|
|
503
|
+
},
|
|
504
|
+
});
|
|
505
|
+
};
|
|
506
|
+
|
|
507
|
+
export type GetSmtpConfigFormFieldsFunction = <TEntity>(
|
|
508
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
509
|
+
) => Array<Field<TEntity>>;
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* The fields of a mail server form, create and edit alike, on the steps
|
|
513
|
+
* getSmtpConfigFormSteps() declares - less a project config's Name, which
|
|
514
|
+
* getProjectSmtpConfigFormFields() puts first.
|
|
515
|
+
*/
|
|
516
|
+
export const getSmtpConfigFormFields: GetSmtpConfigFormFieldsFunction = <
|
|
517
|
+
TEntity,
|
|
518
|
+
>(
|
|
519
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
520
|
+
): Array<Field<TEntity>> => {
|
|
521
|
+
const advancedSection: FormFieldCollapsibleSection<TEntity> =
|
|
522
|
+
getSmtpAdvancedSection<TEntity>(columns);
|
|
523
|
+
|
|
524
|
+
const descriptionColumn: string | undefined = columns.configDescription;
|
|
525
|
+
|
|
526
|
+
return [
|
|
527
|
+
{
|
|
528
|
+
field: { [columns.hostname]: true } as SelectFormFields<TEntity>,
|
|
529
|
+
title: "Hostname",
|
|
530
|
+
stepId: "server",
|
|
531
|
+
fieldType: FormFieldSchemaType.Hostname,
|
|
532
|
+
required: true,
|
|
533
|
+
placeholder: "smtp.server.com",
|
|
534
|
+
description:
|
|
535
|
+
"SMTP server hostname. Examples: smtp.office365.com (Microsoft 365), smtp.gmail.com (Google)",
|
|
536
|
+
disableSpellCheck: true,
|
|
537
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
538
|
+
return showsSmtpServerFields(values, columns);
|
|
539
|
+
},
|
|
540
|
+
},
|
|
541
|
+
{
|
|
542
|
+
field: { [columns.port]: true } as SelectFormFields<TEntity>,
|
|
543
|
+
title: "Port",
|
|
544
|
+
stepId: "server",
|
|
545
|
+
fieldType: FormFieldSchemaType.Port,
|
|
546
|
+
required: true,
|
|
547
|
+
placeholder: "587",
|
|
548
|
+
description: SMTP_PORT_DESCRIPTION,
|
|
549
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
550
|
+
return showsSmtpServerFields(values, columns);
|
|
551
|
+
},
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
field: { [columns.username]: true } as SelectFormFields<TEntity>,
|
|
555
|
+
title: "Username",
|
|
556
|
+
stepId: "server",
|
|
557
|
+
fieldType: FormFieldSchemaType.Text,
|
|
558
|
+
required: false,
|
|
559
|
+
placeholder: "emailuser@company.com",
|
|
560
|
+
description: SMTP_USERNAME_DESCRIPTION,
|
|
561
|
+
disableSpellCheck: true,
|
|
562
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
563
|
+
return showsSmtpUsername(values, columns);
|
|
564
|
+
},
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
field: { [columns.password]: true } as SelectFormFields<TEntity>,
|
|
568
|
+
title: "Password",
|
|
569
|
+
stepId: "server",
|
|
570
|
+
fieldType: FormFieldSchemaType.EncryptedText,
|
|
571
|
+
required: false,
|
|
572
|
+
placeholder: "Password",
|
|
573
|
+
description: SMTP_PASSWORD_DESCRIPTION,
|
|
574
|
+
disableSpellCheck: true,
|
|
575
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
576
|
+
return showsSmtpPassword(values, columns);
|
|
577
|
+
},
|
|
578
|
+
},
|
|
579
|
+
{
|
|
580
|
+
field: { [columns.transportType]: true } as SelectFormFields<TEntity>,
|
|
581
|
+
title: "Transport",
|
|
582
|
+
stepId: "server",
|
|
583
|
+
fieldType: FormFieldSchemaType.Dropdown,
|
|
584
|
+
dropdownOptions:
|
|
585
|
+
DropdownUtil.getDropdownOptionsFromEnum(MailTransportType),
|
|
586
|
+
required: true,
|
|
587
|
+
defaultValue: MailTransportType.SMTP,
|
|
588
|
+
description: SMTP_TRANSPORT_DESCRIPTION,
|
|
589
|
+
collapsibleSection: advancedSection,
|
|
590
|
+
},
|
|
591
|
+
{
|
|
592
|
+
field: { [columns.secure]: true } as SelectFormFields<TEntity>,
|
|
593
|
+
title: "Require TLS",
|
|
594
|
+
stepId: "server",
|
|
595
|
+
fieldType: FormFieldSchemaType.Toggle,
|
|
596
|
+
required: false,
|
|
597
|
+
description: SMTP_REQUIRE_TLS_DESCRIPTION,
|
|
598
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
599
|
+
return showsSmtpServerFields(values, columns);
|
|
600
|
+
},
|
|
601
|
+
collapsibleSection: advancedSection,
|
|
602
|
+
},
|
|
603
|
+
{
|
|
604
|
+
field: { [columns.authType]: true } as SelectFormFields<TEntity>,
|
|
605
|
+
title: "Authentication Type",
|
|
606
|
+
stepId: "server",
|
|
607
|
+
fieldType: FormFieldSchemaType.Dropdown,
|
|
608
|
+
dropdownOptions: DropdownUtil.getDropdownOptionsFromEnum(
|
|
609
|
+
SMTPAuthenticationType,
|
|
610
|
+
),
|
|
611
|
+
required: true,
|
|
612
|
+
defaultValue: SMTPAuthenticationType.UsernamePassword,
|
|
613
|
+
description:
|
|
614
|
+
"Select the authentication method. Use OAuth for providers like Microsoft 365, Google Workspace, etc.",
|
|
615
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
616
|
+
return showsSmtpServerFields(values, columns);
|
|
617
|
+
},
|
|
618
|
+
collapsibleSection: advancedSection,
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
field: { [columns.oauthProviderType]: true } as SelectFormFields<TEntity>,
|
|
622
|
+
title: "OAuth Provider Type",
|
|
623
|
+
stepId: "server",
|
|
624
|
+
fieldType: FormFieldSchemaType.Dropdown,
|
|
625
|
+
dropdownOptions:
|
|
626
|
+
DropdownUtil.getDropdownOptionsFromEnum(OAuthProviderType),
|
|
627
|
+
required: true,
|
|
628
|
+
defaultValue: OAuthProviderType.ClientCredentials,
|
|
629
|
+
description:
|
|
630
|
+
"Select the OAuth grant type. Use 'Client Credentials' for Microsoft 365 and most providers. Use 'JWT Bearer' for Google Workspace service accounts.",
|
|
631
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
632
|
+
return showsSmtpOAuthProviderType(values, columns);
|
|
633
|
+
},
|
|
634
|
+
collapsibleSection: advancedSection,
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
field: { [columns.clientId]: true } as SelectFormFields<TEntity>,
|
|
638
|
+
title: "OAuth Client ID",
|
|
639
|
+
stepId: "server",
|
|
640
|
+
fieldType: FormFieldSchemaType.Text,
|
|
641
|
+
required: true,
|
|
642
|
+
placeholder: "12345678-1234-1234-1234-123456789012",
|
|
643
|
+
description:
|
|
644
|
+
"Application (Client) ID from your Azure AD app registration (or service account for JWT Bearer).",
|
|
645
|
+
disableSpellCheck: true,
|
|
646
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
647
|
+
return showsSmtpOAuthCredentials(values, columns);
|
|
648
|
+
},
|
|
649
|
+
collapsibleSection: advancedSection,
|
|
650
|
+
},
|
|
651
|
+
{
|
|
652
|
+
field: { [columns.clientSecret]: true } as SelectFormFields<TEntity>,
|
|
653
|
+
title: "OAuth Client Secret",
|
|
654
|
+
stepId: "server",
|
|
655
|
+
fieldType: FormFieldSchemaType.LongText,
|
|
656
|
+
required: true,
|
|
657
|
+
placeholder: "Client secret value",
|
|
658
|
+
description:
|
|
659
|
+
"For Client Credentials: Client secret from your OAuth application. For JWT Bearer (Google): The entire private_key from your service account JSON file (including BEGIN/END markers).",
|
|
660
|
+
disableSpellCheck: true,
|
|
661
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
662
|
+
return showsSmtpOAuthCredentials(values, columns);
|
|
663
|
+
},
|
|
664
|
+
collapsibleSection: advancedSection,
|
|
665
|
+
},
|
|
666
|
+
{
|
|
667
|
+
field: { [columns.tokenUrl]: true } as SelectFormFields<TEntity>,
|
|
668
|
+
title: "OAuth Token URL",
|
|
669
|
+
stepId: "server",
|
|
670
|
+
fieldType: FormFieldSchemaType.URL,
|
|
671
|
+
required: true,
|
|
672
|
+
placeholder:
|
|
673
|
+
"https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token",
|
|
674
|
+
description:
|
|
675
|
+
"The OAuth token endpoint URL. For Microsoft 365 (both SMTP+OAuth and Microsoft Graph): https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token. For Google: https://oauth2.googleapis.com/token",
|
|
676
|
+
disableSpellCheck: true,
|
|
677
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
678
|
+
return showsSmtpOAuthCredentials(values, columns);
|
|
679
|
+
},
|
|
680
|
+
collapsibleSection: advancedSection,
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
field: { [columns.scope]: true } as SelectFormFields<TEntity>,
|
|
684
|
+
title: "OAuth Scope",
|
|
685
|
+
stepId: "server",
|
|
686
|
+
fieldType: FormFieldSchemaType.Text,
|
|
687
|
+
required: true,
|
|
688
|
+
placeholder: "https://graph.microsoft.com/.default",
|
|
689
|
+
description:
|
|
690
|
+
"The OAuth scope(s) required. For Microsoft Graph: https://graph.microsoft.com/.default. For Microsoft 365 SMTP+OAuth: https://outlook.office365.com/.default. For Google: https://mail.google.com/",
|
|
691
|
+
disableSpellCheck: true,
|
|
692
|
+
showIf: (values: FormValues<TEntity>): boolean => {
|
|
693
|
+
return showsSmtpOAuthCredentials(values, columns);
|
|
694
|
+
},
|
|
695
|
+
collapsibleSection: advancedSection,
|
|
696
|
+
},
|
|
697
|
+
...(descriptionColumn
|
|
698
|
+
? [
|
|
699
|
+
{
|
|
700
|
+
field: { [descriptionColumn]: true } as SelectFormFields<TEntity>,
|
|
701
|
+
title: "Description",
|
|
702
|
+
stepId: "server",
|
|
703
|
+
fieldType: FormFieldSchemaType.LongText,
|
|
704
|
+
required: false,
|
|
705
|
+
description:
|
|
706
|
+
"Friendly description for this config so you remember what this is about.",
|
|
707
|
+
placeholder: "Company SMTP server hosted on AWS",
|
|
708
|
+
collapsibleSection: advancedSection,
|
|
709
|
+
},
|
|
710
|
+
]
|
|
711
|
+
: []),
|
|
712
|
+
{
|
|
713
|
+
field: { [columns.fromEmail]: true } as SelectFormFields<TEntity>,
|
|
714
|
+
title: "From Email",
|
|
715
|
+
stepId: "sender",
|
|
716
|
+
fieldType: FormFieldSchemaType.Email,
|
|
717
|
+
required: true,
|
|
718
|
+
placeholder: "email@company.com",
|
|
719
|
+
description: SMTP_FROM_EMAIL_DESCRIPTION,
|
|
720
|
+
disableSpellCheck: true,
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
field: { [columns.fromName]: true } as SelectFormFields<TEntity>,
|
|
724
|
+
title: "From Name",
|
|
725
|
+
stepId: "sender",
|
|
726
|
+
fieldType: FormFieldSchemaType.Text,
|
|
727
|
+
required: true,
|
|
728
|
+
placeholder: "Company, Inc.",
|
|
729
|
+
description:
|
|
730
|
+
"This is the display name your team and customers see, when they receive emails from OneUptime.",
|
|
731
|
+
disableSpellCheck: true,
|
|
732
|
+
},
|
|
733
|
+
];
|
|
734
|
+
};
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* A project's Custom SMTP config: its Name first, on the Server step, then
|
|
738
|
+
* the shared fields. The Description is folded under Advanced.
|
|
739
|
+
*/
|
|
740
|
+
export const getProjectSmtpConfigFormFields: () => Array<
|
|
741
|
+
Field<ProjectSmtpConfig>
|
|
742
|
+
> = (): Array<Field<ProjectSmtpConfig>> => {
|
|
743
|
+
return [
|
|
744
|
+
{
|
|
745
|
+
field: { name: true },
|
|
746
|
+
title: "Name",
|
|
747
|
+
stepId: "server",
|
|
748
|
+
fieldType: FormFieldSchemaType.Text,
|
|
749
|
+
required: true,
|
|
750
|
+
description:
|
|
751
|
+
"Friendly name for this config so you remember what this is about.",
|
|
752
|
+
placeholder: "Company SMTP Server",
|
|
753
|
+
validation: {
|
|
754
|
+
minLength: 2,
|
|
755
|
+
},
|
|
756
|
+
},
|
|
757
|
+
...getSmtpConfigFormFields<ProjectSmtpConfig>(
|
|
758
|
+
PROJECT_SMTP_CONFIG_FORM_COLUMNS,
|
|
759
|
+
),
|
|
760
|
+
];
|
|
761
|
+
};
|
|
762
|
+
|
|
763
|
+
// The instance's mail server (GlobalConfig): the shared fields as they are.
|
|
764
|
+
export const getGlobalSmtpConfigFormFields: () => Array<
|
|
765
|
+
Field<GlobalConfig>
|
|
766
|
+
> = (): Array<Field<GlobalConfig>> => {
|
|
767
|
+
return getSmtpConfigFormFields<GlobalConfig>(GLOBAL_SMTP_CONFIG_FORM_COLUMNS);
|
|
768
|
+
};
|
|
769
|
+
|
|
770
|
+
/*
|
|
771
|
+
* What a new project config starts with: port 587. Create only - an edit
|
|
772
|
+
* form shows the config as it is.
|
|
773
|
+
*/
|
|
774
|
+
export const PROJECT_SMTP_CONFIG_CREATE_INITIAL_VALUES: FormValues<ProjectSmtpConfig> =
|
|
775
|
+
{
|
|
776
|
+
port: DEFAULT_SMTP_PORT,
|
|
777
|
+
} as unknown as FormValues<ProjectSmtpConfig>;
|
|
778
|
+
|
|
779
|
+
/*
|
|
780
|
+
* The server and sign-in columns Microsoft Graph has no use for: it posts
|
|
781
|
+
* to Graph, not to a hostname and port, and signs in with the OAuth app.
|
|
782
|
+
*/
|
|
783
|
+
export const getSmtpServerColumnsGraphIgnores: <TEntity>(
|
|
784
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
785
|
+
) => Array<Extract<keyof TEntity, string>> = <TEntity>(
|
|
786
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
787
|
+
): Array<Extract<keyof TEntity, string>> => {
|
|
788
|
+
return [columns.hostname, columns.port, columns.username, columns.password];
|
|
789
|
+
};
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* What a new config keeps of the values its form held. Once Microsoft Graph
|
|
793
|
+
* is picked the form hides the hostname, port, username and password, but
|
|
794
|
+
* still holds them - the port it starts on, or what was typed before Graph
|
|
795
|
+
* was picked - so they are left out of what is created, as the form left
|
|
796
|
+
* them out of what it showed. Any other config is created as it is. For a
|
|
797
|
+
* create form's onBeforeCreate: an edited config keeps what it holds.
|
|
798
|
+
*/
|
|
799
|
+
export const withoutValuesGraphIgnores: <TEntity>(
|
|
800
|
+
item: TEntity,
|
|
801
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
802
|
+
) => TEntity = <TEntity>(
|
|
803
|
+
item: TEntity,
|
|
804
|
+
columns: SmtpConfigFormColumns<TEntity>,
|
|
805
|
+
): TEntity => {
|
|
806
|
+
if (getSmtpTransport(item, columns) !== MailTransportType.MicrosoftGraph) {
|
|
807
|
+
return item;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
for (const column of getSmtpServerColumnsGraphIgnores(columns)) {
|
|
811
|
+
delete (item as unknown as Record<string, unknown>)[column];
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
return item;
|
|
815
|
+
};
|