@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.
Files changed (1045) hide show
  1. package/Models/DatabaseModels/AlertGroupingRule.ts +10 -6
  2. package/Models/DatabaseModels/File.ts +41 -2
  3. package/Models/DatabaseModels/Form.ts +126 -0
  4. package/Models/DatabaseModels/IncidentGroupingRule.ts +10 -6
  5. package/Models/DatabaseModels/LogDropFilter.ts +1 -0
  6. package/Models/DatabaseModels/LogPipeline.ts +1 -0
  7. package/Models/DatabaseModels/LogScrubRule.ts +14 -8
  8. package/Models/DatabaseModels/MetricRecordingRule.ts +2 -1
  9. package/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.ts +4 -2
  10. package/Models/DatabaseModels/OnCallDutyPolicyUserOverride.ts +22 -9
  11. package/Models/DatabaseModels/ProjectCallSMSConfig.ts +6 -1
  12. package/Models/DatabaseModels/StatusPage.ts +8 -4
  13. package/Models/DatabaseModels/TraceDropFilter.ts +1 -0
  14. package/Models/DatabaseModels/TracePipeline.ts +1 -0
  15. package/Models/DatabaseModels/TraceRecordingRule.ts +2 -1
  16. package/Models/DatabaseModels/TraceScrubRule.ts +14 -8
  17. package/Models/DatabaseModels/UserOnCallLog.ts +4 -2
  18. package/Server/API/CustomDomainRoutes.ts +251 -0
  19. package/Server/API/DashboardAPI.ts +33 -4
  20. package/Server/API/DashboardDomainAPI.ts +63 -93
  21. package/Server/API/StatusPageAPI.ts +92 -0
  22. package/Server/API/StatusPageDomainAPI.ts +59 -96
  23. package/Server/Infrastructure/GlobalCache.ts +84 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.ts +47 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  26. package/Server/Services/AlertGroupingEngineService.ts +48 -70
  27. package/Server/Services/AlertGroupingRuleService.ts +38 -0
  28. package/Server/Services/CephClusterService.ts +25 -0
  29. package/Server/Services/CloudResourceService.ts +42 -0
  30. package/Server/Services/DashboardDomainService.ts +640 -214
  31. package/Server/Services/DashboardService.ts +30 -8
  32. package/Server/Services/DatabaseService.ts +143 -12
  33. package/Server/Services/DockerHostService.ts +60 -0
  34. package/Server/Services/DockerSwarmClusterService.ts +25 -0
  35. package/Server/Services/FileService.ts +60 -0
  36. package/Server/Services/FormService.ts +212 -2
  37. package/Server/Services/GlobalOidcService.ts +10 -0
  38. package/Server/Services/GlobalSsoService.ts +10 -0
  39. package/Server/Services/HostService.ts +58 -0
  40. package/Server/Services/IncidentGroupingEngineService.ts +48 -70
  41. package/Server/Services/IncidentGroupingRuleService.ts +38 -0
  42. package/Server/Services/IoTFleetService.ts +26 -0
  43. package/Server/Services/KubernetesClusterService.ts +64 -0
  44. package/Server/Services/LabelService.ts +6 -17
  45. package/Server/Services/LogScrubRuleService.ts +50 -0
  46. package/Server/Services/OnCallDutyPolicyScheduleService.ts +264 -0
  47. package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +9 -1
  48. package/Server/Services/OnCallNotificationAlertingService.ts +24 -29
  49. package/Server/Services/OnCallSetupReminderService.ts +41 -40
  50. package/Server/Services/PodmanHostService.ts +60 -0
  51. package/Server/Services/ProfileAggregationService.ts +38 -0
  52. package/Server/Services/ProjectCallSMSConfigService.ts +76 -3
  53. package/Server/Services/ProjectOidcService.ts +20 -0
  54. package/Server/Services/ProjectSsoService.ts +20 -0
  55. package/Server/Services/ProxmoxClusterService.ts +25 -0
  56. package/Server/Services/RumApplicationService.ts +45 -0
  57. package/Server/Services/ScheduledMaintenanceService.ts +9 -23
  58. package/Server/Services/ServerlessFunctionService.ts +47 -0
  59. package/Server/Services/ServiceService.ts +33 -10
  60. package/Server/Services/StatusPageDomainService.ts +622 -213
  61. package/Server/Services/StatusPageOidcService.ts +20 -0
  62. package/Server/Services/StatusPageResourceService.ts +89 -34
  63. package/Server/Services/StatusPageService.ts +270 -54
  64. package/Server/Services/StatusPageSsoService.ts +20 -0
  65. package/Server/Services/TraceScrubRuleService.ts +50 -0
  66. package/Server/Services/UserIncomingCallNumberService.ts +28 -14
  67. package/Server/Services/VMwareVCenterService.ts +25 -0
  68. package/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.ts +3 -3
  69. package/Server/Utils/Greenlock/CertificateOrder.ts +482 -0
  70. package/Server/Utils/Greenlock/CertificateOrderBudget.ts +134 -0
  71. package/Server/Utils/Greenlock/CertificateOrderFailures.ts +288 -0
  72. package/Server/Utils/Greenlock/CertificateOrderLock.ts +163 -0
  73. package/Server/Utils/Greenlock/CertificateOrderOutcome.ts +29 -0
  74. package/Server/Utils/Greenlock/CertificateOwners.ts +72 -0
  75. package/Server/Utils/Greenlock/CertificateReissueOrder.ts +99 -0
  76. package/Server/Utils/Greenlock/CustomDomainOrders.ts +397 -0
  77. package/Server/Utils/Greenlock/Greenlock.ts +839 -203
  78. package/Server/Utils/Rules/GroupingRuleEpisodeOwners.ts +551 -0
  79. package/Server/Utils/Rules/OwnerRuleAssignment.ts +8 -1
  80. package/Server/Utils/ScrubRuleValidation.ts +248 -0
  81. package/Server/Utils/StatusPage/AffectedStatusPageResources.ts +138 -0
  82. package/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.ts +294 -0
  83. package/Server/Utils/Telemetry/DiscoveredResourceCreate.ts +275 -0
  84. package/Server/Utils/Telemetry/DiscoveredResourceUpdate.ts +217 -0
  85. package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +8 -2
  86. package/Tests/App/Accounts/FormPage.test.tsx +238 -0
  87. package/Tests/App/Accounts/FormUtils.test.ts +108 -0
  88. package/Tests/App/AdminDashboard/AdminAddToProjectMembersTeam.test.tsx +1087 -0
  89. package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +140 -138
  90. package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +144 -145
  91. package/Tests/App/AdminDashboard/AdminSettingsFormsOnePage.test.tsx +907 -0
  92. package/Tests/App/AdminDashboard/AdminSettingsSwitches.test.tsx +906 -0
  93. package/Tests/App/AdminDashboard/AdminSmtpSettingsForm.test.tsx +823 -0
  94. package/Tests/App/AdminDashboard/BulkAddUsersToProjectModal.test.tsx +341 -368
  95. package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +199 -54
  96. package/Tests/App/AdminDashboard/ProjectScopedTeamsPicker.test.tsx +991 -0
  97. package/Tests/App/Dashboard/AIInvestigationSettingsLimits.test.tsx +147 -90
  98. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +224 -104
  99. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +302 -0
  100. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +408 -152
  101. package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +55 -0
  102. package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +206 -115
  103. package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +32 -0
  104. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +206 -71
  105. package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +45 -9
  106. package/Tests/App/Dashboard/AnnouncementCreateForm.test.tsx +1208 -0
  107. package/Tests/App/Dashboard/AnnouncementEditAndTemplateForms.test.tsx +693 -0
  108. package/Tests/App/Dashboard/AnnouncementFormsStructure.test.ts +546 -0
  109. package/Tests/App/Dashboard/AnnouncementStatusPageSuggestions.test.tsx +425 -0
  110. package/Tests/App/Dashboard/AnnouncementsTableCreateLinks.test.tsx +267 -0
  111. package/Tests/App/Dashboard/ApiKeyCreateForm.test.ts +68 -51
  112. package/Tests/App/Dashboard/ApiKeyViewPermissions.test.tsx +11 -9
  113. package/Tests/App/Dashboard/ApiKeysCreateAccess.test.tsx +24 -16
  114. package/Tests/App/Dashboard/BulkChangeStateModalOnePage.test.tsx +333 -0
  115. package/Tests/App/Dashboard/CardDescriptionsSayWhatFor.test.tsx +307 -0
  116. package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +18 -4
  117. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +7 -2
  118. package/Tests/App/Dashboard/ColorFieldsPrefilledPages.test.tsx +453 -0
  119. package/Tests/App/Dashboard/CreateFromRecordBreadcrumbs.test.ts +272 -0
  120. package/Tests/App/Dashboard/CreateFromRecordLinks.test.tsx +495 -0
  121. package/Tests/App/Dashboard/CreateFromRecordPages.test.tsx +1026 -0
  122. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +65 -23
  123. package/Tests/App/Dashboard/CriteriaName.test.ts +5 -1
  124. package/Tests/App/Dashboard/CustomDomainCreateFlow.test.tsx +516 -0
  125. package/Tests/App/Dashboard/CustomDomainDnsSetupModal.test.tsx +547 -0
  126. package/Tests/App/Dashboard/CustomDomainsPages.test.tsx +1077 -0
  127. package/Tests/App/Dashboard/CustomFieldSimpleCreate.test.tsx +2 -2
  128. package/Tests/App/Dashboard/CustomFieldSimpleCreateRender.test.tsx +12 -6
  129. package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +1 -1
  130. package/Tests/App/Dashboard/CustomSmtpConfigForm.test.tsx +969 -0
  131. package/Tests/App/Dashboard/DashboardBlankCanvasAddWidget.test.tsx +425 -0
  132. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +400 -0
  133. package/Tests/App/Dashboard/DashboardComponentsMRTranslation.test.tsx +4 -3
  134. package/Tests/App/Dashboard/DashboardCreateForm.test.ts +375 -0
  135. package/Tests/App/Dashboard/DashboardCreateFromTemplate.test.tsx +727 -0
  136. package/Tests/App/Dashboard/DashboardEmptyCanvasAddWidget.test.tsx +86 -0
  137. package/Tests/App/Dashboard/DashboardPhoneProductsMenu.test.tsx +99 -9
  138. package/Tests/App/Dashboard/DashboardSharingCard.test.tsx +1226 -0
  139. package/Tests/App/Dashboard/DashboardSharingEntryPoints.test.tsx +383 -0
  140. package/Tests/App/Dashboard/DashboardSharingPage.test.tsx +478 -0
  141. package/Tests/App/Dashboard/DeclareFormsAdvancedRender.test.tsx +90 -34
  142. package/Tests/App/Dashboard/DeclareIncidentMonitorsApart.test.tsx +1028 -0
  143. package/Tests/App/Dashboard/DefaultSsoTeams.test.tsx +215 -0
  144. package/Tests/App/Dashboard/DisabledWarningArchived.test.tsx +3 -3
  145. package/Tests/App/Dashboard/DisabledWarningRobustness.test.tsx +15 -12
  146. package/Tests/App/Dashboard/DiscoveredResourceCreateForms.test.tsx +936 -0
  147. package/Tests/App/Dashboard/EmbeddedMetricCardGroup.test.tsx +720 -0
  148. package/Tests/App/Dashboard/EpisodeMemberRoleAssignmentsFormField.test.tsx +331 -0
  149. package/Tests/App/Dashboard/EpisodePostmortemPage.test.tsx +327 -0
  150. package/Tests/App/Dashboard/EscalationRuleForm.test.ts +2 -2
  151. package/Tests/App/Dashboard/EscalationRuleFormGuard.test.ts +6 -2
  152. package/Tests/App/Dashboard/EscalationRuleOneStep.test.tsx +8 -4
  153. package/Tests/App/Dashboard/EventMeasurements.test.ts +1175 -0
  154. package/Tests/App/Dashboard/EventMeasurementsCard.test.tsx +993 -0
  155. package/Tests/App/Dashboard/EventNoteComposerDialog.test.tsx +939 -0
  156. package/Tests/App/Dashboard/EventNotes.test.tsx +34 -1
  157. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +186 -1
  158. package/Tests/App/Dashboard/EventSettingsSwitchPages.test.tsx +625 -0
  159. package/Tests/App/Dashboard/ExceptionMonitorEnvironmentFilter.test.tsx +6 -2
  160. package/Tests/App/Dashboard/FeedNoteComposerDialog.test.tsx +1327 -0
  161. package/Tests/App/Dashboard/FeedNoteDialogHelpers.ts +109 -0
  162. package/Tests/App/Dashboard/FilterChipClearButton.test.tsx +356 -0
  163. package/Tests/App/Dashboard/FormBrandingSection.test.tsx +504 -0
  164. package/Tests/App/Dashboard/FormBrandingValues.test.ts +255 -0
  165. package/Tests/App/Dashboard/FormBuilderParts.test.tsx +38 -1
  166. package/Tests/App/Dashboard/FormBuilderUi.test.tsx +176 -2
  167. package/Tests/App/Dashboard/FormMappingCard.test.tsx +33 -13
  168. package/Tests/App/Dashboard/FormsMovedPagesAndSubmissions.test.tsx +1 -1
  169. package/Tests/App/Dashboard/GeneratedKeyForms.test.tsx +30 -7
  170. package/Tests/App/Dashboard/GlobalProbesOnNewMonitorsCard.test.tsx +258 -0
  171. package/Tests/App/Dashboard/GroupingRuleFormFlow.test.tsx +653 -37
  172. package/Tests/App/Dashboard/GroupingRulePages.test.tsx +218 -9
  173. package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +52 -4
  174. package/Tests/App/Dashboard/IncidentEpisodeFeedPublicNoteNotifyDefault.test.tsx +230 -338
  175. package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +45 -9
  176. package/Tests/App/Dashboard/IncidentFeedPublicNoteNotifyDefault.test.tsx +227 -295
  177. package/Tests/App/Dashboard/IncidentLinkedAlertsSettingsPage.test.tsx +157 -181
  178. package/Tests/App/Dashboard/IncidentPostmortemPage.test.tsx +775 -0
  179. package/Tests/App/Dashboard/IncidentRoleFormField.test.tsx +379 -15
  180. package/Tests/App/Dashboard/IncidentRolesSettingsPage.test.tsx +148 -32
  181. package/Tests/App/Dashboard/IncidentTemplateInitialState.test.tsx +430 -0
  182. package/Tests/App/Dashboard/IncidentTemplateMonitorsApart.test.tsx +492 -0
  183. package/Tests/App/Dashboard/IncomingCallEscalationOneStep.test.tsx +830 -0
  184. package/Tests/App/Dashboard/IncomingCallEscalationRuleForm.test.ts +510 -0
  185. package/Tests/App/Dashboard/IncomingCallEscalationRuleFormGuard.test.ts +378 -0
  186. package/Tests/App/Dashboard/IngestionKeyForm.test.ts +664 -0
  187. package/Tests/App/Dashboard/IngestionKeySelectorCreate.test.tsx +523 -0
  188. package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +130 -9
  189. package/Tests/App/Dashboard/IpAllowlistCopy.test.ts +122 -0
  190. package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +19 -3
  191. package/Tests/App/Dashboard/KubernetesMetricsSetupEmptyState.test.tsx +275 -0
  192. package/Tests/App/Dashboard/KubernetesMetricsSetupHints.test.tsx +720 -0
  193. package/Tests/App/Dashboard/LabelsFormField.test.tsx +18 -13
  194. package/Tests/App/Dashboard/LegacyDefaultAssigneeNote.test.tsx +359 -0
  195. package/Tests/App/Dashboard/LogMonitorAttributeOperatorPreview.test.tsx +10 -10
  196. package/Tests/App/Dashboard/MarkdownTemplateDialogsWide.test.tsx +42 -20
  197. package/Tests/App/Dashboard/MeasurementForms.test.tsx +191 -5
  198. package/Tests/App/Dashboard/MeasurementPagesI18n.test.ts +2 -0
  199. package/Tests/App/Dashboard/MeasurementSetup.test.ts +5 -2
  200. package/Tests/App/Dashboard/MenuSpecificFoldedSections.test.tsx +38 -12
  201. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +34 -11
  202. package/Tests/App/Dashboard/MetricAndRecordingRuleFormsRender.test.tsx +1206 -0
  203. package/Tests/App/Dashboard/MetricResultsState.test.ts +248 -0
  204. package/Tests/App/Dashboard/MetricViewResultsState.test.tsx +404 -0
  205. package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +1 -1
  206. package/Tests/App/Dashboard/MonitorCriteriaAdvancedOptions.test.tsx +77 -27
  207. package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +5 -8
  208. package/Tests/App/Dashboard/MonitorCriteriaHeaderControls.test.tsx +228 -0
  209. package/Tests/App/Dashboard/MonitorCriteriaIncidentRoles.test.tsx +411 -0
  210. package/Tests/App/Dashboard/MonitorFeedRefresh.test.tsx +5 -1
  211. package/Tests/App/Dashboard/MonitorFormIncidentRoles.test.tsx +460 -0
  212. package/Tests/App/Dashboard/MonitorIntervalRedirect.test.tsx +299 -0
  213. package/Tests/App/Dashboard/MonitorOverviewHero.test.tsx +243 -2
  214. package/Tests/App/Dashboard/MonitorProbesAndIntervalPage.test.tsx +638 -0
  215. package/Tests/App/Dashboard/MonitorStepsDefaultStatusAdvanced.test.tsx +2 -2
  216. package/Tests/App/Dashboard/MonitorSummaryTestMonitorButton.test.tsx +2 -2
  217. package/Tests/App/Dashboard/MonitoringIntervalCard.test.tsx +493 -0
  218. package/Tests/App/Dashboard/MonitoringSwitch.test.tsx +597 -0
  219. package/Tests/App/Dashboard/MovedRunnerSettingsRedirects.test.tsx +4 -5
  220. package/Tests/App/Dashboard/NotificationChannelOffSwitchLists.test.tsx +636 -0
  221. package/Tests/App/Dashboard/OnCallPolicyCreateFormGuard.test.ts +8 -4
  222. package/Tests/App/Dashboard/OnCallPolicyFirstResponders.test.tsx +1 -1
  223. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +54 -0
  224. package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +43 -24
  225. package/Tests/App/Dashboard/OnCallRulesRedirects.test.tsx +530 -0
  226. package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +158 -74
  227. package/Tests/App/Dashboard/OnCallRulesTabs.test.tsx +511 -0
  228. package/Tests/App/Dashboard/OnCallScheduleAddLayerDefaults.test.tsx +236 -0
  229. package/Tests/App/Dashboard/OnCallScheduleCreateFormGuard.test.ts +633 -0
  230. package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +13 -2
  231. package/Tests/App/Dashboard/OnCallScheduleWhoTakesTurns.test.tsx +771 -0
  232. package/Tests/App/Dashboard/OnCallSharedCalendarFeedSettingsForm.test.tsx +357 -0
  233. package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +16 -6
  234. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +112 -23
  235. package/Tests/App/Dashboard/PageSearchIndexCoversMenus.test.tsx +594 -0
  236. package/Tests/App/Dashboard/PageSearchIndexCoversRoutes.test.tsx +271 -0
  237. package/Tests/App/Dashboard/PageSearchRanking.test.tsx +373 -0
  238. package/Tests/App/Dashboard/PostmortemPageParts.test.tsx +548 -0
  239. package/Tests/App/Dashboard/ProbeAgreementCard.test.tsx +483 -0
  240. package/Tests/App/Dashboard/ProductOrientation.test.tsx +9 -2
  241. package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +282 -404
  242. package/Tests/App/Dashboard/ProjectAiSettingsSwitchPages.test.tsx +1414 -0
  243. package/Tests/App/Dashboard/ProjectNotificationChannels.test.tsx +1191 -0
  244. package/Tests/App/Dashboard/ProjectSettingsSwitchCards.test.tsx +603 -0
  245. package/Tests/App/Dashboard/RemindersCard.test.tsx +477 -0
  246. package/Tests/App/Dashboard/ResourceDetailsCard.test.tsx +458 -0
  247. package/Tests/App/Dashboard/ResourceRuleForm.test.ts +525 -0
  248. package/Tests/App/Dashboard/ResourceRuleFormsRender.test.tsx +803 -0
  249. package/Tests/App/Dashboard/RoleAccess.test.ts +753 -0
  250. package/Tests/App/Dashboard/RoleCardSelectOptions.test.ts +13 -6
  251. package/Tests/App/Dashboard/RouteUtilPageRoute.test.ts +116 -0
  252. package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +1 -1
  253. package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +172 -219
  254. package/Tests/App/Dashboard/RunbookStepHeaderControls.test.tsx +269 -0
  255. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +45 -85
  256. package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +16 -23
  257. package/Tests/App/Dashboard/ScheduledMaintenanceAffectedResourcesEditForm.test.tsx +485 -0
  258. package/Tests/App/Dashboard/ScheduledMaintenanceChangeStateNotifyDefault.test.tsx +27 -2
  259. package/Tests/App/Dashboard/ScheduledMaintenanceCreateForm.test.tsx +65 -28
  260. package/Tests/App/Dashboard/ScheduledMaintenanceFeedPublicNoteNotifyDefault.test.tsx +208 -309
  261. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +36 -53
  262. package/Tests/App/Dashboard/ScheduledMaintenanceFormsStructure.test.ts +83 -14
  263. package/Tests/App/Dashboard/ScheduledMaintenanceMonitorsApart.test.tsx +1085 -0
  264. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +378 -25
  265. package/Tests/App/Dashboard/ScheduledMaintenanceStatusPageSuggestions.test.tsx +513 -0
  266. package/Tests/App/Dashboard/ScheduledMaintenanceTemplateForm.test.tsx +31 -9
  267. package/Tests/App/Dashboard/ScheduledMaintenanceTemplateMonitorsApart.test.tsx +760 -0
  268. package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +11 -13
  269. package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +228 -69
  270. package/Tests/App/Dashboard/SelectedProjectSwitches.test.tsx +359 -0
  271. package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1 -1
  272. package/Tests/App/Dashboard/SessionReplayAllowedCard.test.tsx +297 -0
  273. package/Tests/App/Dashboard/SetupGuideCard.test.tsx +7 -1
  274. package/Tests/App/Dashboard/ShortFormsOnePage.test.tsx +591 -0
  275. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +253 -6
  276. package/Tests/App/Dashboard/SloOverviewData.test.tsx +99 -0
  277. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +3 -1
  278. package/Tests/App/Dashboard/SloSettings.test.tsx +257 -4
  279. package/Tests/App/Dashboard/SsoPages.test.tsx +448 -52
  280. package/Tests/App/Dashboard/StateChangeDialogsFolded.test.tsx +695 -0
  281. package/Tests/App/Dashboard/StateChangeFormFields.test.ts +376 -0
  282. package/Tests/App/Dashboard/StatusPageAccessCard.test.tsx +1088 -0
  283. package/Tests/App/Dashboard/StatusPageAccessCopy.test.ts +450 -0
  284. package/Tests/App/Dashboard/StatusPageAccessMenu.test.tsx +137 -0
  285. package/Tests/App/Dashboard/StatusPageAccessPage.test.tsx +458 -0
  286. package/Tests/App/Dashboard/StatusPageAdvancedSettingsPage.test.tsx +30 -86
  287. package/Tests/App/Dashboard/StatusPageBrandingPage.test.tsx +28 -15
  288. package/Tests/App/Dashboard/StatusPageDisplaySettingsCard.test.tsx +949 -14
  289. package/Tests/App/Dashboard/StatusPagePrivateUsersNotice.test.tsx +233 -0
  290. package/Tests/App/Dashboard/StatusPageReportsCard.test.tsx +1001 -0
  291. package/Tests/App/Dashboard/StatusPageRequireSsoCard.test.tsx +247 -0
  292. package/Tests/App/Dashboard/StatusPageSubscriberSettingsPages.test.tsx +4 -17
  293. package/Tests/App/Dashboard/StatusPageSuggestions.test.tsx +930 -0
  294. package/Tests/App/Dashboard/StatusPageSwitchCardPages.test.tsx +335 -0
  295. package/Tests/App/Dashboard/TeamBlockPermissionsRedirect.test.tsx +332 -0
  296. package/Tests/App/Dashboard/TeamCreateForm.test.ts +206 -0
  297. package/Tests/App/Dashboard/TeamViewPermissions.test.tsx +713 -0
  298. package/Tests/App/Dashboard/TeamViewSideMenuBlockPermissions.test.tsx +113 -0
  299. package/Tests/App/Dashboard/TeamsCreateAccess.test.tsx +799 -0
  300. package/Tests/App/Dashboard/TelemetryDataRuleForms.test.ts +655 -0
  301. package/Tests/App/Dashboard/TelemetryDataRuleFormsRender.test.tsx +1014 -0
  302. package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +6 -3
  303. package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +446 -446
  304. package/Tests/App/Dashboard/TelemetryMonitorFiltersFold.test.tsx +613 -0
  305. package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +37 -2
  306. package/Tests/App/Dashboard/TemplateFormsNoInternalDataWarning.test.tsx +3 -3
  307. package/Tests/App/Dashboard/TraceExplorer.test.tsx +338 -0
  308. package/Tests/App/Dashboard/TwilioConfigFirstDefault.test.tsx +786 -0
  309. package/Tests/App/Dashboard/UpcomingShiftGetCover.test.tsx +306 -0
  310. package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +36 -11
  311. package/Tests/App/Dashboard/UserOverrideForm.test.ts +505 -0
  312. package/Tests/App/Dashboard/UserOverrideFormGuard.test.ts +334 -0
  313. package/Tests/App/Dashboard/UserOverrideWhoIsAway.test.tsx +999 -0
  314. package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +33 -11
  315. package/Tests/App/Dashboard/UserSettingsSetupChecklistPage.test.tsx +49 -4
  316. package/Tests/App/Dashboard/UsersPageEmptyState.test.tsx +245 -0
  317. package/Tests/App/Dashboard/WorkflowVariableOAuthSettingsEditSteps.test.tsx +13 -6
  318. package/Tests/App/Dashboard/WorkspaceMenusConnected.test.tsx +0 -2
  319. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +108 -86
  320. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +397 -0
  321. package/Tests/App/StatusPage/StatusPageResourceForm.test.tsx +931 -0
  322. package/Tests/App/StatusPage/StatusPageSubscribeOnePage.test.tsx +686 -0
  323. package/Tests/DialogActionRules.ts +16 -5
  324. package/Tests/Helpers/CardHeaderScan.ts +258 -0
  325. package/Tests/Helpers/FormStepsScan.ts +576 -11
  326. package/Tests/Helpers/MonitorGroupStatusPageRows.ts +237 -0
  327. package/Tests/Helpers/NestedControls.ts +184 -0
  328. package/Tests/Helpers/NestedControlsScan.ts +414 -0
  329. package/Tests/Helpers/SteppedFooterScan.ts +722 -0
  330. package/Tests/Models/DatabaseModels/FormModel.test.ts +31 -7
  331. package/Tests/Models/DatabaseModels/UserOverrideColumnDescriptions.test.ts +123 -0
  332. package/Tests/Models/TelemetryDataRuleColumnDefaults.test.ts +239 -0
  333. package/Tests/ResponsiveFlexLayout.test.ts +111 -0
  334. package/Tests/ResponsiveFlexLayout.ts +165 -0
  335. package/Tests/Server/API/DashboardDomainOrderSslAPI.test.ts +372 -0
  336. package/Tests/Server/API/DashboardDomainVerifyCnameAPI.test.ts +921 -0
  337. package/Tests/Server/API/DashboardSharingPublicRoutes.test.ts +559 -0
  338. package/Tests/Server/API/FormBrandingPublicRoutes.test.ts +680 -0
  339. package/Tests/Server/API/ProjectAPICreateWithTenantHeader.test.ts +300 -0
  340. package/Tests/Server/API/ProjectCreateTestHelpers.ts +211 -0
  341. package/Tests/Server/API/ProjectCreateWithTenantHeaderPostgres.test.ts +387 -0
  342. package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +29 -12
  343. package/Tests/Server/API/StatusPageDomainVerifyCnameAPI.test.ts +1090 -0
  344. package/Tests/Server/API/StatusPageMasterPageAccess.test.ts +254 -0
  345. package/Tests/Server/API/StatusPageReportScheduleWrites.test.ts +829 -0
  346. package/Tests/Server/API/StatusPageUptimeSettingsWrites.test.ts +417 -0
  347. package/Tests/Server/API/StatusPagesListingMonitorsAPI.test.ts +1029 -0
  348. package/Tests/Server/API/StatusPagesListingMonitorsRoute.test.ts +286 -0
  349. package/Tests/Server/Infrastructure/GlobalCache.test.ts +156 -0
  350. package/Tests/Server/Infrastructure/Postgres/MigrateIncidentFormsToFormsMigration.test.ts +52 -1
  351. package/Tests/Server/Services/CustomDomainCertificateLifecycle.test.ts +1559 -0
  352. package/Tests/Server/Services/CustomDomainCertificateReissue.test.ts +186 -16
  353. package/Tests/Server/Services/DashboardAccessChoice.test.ts +657 -0
  354. package/Tests/Server/Services/DashboardCreateFromTemplate.test.ts +200 -0
  355. package/Tests/Server/Services/DashboardDomainCertificateSweeps.test.ts +1142 -0
  356. package/Tests/Server/Services/DiscoveredResourceCreate.test.ts +864 -0
  357. package/Tests/Server/Services/DiscoveredResourceUpdate.test.ts +822 -0
  358. package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +3 -4
  359. package/Tests/Server/Services/FileServiceProject.test.ts +345 -0
  360. package/Tests/Server/Services/FormBranding.test.ts +982 -0
  361. package/Tests/Server/Services/FormPublicForm.test.ts +15 -0
  362. package/Tests/Server/Services/GroupingRuleEpisodeOwners.test.ts +857 -0
  363. package/Tests/Server/Services/IncidentFormPostgres.test.ts +297 -1
  364. package/Tests/Server/Services/MachinePickedColors.test.ts +202 -0
  365. package/Tests/Server/Services/OidcProviderCreateDefaults.test.ts +252 -0
  366. package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayer.test.ts +799 -0
  367. package/Tests/Server/Services/OnCallDutyPolicyScheduleFirstLayerPlans.test.ts +172 -0
  368. package/Tests/Server/Services/OnCallDutyPolicyUserOverrideWhoIsAway.test.ts +571 -0
  369. package/Tests/Server/Services/OnCallSetupReminder.test.ts +35 -13
  370. package/Tests/Server/Services/OnCallUndeliverablePageRulesLink.test.ts +217 -0
  371. package/Tests/Server/Services/ProfileAggregationService.test.ts +213 -4
  372. package/Tests/Server/Services/ProjectCallSMSConfigFirstDefault.test.ts +699 -0
  373. package/Tests/Server/Services/ProjectCallSMSConfigFirstDefaultBilling.test.ts +247 -0
  374. package/Tests/Server/Services/SamlProviderCreateDefaults.test.ts +255 -0
  375. package/Tests/Server/Services/ScheduledMaintenanceSubscriberMonitorGroups.test.ts +333 -0
  376. package/Tests/Server/Services/ScrubRuleSaveValidation.test.ts +947 -0
  377. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +17 -4
  378. package/Tests/Server/Services/StatusPageAccessChoice.test.ts +548 -0
  379. package/Tests/Server/Services/StatusPageDomainCertificateSweeps.test.ts +1238 -0
  380. package/Tests/Server/Services/TeamCreateAccessGrant.test.ts +607 -0
  381. package/Tests/Server/Services/TwilioConfigSendersGuard.test.ts +249 -0
  382. package/Tests/Server/Services/VerificationCodesUseProjectTwilioConfig.test.ts +264 -0
  383. package/Tests/Server/Types/Database/Permissions/FormBrandingColumns.test.ts +270 -0
  384. package/Tests/Server/Utils/Greenlock/CertificateCleanup.test.ts +526 -0
  385. package/Tests/Server/Utils/Greenlock/CertificateOrder.test.ts +1062 -0
  386. package/Tests/Server/Utils/Greenlock/CertificateOrderBudget.test.ts +243 -0
  387. package/Tests/Server/Utils/Greenlock/CertificateOrderFailures.test.ts +293 -0
  388. package/Tests/Server/Utils/Greenlock/CertificateOrderLock.test.ts +152 -0
  389. package/Tests/Server/Utils/Greenlock/CertificateOwnersGuard.test.ts +119 -0
  390. package/Tests/Server/Utils/Greenlock/CertificateRenewalOwnership.test.ts +1170 -0
  391. package/Tests/Server/Utils/Greenlock/CertificateRenewalSafety.test.ts +368 -0
  392. package/Tests/Server/Utils/Greenlock/CertificateRenewalSchedule.test.ts +188 -11
  393. package/Tests/Server/Utils/Greenlock/CustomDomainOrders.test.ts +723 -0
  394. package/Tests/Server/Utils/Greenlock/InMemoryRedis.ts +189 -0
  395. package/Tests/Server/Utils/Greenlock/NginxAcmeCertificatesToDisk.test.ts +242 -0
  396. package/Tests/Server/Utils/Greenlock/NginxCustomCertificatesToDisk.test.ts +305 -0
  397. package/Tests/Server/Utils/Greenlock/OrderCertGuards.test.ts +583 -0
  398. package/Tests/Server/Utils/Greenlock/OrderCertStorage.test.ts +203 -0
  399. package/Tests/Server/Utils/StatusPage/AffectedStatusPageResources.test.ts +700 -0
  400. package/Tests/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.test.ts +744 -0
  401. package/Tests/Types/CustomDomain/CustomDomainCertificates.test.ts +106 -0
  402. package/Tests/Types/CustomDomain/CustomDomainVerification.test.ts +94 -0
  403. package/Tests/Types/Dashboard/DashboardAccess.test.ts +460 -0
  404. package/Tests/Types/Filter/FilterConditionUtil.test.ts +59 -0
  405. package/Tests/Types/Form/FormBranding.test.ts +760 -0
  406. package/Tests/Types/IncomingCall/IncomingCallRingTime.test.ts +80 -0
  407. package/Tests/Types/NotificationRule/OnCallRuleKind.test.ts +271 -0
  408. package/Tests/Types/OnCallDutyPolicy/ScheduleFirstLayer.test.ts +300 -0
  409. package/Tests/Types/OnCallDutyPolicy/ScheduleLayerDefaults.test.ts +316 -0
  410. package/Tests/Types/OnCallDutyPolicy/UserOverrideCoverRequest.test.ts +257 -0
  411. package/Tests/Types/SSO/OidcProviderDefaults.test.ts +474 -0
  412. package/Tests/Types/SSO/SamlProviderDefaults.test.ts +150 -0
  413. package/Tests/Types/SSO/SsoProviderDefaults.test.ts +181 -0
  414. package/Tests/Types/StatusPage/StatusPageAccess.test.ts +393 -0
  415. package/Tests/Types/StatusPage/StatusPagesListingMonitors.test.ts +149 -0
  416. package/Tests/Types/Telemetry/ScrubRule.test.ts +375 -0
  417. package/Tests/UI/Components/AdvancedPageSection.test.tsx +201 -61
  418. package/Tests/UI/Components/BasicFormModalSteps.test.tsx +129 -153
  419. package/Tests/UI/Components/Card.test.tsx +354 -367
  420. package/Tests/UI/Components/CardHeaderActionsGuard.test.tsx +605 -0
  421. package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +23 -8
  422. package/Tests/UI/Components/CardModelDetailOnBeforeUpdate.test.tsx +224 -0
  423. package/Tests/UI/Components/CardModelDetailPageButtons.test.tsx +231 -0
  424. package/Tests/UI/Components/ChoiceRows.test.tsx +365 -0
  425. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +341 -5
  426. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +655 -64
  427. package/Tests/UI/Components/Detail/DetailCreatedOnIdLine.test.tsx +669 -0
  428. package/Tests/UI/Components/Detail/DetailIdLineDarkMode.test.ts +34 -7
  429. package/Tests/UI/Components/Detail/DetailIdLineInLocale.test.tsx +71 -0
  430. package/Tests/UI/Components/Detail/DetailRecordIdLine.test.tsx +26 -7
  431. package/Tests/UI/Components/Detail/DetailRecordLine.test.tsx +326 -0
  432. package/Tests/UI/Components/Detail/DetailRecordTime.test.ts +324 -0
  433. package/Tests/UI/Components/DetailCompactStyle.test.tsx +7 -3
  434. package/Tests/UI/Components/Dropdown/DropdownChange.test.ts +163 -0
  435. package/Tests/UI/Components/EntityDropdown.test.tsx +103 -1
  436. package/Tests/UI/Components/EntityDropdownClearButton.test.tsx +638 -0
  437. package/Tests/UI/Components/EntityDropdownEscape.test.tsx +6 -6
  438. package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +21 -4
  439. package/Tests/UI/Components/EntityDropdownQuery.test.tsx +411 -0
  440. package/Tests/UI/Components/EntityDropdownQueryHelpers.test.ts +131 -0
  441. package/Tests/UI/Components/FilePicker.test.tsx +220 -1
  442. package/Tests/UI/Components/FoldedSection/FoldedSection.test.tsx +582 -0
  443. package/Tests/UI/Components/FoldedSection/FoldedSectionDarkMode.test.ts +197 -0
  444. package/Tests/UI/Components/FoldedSection/FoldedSectionItem.test.ts +247 -0
  445. package/Tests/UI/Components/FoldedSection/FoldedSectionQueries.ts +86 -0
  446. package/Tests/UI/Components/Forms/AdvancedStepsGuard.test.ts +358 -32
  447. package/Tests/UI/Components/Forms/AnchoredFieldPopupPlacement.test.tsx +195 -0
  448. package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +187 -23
  449. package/Tests/UI/Components/Forms/BasicFormFillsInOnShow.test.tsx +246 -0
  450. package/Tests/UI/Components/Forms/BasicFormFooterSetValue.test.tsx +283 -0
  451. package/Tests/UI/Components/Forms/BasicFormPrimaryActionLastStep.test.tsx +780 -0
  452. package/Tests/UI/Components/Forms/BasicFormSingleStep.test.tsx +232 -0
  453. package/Tests/UI/Components/Forms/BasicFormStepValidation.test.tsx +7 -4
  454. package/Tests/UI/Components/Forms/BasicFormSubmitAllSteps.test.tsx +4 -3
  455. package/Tests/UI/Components/Forms/CreateFormDefaultsGuard.test.ts +252 -7
  456. package/Tests/UI/Components/Forms/DeclareAndCreateFormsGuard.test.ts +247 -7
  457. package/Tests/UI/Components/Forms/DiscoveredResourceCreateFormsGuard.test.ts +492 -0
  458. package/Tests/UI/Components/Forms/FilterConditionOnlyWithTwoFiltersGuard.test.ts +333 -0
  459. package/Tests/UI/Components/Forms/FoldedEditorWidthTiming.test.tsx +127 -0
  460. package/Tests/UI/Components/Forms/FoldedSectionsGuard.test.ts +523 -0
  461. package/Tests/UI/Components/Forms/FollowPickName.test.ts +88 -0
  462. package/Tests/UI/Components/Forms/FormFieldDropdownChange.test.tsx +294 -0
  463. package/Tests/UI/Components/Forms/FormModalWidth.test.tsx +237 -2
  464. package/Tests/UI/Components/Forms/FormSummary.test.tsx +181 -0
  465. package/Tests/UI/Components/Forms/IncidentEpisodePublicNoteNotifyPayload.test.tsx +110 -86
  466. package/Tests/UI/Components/Forms/LabelsFormFieldGuard.test.ts +101 -96
  467. package/Tests/UI/Components/Forms/LongFormStepsGuard.test.ts +559 -10
  468. package/Tests/UI/Components/Forms/MarkdownFormsAreWide.test.ts +56 -4
  469. package/Tests/UI/Components/Forms/MetricAndRecordingRuleFormsGuard.test.ts +400 -0
  470. package/Tests/UI/Components/Forms/ModelFormColorDefaults.test.tsx +659 -0
  471. package/Tests/UI/Components/Forms/ModelFormCreateDefaults.test.tsx +108 -4
  472. package/Tests/UI/Components/Forms/ModelFormDropdownQuery.test.tsx +403 -0
  473. package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +126 -0
  474. package/Tests/UI/Components/Forms/ModelFormSinglePickPeoplePicker.test.tsx +453 -0
  475. package/Tests/UI/Components/Forms/OidcProviderFormsGuard.test.ts +321 -0
  476. package/Tests/UI/Components/Forms/OneIncidentRolePickerGuard.test.ts +823 -0
  477. package/Tests/UI/Components/Forms/OneSwitchCardsGuard.test.ts +739 -0
  478. package/Tests/UI/Components/Forms/OpenFormSections.test.tsx +169 -0
  479. package/Tests/UI/Components/Forms/OverloadedFormStepsGuard.test.ts +21 -9
  480. package/Tests/UI/Components/Forms/PrimaryActionLastStepGuard.test.ts +478 -0
  481. package/Tests/UI/Components/Forms/ProjectTeamFormsGuard.test.ts +240 -0
  482. package/Tests/UI/Components/Forms/ResourceDetailsOnePlaceGuard.test.ts +936 -0
  483. package/Tests/UI/Components/Forms/ResourceRuleFormsGuard.test.ts +527 -0
  484. package/Tests/UI/Components/Forms/SamlProviderFormsGuard.test.ts +387 -0
  485. package/Tests/UI/Components/Forms/SmallWizardsOnePageGuard.test.ts +331 -0
  486. package/Tests/UI/Components/Forms/SmtpConfigFormsGuard.test.ts +470 -0
  487. package/Tests/UI/Components/Forms/StateChangeDialogsFoldTheNote.test.ts +322 -0
  488. package/Tests/UI/Components/Forms/StatusPageResourceFormsGuard.test.ts +381 -0
  489. package/Tests/UI/Components/Forms/SteppedFormFooter.test.ts +225 -0
  490. package/Tests/UI/Components/Forms/SteppedFormFooterTiming.test.tsx +82 -40
  491. package/Tests/UI/Components/Forms/SwitchCardsGuard.test.ts +339 -0
  492. package/Tests/UI/Components/Forms/TelemetryDataRuleFormsGuard.test.ts +383 -0
  493. package/Tests/UI/Components/Forms/UniqueName.test.ts +163 -0
  494. package/Tests/UI/Components/Forms/Utils/AdvancedFormSection.test.ts +131 -11
  495. package/Tests/UI/Components/Forms/Utils/CreateFormColorDefaults.test.ts +373 -0
  496. package/Tests/UI/Components/Forms/Utils/FoldedFormFields.test.ts +482 -0
  497. package/Tests/UI/Components/LabelRuleImportExport.test.tsx +32 -0
  498. package/Tests/UI/Components/MemberRoleAssignment.test.tsx +51 -7
  499. package/Tests/UI/Components/ModalSecondaryButton.test.tsx +60 -3
  500. package/Tests/UI/Components/ModelFormDraftValues.test.tsx +255 -0
  501. package/Tests/UI/Components/ModelPageHeaderChanged.test.tsx +293 -0
  502. package/Tests/UI/Components/ModelSwitchCard.test.tsx +813 -0
  503. package/Tests/UI/Components/ModelSwitchEvents.test.ts +188 -0
  504. package/Tests/UI/Components/ModelSwitchRow.test.tsx +861 -0
  505. package/Tests/UI/Components/ModelSwitchUtil.test.ts +239 -0
  506. package/Tests/UI/Components/ModelSwitchesCard.test.tsx +699 -0
  507. package/Tests/UI/Components/NavBar.test.tsx +41 -2
  508. package/Tests/UI/Components/NavBarCategoryToggleDarkMode.test.ts +12 -0
  509. package/Tests/UI/Components/NavBarMenuCatalog.test.tsx +197 -30
  510. package/Tests/UI/Components/NavBarMenuFolding.test.tsx +221 -39
  511. package/Tests/UI/Components/NavBarMenuSearch.test.tsx +15 -10
  512. package/Tests/UI/Components/NestedControlsGuard.test.ts +300 -0
  513. package/Tests/UI/Components/PageBreadcrumbOverride.test.tsx +202 -0
  514. package/Tests/UI/Components/PeoplePicker/OwnersFieldGuard.test.ts +269 -5
  515. package/Tests/UI/Components/PeoplePicker/PeoplePickerChange.test.tsx +414 -0
  516. package/Tests/UI/Components/PeoplePicker/PeoplePickerExcludePicks.test.tsx +582 -0
  517. package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePick.test.tsx +519 -0
  518. package/Tests/UI/Components/PeoplePicker/PeoplePickerSinglePickTypes.test.ts +174 -0
  519. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +8 -3
  520. package/Tests/UI/Components/RuleCriteria/RuleCriteriaNamesGuard.test.ts +14 -6
  521. package/Tests/UI/Components/RuleRun/RuleViewDescription.test.tsx +107 -0
  522. package/Tests/UI/Components/SaveStatus.test.tsx +81 -0
  523. package/Tests/UI/Components/SmtpConfig/SmtpConfigFormFields.test.ts +1078 -0
  524. package/Tests/UI/Components/Sso/OidcProviderForm.test.tsx +608 -0
  525. package/Tests/UI/Components/Sso/OidcProviderFormFields.test.ts +698 -0
  526. package/Tests/UI/Components/Sso/SamlProviderForm.test.tsx +583 -0
  527. package/Tests/UI/Components/Sso/SamlProviderFormFields.test.ts +619 -0
  528. package/Tests/UI/Components/SteppedEditFormSave.test.tsx +199 -141
  529. package/Tests/UI/Components/Table/TableEmptyStateComponent.test.tsx +143 -0
  530. package/Tests/UI/Components/UseSaveModelSwitch.test.tsx +409 -0
  531. package/Tests/UI/Components/Workflow/ArgumentsForm.test.tsx +3 -3
  532. package/Tests/UI/Components/Workflow/ArgumentsFormAdvancedSettings.test.tsx +83 -27
  533. package/Tests/UI/Components/Workflow/WorkflowLogModal.test.tsx +7 -2
  534. package/Tests/UI/Components/useSaveOnChange.test.tsx +341 -0
  535. package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +1 -1
  536. package/Tests/UI/Rum/ReplayTimeline.test.tsx +75 -5
  537. package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +97 -0
  538. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +12 -39
  539. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -6
  540. package/Tests/{App/Dashboard → UI/Utils}/DefaultInviteTeam.test.ts +126 -4
  541. package/Tests/UI/Utils/GrantablePermission.test.ts +172 -0
  542. package/Tests/UI/Utils/PermissionGateColumnUpdate.test.ts +211 -0
  543. package/Tests/UI/Utils/TranslateTemplate.test.ts +31 -0
  544. package/Tests/Utils/DistinctColor.test.ts +446 -0
  545. package/Tests/Utils/Monitor/MonitorOverviewPresentationUtil.test.ts +14 -2
  546. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +1 -1
  547. package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +2 -2
  548. package/Tests/Utils/Slo/SloHealth.test.ts +28 -6
  549. package/Tests/Utils/StatusPage/ReportSchedule.test.ts +867 -0
  550. package/Tests/Utils/Telemetry/DiscoveredResourceName.test.ts +189 -0
  551. package/Tests/Utils/WordMatch.test.ts +104 -0
  552. package/Types/BrandColors.ts +10 -0
  553. package/Types/CustomDomain/CustomDomainCertificates.ts +128 -0
  554. package/Types/CustomDomain/CustomDomainVerification.ts +78 -0
  555. package/Types/Dashboard/DashboardAccess.ts +250 -0
  556. package/Types/Dashboard/DashboardTemplates.ts +33 -0
  557. package/Types/Filter/FilterConditionUtil.ts +29 -0
  558. package/Types/Form/FormBranding.ts +475 -0
  559. package/Types/Form/FormPublic.ts +26 -0
  560. package/Types/IncomingCall/IncomingCallRingTime.ts +48 -0
  561. package/Types/Log/LogScrubField.ts +14 -0
  562. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +1 -1
  563. package/Types/NotificationRule/OnCallRuleKind.ts +194 -0
  564. package/Types/OnCallDutyPolicy/FirstResponders.ts +3 -32
  565. package/Types/OnCallDutyPolicy/MiscDataId.ts +38 -0
  566. package/Types/OnCallDutyPolicy/ScheduleFirstLayer.ts +165 -0
  567. package/Types/OnCallDutyPolicy/ScheduleLayerDefaults.ts +160 -0
  568. package/Types/OnCallDutyPolicy/UserOverrideCoverRequest.ts +148 -0
  569. package/Types/SSO/OidcProviderDefaults.ts +282 -0
  570. package/Types/SSO/SamlProviderDefaults.ts +77 -0
  571. package/Types/SSO/SsoProviderDefaults.ts +101 -0
  572. package/Types/StatusPage/StatusPageAccess.ts +215 -0
  573. package/Types/StatusPage/StatusPagesListingMonitors.ts +150 -0
  574. package/Types/Telemetry/ScrubRule.ts +240 -0
  575. package/UI/Components/AdvancedPageSection/AdvancedPageSection.tsx +59 -29
  576. package/UI/Components/Card/Card.tsx +139 -80
  577. package/UI/Components/ChoiceRows/ChoiceRows.tsx +249 -0
  578. package/UI/Components/CommandPalette/CommandPalette.tsx +28 -12
  579. package/UI/Components/CommandPalette/PaletteFilter.ts +962 -75
  580. package/UI/Components/CommandPalette/PaletteRow.tsx +35 -3
  581. package/UI/Components/CommandPalette/Types.ts +37 -1
  582. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +6 -0
  583. package/UI/Components/Detail/Detail.tsx +52 -15
  584. package/UI/Components/Detail/DetailRecordLine.tsx +96 -0
  585. package/UI/Components/Detail/DetailRecordTime.ts +196 -0
  586. package/UI/Components/Dropdown/DropdownChange.ts +198 -0
  587. package/UI/Components/EntityDropdown/EntityDropdown.tsx +270 -106
  588. package/UI/Components/EntityDropdown/EntityDropdownQuery.ts +119 -0
  589. package/UI/Components/FilePicker/FilePicker.tsx +90 -6
  590. package/UI/Components/FoldedSection/FoldedSection.tsx +370 -0
  591. package/UI/Components/FoldedSection/FoldedSectionItem.ts +141 -0
  592. package/UI/Components/FoldedSection/FoldedSectionTitles.ts +39 -0
  593. package/UI/Components/FormModal/BasicFormModal.tsx +40 -67
  594. package/UI/Components/Forms/BasicForm.tsx +218 -119
  595. package/UI/Components/Forms/BasicModelForm.tsx +0 -2
  596. package/UI/Components/Forms/CollapsibleFormSection.tsx +108 -18
  597. package/UI/Components/Forms/Fields/FormField.tsx +62 -15
  598. package/UI/Components/Forms/Fields/GeneratedKeyField.tsx +1 -5
  599. package/UI/Components/Forms/FormSummary.tsx +5 -3
  600. package/UI/Components/Forms/ModelForm.tsx +123 -16
  601. package/UI/Components/Forms/Types/Field.ts +98 -16
  602. package/UI/Components/Forms/Utils/AdvancedFormSection.ts +102 -31
  603. package/UI/Components/Forms/Utils/CreateFormDefaults.ts +158 -17
  604. package/UI/Components/Forms/Utils/FoldedFormFields.ts +393 -0
  605. package/UI/Components/Forms/Utils/FollowPickName.ts +52 -0
  606. package/UI/Components/Forms/Utils/FormModalWidth.ts +35 -4
  607. package/UI/Components/Forms/Utils/OpenFormSections.ts +104 -0
  608. package/UI/Components/Forms/Utils/SteppedFormFooter.ts +151 -0
  609. package/UI/Components/Forms/Utils/UniqueName.ts +81 -0
  610. package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +22 -3
  611. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +6 -5
  612. package/UI/Components/Modal/ModalFooter.tsx +10 -1
  613. package/UI/Components/ModelDetail/CardModelDetail.tsx +33 -8
  614. package/UI/Components/ModelFormModal/ModelFormModal.tsx +44 -58
  615. package/UI/Components/ModelSwitch/ModelSwitchCard.tsx +305 -0
  616. package/UI/Components/ModelSwitch/ModelSwitchEvents.ts +109 -0
  617. package/UI/Components/ModelSwitch/ModelSwitchRow.tsx +438 -0
  618. package/UI/Components/ModelSwitch/ModelSwitchUtil.ts +120 -0
  619. package/UI/Components/ModelSwitch/ModelSwitchesCard.tsx +265 -0
  620. package/UI/Components/ModelSwitch/useSaveModelSwitch.ts +144 -0
  621. package/UI/Components/ModelTable/BaseModelTable.tsx +6 -0
  622. package/UI/Components/ModelTable/ModelTable.tsx +5 -0
  623. package/UI/Components/Navbar/NavBar.tsx +10 -9
  624. package/UI/Components/Navbar/NavBarMenuCatalog.ts +57 -22
  625. package/UI/Components/Navbar/NavBarMenuModal.tsx +17 -13
  626. package/UI/Components/Navbar/NavBarMobileMenu.tsx +40 -23
  627. package/UI/Components/Page/ModelHeaderEvents.ts +75 -0
  628. package/UI/Components/Page/ModelPage.tsx +21 -1
  629. package/UI/Components/Page/Page.tsx +68 -13
  630. package/UI/Components/PeoplePicker/PeoplePicker.tsx +150 -45
  631. package/UI/Components/PeoplePicker/PeoplePickerTypes.ts +193 -4
  632. package/UI/Components/PeoplePicker/PeopleSearchPopup.tsx +37 -10
  633. package/UI/Components/PublicForm/PublicFormFavicon.ts +99 -0
  634. package/UI/Components/PublicForm/PublicFormLogo.tsx +81 -0
  635. package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +5 -3
  636. package/UI/Components/RuleRun/RuleView.tsx +2 -5
  637. package/UI/Components/SaveStatus/SaveStatus.tsx +76 -0
  638. package/UI/Components/SaveStatus/useSaveOnChange.ts +178 -0
  639. package/UI/Components/SmtpConfig/SmtpConfigFormFields.ts +815 -0
  640. package/UI/Components/Sso/OidcProviderFormFields.ts +481 -0
  641. package/UI/Components/Sso/SamlProviderFormFields.ts +322 -0
  642. package/UI/Components/Sso/SsoProviderFormFields.ts +331 -0
  643. package/UI/Components/Table/TableEmptyState.tsx +39 -5
  644. package/UI/Components/Workflow/ArgumentsForm.tsx +21 -78
  645. package/UI/Components/Workflow/ComponentPicker/ComponentSearch.ts +18 -145
  646. package/UI/Components/Workflow/WorkflowLogModal.tsx +1 -3
  647. package/UI/Types/UseAnchoredFieldPopup.ts +46 -4
  648. package/UI/Utils/DefaultInviteTeam.ts +306 -0
  649. package/UI/Utils/GrantablePermission.ts +46 -0
  650. package/UI/Utils/PermissionGate.ts +80 -7
  651. package/UI/Utils/TranslateTemplate.ts +22 -0
  652. package/Utils/DistinctColor.ts +223 -0
  653. package/Utils/Monitor/MonitorOverviewPresentationUtil.ts +47 -2
  654. package/Utils/Slo/SloHealth.ts +9 -3
  655. package/Utils/StatusPage/ReportSchedule.ts +462 -0
  656. package/Utils/Telemetry/DiscoveredResourceName.ts +95 -0
  657. package/Utils/WordMatch.ts +185 -0
  658. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +6 -6
  659. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
  660. package/build/dist/Models/DatabaseModels/File.js +47 -1
  661. package/build/dist/Models/DatabaseModels/File.js.map +1 -1
  662. package/build/dist/Models/DatabaseModels/Form.js +125 -0
  663. package/build/dist/Models/DatabaseModels/Form.js.map +1 -1
  664. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +6 -6
  665. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  666. package/build/dist/Models/DatabaseModels/LogDropFilter.js +1 -0
  667. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  668. package/build/dist/Models/DatabaseModels/LogPipeline.js +1 -0
  669. package/build/dist/Models/DatabaseModels/LogPipeline.js.map +1 -1
  670. package/build/dist/Models/DatabaseModels/LogScrubRule.js +14 -8
  671. package/build/dist/Models/DatabaseModels/LogScrubRule.js.map +1 -1
  672. package/build/dist/Models/DatabaseModels/MetricRecordingRule.js +1 -1
  673. package/build/dist/Models/DatabaseModels/MetricRecordingRule.js.map +1 -1
  674. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js +2 -2
  675. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyExecutionLogTimeline.js.map +1 -1
  676. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js +20 -9
  677. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyUserOverride.js.map +1 -1
  678. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +6 -1
  679. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
  680. package/build/dist/Models/DatabaseModels/StatusPage.js +4 -4
  681. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  682. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +1 -0
  683. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  684. package/build/dist/Models/DatabaseModels/TracePipeline.js +1 -0
  685. package/build/dist/Models/DatabaseModels/TracePipeline.js.map +1 -1
  686. package/build/dist/Models/DatabaseModels/TraceRecordingRule.js +1 -1
  687. package/build/dist/Models/DatabaseModels/TraceRecordingRule.js.map +1 -1
  688. package/build/dist/Models/DatabaseModels/TraceScrubRule.js +14 -8
  689. package/build/dist/Models/DatabaseModels/TraceScrubRule.js.map +1 -1
  690. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -2
  691. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  692. package/build/dist/Server/API/CustomDomainRoutes.js +124 -0
  693. package/build/dist/Server/API/CustomDomainRoutes.js.map +1 -0
  694. package/build/dist/Server/API/DashboardAPI.js +22 -4
  695. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  696. package/build/dist/Server/API/DashboardDomainAPI.js +56 -49
  697. package/build/dist/Server/API/DashboardDomainAPI.js.map +1 -1
  698. package/build/dist/Server/API/StatusPageAPI.js +101 -39
  699. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  700. package/build/dist/Server/API/StatusPageDomainAPI.js +52 -51
  701. package/build/dist/Server/API/StatusPageDomainAPI.js.map +1 -1
  702. package/build/dist/Server/Infrastructure/GlobalCache.js +63 -0
  703. package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
  704. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js +36 -0
  705. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797700000000-AddFormBranding.js.map +1 -0
  706. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  707. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  708. package/build/dist/Server/Services/AlertGroupingEngineService.js +44 -61
  709. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  710. package/build/dist/Server/Services/AlertGroupingRuleService.js +45 -0
  711. package/build/dist/Server/Services/AlertGroupingRuleService.js.map +1 -1
  712. package/build/dist/Server/Services/CephClusterService.js +23 -0
  713. package/build/dist/Server/Services/CephClusterService.js.map +1 -1
  714. package/build/dist/Server/Services/CloudResourceService.js +39 -0
  715. package/build/dist/Server/Services/CloudResourceService.js.map +1 -1
  716. package/build/dist/Server/Services/DashboardDomainService.js +510 -172
  717. package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
  718. package/build/dist/Server/Services/DashboardService.js +22 -9
  719. package/build/dist/Server/Services/DashboardService.js.map +1 -1
  720. package/build/dist/Server/Services/DatabaseService.js +114 -10
  721. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  722. package/build/dist/Server/Services/DockerHostService.js +51 -0
  723. package/build/dist/Server/Services/DockerHostService.js.map +1 -1
  724. package/build/dist/Server/Services/DockerSwarmClusterService.js +23 -0
  725. package/build/dist/Server/Services/DockerSwarmClusterService.js.map +1 -1
  726. package/build/dist/Server/Services/FileService.js +45 -0
  727. package/build/dist/Server/Services/FileService.js.map +1 -1
  728. package/build/dist/Server/Services/FormService.js +158 -14
  729. package/build/dist/Server/Services/FormService.js.map +1 -1
  730. package/build/dist/Server/Services/GlobalOidcService.js +9 -0
  731. package/build/dist/Server/Services/GlobalOidcService.js.map +1 -1
  732. package/build/dist/Server/Services/GlobalSsoService.js +9 -0
  733. package/build/dist/Server/Services/GlobalSsoService.js.map +1 -1
  734. package/build/dist/Server/Services/HostService.js +50 -0
  735. package/build/dist/Server/Services/HostService.js.map +1 -1
  736. package/build/dist/Server/Services/IncidentGroupingEngineService.js +45 -62
  737. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  738. package/build/dist/Server/Services/IncidentGroupingRuleService.js +45 -0
  739. package/build/dist/Server/Services/IncidentGroupingRuleService.js.map +1 -1
  740. package/build/dist/Server/Services/IoTFleetService.js +23 -0
  741. package/build/dist/Server/Services/IoTFleetService.js.map +1 -1
  742. package/build/dist/Server/Services/KubernetesClusterService.js +54 -0
  743. package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
  744. package/build/dist/Server/Services/LabelService.js +6 -16
  745. package/build/dist/Server/Services/LabelService.js.map +1 -1
  746. package/build/dist/Server/Services/LogScrubRuleService.js +31 -0
  747. package/build/dist/Server/Services/LogScrubRuleService.js.map +1 -1
  748. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +202 -0
  749. package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
  750. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +7 -1
  751. package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
  752. package/build/dist/Server/Services/OnCallNotificationAlertingService.js +17 -24
  753. package/build/dist/Server/Services/OnCallNotificationAlertingService.js.map +1 -1
  754. package/build/dist/Server/Services/OnCallSetupReminderService.js +32 -38
  755. package/build/dist/Server/Services/OnCallSetupReminderService.js.map +1 -1
  756. package/build/dist/Server/Services/PodmanHostService.js +51 -0
  757. package/build/dist/Server/Services/PodmanHostService.js.map +1 -1
  758. package/build/dist/Server/Services/ProfileAggregationService.js +34 -0
  759. package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
  760. package/build/dist/Server/Services/ProjectCallSMSConfigService.js +53 -3
  761. package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
  762. package/build/dist/Server/Services/ProjectOidcService.js +28 -0
  763. package/build/dist/Server/Services/ProjectOidcService.js.map +1 -1
  764. package/build/dist/Server/Services/ProjectSsoService.js +28 -0
  765. package/build/dist/Server/Services/ProjectSsoService.js.map +1 -1
  766. package/build/dist/Server/Services/ProxmoxClusterService.js +23 -0
  767. package/build/dist/Server/Services/ProxmoxClusterService.js.map +1 -1
  768. package/build/dist/Server/Services/RumApplicationService.js +42 -0
  769. package/build/dist/Server/Services/RumApplicationService.js.map +1 -1
  770. package/build/dist/Server/Services/ScheduledMaintenanceService.js +18 -26
  771. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  772. package/build/dist/Server/Services/ServerlessFunctionService.js +44 -0
  773. package/build/dist/Server/Services/ServerlessFunctionService.js.map +1 -1
  774. package/build/dist/Server/Services/ServiceService.js +30 -4
  775. package/build/dist/Server/Services/ServiceService.js.map +1 -1
  776. package/build/dist/Server/Services/StatusPageDomainService.js +495 -174
  777. package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
  778. package/build/dist/Server/Services/StatusPageOidcService.js +28 -0
  779. package/build/dist/Server/Services/StatusPageOidcService.js.map +1 -1
  780. package/build/dist/Server/Services/StatusPageResourceService.js +82 -46
  781. package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
  782. package/build/dist/Server/Services/StatusPageService.js +174 -45
  783. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  784. package/build/dist/Server/Services/StatusPageSsoService.js +28 -0
  785. package/build/dist/Server/Services/StatusPageSsoService.js.map +1 -1
  786. package/build/dist/Server/Services/TraceScrubRuleService.js +31 -0
  787. package/build/dist/Server/Services/TraceScrubRuleService.js.map +1 -1
  788. package/build/dist/Server/Services/UserIncomingCallNumberService.js +20 -10
  789. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  790. package/build/dist/Server/Services/VMwareVCenterService.js +23 -0
  791. package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -1
  792. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js +3 -3
  793. package/build/dist/Server/Utils/AI/PerfEvidence/SpanTreeAnalyzer.js.map +1 -1
  794. package/build/dist/Server/Utils/Greenlock/CertificateOrder.js +353 -0
  795. package/build/dist/Server/Utils/Greenlock/CertificateOrder.js.map +1 -0
  796. package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js +119 -0
  797. package/build/dist/Server/Utils/Greenlock/CertificateOrderBudget.js.map +1 -0
  798. package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js +208 -0
  799. package/build/dist/Server/Utils/Greenlock/CertificateOrderFailures.js.map +1 -0
  800. package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js +111 -0
  801. package/build/dist/Server/Utils/Greenlock/CertificateOrderLock.js.map +1 -0
  802. package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js +30 -0
  803. package/build/dist/Server/Utils/Greenlock/CertificateOrderOutcome.js.map +1 -0
  804. package/build/dist/Server/Utils/Greenlock/CertificateOwners.js +52 -0
  805. package/build/dist/Server/Utils/Greenlock/CertificateOwners.js.map +1 -0
  806. package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js +80 -0
  807. package/build/dist/Server/Utils/Greenlock/CertificateReissueOrder.js.map +1 -0
  808. package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js +296 -0
  809. package/build/dist/Server/Utils/Greenlock/CustomDomainOrders.js.map +1 -0
  810. package/build/dist/Server/Utils/Greenlock/Greenlock.js +595 -146
  811. package/build/dist/Server/Utils/Greenlock/Greenlock.js.map +1 -1
  812. package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js +366 -0
  813. package/build/dist/Server/Utils/Rules/GroupingRuleEpisodeOwners.js.map +1 -0
  814. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +7 -0
  815. package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -1
  816. package/build/dist/Server/Utils/ScrubRuleValidation.js +127 -0
  817. package/build/dist/Server/Utils/ScrubRuleValidation.js.map +1 -0
  818. package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js +97 -0
  819. package/build/dist/Server/Utils/StatusPage/AffectedStatusPageResources.js.map +1 -0
  820. package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js +195 -0
  821. package/build/dist/Server/Utils/StatusPage/StatusPagesListingMonitorsBuilder.js.map +1 -0
  822. package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js +177 -0
  823. package/build/dist/Server/Utils/Telemetry/DiscoveredResourceCreate.js.map +1 -0
  824. package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js +129 -0
  825. package/build/dist/Server/Utils/Telemetry/DiscoveredResourceUpdate.js.map +1 -0
  826. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +8 -2
  827. package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -1
  828. package/build/dist/Types/BrandColors.js +9 -0
  829. package/build/dist/Types/BrandColors.js.map +1 -1
  830. package/build/dist/Types/CustomDomain/CustomDomainCertificates.js +71 -0
  831. package/build/dist/Types/CustomDomain/CustomDomainCertificates.js.map +1 -0
  832. package/build/dist/Types/CustomDomain/CustomDomainVerification.js +58 -0
  833. package/build/dist/Types/CustomDomain/CustomDomainVerification.js.map +1 -0
  834. package/build/dist/Types/Dashboard/DashboardAccess.js +157 -0
  835. package/build/dist/Types/Dashboard/DashboardAccess.js.map +1 -0
  836. package/build/dist/Types/Dashboard/DashboardTemplates.js +26 -0
  837. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  838. package/build/dist/Types/Filter/FilterConditionUtil.js +24 -0
  839. package/build/dist/Types/Filter/FilterConditionUtil.js.map +1 -0
  840. package/build/dist/Types/Form/FormBranding.js +266 -0
  841. package/build/dist/Types/Form/FormBranding.js.map +1 -0
  842. package/build/dist/Types/Form/FormPublic.js +6 -0
  843. package/build/dist/Types/Form/FormPublic.js.map +1 -1
  844. package/build/dist/Types/IncomingCall/IncomingCallRingTime.js +37 -0
  845. package/build/dist/Types/IncomingCall/IncomingCallRingTime.js.map +1 -0
  846. package/build/dist/Types/Log/LogScrubField.js +15 -0
  847. package/build/dist/Types/Log/LogScrubField.js.map +1 -0
  848. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +1 -1
  849. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
  850. package/build/dist/Types/NotificationRule/OnCallRuleKind.js +134 -0
  851. package/build/dist/Types/NotificationRule/OnCallRuleKind.js.map +1 -0
  852. package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js +2 -23
  853. package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js.map +1 -1
  854. package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js +30 -0
  855. package/build/dist/Types/OnCallDutyPolicy/MiscDataId.js.map +1 -0
  856. package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js +113 -0
  857. package/build/dist/Types/OnCallDutyPolicy/ScheduleFirstLayer.js.map +1 -0
  858. package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js +95 -0
  859. package/build/dist/Types/OnCallDutyPolicy/ScheduleLayerDefaults.js.map +1 -0
  860. package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js +99 -0
  861. package/build/dist/Types/OnCallDutyPolicy/UserOverrideCoverRequest.js.map +1 -0
  862. package/build/dist/Types/SSO/OidcProviderDefaults.js +189 -0
  863. package/build/dist/Types/SSO/OidcProviderDefaults.js.map +1 -0
  864. package/build/dist/Types/SSO/SamlProviderDefaults.js +55 -0
  865. package/build/dist/Types/SSO/SamlProviderDefaults.js.map +1 -0
  866. package/build/dist/Types/SSO/SsoProviderDefaults.js +67 -0
  867. package/build/dist/Types/SSO/SsoProviderDefaults.js.map +1 -0
  868. package/build/dist/Types/StatusPage/StatusPageAccess.js +132 -0
  869. package/build/dist/Types/StatusPage/StatusPageAccess.js.map +1 -0
  870. package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js +84 -0
  871. package/build/dist/Types/StatusPage/StatusPagesListingMonitors.js.map +1 -0
  872. package/build/dist/Types/Telemetry/ScrubRule.js +180 -0
  873. package/build/dist/Types/Telemetry/ScrubRule.js.map +1 -0
  874. package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js +9 -7
  875. package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js.map +1 -1
  876. package/build/dist/UI/Components/Card/Card.js +81 -35
  877. package/build/dist/UI/Components/Card/Card.js.map +1 -1
  878. package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js +54 -0
  879. package/build/dist/UI/Components/ChoiceRows/ChoiceRows.js.map +1 -0
  880. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +25 -12
  881. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
  882. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +632 -64
  883. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -1
  884. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +7 -1
  885. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -1
  886. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +7 -1
  887. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  888. package/build/dist/UI/Components/Detail/Detail.js +26 -13
  889. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  890. package/build/dist/UI/Components/Detail/DetailRecordLine.js +32 -0
  891. package/build/dist/UI/Components/Detail/DetailRecordLine.js.map +1 -0
  892. package/build/dist/UI/Components/Detail/DetailRecordTime.js +134 -0
  893. package/build/dist/UI/Components/Detail/DetailRecordTime.js.map +1 -0
  894. package/build/dist/UI/Components/Dropdown/DropdownChange.js +102 -0
  895. package/build/dist/UI/Components/Dropdown/DropdownChange.js.map +1 -0
  896. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +134 -57
  897. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  898. package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js +78 -0
  899. package/build/dist/UI/Components/EntityDropdown/EntityDropdownQuery.js.map +1 -0
  900. package/build/dist/UI/Components/FilePicker/FilePicker.js +55 -6
  901. package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
  902. package/build/dist/UI/Components/FoldedSection/FoldedSection.js +139 -0
  903. package/build/dist/UI/Components/FoldedSection/FoldedSection.js.map +1 -0
  904. package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js +58 -0
  905. package/build/dist/UI/Components/FoldedSection/FoldedSectionItem.js.map +1 -0
  906. package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js +34 -0
  907. package/build/dist/UI/Components/FoldedSection/FoldedSectionTitles.js.map +1 -0
  908. package/build/dist/UI/Components/FormModal/BasicFormModal.js +29 -45
  909. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  910. package/build/dist/UI/Components/Forms/BasicForm.js +148 -89
  911. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  912. package/build/dist/UI/Components/Forms/BasicModelForm.js +1 -1
  913. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  914. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +49 -10
  915. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -1
  916. package/build/dist/UI/Components/Forms/Fields/FormField.js +25 -11
  917. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  918. package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js +2 -5
  919. package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js.map +1 -1
  920. package/build/dist/UI/Components/Forms/FormSummary.js +5 -3
  921. package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
  922. package/build/dist/UI/Components/Forms/ModelForm.js +72 -14
  923. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  924. package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
  925. package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js +80 -23
  926. package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js.map +1 -1
  927. package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js +91 -9
  928. package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js.map +1 -1
  929. package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js +243 -0
  930. package/build/dist/UI/Components/Forms/Utils/FoldedFormFields.js.map +1 -0
  931. package/build/dist/UI/Components/Forms/Utils/FollowPickName.js +32 -0
  932. package/build/dist/UI/Components/Forms/Utils/FollowPickName.js.map +1 -0
  933. package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js +25 -5
  934. package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js.map +1 -1
  935. package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js +32 -0
  936. package/build/dist/UI/Components/Forms/Utils/OpenFormSections.js.map +1 -0
  937. package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js +71 -0
  938. package/build/dist/UI/Components/Forms/Utils/SteppedFormFooter.js.map +1 -0
  939. package/build/dist/UI/Components/Forms/Utils/UniqueName.js +56 -0
  940. package/build/dist/UI/Components/Forms/Utils/UniqueName.js.map +1 -0
  941. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +17 -1
  942. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -1
  943. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  944. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  945. package/build/dist/UI/Components/Modal/ModalFooter.js +8 -1
  946. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  947. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +19 -6
  948. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  949. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +33 -43
  950. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  951. package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js +151 -0
  952. package/build/dist/UI/Components/ModelSwitch/ModelSwitchCard.js.map +1 -0
  953. package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js +54 -0
  954. package/build/dist/UI/Components/ModelSwitch/ModelSwitchEvents.js.map +1 -0
  955. package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js +201 -0
  956. package/build/dist/UI/Components/ModelSwitch/ModelSwitchRow.js.map +1 -0
  957. package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js +60 -0
  958. package/build/dist/UI/Components/ModelSwitch/ModelSwitchUtil.js.map +1 -0
  959. package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js +116 -0
  960. package/build/dist/UI/Components/ModelSwitch/ModelSwitchesCard.js.map +1 -0
  961. package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js +68 -0
  962. package/build/dist/UI/Components/ModelSwitch/useSaveModelSwitch.js.map +1 -0
  963. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -0
  964. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  965. package/build/dist/UI/Components/ModelTable/ModelTable.js +3 -1
  966. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  967. package/build/dist/UI/Components/Navbar/NavBar.js +2 -2
  968. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  969. package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js +21 -10
  970. package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js.map +1 -1
  971. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +10 -7
  972. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  973. package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js +17 -9
  974. package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js.map +1 -1
  975. package/build/dist/UI/Components/Page/ModelHeaderEvents.js +43 -0
  976. package/build/dist/UI/Components/Page/ModelHeaderEvents.js.map +1 -0
  977. package/build/dist/UI/Components/Page/ModelPage.js +19 -1
  978. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  979. package/build/dist/UI/Components/Page/Page.js +31 -13
  980. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  981. package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js +62 -20
  982. package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js.map +1 -1
  983. package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js +98 -1
  984. package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js.map +1 -1
  985. package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js +35 -14
  986. package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js.map +1 -1
  987. package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js +66 -0
  988. package/build/dist/UI/Components/PublicForm/PublicFormFavicon.js.map +1 -0
  989. package/build/dist/UI/Components/PublicForm/PublicFormLogo.js +38 -0
  990. package/build/dist/UI/Components/PublicForm/PublicFormLogo.js.map +1 -0
  991. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +5 -3
  992. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -1
  993. package/build/dist/UI/Components/RuleRun/RuleView.js +2 -2
  994. package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -1
  995. package/build/dist/UI/Components/SaveStatus/SaveStatus.js +46 -0
  996. package/build/dist/UI/Components/SaveStatus/SaveStatus.js.map +1 -0
  997. package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js +98 -0
  998. package/build/dist/UI/Components/SaveStatus/useSaveOnChange.js.map +1 -0
  999. package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js +503 -0
  1000. package/build/dist/UI/Components/SmtpConfig/SmtpConfigFormFields.js.map +1 -0
  1001. package/build/dist/UI/Components/Sso/OidcProviderFormFields.js +283 -0
  1002. package/build/dist/UI/Components/Sso/OidcProviderFormFields.js.map +1 -0
  1003. package/build/dist/UI/Components/Sso/SamlProviderFormFields.js +182 -0
  1004. package/build/dist/UI/Components/Sso/SamlProviderFormFields.js.map +1 -0
  1005. package/build/dist/UI/Components/Sso/SsoProviderFormFields.js +208 -0
  1006. package/build/dist/UI/Components/Sso/SsoProviderFormFields.js.map +1 -0
  1007. package/build/dist/UI/Components/Table/TableEmptyState.js +17 -4
  1008. package/build/dist/UI/Components/Table/TableEmptyState.js.map +1 -1
  1009. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +17 -52
  1010. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  1011. package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js +7 -89
  1012. package/build/dist/UI/Components/Workflow/ComponentPicker/ComponentSearch.js.map +1 -1
  1013. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +1 -1
  1014. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -1
  1015. package/build/dist/UI/Types/UseAnchoredFieldPopup.js +22 -3
  1016. package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
  1017. package/build/dist/UI/Utils/DefaultInviteTeam.js +207 -0
  1018. package/build/dist/UI/Utils/DefaultInviteTeam.js.map +1 -0
  1019. package/build/dist/UI/Utils/GrantablePermission.js +31 -0
  1020. package/build/dist/UI/Utils/GrantablePermission.js.map +1 -1
  1021. package/build/dist/UI/Utils/PermissionGate.js +54 -3
  1022. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  1023. package/build/dist/UI/Utils/TranslateTemplate.js +16 -0
  1024. package/build/dist/UI/Utils/TranslateTemplate.js.map +1 -1
  1025. package/build/dist/Utils/DistinctColor.js +151 -0
  1026. package/build/dist/Utils/DistinctColor.js.map +1 -0
  1027. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js +12 -1
  1028. package/build/dist/Utils/Monitor/MonitorOverviewPresentationUtil.js.map +1 -1
  1029. package/build/dist/Utils/Slo/SloHealth.js +9 -3
  1030. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  1031. package/build/dist/Utils/StatusPage/ReportSchedule.js +304 -0
  1032. package/build/dist/Utils/StatusPage/ReportSchedule.js.map +1 -0
  1033. package/build/dist/Utils/Telemetry/DiscoveredResourceName.js +65 -0
  1034. package/build/dist/Utils/Telemetry/DiscoveredResourceName.js.map +1 -0
  1035. package/build/dist/Utils/WordMatch.js +115 -0
  1036. package/build/dist/Utils/WordMatch.js.map +1 -0
  1037. package/package.json +1 -1
  1038. package/Tests/App/Dashboard/BulkChangeStateModalSteps.test.ts +0 -109
  1039. package/Tests/App/StatusPage/StatusPageSubscribeFromFirstStep.test.tsx +0 -382
  1040. package/Tests/UI/Components/Forms/BasicFormFinishFromAnyStep.test.tsx +0 -729
  1041. package/Tests/UI/Components/Forms/FinishFromAnyStep.test.ts +0 -571
  1042. package/Tests/UI/Components/Forms/FinishFromAnyStepGuard.test.ts +0 -566
  1043. package/UI/Components/Forms/Utils/FinishFromAnyStep.ts +0 -284
  1044. package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js +0 -132
  1045. package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js.map +0 -1
@@ -30,19 +30,30 @@ import TelemetryIngestionKeyType from "../../../Types/Telemetry/TelemetryIngesti
30
30
  import { ComponentProps as CodeEditorProps } from "../../../UI/Components/CodeEditor/CodeEditor";
31
31
  import { FormType } from "../../../UI/Components/Forms/ModelForm";
32
32
  import ModelFormModal from "../../../UI/Components/ModelFormModal/ModelFormModal";
33
+ import { ModalType } from "../../../UI/Components/ModelTable/BaseModelTable";
33
34
  import { ComponentProps as ModelTableProps } from "../../../UI/Components/ModelTable/ModelTable";
34
35
  import Navigation from "../../../UI/Utils/Navigation";
35
36
  import ProjectUtil from "../../../UI/Utils/Project";
36
37
  import getJestMockFunction, { MockFunction } from "../../MockType";
37
38
 
38
39
  /*
39
- * Exercise the production page's field and step configuration through the real
40
- * modal, ModelForm, BasicForm, validation and summary. The table is replaced by
41
- * its open-create-modal state, and only transport, permissions and Monaco's
42
- * browser-only editor are stubbed. This catches fields that are assigned to the
43
- * wrong step as well as values lost between steps or omitted from submission.
40
+ * Settings > Telemetry Ingestion Keys > Create, through the real modal,
41
+ * ModelForm, BasicForm and validation, with the page's own form
42
+ * (Components/Telemetry/IngestionKeyForm). The table is replaced by its
43
+ * open-create-modal state - which also reports a create the way the table
44
+ * does (onCreateSuccess) - and only transport, permissions and the code
45
+ * editor are stubbed.
46
+ *
47
+ * What the user gets: a Server key on a paid plan is one page and one
48
+ * click - the name already filled in, Server picked, the description folded
49
+ * under Advanced - and the new key opens on its own page, where its secret
50
+ * is. A Browser key walks on to its allowed origins; the Free plan to the
51
+ * pricing, which has to be shown before the key can be created.
44
52
  */
45
53
 
54
+ const PROJECT_ID: string = "11111111-1111-4111-8111-111111111111";
55
+ const KEY_ID: string = "22222222-2222-4222-8222-222222222222";
56
+
46
57
  let isFreePlan: boolean = false;
47
58
  let capturedTableProps: ModelTableProps<TelemetryIngestionKey> | null = null;
48
59
  const createOrUpdateMock: MockFunction = getJestMockFunction();
@@ -63,7 +74,10 @@ jest.mock("../../../UI/Components/ModelTable/ModelTable", () => {
63
74
  initialValues={props.createInitialValues}
64
75
  submitButtonText="Create Ingestion Key"
65
76
  onClose={closeMock}
66
- onSuccess={successMock}
77
+ onSuccess={(item: TelemetryIngestionKey): void => {
78
+ successMock(item);
79
+ props.onCreateSuccess?.(item, ModalType.Create);
80
+ }}
67
81
  onBeforeCreate={props.onBeforeCreate}
68
82
  formProps={{
69
83
  id: "create-ingestion-key-form",
@@ -186,8 +200,6 @@ jest.mock("../../../UI/Components/CodeEditor/CodeEditor", () => {
186
200
  };
187
201
  });
188
202
 
189
- const NAME: string = "Storefront telemetry";
190
- const DESCRIPTION: string = "Production website and collector telemetry";
191
203
  const ORIGINS: string = '["https://app.example.com", "https://*.example.org"]';
192
204
  const SERVICE: string = "storefront-web";
193
205
 
@@ -195,15 +207,60 @@ function dialog(): HTMLElement {
195
207
  return screen.getByRole("dialog", { name: "Create New Ingestion Key" });
196
208
  }
197
209
 
198
- function progress(): HTMLElement {
199
- return within(dialog()).getByRole("navigation", { name: "Progress" });
210
+ function nameInput(): HTMLElement {
211
+ return within(dialog()).getByPlaceholderText("Ingestion Key Name");
212
+ }
213
+
214
+ function descriptionInput(): HTMLElement {
215
+ return within(dialog()).getByPlaceholderText("Ingestion Key Description");
216
+ }
217
+
218
+ // The dialog's action, Create Ingestion Key: on the last step only.
219
+ function mainButton(): HTMLElement {
220
+ return within(dialog()).getByTestId("modal-footer-submit-button");
221
+ }
222
+
223
+ function queryMainButton(): HTMLElement | null {
224
+ return within(dialog()).queryByTestId("modal-footer-submit-button");
225
+ }
226
+
227
+ // The plain Next every step but the last shows instead.
228
+ function queryNextButton(): HTMLElement | null {
229
+ return within(dialog()).queryByTestId("modal-footer-next-button");
230
+ }
231
+
232
+ function progress(): HTMLElement | null {
233
+ return within(dialog()).queryByRole("navigation", { name: "Progress" });
200
234
  }
201
235
 
202
236
  function activeStep(): string {
203
- return progress().querySelector('[aria-current="step"]')?.textContent || "";
237
+ return progress()?.querySelector('[aria-current="step"]')?.textContent || "";
204
238
  }
205
239
 
206
- async function renderWizard(): Promise<UserEvent> {
240
+ function stepTitles(): Array<string> {
241
+ const list: HTMLElement | null = progress();
242
+
243
+ if (!list) {
244
+ return [];
245
+ }
246
+
247
+ return within(list)
248
+ .getAllByRole("listitem")
249
+ .map((item: HTMLElement): string => {
250
+ return item.textContent || "";
251
+ });
252
+ }
253
+
254
+ // The Advanced header on the step on screen.
255
+ function advancedHeader(): HTMLElement {
256
+ return within(dialog()).getByRole("button", { name: "More fields" });
257
+ }
258
+
259
+ function card(keyType: TelemetryIngestionKeyType): HTMLElement {
260
+ return within(dialog()).getByTestId(`card-select-option-${keyType}`);
261
+ }
262
+
263
+ async function renderPage(): Promise<UserEvent> {
207
264
  await act(async (): Promise<void> => {
208
265
  render(
209
266
  <MemoryRouter>
@@ -217,519 +274,462 @@ async function renderWizard(): Promise<UserEvent> {
217
274
  });
218
275
  await screen.findByPlaceholderText("Ingestion Key Name");
219
276
  await waitFor(() => {
220
- expect(dialog()).toBeVisible();
277
+ expect(nameInput()).toHaveValue("Server key");
278
+ });
279
+ /*
280
+ * An input shows its field's default before BasicForm has taken it into
281
+ * its values, and BasicForm never fills in a form someone has typed into:
282
+ * let it settle before typing.
283
+ */
284
+ await act(async (): Promise<void> => {
285
+ await new Promise<void>((resolve: () => void): void => {
286
+ setTimeout(resolve, 0);
287
+ });
221
288
  });
222
289
  return userEvent.setup({ delay: null });
223
290
  }
224
291
 
225
- async function next(user: UserEvent): Promise<void> {
226
- await user.click(
227
- await within(dialog()).findByRole("button", { name: "Next" }),
228
- );
229
- }
230
-
231
- async function enterDetails(
292
+ async function pickType(
232
293
  user: UserEvent,
233
- description?: string,
294
+ keyType: TelemetryIngestionKeyType,
234
295
  ): Promise<void> {
235
- fireEvent.change(screen.getByPlaceholderText("Ingestion Key Name"), {
236
- target: { value: NAME },
296
+ await user.click(card(keyType));
297
+ await waitFor(() => {
298
+ expect(card(keyType)).toHaveAttribute("aria-checked", "true");
237
299
  });
238
- if (description) {
239
- fireEvent.change(screen.getByPlaceholderText("Ingestion Key Description"), {
240
- target: { value: description },
241
- });
242
- }
243
- await next(user);
244
- await screen.findByRole("radiogroup", { name: "Key Type" });
245
300
  }
246
301
 
247
- async function selectType(
248
- user: UserEvent,
249
- keyType: TelemetryIngestionKeyType,
250
- ): Promise<void> {
251
- await user.click(screen.getByTestId(`card-select-option-${keyType}`));
302
+ async function goToBrowserSettings(user: UserEvent): Promise<void> {
303
+ await pickType(user, TelemetryIngestionKeyType.Browser);
252
304
  await waitFor(() => {
253
- expect(screen.getByTestId(`card-select-option-${keyType}`)).toHaveAttribute(
254
- "aria-checked",
255
- "true",
256
- );
257
- if (keyType === TelemetryIngestionKeyType.Browser) {
258
- expect(within(progress()).getByText("Browser Settings")).toBeVisible();
259
- } else {
260
- expect(
261
- within(progress()).queryByText("Browser Settings"),
262
- ).not.toBeInTheDocument();
263
- }
305
+ expect(queryNextButton()).toHaveTextContent("Next");
306
+ });
307
+ expect(queryMainButton()).not.toBeInTheDocument();
308
+ await user.click(queryNextButton()!);
309
+ await within(dialog()).findByRole("textbox", { name: "Allowed Origins" });
310
+ await waitFor(() => {
311
+ expect(activeStep()).toBe("Browser Settings");
264
312
  });
265
313
  }
266
314
 
267
- async function enterBrowserSettings(user: UserEvent): Promise<void> {
268
- await selectType(user, TelemetryIngestionKeyType.Browser);
269
- await next(user);
270
- await screen.findByRole("textbox", { name: "Allowed Origins" });
315
+ function originsInput(): HTMLElement {
316
+ return within(dialog()).getByRole("textbox", { name: "Allowed Origins" });
271
317
  }
272
318
 
273
- async function goBackTo(user: UserEvent, title: string): Promise<void> {
274
- await user.click(within(progress()).getByText(title));
275
- await waitFor(() => {
276
- expect(activeStep()).toBe(title);
277
- });
319
+ interface CreateRequest {
320
+ model: TelemetryIngestionKey;
321
+ miscDataProps: JSONObject;
278
322
  }
279
323
 
280
- async function expectSummary(): Promise<void> {
281
- await waitFor(() => {
282
- expect(activeStep()).toBe("Summary");
283
- });
284
- const createButton: HTMLElement = await within(dialog()).findByRole(
285
- "button",
286
- {
287
- name: "Create Ingestion Key",
288
- },
289
- );
324
+ async function create(user: UserEvent): Promise<CreateRequest> {
290
325
  await waitFor(() => {
291
- expect(createButton).toBeEnabled();
326
+ expect(mainButton()).toHaveTextContent("Create Ingestion Key");
292
327
  });
293
- expect(createOrUpdateMock).not.toHaveBeenCalled();
294
- }
295
-
296
- async function submit(user: UserEvent): Promise<TelemetryIngestionKey> {
297
- await user.click(
298
- await within(dialog()).findByRole("button", {
299
- name: "Create Ingestion Key",
300
- }),
301
- );
328
+ await user.click(mainButton());
302
329
  await waitFor(() => {
303
330
  expect(createOrUpdateMock).toHaveBeenCalledTimes(1);
304
331
  expect(successMock).toHaveBeenCalledTimes(1);
305
332
  });
306
- return (
307
- createOrUpdateMock.mock.calls[0]?.[0] as {
308
- model: TelemetryIngestionKey;
309
- }
310
- ).model;
333
+ return createOrUpdateMock.mock.calls[0]?.[0] as CreateRequest;
311
334
  }
312
335
 
313
- describe("Telemetry ingestion key creation wizard", () => {
336
+ describe("Settings > Telemetry Ingestion Keys > Create", () => {
314
337
  beforeEach(() => {
315
338
  jest.restoreAllMocks();
316
339
  isFreePlan = false;
317
340
  capturedTableProps = null;
318
- createOrUpdateMock.mockReset().mockResolvedValue({ data: {} });
341
+ createOrUpdateMock.mockReset().mockResolvedValue({
342
+ data: { _id: KEY_ID, name: "Server key" },
343
+ });
319
344
  closeMock.mockReset();
320
345
  successMock.mockReset();
321
346
  jest
322
347
  .spyOn(ProjectUtil, "getCurrentProjectId")
323
- .mockReturnValue(new ObjectID("11111111-1111-4111-8111-111111111111"));
348
+ .mockReturnValue(new ObjectID(PROJECT_ID));
324
349
  jest
325
350
  .spyOn(Navigation, "getCurrentRoute")
326
351
  .mockReturnValue(new Route("/settings/telemetry-ingestion-keys"));
352
+ jest.spyOn(Navigation, "navigate").mockImplementation((): void => {});
327
353
  });
328
354
 
329
355
  afterEach(() => {
330
356
  cleanup();
331
357
  });
332
358
 
333
- test("opens with only name and description and cannot skip to an unfinished step", async () => {
334
- const user: UserEvent = await renderWizard();
335
- expect(screen.getByPlaceholderText("Ingestion Key Name")).toBeVisible();
336
- expect(
337
- screen.getByPlaceholderText("Ingestion Key Description"),
338
- ).toBeVisible();
339
- expect(screen.queryByRole("radiogroup")).not.toBeInTheDocument();
340
- expect(
341
- screen.queryByRole("textbox", { name: "Allowed Origins" }),
342
- ).not.toBeInTheDocument();
343
- expect(
344
- within(progress()).queryByText("Browser Settings"),
345
- ).not.toBeInTheDocument();
346
- expect(within(progress()).queryByText("Billing")).not.toBeInTheDocument();
347
- expect(
348
- within(dialog()).queryByRole("button", { name: "Back" }),
349
- ).not.toBeInTheDocument();
350
- expect(capturedTableProps?.formSteps?.[0]?.id).toBe("details");
351
-
352
- await user.click(within(progress()).getByText("Key Type"));
353
- await user.click(within(progress()).getByText("Summary"));
354
-
355
- expect(screen.getByPlaceholderText("Ingestion Key Name")).toBeVisible();
356
- expect(createOrUpdateMock).not.toHaveBeenCalled();
357
- });
358
-
359
- test.each(["", "A", " "])(
360
- "keeps invalid name %j on the details step with an inline error",
361
- async (name: string) => {
362
- const user: UserEvent = await renderWizard();
363
- if (name) {
364
- await user.type(
365
- screen.getByPlaceholderText("Ingestion Key Name"),
366
- name,
367
- );
368
- }
369
- await next(user);
359
+ describe("a Server key on a paid plan", () => {
360
+ test("is one page: the name filled in, Server picked, the description folded, nothing to walk", async () => {
361
+ await renderPage();
370
362
 
363
+ expect(nameInput()).toBeVisible();
364
+ expect(nameInput()).toHaveValue("Server key");
371
365
  expect(
372
- await screen.findByText(
373
- name ? /Name cannot be less than 2/ : "Name is required.",
374
- ),
366
+ within(dialog()).getByRole("radiogroup", { name: "Key Type" }),
375
367
  ).toBeVisible();
376
- expect(screen.getByPlaceholderText("Ingestion Key Name")).toBeVisible();
377
- expect(screen.queryByRole("radiogroup")).not.toBeInTheDocument();
378
- expect(createOrUpdateMock).not.toHaveBeenCalled();
379
- },
380
- );
381
-
382
- test("keeps key type on its own step and defaults to a server key", async () => {
383
- const user: UserEvent = await renderWizard();
384
- await enterDetails(user, DESCRIPTION);
385
-
386
- expect(
387
- screen.queryByPlaceholderText("Ingestion Key Name"),
388
- ).not.toBeInTheDocument();
389
- expect(
390
- screen.queryByPlaceholderText("Ingestion Key Description"),
391
- ).not.toBeInTheDocument();
392
- expect(activeStep()).toBe("Key Type");
393
- expect(screen.getByTestId("card-select-option-Server")).toHaveAttribute(
394
- "aria-checked",
395
- "true",
396
- );
397
- expect(screen.getByTestId("card-select-option-Browser")).toHaveAttribute(
398
- "aria-checked",
399
- "false",
400
- );
401
- expect(
402
- screen.queryByRole("textbox", { name: "Allowed Origins" }),
403
- ).not.toBeInTheDocument();
404
- expect(screen.queryByPlaceholderText(SERVICE)).not.toBeInTheDocument();
405
- expect(createOrUpdateMock).not.toHaveBeenCalled();
406
- });
368
+ expect(card(TelemetryIngestionKeyType.Server)).toHaveAttribute(
369
+ "aria-checked",
370
+ "true",
371
+ );
372
+ expect(card(TelemetryIngestionKeyType.Browser)).toHaveAttribute(
373
+ "aria-checked",
374
+ "false",
375
+ );
407
376
 
408
- test("reviews and submits a server key without requiring a description or browser settings", async () => {
409
- const user: UserEvent = await renderWizard();
410
- await enterDetails(user);
411
- await next(user);
412
- await expectSummary();
413
-
414
- expect(within(dialog()).getByText(NAME)).toBeVisible();
415
- expect(
416
- within(dialog()).queryByText("Allowed Origins"),
417
- ).not.toBeInTheDocument();
418
- expect(
419
- within(dialog()).queryByText("Pinned Service Name"),
420
- ).not.toBeInTheDocument();
421
- const model: TelemetryIngestionKey = await submit(user);
422
- expect(model.name).toBe(NAME);
423
- expect(model.description || "").toBe("");
424
- expect(model.keyType).toBe(TelemetryIngestionKeyType.Server);
425
- expect(model.allowedOrigins).toBeFalsy();
426
- expect(model.pinnedServiceName).toBeFalsy();
427
- expect(successMock).toHaveBeenCalledTimes(1);
428
- });
377
+ // Description is under a folded Advanced header.
378
+ expect(advancedHeader()).toHaveAttribute("aria-expanded", "false");
379
+ expect(descriptionInput()).not.toBeVisible();
429
380
 
430
- test("selects a key type with the keyboard without submitting or advancing the wizard", async () => {
431
- const user: UserEvent = await renderWizard();
432
- await enterDetails(user);
433
- const browser: HTMLElement = screen.getByTestId(
434
- "card-select-option-Browser",
435
- );
436
- browser.focus();
437
- await user.keyboard("{Enter}");
381
+ // One page: no step list, no "Step 1 of 1", no Summary, no Back.
382
+ expect(progress()).not.toBeInTheDocument();
383
+ expect(
384
+ within(dialog()).queryByText(/Step \d+ of \d+/),
385
+ ).not.toBeInTheDocument();
386
+ expect(within(dialog()).queryByText("Summary")).not.toBeInTheDocument();
387
+ expect(
388
+ within(dialog()).queryByRole("button", { name: "Back" }),
389
+ ).not.toBeInTheDocument();
390
+ expect(
391
+ within(dialog()).queryByTestId("modal-footer-next-button"),
392
+ ).not.toBeInTheDocument();
393
+ expect(mainButton()).toHaveTextContent("Create Ingestion Key");
438
394
 
439
- expect(browser).toHaveAttribute("aria-checked", "true");
440
- expect(screen.getByTestId("card-select-option-Server")).toHaveAttribute(
441
- "aria-checked",
442
- "false",
443
- );
444
- expect(activeStep()).toBe("Key Type");
445
- expect(createOrUpdateMock).not.toHaveBeenCalled();
446
- await waitFor(() => {
447
- expect(within(progress()).getByText("Browser Settings")).toBeVisible();
395
+ // Nothing of a Browser key is asked of a Server key.
396
+ expect(
397
+ within(dialog()).queryByRole("textbox", { name: "Allowed Origins" }),
398
+ ).not.toBeInTheDocument();
399
+ expect(
400
+ within(dialog()).queryByPlaceholderText(SERVICE),
401
+ ).not.toBeInTheDocument();
402
+ expect(capturedTableProps?.formSummary).toBeUndefined();
448
403
  });
449
- await next(user);
450
- expect(activeStep()).toBe("Browser Settings");
451
- });
452
404
 
453
- test("preserves details when revisiting a completed step and submits the edited values", async () => {
454
- const user: UserEvent = await renderWizard();
455
- await enterDetails(user, DESCRIPTION);
456
- expect(
457
- within(dialog()).queryByRole("button", { name: "Back" }),
458
- ).not.toBeInTheDocument();
459
- await goBackTo(user, "Details");
460
- expect(activeStep()).toBe("Details");
461
-
462
- await waitFor(() => {
463
- expect(screen.getByPlaceholderText("Ingestion Key Name")).toHaveValue(
464
- NAME,
405
+ test("is created with one click, as it was filled in", async () => {
406
+ const user: UserEvent = await renderPage();
407
+ const request: CreateRequest = await create(user);
408
+
409
+ expect(request.model.name).toBe("Server key");
410
+ expect(request.model.keyType).toBe(TelemetryIngestionKeyType.Server);
411
+ expect(request.model.description || "").toBe("");
412
+ expect(request.model.allowedOrigins).toBeFalsy();
413
+ expect(request.model.pinnedServiceName).toBeFalsy();
414
+ expect(request.miscDataProps).not.toHaveProperty(
415
+ "telemetryPayAsYouGoNotice",
465
416
  );
466
- expect(
467
- screen.getByPlaceholderText("Ingestion Key Description"),
468
- ).toHaveValue(DESCRIPTION);
469
417
  });
470
- await user.type(screen.getByPlaceholderText("Ingestion Key Name"), " v2");
471
- await next(user);
472
- await next(user);
473
- await expectSummary();
474
-
475
- const model: TelemetryIngestionKey = await submit(user);
476
- expect(model.name).toBe(`${NAME} v2`);
477
- expect(model.description).toBe(DESCRIPTION);
478
- });
479
-
480
- test("reveals browser settings only after choosing a browser key and leaving the type step", async () => {
481
- const user: UserEvent = await renderWizard();
482
- await enterDetails(user);
483
- await selectType(user, TelemetryIngestionKeyType.Browser);
484
-
485
- expect(within(progress()).getByText("Browser Settings")).toBeVisible();
486
- expect(
487
- screen.queryByRole("textbox", { name: "Allowed Origins" }),
488
- ).not.toBeInTheDocument();
489
- await next(user);
490
-
491
- expect(
492
- await screen.findByRole("textbox", { name: "Allowed Origins" }),
493
- ).toBeVisible();
494
- expect(screen.getByPlaceholderText(SERVICE)).toBeVisible();
495
- expect(screen.queryByRole("radiogroup")).not.toBeInTheDocument();
496
- expect(activeStep()).toBe("Browser Settings");
497
- });
498
418
 
499
- test("requires allowed origins on the browser step and rejects malformed JSON before review", async () => {
500
- const user: UserEvent = await renderWizard();
501
- await enterDetails(user);
502
- await enterBrowserSettings(user);
503
- await next(user);
504
- expect(
505
- await screen.findByText("Allowed Origins is required."),
506
- ).toBeVisible();
507
- expect(activeStep()).toBe("Browser Settings");
419
+ test("then opens on its own page, where its secret is", async () => {
420
+ const user: UserEvent = await renderPage();
421
+ await create(user);
508
422
 
509
- for (const origins of [
510
- '["https://app.example.com"',
511
- " ",
512
- "{{origins}}",
513
- ]) {
514
- fireEvent.change(
515
- screen.getByRole("textbox", { name: "Allowed Origins" }),
516
- { target: { value: origins } },
423
+ await waitFor(() => {
424
+ expect(Navigation.navigate).toHaveBeenCalledTimes(1);
425
+ });
426
+ const route: Route = jest.mocked(Navigation.navigate).mock
427
+ .calls[0]?.[0] as Route;
428
+ expect(route.toString()).toBe(
429
+ `/dashboard/${PROJECT_ID}/settings/telemetry-ingestion-keys/${KEY_ID}`,
517
430
  );
518
- await next(user);
519
- expect(
520
- await screen.findByText(/Allowed Origins is not valid JSON/),
521
- ).toBeVisible();
522
- expect(activeStep()).toBe("Browser Settings");
523
- expect(createOrUpdateMock).not.toHaveBeenCalled();
524
- }
525
- });
431
+ });
526
432
 
527
- test.each([true, false])(
528
- "reviews and submits a browser key with optional service pin populated=%s",
529
- async (withService: boolean) => {
530
- const user: UserEvent = await renderWizard();
531
- await enterDetails(user, DESCRIPTION);
532
- await enterBrowserSettings(user);
533
- fireEvent.change(
534
- screen.getByRole("textbox", { name: "Allowed Origins" }),
535
- {
536
- target: { value: ORIGINS },
537
- },
538
- );
539
- if (withService) {
540
- fireEvent.change(screen.getByPlaceholderText(SERVICE), {
541
- target: { value: SERVICE },
542
- });
543
- }
544
- await next(user);
545
- await expectSummary();
546
-
547
- expect(within(dialog()).getByText(NAME)).toBeVisible();
548
- expect(within(dialog()).getByText("Allowed Origins")).toBeVisible();
549
- const model: TelemetryIngestionKey = await submit(user);
550
- expect(model.name).toBe(NAME);
551
- expect(model.description).toBe(DESCRIPTION);
552
- expect(model.keyType).toBe(TelemetryIngestionKeyType.Browser);
553
- expect(model.allowedOrigins).toEqual(JSON.parse(ORIGINS));
554
- expect(model.pinnedServiceName || "").toBe(withService ? SERVICE : "");
555
- },
556
- );
557
-
558
- test("blocks empty lists, non-array JSON, non-text entries and origin URLs with paths", async () => {
559
- const user: UserEvent = await renderWizard();
560
- await enterDetails(user);
561
- await enterBrowserSettings(user);
562
- for (const origins of [
563
- "[]",
564
- "{}",
565
- '["https://app.example.com", 17]',
566
- '["https://app.example.com/path"]',
567
- ]) {
568
- fireEvent.change(
569
- screen.getByRole("textbox", { name: "Allowed Origins" }),
570
- { target: { value: origins } },
433
+ test("a name of one's own and a description are sent", async () => {
434
+ const user: UserEvent = await renderPage();
435
+
436
+ fireEvent.change(nameInput(), {
437
+ target: { value: "Production collectors" },
438
+ });
439
+ await user.click(advancedHeader());
440
+ expect(descriptionInput()).toBeVisible();
441
+ fireEvent.change(descriptionInput(), {
442
+ target: { value: "The collectors in eu-west-1." },
443
+ });
444
+
445
+ const request: CreateRequest = await create(user);
446
+ expect(request.model.name).toBe("Production collectors");
447
+ expect(request.model.description).toBe("The collectors in eu-west-1.");
448
+ expect(request.model.keyType).toBe(TelemetryIngestionKeyType.Server);
449
+ });
450
+
451
+ test.each(["", "A", " "])(
452
+ "the name %j is refused under the field, and nothing is created",
453
+ async (name: string) => {
454
+ const user: UserEvent = await renderPage();
455
+
456
+ fireEvent.change(nameInput(), { target: { value: name } });
457
+ await user.click(mainButton());
458
+
459
+ expect(
460
+ await within(dialog()).findByText(
461
+ name ? /Name cannot be less than 2/ : "Name is required.",
462
+ ),
463
+ ).toBeVisible();
464
+ expect(createOrUpdateMock).not.toHaveBeenCalled();
465
+ expect(Navigation.navigate).not.toHaveBeenCalled();
466
+ },
467
+ );
468
+
469
+ test("Cancel closes without creating a key", async () => {
470
+ const user: UserEvent = await renderPage();
471
+
472
+ await user.click(
473
+ within(dialog()).getByRole("button", { name: "Cancel" }),
571
474
  );
572
- await next(user);
573
475
 
574
- expect(activeStep()).toBe("Browser Settings");
575
- expect(within(dialog()).getByRole("alert")).toBeVisible();
476
+ expect(closeMock).toHaveBeenCalledTimes(1);
576
477
  expect(createOrUpdateMock).not.toHaveBeenCalled();
577
- }
478
+ });
578
479
  });
579
480
 
580
- test("retains browser settings on backward navigation and omits their step and summary after switching to server", async () => {
581
- const user: UserEvent = await renderWizard();
582
- await enterDetails(user);
583
- await enterBrowserSettings(user);
584
- fireEvent.change(screen.getByRole("textbox", { name: "Allowed Origins" }), {
585
- target: { value: ORIGINS },
586
- });
587
- fireEvent.change(screen.getByPlaceholderText(SERVICE), {
588
- target: { value: SERVICE },
589
- });
590
- await goBackTo(user, "Key Type");
591
- await next(user);
481
+ describe("the name follows the type", () => {
482
+ test("until a name of one's own is typed", async () => {
483
+ const user: UserEvent = await renderPage();
592
484
 
593
- await waitFor(() => {
594
- expect(
595
- screen.getByRole("textbox", { name: "Allowed Origins" }),
596
- ).toHaveValue(ORIGINS);
597
- expect(screen.getByPlaceholderText(SERVICE)).toHaveValue(SERVICE);
485
+ await pickType(user, TelemetryIngestionKeyType.Browser);
486
+ await waitFor(() => {
487
+ expect(nameInput()).toHaveValue("Browser key");
488
+ });
489
+
490
+ await pickType(user, TelemetryIngestionKeyType.Server);
491
+ await waitFor(() => {
492
+ expect(nameInput()).toHaveValue("Server key");
493
+ });
494
+
495
+ fireEvent.change(nameInput(), { target: { value: "Storefront" } });
496
+ await pickType(user, TelemetryIngestionKeyType.Browser);
497
+ expect(nameInput()).toHaveValue("Storefront");
498
+
499
+ await pickType(user, TelemetryIngestionKeyType.Server);
500
+ expect(nameInput()).toHaveValue("Storefront");
598
501
  });
599
- await goBackTo(user, "Key Type");
600
- await selectType(user, TelemetryIngestionKeyType.Server);
601
- expect(
602
- within(progress()).queryByText("Browser Settings"),
603
- ).not.toBeInTheDocument();
604
- await next(user);
605
- await expectSummary();
606
-
607
- expect(
608
- within(dialog()).queryByText("Allowed Origins"),
609
- ).not.toBeInTheDocument();
610
- expect(
611
- within(dialog()).queryByText("Pinned Service Name"),
612
- ).not.toBeInTheDocument();
613
- const model: TelemetryIngestionKey = await submit(user);
614
- expect(model.keyType).toBe(TelemetryIngestionKeyType.Server);
615
- expect(model.allowedOrigins).toBeFalsy();
616
- expect(model.pinnedServiceName).toBeFalsy();
617
- });
618
502
 
619
- test("discards malformed browser drafts before submitting a server key", async () => {
620
- const user: UserEvent = await renderWizard();
621
- await enterDetails(user);
622
- await enterBrowserSettings(user);
623
- fireEvent.change(screen.getByRole("textbox", { name: "Allowed Origins" }), {
624
- target: { value: '["https://app.example.com"' },
503
+ test("and picks it up again once the name is cleared", async () => {
504
+ const user: UserEvent = await renderPage();
505
+
506
+ fireEvent.change(nameInput(), { target: { value: "" } });
507
+ await pickType(user, TelemetryIngestionKeyType.Browser);
508
+
509
+ await waitFor(() => {
510
+ expect(nameInput()).toHaveValue("Browser key");
511
+ });
625
512
  });
626
- fireEvent.change(screen.getByPlaceholderText(SERVICE), {
627
- target: { value: SERVICE },
513
+
514
+ test("choosing the type with the keyboard neither submits nor walks on", async () => {
515
+ const user: UserEvent = await renderPage();
516
+ const browser: HTMLElement = card(TelemetryIngestionKeyType.Browser);
517
+
518
+ browser.focus();
519
+ await user.keyboard("{Enter}");
520
+
521
+ expect(browser).toHaveAttribute("aria-checked", "true");
522
+ expect(createOrUpdateMock).not.toHaveBeenCalled();
523
+ await waitFor(() => {
524
+ expect(nameInput()).toHaveValue("Browser key");
525
+ });
526
+ expect(nameInput()).toBeVisible();
628
527
  });
629
- await next(user);
630
- expect(
631
- await screen.findByText(/Allowed Origins is not valid JSON/),
632
- ).toBeVisible();
633
- await goBackTo(user, "Key Type");
634
- await selectType(user, TelemetryIngestionKeyType.Server);
635
- await next(user);
636
- await expectSummary();
637
-
638
- const model: TelemetryIngestionKey = await submit(user);
639
- expect(model.keyType).toBe(TelemetryIngestionKeyType.Server);
640
- expect(model.allowedOrigins).toBeFalsy();
641
- expect(model.pinnedServiceName).toBeFalsy();
642
528
  });
643
529
 
644
- test("requires fresh browser settings when switching back from a server key", async () => {
645
- const user: UserEvent = await renderWizard();
646
- await enterDetails(user);
647
- await enterBrowserSettings(user);
648
- fireEvent.change(screen.getByRole("textbox", { name: "Allowed Origins" }), {
649
- target: { value: ORIGINS },
650
- });
651
- fireEvent.change(screen.getByPlaceholderText(SERVICE), {
652
- target: { value: SERVICE },
530
+ describe("a Browser key", () => {
531
+ test("brings its Browser Settings step: the step list appears, and Key offers a plain Next instead of Create", async () => {
532
+ const user: UserEvent = await renderPage();
533
+
534
+ await pickType(user, TelemetryIngestionKeyType.Browser);
535
+
536
+ await waitFor(() => {
537
+ expect(stepTitles()).toEqual(["Key", "Browser Settings"]);
538
+ });
539
+ expect(activeStep()).toBe("Key");
540
+ // Key is not the last step now: Next, and no Create.
541
+ await waitFor(() => {
542
+ expect(queryNextButton()).toHaveTextContent("Next");
543
+ });
544
+ expect(queryMainButton()).not.toBeInTheDocument();
545
+ expect(
546
+ within(dialog()).queryByRole("textbox", { name: "Allowed Origins" }),
547
+ ).not.toBeInTheDocument();
653
548
  });
654
- await goBackTo(user, "Key Type");
655
- await selectType(user, TelemetryIngestionKeyType.Server);
656
- await selectType(user, TelemetryIngestionKeyType.Browser);
657
- await next(user);
658
-
659
- expect(
660
- screen.getByRole("textbox", { name: "Allowed Origins" }),
661
- ).toHaveValue("");
662
- expect(screen.getByPlaceholderText(SERVICE)).toHaveValue("");
663
- await next(user);
664
- expect(
665
- await screen.findByText("Allowed Origins is required."),
666
- ).toBeVisible();
667
- expect(createOrUpdateMock).not.toHaveBeenCalled();
668
- });
669
549
 
670
- test.each([
671
- TelemetryIngestionKeyType.Server,
672
- TelemetryIngestionKeyType.Browser,
673
- ])(
674
- "shows Free plan pricing on a dedicated billing step before submitting a %s key",
675
- async (keyType: TelemetryIngestionKeyType) => {
676
- isFreePlan = true;
677
- const user: UserEvent = await renderWizard();
550
+ test("asks for the origins, with the pinned service name folded under Advanced", async () => {
551
+ const user: UserEvent = await renderPage();
552
+ await goToBrowserSettings(user);
553
+
554
+ expect(originsInput()).toBeVisible();
555
+ expect(within(dialog()).getByPlaceholderText(SERVICE)).not.toBeVisible();
556
+ expect(advancedHeader()).toHaveAttribute("aria-expanded", "false");
678
557
  expect(
679
- within(dialog()).queryByRole("region", { name: "Telemetry pricing" }),
558
+ within(dialog()).queryByPlaceholderText("Ingestion Key Name"),
680
559
  ).not.toBeInTheDocument();
681
- await enterDetails(user);
682
560
  expect(
683
- within(dialog()).queryByRole("region", { name: "Telemetry pricing" }),
561
+ within(dialog()).queryByRole("radiogroup", { name: "Key Type" }),
684
562
  ).not.toBeInTheDocument();
685
- if (keyType === TelemetryIngestionKeyType.Browser) {
686
- await enterBrowserSettings(user);
687
- fireEvent.change(
688
- screen.getByRole("textbox", { name: "Allowed Origins" }),
689
- {
690
- target: { value: ORIGINS },
691
- },
692
- );
563
+ });
564
+
565
+ test("refuses missing, malformed and unusable origins under the field", async () => {
566
+ const user: UserEvent = await renderPage();
567
+ await goToBrowserSettings(user);
568
+
569
+ await user.click(mainButton());
570
+ expect(
571
+ await within(dialog()).findByText("Allowed Origins is required."),
572
+ ).toBeVisible();
573
+
574
+ for (const [value, error] of [
575
+ ['["https://app.example.com"', /Allowed Origins is not valid JSON/],
576
+ ["[]", /at least one allowed origin/],
577
+ ['{"origin":"https://app.example.com"}', /at least one allowed origin/],
578
+ ['["https://app.example.com", 17]', /must be text/],
579
+ ['["https://app.example.com/path"]', /must not contain a path/],
580
+ ] as Array<[string, RegExp]>) {
581
+ fireEvent.change(originsInput(), { target: { value } });
582
+ await user.click(mainButton());
583
+
584
+ expect(await within(dialog()).findByText(error)).toBeVisible();
585
+ expect(activeStep()).toBe("Browser Settings");
586
+ expect(createOrUpdateMock).not.toHaveBeenCalled();
693
587
  }
694
- await next(user);
588
+ });
695
589
 
696
- const notice: HTMLElement = await within(dialog()).findByRole("region", {
697
- name: "Telemetry pricing",
590
+ test.each([true, false])(
591
+ "is created with its origins, the pinned service name filled in: %s",
592
+ async (withService: boolean) => {
593
+ const user: UserEvent = await renderPage();
594
+ await goToBrowserSettings(user);
595
+
596
+ fireEvent.change(originsInput(), { target: { value: ORIGINS } });
597
+ if (withService) {
598
+ await user.click(advancedHeader());
599
+ fireEvent.change(within(dialog()).getByPlaceholderText(SERVICE), {
600
+ target: { value: SERVICE },
601
+ });
602
+ }
603
+
604
+ const request: CreateRequest = await create(user);
605
+ expect(request.model.name).toBe("Browser key");
606
+ expect(request.model.keyType).toBe(TelemetryIngestionKeyType.Browser);
607
+ expect(request.model.allowedOrigins).toEqual(JSON.parse(ORIGINS));
608
+ expect(request.model.pinnedServiceName || "").toBe(
609
+ withService ? SERVICE : "",
610
+ );
611
+ },
612
+ );
613
+
614
+ test("switching back to Server drops the step and the drafts, and the key is a Server key", async () => {
615
+ const user: UserEvent = await renderPage();
616
+ await goToBrowserSettings(user);
617
+
618
+ fireEvent.change(originsInput(), {
619
+ target: { value: '["https://app.example.com"' },
698
620
  });
699
- expect(notice).toHaveTextContent("Session replay");
700
- expect(notice).toHaveTextContent("payment method");
701
- expect(activeStep()).toBe("Billing");
702
- expect(within(dialog()).queryByRole("checkbox")).not.toBeInTheDocument();
703
- expect(createOrUpdateMock).not.toHaveBeenCalled();
704
- await next(user);
705
- await expectSummary();
621
+ await user.click(advancedHeader());
622
+ fireEvent.change(within(dialog()).getByPlaceholderText(SERVICE), {
623
+ target: { value: SERVICE },
624
+ });
625
+
626
+ await user.click(within(progress() as HTMLElement).getByText("Key"));
627
+ await waitFor(() => {
628
+ expect(activeStep()).toBe("Key");
629
+ });
630
+ await pickType(user, TelemetryIngestionKeyType.Server);
631
+
632
+ // One step again: the page it started as.
633
+ await waitFor(() => {
634
+ expect(progress()).not.toBeInTheDocument();
635
+ });
636
+ expect(nameInput()).toHaveValue("Server key");
637
+
638
+ const request: CreateRequest = await create(user);
639
+ expect(request.model.keyType).toBe(TelemetryIngestionKeyType.Server);
640
+ expect(request.model.allowedOrigins).toBeFalsy();
641
+ expect(request.model.pinnedServiceName).toBeFalsy();
642
+ });
643
+
644
+ test("switching to Server and back asks for fresh origins", async () => {
645
+ const user: UserEvent = await renderPage();
646
+ await goToBrowserSettings(user);
647
+ fireEvent.change(originsInput(), { target: { value: ORIGINS } });
648
+
649
+ await user.click(within(progress() as HTMLElement).getByText("Key"));
650
+ await pickType(user, TelemetryIngestionKeyType.Server);
651
+ await pickType(user, TelemetryIngestionKeyType.Browser);
652
+ await waitFor(() => {
653
+ expect(queryNextButton()).toHaveTextContent("Next");
654
+ });
655
+ await user.click(queryNextButton()!);
656
+
706
657
  expect(
707
- within(dialog()).getByRole("region", { name: "Telemetry pricing" }),
708
- ).toHaveTextContent("Session replay");
709
- expect((await submit(user)).keyType).toBe(keyType);
710
-
711
- const request: {
712
- model: TelemetryIngestionKey;
713
- miscDataProps: JSONObject;
714
- } = createOrUpdateMock.mock.calls[0]?.[0] as {
715
- model: TelemetryIngestionKey;
716
- miscDataProps: JSONObject;
717
- };
718
- expect(request.miscDataProps).not.toHaveProperty(
719
- "telemetryPayAsYouGoNotice",
720
- );
721
- expect(JSON.stringify(request.model)).not.toContain(
722
- "telemetryPayAsYouGoNotice",
723
- );
724
- },
725
- );
658
+ await within(dialog()).findByRole("textbox", {
659
+ name: "Allowed Origins",
660
+ }),
661
+ ).toHaveValue("");
662
+ await user.click(mainButton());
663
+ expect(
664
+ await within(dialog()).findByText("Allowed Origins is required."),
665
+ ).toBeVisible();
666
+ expect(createOrUpdateMock).not.toHaveBeenCalled();
667
+ });
668
+ });
726
669
 
727
- test("cancels from a later step without creating a key", async () => {
728
- const user: UserEvent = await renderWizard();
729
- await enterDetails(user);
730
- await user.click(within(dialog()).getByRole("button", { name: "Cancel" }));
670
+ describe("on the Free plan", () => {
671
+ test.each([
672
+ TelemetryIngestionKeyType.Server,
673
+ TelemetryIngestionKeyType.Browser,
674
+ ])(
675
+ "a %s key is created only once the pricing on the Billing step has been shown",
676
+ async (keyType: TelemetryIngestionKeyType) => {
677
+ isFreePlan = true;
678
+ const user: UserEvent = await renderPage();
679
+
680
+ expect(
681
+ within(dialog()).queryByRole("region", {
682
+ name: "Telemetry pricing",
683
+ }),
684
+ ).not.toBeInTheDocument();
685
+
686
+ if (keyType === TelemetryIngestionKeyType.Browser) {
687
+ await goToBrowserSettings(user);
688
+ fireEvent.change(originsInput(), { target: { value: ORIGINS } });
689
+ }
690
+
691
+ /*
692
+ * Every other step is valid, but Billing - the last step - has not
693
+ * been shown, and Create is on the last step only.
694
+ */
695
+ expect(queryMainButton()).not.toBeInTheDocument();
696
+ expect(queryNextButton()).toHaveTextContent("Next");
697
+ await user.click(queryNextButton()!);
698
+
699
+ const notice: HTMLElement = await within(dialog()).findByRole(
700
+ "region",
701
+ { name: "Telemetry pricing" },
702
+ );
703
+ expect(notice).toHaveTextContent("Session replay");
704
+ expect(notice).toHaveTextContent("payment method");
705
+ expect(activeStep()).toBe("Billing");
706
+ expect(
707
+ within(dialog()).queryByRole("checkbox"),
708
+ ).not.toBeInTheDocument();
709
+ expect(createOrUpdateMock).not.toHaveBeenCalled();
710
+
711
+ const request: CreateRequest = await create(user);
712
+ expect(request.model.keyType).toBe(keyType);
713
+ expect(request.miscDataProps).not.toHaveProperty(
714
+ "telemetryPayAsYouGoNotice",
715
+ );
716
+ expect(JSON.stringify(request.model)).not.toContain(
717
+ "telemetryPayAsYouGoNotice",
718
+ );
719
+ },
720
+ );
731
721
 
732
- expect(closeMock).toHaveBeenCalledTimes(1);
733
- expect(createOrUpdateMock).not.toHaveBeenCalled();
722
+ test("the step list shows Key and Billing, and Browser Settings between them for a Browser key", async () => {
723
+ isFreePlan = true;
724
+ const user: UserEvent = await renderPage();
725
+
726
+ await waitFor(() => {
727
+ expect(stepTitles()).toEqual(["Key", "Billing"]);
728
+ });
729
+ await pickType(user, TelemetryIngestionKeyType.Browser);
730
+ await waitFor(() => {
731
+ expect(stepTitles()).toEqual(["Key", "Browser Settings", "Billing"]);
732
+ });
733
+ });
734
734
  });
735
735
  });