@oneuptime/common 14.0.12 → 14.0.13

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 (2060) hide show
  1. package/Models/DatabaseModels/AlertGroupingRule.ts +4 -3
  2. package/Models/DatabaseModels/AlertMeasurement.ts +16 -9
  3. package/Models/DatabaseModels/AlertReminderRule.ts +4 -3
  4. package/Models/DatabaseModels/AlertSeverity.ts +5 -2
  5. package/Models/DatabaseModels/AlertState.ts +5 -2
  6. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +17 -0
  7. package/Models/DatabaseModels/{IncidentForm.ts → Form.ts} +97 -205
  8. package/Models/DatabaseModels/{IncidentFormSubmission.ts → FormSubmission.ts} +158 -76
  9. package/Models/DatabaseModels/Incident.ts +1 -1
  10. package/Models/DatabaseModels/IncidentCustomField.ts +7 -3
  11. package/Models/DatabaseModels/IncidentGroupingRule.ts +4 -3
  12. package/Models/DatabaseModels/IncidentMeasurement.ts +15 -8
  13. package/Models/DatabaseModels/IncidentReminderRule.ts +4 -3
  14. package/Models/DatabaseModels/IncidentSeverity.ts +5 -2
  15. package/Models/DatabaseModels/IncidentSlaRule.ts +4 -3
  16. package/Models/DatabaseModels/IncidentState.ts +5 -2
  17. package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
  18. package/Models/DatabaseModels/IncomingCallPolicyEscalationRule.ts +5 -1
  19. package/Models/DatabaseModels/Index.ts +4 -4
  20. package/Models/DatabaseModels/LogDropFilter.ts +4 -3
  21. package/Models/DatabaseModels/LogPipeline.ts +4 -3
  22. package/Models/DatabaseModels/LogPipelineProcessor.ts +4 -3
  23. package/Models/DatabaseModels/LogScrubRule.ts +3 -2
  24. package/Models/DatabaseModels/MetricPipelineRule.ts +3 -2
  25. package/Models/DatabaseModels/MetricRecordingRule.ts +7 -2
  26. package/Models/DatabaseModels/MonitorStatus.ts +4 -1
  27. package/Models/DatabaseModels/NetworkDeviceRole.ts +3 -1
  28. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +9 -3
  29. package/Models/DatabaseModels/Project.ts +18 -11
  30. package/Models/DatabaseModels/RunbookRule.ts +343 -0
  31. package/Models/DatabaseModels/ScheduledMaintenance.ts +3 -1
  32. package/Models/DatabaseModels/ScheduledMaintenanceMeasurement.ts +15 -8
  33. package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +4 -3
  34. package/Models/DatabaseModels/ScheduledMaintenanceState.ts +5 -2
  35. package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -2
  36. package/Models/DatabaseModels/StatusPageFooterLink.ts +5 -1
  37. package/Models/DatabaseModels/StatusPageHeaderLink.ts +5 -1
  38. package/Models/DatabaseModels/StatusPageHistoryChartBarColorRule.ts +5 -1
  39. package/Models/DatabaseModels/TraceDropFilter.ts +4 -3
  40. package/Models/DatabaseModels/TracePipeline.ts +4 -3
  41. package/Models/DatabaseModels/TracePipelineProcessor.ts +4 -3
  42. package/Models/DatabaseModels/TraceRecordingRule.ts +7 -2
  43. package/Models/DatabaseModels/TraceScrubRule.ts +3 -2
  44. package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +49 -1
  45. package/Server/API/BaseAnalyticsAPI.ts +17 -0
  46. package/Server/API/{IncidentFormAPI.ts → FormAPI.ts} +77 -83
  47. package/Server/Infrastructure/Postgres/SchemaMigrations/1797300000000-TurnOnLinkedAlertSwitchesByDefault.ts +40 -0
  48. package/Server/Infrastructure/Postgres/SchemaMigrations/1797400000000-MigrateIncidentFormsToForms.ts +348 -0
  49. package/Server/Infrastructure/Postgres/SchemaMigrations/1797500000000-AddRunbookRuleMatchCriteria.ts +178 -0
  50. package/Server/Infrastructure/Postgres/SchemaMigrations/1797600000000-AddSeverityAndStateColorsToNotificationEmailRollup.ts +26 -0
  51. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  52. package/Server/Middleware/{IncidentFormRateLimit.ts → FormRateLimit.ts} +186 -194
  53. package/Server/Services/AlertEpisodeService.ts +5 -3
  54. package/Server/Services/AlertMeasurementService.ts +120 -23
  55. package/Server/Services/AlertReminderRuleService.ts +0 -31
  56. package/Server/Services/AlertService.ts +5 -3
  57. package/Server/Services/AlertSeverityService.ts +15 -109
  58. package/Server/Services/AlertStateService.ts +28 -119
  59. package/Server/Services/AnalyticsDatabaseService.ts +102 -9
  60. package/Server/Services/DatabaseService.ts +302 -0
  61. package/Server/Services/FormService.ts +1161 -0
  62. package/Server/Services/FormSubmissionService.ts +22 -0
  63. package/Server/Services/IncidentAlertService.ts +57 -24
  64. package/Server/Services/IncidentCustomFieldService.ts +4 -113
  65. package/Server/Services/IncidentEpisodeService.ts +5 -3
  66. package/Server/Services/IncidentMeasurementService.ts +123 -23
  67. package/Server/Services/IncidentReminderRuleService.ts +0 -31
  68. package/Server/Services/IncidentService.ts +5 -3
  69. package/Server/Services/IncidentSeverityService.ts +15 -114
  70. package/Server/Services/IncidentSlaRuleService.ts +0 -32
  71. package/Server/Services/IncidentStateService.ts +28 -119
  72. package/Server/Services/IncidentStateTimelineService.ts +2 -2
  73. package/Server/Services/IncomingCallPolicyEscalationRuleService.ts +22 -190
  74. package/Server/Services/Index.ts +4 -4
  75. package/Server/Services/LogService.ts +13 -0
  76. package/Server/Services/MetricRecordingRuleService.ts +106 -0
  77. package/Server/Services/MonitorStatusService.ts +27 -131
  78. package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +41 -0
  79. package/Server/Services/OnCallDutyPolicyService.ts +343 -0
  80. package/Server/Services/ProjectService.ts +62 -73
  81. package/Server/Services/RunbookRuleEngineService.ts +413 -41
  82. package/Server/Services/RunbookRuleService.ts +97 -0
  83. package/Server/Services/ScheduledMaintenanceMeasurementService.ts +126 -23
  84. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +0 -31
  85. package/Server/Services/ScheduledMaintenanceService.ts +5 -3
  86. package/Server/Services/ScheduledMaintenanceStateService.ts +28 -129
  87. package/Server/Services/SpanService.ts +21 -2
  88. package/Server/Services/StatusPageFooterLinkService.ts +9 -198
  89. package/Server/Services/StatusPageHeaderLinkService.ts +8 -197
  90. package/Server/Services/StatusPageHistoryChartBarColorRuleService.ts +9 -198
  91. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +17 -5
  92. package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +7 -6
  93. package/Server/Services/TraceRecordingRuleService.ts +15 -2
  94. package/Server/Services/UserNotificationRuleService.ts +41 -0
  95. package/Server/Types/AnalyticsDatabase/CountBy.ts +14 -0
  96. package/Server/Utils/Database/ListOrderMaintainer.ts +465 -0
  97. package/Server/Utils/Database/StateOrderGuard.ts +390 -0
  98. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +2 -0
  99. package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +86 -3
  100. package/Server/Utils/EmailRollup/EmailRollupWriter.ts +41 -0
  101. package/Server/Utils/Form/FormRecordOptions.ts +147 -0
  102. package/Server/Utils/Form/FormSubmissionNote.ts +215 -0
  103. package/Server/Utils/Form/FormTargetHandler.ts +410 -0
  104. package/Server/Utils/Form/FormTargets.ts +28 -0
  105. package/Server/Utils/Form/IncidentFormTarget.ts +580 -0
  106. package/Server/Utils/Form/ScheduledMaintenanceFormTarget.ts +401 -0
  107. package/Server/Utils/Measurement/MeasurementDefinitionChange.ts +81 -0
  108. package/Server/Utils/Measurement/MeasurementDefinitionValidator.ts +9 -4
  109. package/Server/Utils/Measurement/MeasurementKeyAssigner.ts +50 -0
  110. package/Server/Utils/Measurement/MeasurementMetricWriter.ts +22 -2
  111. package/Server/Utils/Measurement/MeasurementStateReference.ts +95 -0
  112. package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +1 -1
  113. package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +8 -7
  114. package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +24 -16
  115. package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +9 -1
  116. package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +4 -0
  117. package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +7 -5
  118. package/Tests/App/Accounts/FormPage.test.tsx +761 -0
  119. package/Tests/App/Accounts/FormServerMessages.test.ts +115 -0
  120. package/Tests/App/Accounts/FormUtils.test.ts +557 -0
  121. package/Tests/App/AdminDashboard/AdminMenusFolded.test.tsx +299 -0
  122. package/Tests/App/AdminDashboard/AdminProductsMenuUnfolded.test.tsx +133 -0
  123. package/Tests/App/ArchivedEntriesInAdvancedSection.test.tsx +662 -0
  124. package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +5 -4
  125. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +58 -0
  126. package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +25 -3
  127. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +108 -4
  128. package/Tests/App/Dashboard/ApiKeyCreateForm.test.ts +652 -0
  129. package/Tests/App/Dashboard/ApiKeyViewPermissions.test.tsx +756 -0
  130. package/Tests/App/Dashboard/ApiKeysCreateAccess.test.tsx +797 -0
  131. package/Tests/App/Dashboard/ArchivedResourceNavigation.test.tsx +50 -2
  132. package/Tests/App/Dashboard/BulkChangeStateModalColors.test.tsx +136 -0
  133. package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +7 -2
  134. package/Tests/App/Dashboard/ConnectedWorkspaces.test.tsx +771 -0
  135. package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +77 -20
  136. package/Tests/App/Dashboard/CreateOAuthWorkflowVariableFormSteps.test.tsx +6 -4
  137. package/Tests/App/Dashboard/CreateReviewStepRoleSummary.test.tsx +2 -2
  138. package/Tests/App/Dashboard/CreateReviewStepSelectionSummary.test.tsx +4 -4
  139. package/Tests/App/Dashboard/CreateWorkflowModal.test.tsx +549 -123
  140. package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +64 -1
  141. package/Tests/App/Dashboard/CriteriaFilterMonitorTypeChange.test.ts +127 -0
  142. package/Tests/App/Dashboard/CriteriaName.test.ts +831 -0
  143. package/Tests/App/Dashboard/CustomFieldDefinitionTableRender.test.tsx +485 -0
  144. package/Tests/App/Dashboard/CustomFieldSimpleCreate.test.tsx +1070 -0
  145. package/Tests/App/Dashboard/CustomFieldSimpleCreateRender.test.tsx +747 -0
  146. package/Tests/App/Dashboard/CustomFieldTablesTwoColumns.test.tsx +523 -0
  147. package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +92 -59
  148. package/Tests/App/Dashboard/DashboardComponentsAToLHelpersTranslation.test.ts +256 -0
  149. package/Tests/App/Dashboard/DashboardComponentsAToLTranslation.test.tsx +482 -0
  150. package/Tests/App/Dashboard/DashboardComponentsMRTranslation.test.tsx +805 -0
  151. package/Tests/App/Dashboard/DashboardFrenchLocale.test.tsx +335 -0
  152. package/Tests/App/Dashboard/DashboardGermanLocale.test.tsx +250 -0
  153. package/Tests/App/Dashboard/DashboardJapaneseLocale.test.tsx +435 -0
  154. package/Tests/App/Dashboard/DashboardPagesTranslation.test.tsx +449 -0
  155. package/Tests/App/Dashboard/DashboardPagesUtilsTranslation.test.ts +487 -0
  156. package/Tests/App/Dashboard/DashboardPhoneProductsMenu.test.tsx +262 -0
  157. package/Tests/App/Dashboard/DashboardRuntimeLocales.test.tsx +635 -0
  158. package/Tests/App/Dashboard/DashboardSpanishLocale.test.tsx +405 -0
  159. package/Tests/App/Dashboard/DeclareFormsAdvancedRender.test.tsx +550 -0
  160. package/Tests/App/Dashboard/DefaultInviteTeam.test.ts +600 -0
  161. package/Tests/App/Dashboard/DeveloperDocsGuides.test.ts +569 -127
  162. package/Tests/App/Dashboard/DeveloperDocsPage.test.tsx +337 -51
  163. package/Tests/App/Dashboard/DiscoveryScanStatusMessage.test.tsx +10 -1
  164. package/Tests/App/Dashboard/EntityFilterDropdownColors.test.tsx +269 -0
  165. package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +23 -12
  166. package/Tests/App/Dashboard/EscalationRuleForm.test.ts +426 -0
  167. package/Tests/App/Dashboard/EscalationRuleFormGuard.test.ts +239 -0
  168. package/Tests/App/Dashboard/EscalationRuleOneStep.test.tsx +997 -0
  169. package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +38 -10
  170. package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
  171. package/Tests/App/Dashboard/EventNotesUtil.test.ts +2 -2
  172. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +87 -0
  173. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +349 -145
  174. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +50 -18
  175. package/Tests/App/Dashboard/FeedOrdering.test.ts +116 -24
  176. package/Tests/App/Dashboard/FlameGraphLosesItsSpans.test.tsx +102 -0
  177. package/Tests/App/Dashboard/FormBuilderData.test.ts +280 -0
  178. package/Tests/App/Dashboard/FormBuilderParts.test.tsx +794 -0
  179. package/Tests/App/Dashboard/FormBuilderState.test.ts +630 -0
  180. package/Tests/App/Dashboard/FormBuilderUi.test.tsx +850 -0
  181. package/Tests/App/Dashboard/FormMappingCard.test.tsx +492 -0
  182. package/Tests/App/Dashboard/FormOnSubmit.test.ts +693 -0
  183. package/Tests/App/Dashboard/{IncidentFormPlan.test.ts → FormPlan.test.ts} +15 -15
  184. package/Tests/App/Dashboard/{IncidentFormShareLinkCard.test.tsx → FormShareLinkCard.test.tsx} +53 -73
  185. package/Tests/App/Dashboard/FormStatusCard.test.tsx +354 -0
  186. package/Tests/App/Dashboard/FormTargetCard.test.tsx +315 -0
  187. package/Tests/App/Dashboard/FormsMovedPagesAndSubmissions.test.tsx +270 -0
  188. package/Tests/App/Dashboard/FormsPages.test.tsx +574 -0
  189. package/Tests/App/Dashboard/GeneratedKeyForms.test.tsx +500 -0
  190. package/Tests/App/Dashboard/GroupingRuleComponents.test.tsx +792 -0
  191. package/Tests/App/Dashboard/GroupingRuleFormFlow.test.tsx +1109 -0
  192. package/Tests/App/Dashboard/GroupingRulePages.test.tsx +672 -0
  193. package/Tests/App/Dashboard/GroupingRuleTranslationRender.test.tsx +244 -0
  194. package/Tests/App/Dashboard/IncidentCreateAcknowledgeAlerts.test.tsx +7 -4
  195. package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +33 -15
  196. package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +640 -23
  197. package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +2 -0
  198. package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +37 -345
  199. package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +6 -541
  200. package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +188 -28
  201. package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +25 -3
  202. package/Tests/App/Dashboard/IncidentLinkedAlertsSettingsPage.test.tsx +583 -0
  203. package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +350 -52
  204. package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +7 -2
  205. package/Tests/App/Dashboard/IncidentRoleFormField.test.tsx +405 -0
  206. package/Tests/App/Dashboard/IncidentRolesSettingsPage.test.tsx +659 -0
  207. package/Tests/App/Dashboard/IncidentRuleConditions.test.tsx +405 -0
  208. package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +236 -21
  209. package/Tests/App/Dashboard/IncidentStatesPageTable.test.tsx +440 -0
  210. package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +24 -4
  211. package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +135 -3
  212. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +201 -14
  213. package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +12 -5
  214. package/Tests/App/Dashboard/InvestigationConversationData.test.ts +36 -12
  215. package/Tests/App/Dashboard/InvestigationDrawer.test.tsx +56 -0
  216. package/Tests/App/Dashboard/InviteUserDefaultTeam.test.tsx +586 -0
  217. package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +6 -3
  218. package/Tests/App/Dashboard/LabelsFormField.test.tsx +554 -0
  219. package/Tests/App/Dashboard/LogsResultTotal.test.tsx +827 -0
  220. package/Tests/App/Dashboard/MarkdownTemplateDialogsWide.test.tsx +306 -0
  221. package/Tests/App/Dashboard/MeasurementForms.test.tsx +927 -0
  222. package/Tests/App/Dashboard/MeasurementListAndChart.test.tsx +290 -0
  223. package/Tests/App/Dashboard/MeasurementPagesI18n.test.ts +148 -0
  224. package/Tests/App/Dashboard/MeasurementSetup.test.ts +618 -0
  225. package/Tests/App/Dashboard/MenuSpecificFoldedSections.test.tsx +494 -0
  226. package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +4 -4
  227. package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +40 -17
  228. package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +35 -10
  229. package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +3 -1
  230. package/Tests/App/Dashboard/MetricDescriptionsCatalog.test.ts +11 -2
  231. package/Tests/App/Dashboard/MonitorCriteriaActionToggles.test.tsx +0 -1
  232. package/Tests/App/Dashboard/MonitorCriteriaAdvancedOptions.test.tsx +0 -2
  233. package/Tests/App/Dashboard/MonitorCriteriaNameAndDescription.test.tsx +534 -0
  234. package/Tests/App/Dashboard/MonitorCriteriaOwners.test.tsx +281 -0
  235. package/Tests/App/Dashboard/MonitorCriteriaTemplateVariables.test.tsx +191 -0
  236. package/Tests/App/Dashboard/MonitorRecommendationSeverityColors.test.ts +73 -0
  237. package/Tests/App/Dashboard/MonitorStatusChangesCard.test.tsx +70 -6
  238. package/Tests/App/Dashboard/MonitorStepsCriteriaAlignmentWiring.test.tsx +168 -4
  239. package/Tests/App/Dashboard/MonitorStepsDefaultStatusAdvanced.test.tsx +448 -0
  240. package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +54 -0
  241. package/Tests/App/Dashboard/NetworkMetricTooltips.test.ts +9 -4
  242. package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +80 -7
  243. package/Tests/App/Dashboard/NotificationMethodTabsWorkspaces.test.tsx +280 -0
  244. package/Tests/App/Dashboard/NumberPrefixPageRedirects.test.tsx +365 -0
  245. package/Tests/App/Dashboard/NumberPrefixSettingsPages.test.tsx +1048 -0
  246. package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +11 -2
  247. package/Tests/App/Dashboard/OnCallPolicyCreateFormGuard.test.ts +328 -0
  248. package/Tests/App/Dashboard/OnCallPolicyFirstResponders.test.tsx +639 -0
  249. package/Tests/App/Dashboard/OnCallPolicySummaryNobodyPaged.test.tsx +293 -0
  250. package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +36 -18
  251. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +7 -1
  252. package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +1 -1
  253. package/Tests/App/Dashboard/OwnersCard.test.tsx +422 -0
  254. package/Tests/App/Dashboard/ProductOrientation.test.tsx +147 -9
  255. package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +28 -14
  256. package/Tests/App/Dashboard/ResourceAiInsightsPage.test.tsx +3 -2
  257. package/Tests/App/Dashboard/ResourceFeed.test.tsx +162 -130
  258. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +1 -1
  259. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +115 -81
  260. package/Tests/App/Dashboard/RoleCardSelectOptions.test.ts +204 -0
  261. package/Tests/App/Dashboard/RunbookRuleConditions.test.tsx +773 -0
  262. package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +12 -1
  263. package/Tests/App/Dashboard/RunnerNavigation.test.tsx +32 -11
  264. package/Tests/App/Dashboard/ScheduledMaintenanceCreateForm.test.tsx +798 -0
  265. package/Tests/App/Dashboard/ScheduledMaintenanceFormsStructure.test.ts +517 -0
  266. package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +183 -0
  267. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +103 -4
  268. package/Tests/App/Dashboard/ScheduledMaintenanceTemplateForm.test.tsx +602 -0
  269. package/Tests/App/Dashboard/SearchEngineIndexingCard.test.tsx +436 -0
  270. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +104 -0
  271. package/Tests/App/Dashboard/SetupGuideStepVariants.test.tsx +135 -0
  272. package/Tests/App/Dashboard/SideMenuHarness.tsx +20 -0
  273. package/Tests/App/Dashboard/SloFeed.test.tsx +33 -48
  274. package/Tests/App/Dashboard/SloListSideMenu.test.tsx +36 -1
  275. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +66 -7
  276. package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +15 -4
  277. package/Tests/App/Dashboard/StateSettingsPages.test.tsx +581 -0
  278. package/Tests/App/Dashboard/StateTimelinePagesLiveState.test.tsx +373 -0
  279. package/Tests/App/Dashboard/StatusPageAdvancedOptionsRedirect.test.tsx +321 -0
  280. package/Tests/App/Dashboard/StatusPageAdvancedSettingsPage.test.tsx +271 -0
  281. package/Tests/App/Dashboard/StatusPageBrandingMenu.test.tsx +176 -0
  282. package/Tests/App/Dashboard/StatusPageBrandingPage.test.tsx +694 -0
  283. package/Tests/App/Dashboard/StatusPageBrandingRedirects.test.tsx +400 -0
  284. package/Tests/App/Dashboard/StatusPageDisplaySettingsCard.test.tsx +1439 -0
  285. package/Tests/App/Dashboard/StatusPageSubscriberSettingsPages.test.tsx +888 -0
  286. package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +382 -17
  287. package/Tests/App/Dashboard/SubscriberChannelOffPanel.test.tsx +393 -0
  288. package/Tests/App/Dashboard/SubscriberChannelsCard.test.tsx +832 -0
  289. package/Tests/App/Dashboard/SubscriberNotificationWarnings.test.tsx +215 -0
  290. package/Tests/App/Dashboard/SubscriberTemplateVariables.test.tsx +314 -0
  291. package/Tests/App/Dashboard/TemplateFormsNoInternalDataWarning.test.tsx +698 -0
  292. package/Tests/App/Dashboard/TracesResultTotal.test.tsx +543 -0
  293. package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +2 -1
  294. package/Tests/App/Dashboard/TriggerRuleCriteriaNames.test.tsx +142 -0
  295. package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +11 -3
  296. package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +172 -1
  297. package/Tests/App/Dashboard/VMwareMetricTooltips.test.ts +12 -6
  298. package/Tests/App/Dashboard/WorkflowRunsLogsMenus.test.tsx +44 -7
  299. package/Tests/App/Dashboard/WorkflowRunsPages.test.tsx +5 -1
  300. package/Tests/App/Dashboard/WorkflowTemplatePicker.test.tsx +780 -755
  301. package/Tests/App/Dashboard/WorkflowVariableCreateFormSteps.test.tsx +37 -0
  302. package/Tests/App/Dashboard/WorkflowVariableListsGuard.test.ts +308 -0
  303. package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +89 -55
  304. package/Tests/App/Dashboard/WorkflowVariablesTableRender.test.tsx +621 -0
  305. package/Tests/App/Dashboard/WorkspaceConnectionPages.test.tsx +628 -0
  306. package/Tests/App/Dashboard/WorkspaceConnectionsGuards.test.ts +398 -0
  307. package/Tests/App/Dashboard/WorkspaceConnectionsWiring.test.ts +213 -0
  308. package/Tests/App/Dashboard/WorkspaceDisconnectRefresh.test.tsx +318 -0
  309. package/Tests/App/Dashboard/WorkspaceMenusConnected.test.tsx +581 -0
  310. package/Tests/App/Dashboard/WorkspaceSideMenuSection.test.ts +433 -0
  311. package/Tests/App/PublicDashboard/AutoRefreshPickerTick.test.tsx +209 -0
  312. package/Tests/App/RarelyUsedMenuSectionsCollapsed.test.tsx +771 -0
  313. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +74 -5
  314. package/Tests/App/StatusPage/StatusPageSubscribeFromFirstStep.test.tsx +382 -0
  315. package/Tests/Helpers/FormStepsScan.ts +770 -55
  316. package/Tests/Helpers/HookOrderScan.ts +307 -0
  317. package/Tests/Helpers/ToggleUsageScan.ts +4 -2
  318. package/Tests/Models/DatabaseModels/{IncidentFormModel.test.ts → FormModel.test.ts} +433 -495
  319. package/Tests/Models/DatabaseModels/IncidentAlertModel.test.ts +76 -5
  320. package/Tests/Models/DatabaseModels/RunbookRuleCriteriaColumns.test.ts +117 -0
  321. package/Tests/Models/GeneratedKeyColumns.test.ts +145 -0
  322. package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +10 -1
  323. package/Tests/Models/ListOrderColumnModels.test.ts +332 -0
  324. package/Tests/Models/RelationColumnModelTypes.test.ts +135 -0
  325. package/Tests/ResponsiveSpacing.test.ts +627 -0
  326. package/Tests/ResponsiveSpacing.ts +508 -0
  327. package/Tests/ResponsiveVisibility.test.ts +65 -0
  328. package/Tests/ResponsiveVisibility.ts +34 -0
  329. package/Tests/Server/API/BaseAnalyticsAPICountExact.test.ts +185 -0
  330. package/Tests/Server/API/{IncidentFormAPI.test.ts → FormAPI.test.ts} +92 -93
  331. package/Tests/Server/API/{IncidentFormPublicRoutes.test.ts → FormPublicRoutes.test.ts} +182 -126
  332. package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +70 -3
  333. package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +48 -52
  334. package/Tests/Server/Infrastructure/Postgres/AddRunbookRuleMatchCriteriaMigration.test.ts +316 -0
  335. package/Tests/Server/Infrastructure/Postgres/MigrateIncidentFormsToFormsMigration.test.ts +688 -0
  336. package/Tests/Server/Infrastructure/Postgres/TurnOnLinkedAlertSwitchesByDefaultMigration.test.ts +229 -0
  337. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupColorMigration.test.ts +116 -0
  338. package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +109 -22
  339. package/Tests/Server/Middleware/{IncidentFormRateLimit.test.ts → FormRateLimit.test.ts} +214 -227
  340. package/Tests/Server/Services/AlertMeasurementService.test.ts +62 -33
  341. package/Tests/Server/Services/AnalyticsDatabaseServiceExactCount.test.ts +397 -0
  342. package/Tests/Server/Services/DatabaseServiceListOrder.test.ts +713 -0
  343. package/Tests/Server/Services/{IncidentFormOwnersCreatedNotification.test.ts → FormOwnersCreatedNotification.test.ts} +44 -30
  344. package/Tests/Server/Services/FormPublicForm.test.ts +990 -0
  345. package/Tests/Server/Services/FormPublicSubmission.test.ts +1468 -0
  346. package/Tests/Server/Services/{IncidentFormRegistration.test.ts → FormRegistration.test.ts} +37 -45
  347. package/Tests/Server/Services/FormService.test.ts +709 -0
  348. package/Tests/Server/Services/{IncidentFormSubmissionTemplateBranch.test.ts → FormSubmissionTemplateBranch.test.ts} +100 -157
  349. package/Tests/Server/Services/GroupingRuleSimpleSetupEngine.test.ts +627 -0
  350. package/Tests/Server/Services/IncidentAlertPostgres.test.ts +26 -3
  351. package/Tests/Server/Services/IncidentAlertStateCascade.test.ts +169 -8
  352. package/Tests/Server/Services/IncidentFormPostgres.test.ts +250 -494
  353. package/Tests/Server/Services/IncidentMeasurementService.test.ts +37 -17
  354. package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +19 -33
  355. package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +14 -36
  356. package/Tests/Server/Services/MeasurementDashboardEdits.test.ts +390 -0
  357. package/Tests/Server/Services/MeasurementKeyGeneration.test.ts +484 -0
  358. package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +302 -105
  359. package/Tests/Server/Services/OnCallDutyPolicyEscalationRuleDefaultName.test.ts +339 -0
  360. package/Tests/Server/Services/OnCallDutyPolicyFirstResponders.test.ts +815 -0
  361. package/Tests/Server/Services/OnCallDutyPolicyFirstRespondersFreePlan.test.ts +270 -0
  362. package/Tests/Server/Services/ProjectServiceDefaultIncidentRoles.test.ts +392 -0
  363. package/Tests/Server/Services/ProjectServiceLinkedAlertDefaults.test.ts +188 -0
  364. package/Tests/Server/Services/ProjectServiceNumberPrefix.test.ts +327 -0
  365. package/Tests/Server/Services/RecordingRuleOutputMetricNameGeneration.test.ts +367 -0
  366. package/Tests/Server/Services/RunbookRuleEngineService.test.ts +1543 -0
  367. package/Tests/Server/Services/RunbookRuleService.test.ts +478 -0
  368. package/Tests/Server/Services/ScheduledMaintenanceMeasurementService.test.ts +73 -38
  369. package/Tests/Server/Services/SeverityCreationRuleBackfill.test.ts +52 -20
  370. package/Tests/Server/Services/StateListServicesOrder.test.ts +441 -0
  371. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +191 -27
  372. package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +11 -3
  373. package/Tests/Server/Services/TelemetryExactCount.test.ts +410 -0
  374. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +5 -4
  375. package/Tests/Server/Types/Database/Permissions/FormSubmissionRelationSelect.test.ts +201 -0
  376. package/Tests/Server/Utils/Database/ListOrderMaintainer.test.ts +157 -0
  377. package/Tests/Server/Utils/Database/StateOrderGuard.test.ts +720 -0
  378. package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +92 -0
  379. package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +373 -0
  380. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +7 -0
  381. package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +252 -0
  382. package/Tests/Server/Utils/Form/FormSubmissionNote.test.ts +402 -0
  383. package/Tests/Server/Utils/Measurement/MeasurementDefinitionChange.test.ts +130 -0
  384. package/Tests/Server/Utils/Measurement/MeasurementMetricWriter.test.ts +86 -0
  385. package/Tests/Server/Utils/Measurement/MeasurementStateReference.test.ts +129 -0
  386. package/Tests/Server/Utils/Monitor/DefaultMonitorCriteriaOutcomes.test.ts +577 -0
  387. package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +223 -46
  388. package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +58 -45
  389. package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +76 -1
  390. package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +5 -173
  391. package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +160 -17
  392. package/Tests/Types/Form/FormField.test.ts +1552 -0
  393. package/Tests/Types/{Incident/IncidentFormIpAllowlist.test.ts → Form/FormIpAllowlist.test.ts} +21 -23
  394. package/Tests/Types/Form/FormPublic.test.ts +1295 -0
  395. package/Tests/Types/Form/FormSubmissionAnswer.test.ts +206 -0
  396. package/Tests/Types/Form/FormTargetCatalog.test.ts +389 -0
  397. package/Tests/Types/Form/FormTargetSettings.test.ts +459 -0
  398. package/Tests/Types/Form/LegacyIncidentFormConversion.test.ts +341 -0
  399. package/Tests/Types/Measurement/MeasurementKey.test.ts +195 -0
  400. package/Tests/Types/Measurement/MeasurementUnit.test.ts +139 -0
  401. package/Tests/Types/Metrics/RecordingRuleOutputMetricName.test.ts +93 -0
  402. package/Tests/Types/Monitor/MonitorCriteria.test.ts +150 -0
  403. package/Tests/Types/Monitor/MonitorCriteriaActionValidation.test.ts +10 -4
  404. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +436 -7
  405. package/Tests/Types/OnCallDutyPolicy/EscalationRuleDefaults.test.ts +230 -0
  406. package/Tests/Types/OnCallDutyPolicy/FirstResponders.test.ts +218 -0
  407. package/Tests/Types/Rules/RuleCriteriaFieldRegistry.test.ts +82 -2
  408. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +75 -1
  409. package/Tests/Types/Runbook/RunbookRuleCriteria.test.ts +343 -0
  410. package/Tests/Types/ScheduledMaintenance/MaintenanceWindow.test.ts +313 -0
  411. package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +9 -5
  412. package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +42 -1
  413. package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +135 -23
  414. package/Tests/Types/Template/TemplateVariable.test.ts +385 -0
  415. package/Tests/Types/Workflow/ComponentDocumentation.test.ts +2 -2
  416. package/Tests/Types/Workspace/NotificationRules/NotificationRuleConditionColors.test.ts +216 -0
  417. package/Tests/UI/Components/ActionButton/RowActions.test.tsx +214 -14
  418. package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +9 -0
  419. package/Tests/UI/Components/ActionButton/RowActionsTrigger.test.tsx +3 -0
  420. package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +2 -0
  421. package/Tests/UI/Components/AdvancedPageSection.test.tsx +211 -0
  422. package/Tests/UI/Components/AppliedFilters.test.tsx +187 -0
  423. package/Tests/UI/Components/BasicFormModalSteps.test.tsx +220 -4
  424. package/Tests/UI/Components/BulkOwnerActions.test.tsx +366 -174
  425. package/Tests/UI/Components/BulkUpdateForm.test.tsx +2 -0
  426. package/Tests/UI/Components/BulkUpdateFormConfirmDetails.test.tsx +4 -0
  427. package/Tests/UI/Components/CardModelDetailEditModalTitle.test.tsx +195 -0
  428. package/Tests/UI/Components/CardSelect.test.tsx +45 -0
  429. package/Tests/UI/Components/CollapsibleSection.test.tsx +85 -0
  430. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +192 -1
  431. package/Tests/UI/Components/Detail/BooleanValue.test.tsx +97 -0
  432. package/Tests/UI/Components/Detail/DetailIdLine.test.tsx +464 -0
  433. package/Tests/UI/Components/Detail/DetailIdLineDarkMode.test.ts +230 -0
  434. package/Tests/UI/Components/Detail/DetailIdLineInLocale.test.tsx +212 -0
  435. package/Tests/UI/Components/Detail/DetailRecordId.test.ts +142 -0
  436. package/Tests/UI/Components/Detail/DetailRecordIdLine.test.tsx +647 -0
  437. package/Tests/UI/Components/Detail/PlaceholderText.test.tsx +249 -0
  438. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +14 -0
  439. package/Tests/UI/Components/FacetSidebarControls.test.tsx +3 -2
  440. package/Tests/UI/Components/FeedActionsMenu.test.tsx +192 -0
  441. package/Tests/UI/Components/FeedCard.test.tsx +467 -0
  442. package/Tests/UI/Components/FeedEventTypeChecklist.test.tsx +779 -0
  443. package/Tests/UI/Components/FeedFilterModal.test.tsx +232 -0
  444. package/Tests/UI/Components/FeedFilterSummary.test.tsx +335 -0
  445. package/Tests/UI/Components/FeedMoreMenu.test.tsx +488 -0
  446. package/Tests/UI/Components/FeedOptions.test.ts +79 -195
  447. package/Tests/UI/Components/Filters/FilterRowsChangeFilter.test.tsx +300 -0
  448. package/Tests/UI/Components/Forms/AdvancedStepsGuard.test.ts +231 -0
  449. package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +332 -0
  450. package/Tests/UI/Components/Forms/BasicFormFinishFromAnyStep.test.tsx +729 -0
  451. package/Tests/UI/Components/Forms/BasicFormPeoplePicker.test.tsx +345 -0
  452. package/Tests/UI/Components/Forms/CreateFormDefaultsGuard.test.ts +818 -0
  453. package/Tests/UI/Components/Forms/DeclareAndCreateFormsGuard.test.ts +589 -0
  454. package/Tests/UI/Components/Forms/FinishFromAnyStep.test.ts +571 -0
  455. package/Tests/UI/Components/Forms/FinishFromAnyStepGuard.test.ts +566 -0
  456. package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +11 -5
  457. package/Tests/UI/Components/Forms/FormFieldPasswordManagers.test.tsx +301 -0
  458. package/Tests/UI/Components/Forms/FormFieldTemplateVariables.test.tsx +349 -0
  459. package/Tests/UI/Components/Forms/FormFieldToggleRow.test.tsx +76 -0
  460. package/Tests/UI/Components/Forms/FormModalWidth.test.tsx +424 -0
  461. package/Tests/UI/Components/Forms/FormSummary.test.tsx +428 -1
  462. package/Tests/UI/Components/Forms/GeneratedKeyField.test.tsx +527 -0
  463. package/Tests/UI/Components/Forms/GeneratedKeyFieldDarkMode.test.ts +157 -0
  464. package/Tests/UI/Components/Forms/GeneratedKeyFieldI18n.test.ts +182 -0
  465. package/Tests/UI/Components/Forms/GeneratedKeyGuard.test.ts +386 -0
  466. package/Tests/UI/Components/Forms/LabelsFormFieldGuard.test.ts +1237 -0
  467. package/Tests/UI/Components/Forms/LongFormStepsGuard.test.ts +307 -4
  468. package/Tests/UI/Components/Forms/MarkdownFormsAreWide.test.ts +458 -0
  469. package/Tests/UI/Components/Forms/ModelFormCreateDefaults.test.tsx +584 -0
  470. package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +3 -2
  471. package/Tests/UI/Components/Forms/ModelFormModalFormRef.test.tsx +188 -0
  472. package/Tests/UI/Components/Forms/ModelFormOnBeforeUpdate.test.tsx +332 -0
  473. package/Tests/UI/Components/Forms/ModelFormPeoplePicker.test.tsx +452 -0
  474. package/Tests/UI/Components/Forms/ModelFormRuleCriteria.test.tsx +205 -2
  475. package/Tests/UI/Components/Forms/ModelFormStateDropdownColors.test.tsx +558 -0
  476. package/Tests/UI/Components/Forms/OverloadedFormStepsGuard.test.ts +88 -32
  477. package/Tests/UI/Components/Forms/SteppedFormFooterTiming.test.tsx +193 -0
  478. package/Tests/UI/Components/Forms/Utils/AdvancedFormSection.test.ts +401 -0
  479. package/Tests/UI/Components/Forms/Utils/CreateFormDefaults.test.ts +246 -0
  480. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +10 -1
  481. package/Tests/UI/Components/Icon.test.tsx +51 -3
  482. package/Tests/UI/Components/InputPasswordManagers.test.tsx +189 -0
  483. package/Tests/UI/Components/List.test.tsx +136 -3
  484. package/Tests/UI/Components/ListDragAndDrop.test.tsx +203 -0
  485. package/Tests/UI/Components/LogsViewerResultTotal.test.tsx +532 -0
  486. package/Tests/UI/Components/MarkdownEditor.test.tsx +3 -3
  487. package/Tests/UI/Components/MarkdownEditorToolbar.test.tsx +693 -0
  488. package/Tests/UI/Components/MarkdownEditorToolbarDarkMode.test.ts +287 -0
  489. package/Tests/UI/Components/MarkdownToolbarLayout.test.ts +366 -0
  490. package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +40 -1
  491. package/Tests/UI/Components/MasterPageExtensionEvents.test.tsx +236 -0
  492. package/Tests/UI/Components/MenuItemIcons.tsx +152 -0
  493. package/Tests/UI/Components/ModelListEmptyState.test.tsx +107 -14
  494. package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +3 -0
  495. package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +2 -0
  496. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +2 -0
  497. package/Tests/UI/Components/ModelTable/BaseModelTableCreateButtonTitle.test.tsx +78 -6
  498. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +5 -4
  499. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteLock.test.tsx +425 -0
  500. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteNames.test.tsx +2 -0
  501. package/Tests/UI/Components/ModelTable/BaseModelTableDragReorder.test.tsx +661 -0
  502. package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +432 -92
  503. package/Tests/UI/Components/ModelTable/BaseModelTableFilterModalRows.test.tsx +286 -0
  504. package/Tests/UI/Components/ModelTable/BaseModelTableMenuIcons.test.tsx +682 -0
  505. package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +2 -0
  506. package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +4 -0
  507. package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +2 -1
  508. package/Tests/UI/Components/ModelTable/FeedMoreMenuMatchesTable.test.tsx +321 -0
  509. package/Tests/UI/Components/ModelTable/ModelTableEmptyState.test.ts +741 -0
  510. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +2 -0
  511. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +70 -0
  512. package/Tests/UI/Components/MoreMenuCheckedItems.test.tsx +307 -0
  513. package/Tests/UI/Components/MoreMenuItemColor.test.tsx +187 -0
  514. package/Tests/UI/Components/MoreMenuPortal.test.tsx +3 -0
  515. package/Tests/UI/Components/NavBar.test.tsx +108 -1
  516. package/Tests/UI/Components/NavBarCategoryToggleDarkMode.test.ts +176 -0
  517. package/Tests/UI/Components/NavBarMenuCatalog.test.tsx +486 -0
  518. package/Tests/UI/Components/NavBarMenuFolding.test.tsx +757 -0
  519. package/Tests/UI/Components/NavBarMenuSearch.test.tsx +290 -213
  520. package/Tests/UI/Components/ObjectID/ObjectIDView.test.tsx +191 -0
  521. package/Tests/UI/Components/Pagination.test.tsx +1038 -1
  522. package/Tests/UI/Components/PaginationIntegration.test.tsx +120 -3
  523. package/Tests/UI/Components/PaginationSummary.test.ts +300 -0
  524. package/Tests/UI/Components/PaginationTranslation.test.tsx +310 -0
  525. package/Tests/UI/Components/PeoplePicker/OwnersFieldGuard.test.ts +420 -0
  526. package/Tests/UI/Components/PeoplePicker/OwnersFormField.test.ts +167 -0
  527. package/Tests/UI/Components/PeoplePicker/PeopleListAndAvatar.test.tsx +306 -0
  528. package/Tests/UI/Components/PeoplePicker/PeoplePicker.test.tsx +702 -0
  529. package/Tests/UI/Components/PeoplePicker/PeoplePickerKinds.test.ts +453 -0
  530. package/Tests/UI/Components/PeoplePicker/PeoplePickerOnCallScheduleKind.test.ts +371 -0
  531. package/Tests/UI/Components/PeoplePicker/PeoplePickerTypes.test.ts +251 -0
  532. package/Tests/UI/Components/Pill.test.tsx +128 -0
  533. package/Tests/UI/Components/PublicFormFields.test.ts +321 -0
  534. package/Tests/UI/Components/ResetObjectID.test.tsx +6 -6
  535. package/Tests/UI/Components/RowActionsLockedForRow.test.tsx +316 -0
  536. package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilder.test.tsx +900 -270
  537. package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilderDarkMode.test.ts +220 -0
  538. package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilderI18n.test.ts +259 -0
  539. package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilderTranslation.test.tsx +182 -0
  540. package/Tests/UI/Components/RuleCriteria/RuleCriteriaFields.test.ts +906 -0
  541. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +181 -7
  542. package/Tests/UI/Components/RuleCriteria/RuleCriteriaNamesGuard.test.ts +391 -0
  543. package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +113 -31
  544. package/Tests/UI/Components/RuleRun/RuleEnabledField.test.ts +100 -0
  545. package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +29 -0
  546. package/Tests/UI/Components/RuleRun/RuleTableCreateForm.test.tsx +308 -0
  547. package/Tests/UI/Components/SharedComponentsInLocale.test.tsx +286 -0
  548. package/Tests/UI/Components/SharedComponentsOwnWordsInLocale.test.tsx +487 -0
  549. package/Tests/UI/Components/SideMenuSection.test.tsx +75 -3
  550. package/Tests/UI/Components/SideMenuSectionState.test.tsx +99 -5
  551. package/Tests/UI/Components/SideOverSpacing.test.tsx +219 -0
  552. package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +5 -23
  553. package/Tests/UI/Components/StateTimeline/CurrentlyActiveIndicator.test.tsx +227 -0
  554. package/Tests/UI/Components/StateTimeline/StateTimelineColumns.test.tsx +535 -0
  555. package/Tests/UI/Components/StateTimeline/StateTimelineDuration.test.tsx +236 -0
  556. package/Tests/UI/Components/StateTimeline/StateTimelineEndsAt.test.tsx +133 -0
  557. package/Tests/UI/Components/SteppedEditFormSave.test.tsx +100 -5
  558. package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +422 -0
  559. package/Tests/UI/Components/Table/TableDragAndDrop.test.tsx +575 -0
  560. package/Tests/UI/Components/Table/TableEmptyState.test.tsx +300 -62
  561. package/Tests/UI/Components/Table/TableEmptyStateBuilders.test.ts +239 -0
  562. package/Tests/UI/Components/Table/TableEmptyStateComponent.test.tsx +492 -0
  563. package/Tests/UI/Components/Table/TableEmptyStateDarkMode.test.ts +239 -0
  564. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +2 -0
  565. package/Tests/UI/Components/TableColumnList.test.tsx +108 -0
  566. package/Tests/UI/Components/TableLoadingStates.test.tsx +2 -0
  567. package/Tests/UI/Components/TableRowActions.test.tsx +6 -42
  568. package/Tests/UI/Components/TableRowSelectability.test.tsx +2 -0
  569. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerResultTotal.test.tsx +371 -0
  570. package/Tests/UI/Components/TemplateVariables/InsertTemplateVariableButton.test.tsx +353 -0
  571. package/Tests/UI/Components/TemplateVariables/MarkdownConvertersTemplateVariables.test.ts +121 -0
  572. package/Tests/UI/Components/TemplateVariables/MarkdownEditorTemplateVariables.test.tsx +634 -0
  573. package/Tests/UI/Components/TemplateVariables/TemplateVariableMenu.test.tsx +371 -0
  574. package/Tests/UI/Components/TemplateVariables/TemplateVariableTextControl.test.tsx +438 -0
  575. package/Tests/UI/Components/TemplateVariables/TemplateVariablesList.test.tsx +352 -0
  576. package/Tests/UI/Components/TemplateVariables/TextControlUtil.test.tsx +206 -0
  577. package/Tests/UI/Components/Toggle.test.tsx +185 -30
  578. package/Tests/UI/Components/ToggleMatchesProduct.test.tsx +251 -0
  579. package/Tests/UI/Components/ToggleUsageGuard.test.ts +1 -1
  580. package/Tests/UI/Components/Workflow/ComponentPicker/ComponentPickerBottomSpacing.test.tsx +293 -0
  581. package/Tests/UI/Components/Workflow/RunModalSpacing.test.tsx +171 -0
  582. package/Tests/UI/Components/Workflow/WorkflowBuilderInLocale.test.tsx +719 -0
  583. package/Tests/UI/Components/Workflow/WorkflowSentencesInLocale.test.ts +444 -0
  584. package/Tests/UI/Components/useFeedOptions.test.tsx +1 -1
  585. package/Tests/UI/DeleteConfirmationNamesGuard.test.ts +64 -3
  586. package/Tests/UI/EsbuildConfig.test.ts +39 -0
  587. package/Tests/UI/EsbuildLocales.test.ts +1430 -0
  588. package/Tests/UI/ForeignHiddenRuleGuard.test.ts +5 -5
  589. package/Tests/UI/HookOrderGuard.test.ts +375 -0
  590. package/Tests/UI/Monitor/MonitorStepRetrySettings.test.tsx +0 -1
  591. package/Tests/UI/Monitor/MonitorSummaryResponseGoesMissing.test.tsx +147 -0
  592. package/Tests/UI/Rum/ChunkLoader.test.ts +441 -0
  593. package/Tests/UI/Rum/InactivityMap.test.ts +582 -1
  594. package/Tests/UI/Rum/ReplayEngine.test.ts +433 -0
  595. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +27 -0
  596. package/Tests/UI/Rum/ReplayRail.test.tsx +106 -0
  597. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +85 -0
  598. package/Tests/UI/Rum/ReplaySignals.test.ts +115 -0
  599. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +151 -0
  600. package/Tests/UI/Rum/ReplayTimeline.test.tsx +129 -0
  601. package/Tests/UI/Rum/ReplayUi.test.tsx +150 -1
  602. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +7 -4
  603. package/Tests/UI/Styles/PaginationDarkTheme.test.tsx +274 -0
  604. package/Tests/UI/Styles/PillDarkTheme.test.tsx +22 -0
  605. package/Tests/UI/Styles/ToggleTheme.test.ts +425 -191
  606. package/Tests/UI/Styles/TopLayerBackdrop.test.ts +734 -0
  607. package/Tests/UI/Styles/TopLayerBackdropGuard.ts +789 -0
  608. package/Tests/UI/Utils/AnalyticsModelAPICountExact.test.ts +139 -0
  609. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +1 -37
  610. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +3 -9
  611. package/Tests/UI/Utils/DropdownOptionColors.test.ts +398 -0
  612. package/Tests/UI/Utils/ForeignDomMutationGuard.test.tsx +711 -0
  613. package/Tests/UI/Utils/GlobalTranslation.test.ts +222 -0
  614. package/Tests/UI/Utils/GrantablePermission.test.ts +610 -0
  615. package/Tests/UI/Utils/Telemetry/ResultTotal.test.ts +234 -0
  616. package/Tests/UI/Utils/Telemetry/UseResultTotal.test.tsx +616 -0
  617. package/Tests/UI/Utils/Translator.test.ts +502 -0
  618. package/Tests/UI/Utils/UseClockTick.test.tsx +137 -2
  619. package/Tests/UI/Utils/UseLiveDuration.test.tsx +625 -0
  620. package/Tests/Utils/ColorContrast.test.ts +108 -0
  621. package/Tests/Utils/DeveloperDocs/AiAssistantExamples.test.ts +14 -0
  622. package/Tests/Utils/DeveloperDocs/ApiExamples.test.ts +10 -117
  623. package/Tests/Utils/DeveloperDocs/DeveloperDocsLiveFixture.ts +114 -0
  624. package/Tests/Utils/DeveloperDocs/ExampleBuilder.test.ts +851 -0
  625. package/Tests/Utils/DeveloperDocs/ExampleValues.test.ts +101 -0
  626. package/Tests/Utils/DeveloperDocs/Hcl.test.ts +204 -0
  627. package/Tests/Utils/DeveloperDocs/LiveData.test.ts +273 -0
  628. package/Tests/Utils/DeveloperDocs/PageLookups.test.ts +297 -0
  629. package/Tests/Utils/DeveloperDocs/ResourceProfiles.test.ts +582 -0
  630. package/Tests/Utils/DeveloperDocs/TerraformConfig.test.ts +216 -22
  631. package/Tests/Utils/DeveloperDocs/TerraformSchema.test.ts +94 -0
  632. package/Tests/Utils/Email/EmailColorUtil.test.ts +356 -0
  633. package/Tests/Utils/Episode/EpisodeTemplateVariables.test.ts +106 -0
  634. package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +143 -21
  635. package/Tests/Utils/KeyFromName.test.ts +442 -0
  636. package/Tests/Utils/ListOrder.test.ts +889 -0
  637. package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +4 -6
  638. package/Tests/Utils/Measurement/MeasurementMoments.test.ts +531 -0
  639. package/Tests/Utils/Project/NumberPrefix.test.ts +452 -0
  640. package/Tests/Utils/StateOrder.test.ts +850 -0
  641. package/Types/CustomField/CustomFieldCreateSettings.ts +15 -123
  642. package/Types/CustomField/CustomFieldValueFormat.ts +3 -2
  643. package/Types/CustomField/CustomFieldVariableKey.ts +140 -111
  644. package/Types/Database/ListOrderColumn.ts +61 -0
  645. package/Types/Form/FormField.ts +1193 -0
  646. package/Types/{Incident/IncidentFormIpAllowlist.ts → Form/FormIpAllowlist.ts} +50 -50
  647. package/Types/Form/FormPublic.ts +1321 -0
  648. package/Types/Form/FormSubmissionAnswer.ts +159 -0
  649. package/Types/Form/FormTargetCatalog.ts +299 -0
  650. package/Types/Form/FormTargetSettings.ts +450 -0
  651. package/Types/Form/FormTargetType.ts +86 -0
  652. package/Types/Form/LegacyIncidentFormConversion.ts +249 -0
  653. package/Types/Measurement/MeasurementKey.ts +107 -0
  654. package/Types/Measurement/MeasurementUnit.ts +97 -0
  655. package/Types/Metrics/RecordingRuleOutputMetricName.ts +73 -0
  656. package/Types/Monitor/MonitorCriteria.ts +27 -0
  657. package/Types/Monitor/MonitorCriteriaInstance.ts +213 -28
  658. package/Types/Monitor/MonitorStep.ts +2 -0
  659. package/Types/Monitor/MonitorSteps.ts +2 -0
  660. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +6 -3
  661. package/Types/OnCallDutyPolicy/EscalationRuleDefaults.ts +147 -0
  662. package/Types/OnCallDutyPolicy/FirstResponders.ts +161 -0
  663. package/Types/Permission.ts +41 -35
  664. package/Types/Rules/RuleCriteriaFieldRegistry.ts +46 -1
  665. package/Types/Rum/SessionReplay.ts +25 -0
  666. package/Types/Rum/SessionReplayCustomEvents.ts +60 -0
  667. package/Types/Runbook/RunbookRuleCriteria.ts +206 -0
  668. package/Types/ScheduledMaintenance/MaintenanceWindow.ts +167 -0
  669. package/Types/StatusPage/IncidentSubscriberAudience.ts +4 -3
  670. package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +8 -2
  671. package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +68 -27
  672. package/Types/Template/TemplateVariable.ts +297 -0
  673. package/Types/Workspace/NotificationRules/NotificationRuleCondition.ts +27 -56
  674. package/UI/Components/404.tsx +8 -2
  675. package/UI/Components/AI/GenerateFromAIModal.tsx +11 -6
  676. package/UI/Components/AIAgent/AIAgent.tsx +8 -2
  677. package/UI/Components/ActionButton/ActionButtonSchema.ts +17 -1
  678. package/UI/Components/ActionButton/RowActions.tsx +34 -19
  679. package/UI/Components/ActionButton/SplitActionButtons.ts +36 -3
  680. package/UI/Components/ActionCard/ActionCard.tsx +14 -2
  681. package/UI/Components/AdvancedPageSection/AdvancedPageSection.tsx +82 -0
  682. package/UI/Components/AttachmentList/EventAttachmentList.tsx +8 -4
  683. package/UI/Components/AttributesJSON/AttributesJSONPreferences.ts +5 -4
  684. package/UI/Components/AttributesJSON/AttributesJSONView.tsx +18 -4
  685. package/UI/Components/AttributesJSON/AttributesViewToggle.tsx +12 -3
  686. package/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.tsx +76 -23
  687. package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +7 -2
  688. package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +1 -1
  689. package/UI/Components/BulkUpdate/BulkOwnerActions.tsx +55 -150
  690. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +94 -30
  691. package/UI/Components/Button/Button.tsx +1 -1
  692. package/UI/Components/Button/DropdownButton.tsx +1 -1
  693. package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +88 -20
  694. package/UI/Components/Captcha/Captcha.tsx +4 -1
  695. package/UI/Components/Card/CardMoreMenu.tsx +30 -0
  696. package/UI/Components/CardSelect/CardSelect.tsx +51 -17
  697. package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +13 -8
  698. package/UI/Components/Charts/ChartGroup/NoDataMessage.tsx +5 -1
  699. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +9 -1
  700. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +26 -5
  701. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +11 -1
  702. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +11 -1
  703. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +11 -1
  704. package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +12 -4
  705. package/UI/Components/Checkbox/Checkbox.tsx +6 -4
  706. package/UI/Components/CodeBlock/CodeBlock.tsx +9 -2
  707. package/UI/Components/CodeEditor/CodeEditor.tsx +82 -29
  708. package/UI/Components/CollapsibleSection/CollapsibleSection.tsx +38 -4
  709. package/UI/Components/ColorViewer/ColorViewer.tsx +13 -2
  710. package/UI/Components/CopyTextButton/CopyTextButton.tsx +7 -3
  711. package/UI/Components/CopyableButton/CopyableButton.tsx +7 -4
  712. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +10 -1
  713. package/UI/Components/CustomFields/DropdownOptionsInput.tsx +22 -3
  714. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +137 -25
  715. package/UI/Components/Dashboard/DashboardVariableControl.tsx +27 -6
  716. package/UI/Components/Date/CustomTimeRangeModal.tsx +17 -13
  717. package/UI/Components/Date/RangeStartAndEndDateEdit.tsx +36 -16
  718. package/UI/Components/Date/RangeStartAndEndDateView.tsx +9 -1
  719. package/UI/Components/Date/StartAndEndDate.tsx +9 -2
  720. package/UI/Components/Date/TimeRangePickerDropdown.tsx +21 -9
  721. package/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.tsx +50 -9
  722. package/UI/Components/Detail/BooleanValue.tsx +45 -0
  723. package/UI/Components/Detail/Detail.tsx +122 -55
  724. package/UI/Components/Detail/DetailIdLine.tsx +229 -0
  725. package/UI/Components/Detail/DetailRecordId.ts +96 -0
  726. package/UI/Components/Detail/Field.ts +10 -0
  727. package/UI/Components/Detail/PlaceholderText.tsx +22 -1
  728. package/UI/Components/Dictionary/Dictionary.tsx +11 -1
  729. package/UI/Components/Dictionary/DictionaryOfStingsViewer.tsx +9 -2
  730. package/UI/Components/Dropdown/Dropdown.tsx +6 -3
  731. package/UI/Components/DuplicateModel/DuplicateModel.tsx +31 -6
  732. package/UI/Components/EditionLabel/EditionLabel.tsx +333 -191
  733. package/UI/Components/EntityDropdown/EntityDropdown.tsx +65 -32
  734. package/UI/Components/ErrorBoundary.tsx +40 -21
  735. package/UI/Components/ErrorMessage/ErrorMessage.tsx +1 -1
  736. package/UI/Components/EventItem/EventItem.tsx +14 -4
  737. package/UI/Components/Events/RecurringViewElement.tsx +24 -3
  738. package/UI/Components/ExpandableText/ExpandableText.tsx +6 -1
  739. package/UI/Components/Feed/FeedActionsMenu.tsx +49 -0
  740. package/UI/Components/Feed/FeedCard.tsx +156 -0
  741. package/UI/Components/Feed/FeedEventTypeChecklist.tsx +239 -0
  742. package/UI/Components/Feed/FeedFilterModal.tsx +54 -0
  743. package/UI/Components/Feed/FeedFilterSummary.tsx +114 -0
  744. package/UI/Components/Feed/FeedItem.tsx +5 -1
  745. package/UI/Components/Feed/FeedMoreMenu.tsx +100 -0
  746. package/UI/Components/Feed/FeedOptions.ts +44 -114
  747. package/UI/Components/FilePicker/FilePicker.tsx +60 -44
  748. package/UI/Components/FilterButtons/FilterButtons.tsx +6 -2
  749. package/UI/Components/Filters/AppliedFilters.tsx +90 -0
  750. package/UI/Components/Filters/BooleanFilter.tsx +5 -1
  751. package/UI/Components/Filters/DateFilter.tsx +33 -6
  752. package/UI/Components/Filters/DropdownFilter.tsx +5 -1
  753. package/UI/Components/Filters/EntityFilter.tsx +55 -18
  754. package/UI/Components/Filters/FilterPlaceholder.ts +21 -0
  755. package/UI/Components/Filters/FilterViewer.tsx +205 -143
  756. package/UI/Components/Filters/FiltersForm.tsx +19 -4
  757. package/UI/Components/Filters/NumberFilter.tsx +34 -11
  758. package/UI/Components/Filters/TextFilter.tsx +29 -10
  759. package/UI/Components/FormModal/BasicFormModal.tsx +69 -6
  760. package/UI/Components/Forms/BasicForm.tsx +206 -20
  761. package/UI/Components/Forms/BasicModelForm.tsx +2 -0
  762. package/UI/Components/Forms/CollapsibleFormSection.tsx +32 -3
  763. package/UI/Components/Forms/Fields/ColorPicker.tsx +6 -3
  764. package/UI/Components/Forms/Fields/FormField.tsx +282 -136
  765. package/UI/Components/Forms/Fields/GeneratedKeyField.tsx +336 -0
  766. package/UI/Components/Forms/Fields/IconPicker.tsx +7 -4
  767. package/UI/Components/Forms/Fields/PermissionPicker.tsx +11 -4
  768. package/UI/Components/Forms/FormSummary.tsx +161 -15
  769. package/UI/Components/Forms/ModelForm.tsx +186 -14
  770. package/UI/Components/Forms/Steps/Steps.tsx +4 -1
  771. package/UI/Components/Forms/Types/Field.ts +110 -1
  772. package/UI/Components/Forms/Types/FormFieldSchemaType.ts +5 -0
  773. package/UI/Components/Forms/Utils/AdvancedFormSection.ts +262 -0
  774. package/UI/Components/Forms/Utils/CreateFormDefaults.ts +192 -0
  775. package/UI/Components/Forms/Utils/FinishFromAnyStep.ts +284 -0
  776. package/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.ts +2 -0
  777. package/UI/Components/Forms/Utils/FormModalWidth.ts +63 -0
  778. package/UI/Components/Forms/Validation.ts +84 -46
  779. package/UI/Components/FullPageModal/FullPageModal.tsx +4 -1
  780. package/UI/Components/Graphs/UptimeBarTooltip.tsx +10 -2
  781. package/UI/Components/Header/Notifications/Notifications.tsx +7 -4
  782. package/UI/Components/Header/ProjectPicker/CreateNewProjectButton.tsx +5 -1
  783. package/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.tsx +7 -1
  784. package/UI/Components/Header/SearchBox.tsx +5 -1
  785. package/UI/Components/HeaderAlert/HeaderModelAlert.tsx +6 -1
  786. package/UI/Components/HeaderAlert/NotificationBell/NotificationBell.tsx +6 -1
  787. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +5 -2
  788. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellSection.tsx +4 -1
  789. package/UI/Components/HiddenText/HiddenText.tsx +4 -1
  790. package/UI/Components/Icon/Icon.tsx +7 -4
  791. package/UI/Components/ImportExport/ExportModelCard.tsx +21 -3
  792. package/UI/Components/ImportExport/ImportModelsModal.tsx +61 -13
  793. package/UI/Components/Input/Input.tsx +40 -2
  794. package/UI/Components/IpAddressList/IpAddressList.tsx +12 -4
  795. package/UI/Components/JSONTable/JSONTable.tsx +19 -5
  796. package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +90 -28
  797. package/UI/Components/Link/Link.tsx +6 -3
  798. package/UI/Components/List/List.tsx +152 -19
  799. package/UI/Components/List/ListBody.tsx +15 -1
  800. package/UI/Components/List/ListRow.tsx +32 -19
  801. package/UI/Components/List/ListSkeleton.tsx +4 -1
  802. package/UI/Components/Loader/Loader.tsx +12 -4
  803. package/UI/Components/LogsViewer/LogsViewer.tsx +60 -3
  804. package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +16 -4
  805. package/UI/Components/LogsViewer/components/ColumnSelector.tsx +32 -17
  806. package/UI/Components/LogsViewer/components/FacetValueRow.tsx +13 -7
  807. package/UI/Components/LogsViewer/components/HistogramTooltip.tsx +6 -1
  808. package/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.tsx +18 -7
  809. package/UI/Components/LogsViewer/components/LiveLogsToggle.tsx +4 -1
  810. package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +43 -23
  811. package/UI/Components/LogsViewer/components/LogSearchBar.tsx +11 -3
  812. package/UI/Components/LogsViewer/components/LogSearchHelp.tsx +24 -14
  813. package/UI/Components/LogsViewer/components/LogSearchSuggestions.tsx +10 -2
  814. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +19 -5
  815. package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +4 -1
  816. package/UI/Components/LogsViewer/components/LogsHistogram.tsx +13 -6
  817. package/UI/Components/LogsViewer/components/LogsPagination.tsx +10 -0
  818. package/UI/Components/LogsViewer/components/LogsTable.tsx +44 -16
  819. package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +65 -20
  820. package/UI/Components/LogsViewer/components/SavedViewsDropdown.tsx +18 -11
  821. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +7 -1
  822. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +18 -0
  823. package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +1072 -249
  824. package/UI/Components/Markdown.tsx/MarkdownToolbarLayout.ts +260 -0
  825. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +37 -8
  826. package/UI/Components/MasterPage/MasterPage.tsx +4 -1
  827. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +56 -23
  828. package/UI/Components/ModelDelete/ModelDelete.tsx +22 -4
  829. package/UI/Components/ModelDetail/CardModelDetail.tsx +26 -3
  830. package/UI/Components/ModelDetail/ModelDetail.tsx +17 -6
  831. package/UI/Components/ModelFormModal/ModelFormModal.tsx +51 -14
  832. package/UI/Components/ModelList/ModelList.tsx +93 -11
  833. package/UI/Components/ModelList/StaticModelList.tsx +24 -10
  834. package/UI/Components/ModelTable/BaseModelTable.tsx +715 -338
  835. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +73 -29
  836. package/UI/Components/ModelTable/CustomFieldColumns.tsx +2 -1
  837. package/UI/Components/ModelTable/EmptyStateOptions.ts +47 -0
  838. package/UI/Components/ModelTable/ModelTable.tsx +40 -10
  839. package/UI/Components/ModelTable/ModelTableEmptyState.ts +337 -0
  840. package/UI/Components/ModelTable/TableView.tsx +13 -6
  841. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +4 -1
  842. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +39 -1
  843. package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +63 -20
  844. package/UI/Components/MoreMenu/MoreMenu.tsx +27 -11
  845. package/UI/Components/MoreMenu/MoreMenuItem.tsx +63 -5
  846. package/UI/Components/Navbar/NavBar.tsx +25 -29
  847. package/UI/Components/Navbar/NavBarCategoryToggle.tsx +120 -0
  848. package/UI/Components/Navbar/NavBarMenuCatalog.ts +250 -0
  849. package/UI/Components/Navbar/NavBarMenuModal.tsx +391 -162
  850. package/UI/Components/Navbar/NavBarMobileMenu.tsx +140 -0
  851. package/UI/Components/ObjectID/ObjectIDView.tsx +54 -4
  852. package/UI/Components/OsVersionDisplay/OsVersionDisplay.tsx +8 -1
  853. package/UI/Components/Page/ModelPage.tsx +11 -5
  854. package/UI/Components/Page/Page.tsx +1 -1
  855. package/UI/Components/Pagination/Pagination.tsx +257 -112
  856. package/UI/Components/Pagination/PaginationCopy.ts +71 -0
  857. package/UI/Components/Pagination/PaginationSummary.ts +113 -0
  858. package/UI/Components/Pagination/Screenshots/README.md +11 -9
  859. package/UI/Components/Pagination/Screenshots/pagination-before-after.png +0 -0
  860. package/UI/Components/Pagination/Screenshots/pagination-dark.png +0 -0
  861. package/UI/Components/Pagination/Screenshots/pagination-go-to-page-modal.png +0 -0
  862. package/UI/Components/Pagination/Screenshots/pagination-long-list.png +0 -0
  863. package/UI/Components/Pagination/Screenshots/pagination-mobile.png +0 -0
  864. package/UI/Components/Pagination/Screenshots/pagination-telemetry.png +0 -0
  865. package/UI/Components/PeoplePicker/OwnersFormField.ts +95 -0
  866. package/UI/Components/PeoplePicker/OwnersPicker.tsx +74 -0
  867. package/UI/Components/PeoplePicker/PeopleAvatar.tsx +213 -0
  868. package/UI/Components/PeoplePicker/PeopleList.tsx +198 -0
  869. package/UI/Components/PeoplePicker/PeoplePicker.tsx +242 -0
  870. package/UI/Components/PeoplePicker/PeoplePickerKinds.ts +599 -0
  871. package/UI/Components/PeoplePicker/PeoplePickerTypes.ts +244 -0
  872. package/UI/Components/PeoplePicker/PeopleSearchPopup.tsx +537 -0
  873. package/UI/Components/PeoplePicker/usePeopleOptions.ts +264 -0
  874. package/UI/Components/Pill/Pill.tsx +35 -2
  875. package/UI/Components/Pill/PillColors.ts +22 -261
  876. package/UI/Components/Probe/Probe.tsx +5 -2
  877. package/UI/Components/ProgressBar/ProgressBar.tsx +17 -2
  878. package/UI/Components/ProgressButtons/ProgressButtons.tsx +8 -1
  879. package/UI/Components/ProjectInvitations/PendingProjectInvitations.tsx +49 -15
  880. package/UI/Components/PublicForm/PublicFormFields.ts +359 -0
  881. package/UI/Components/ResetObjectID/ResetObjectID.tsx +31 -4
  882. package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +500 -574
  883. package/UI/Components/RuleCriteria/RuleCriteriaFields.ts +895 -0
  884. package/UI/Components/RuleCriteria/RuleCriteriaModelForm.tsx +45 -7
  885. package/UI/Components/RuleCriteria/RuleCriteriaModelTable.tsx +105 -12
  886. package/UI/Components/RuleCriteria/RuleCriteriaSummary.tsx +34 -30
  887. package/UI/Components/RuleRun/RuleDetailFields.tsx +90 -2
  888. package/UI/Components/RuleRun/RuleEnabledField.ts +51 -0
  889. package/UI/Components/RuleRun/RuleTable.tsx +13 -1
  890. package/UI/Components/RuleRun/RuleView.tsx +22 -4
  891. package/UI/Components/RuleRun/RunRuleNowModal.tsx +11 -1
  892. package/UI/Components/Runbook/StepTimeoutInput.tsx +22 -11
  893. package/UI/Components/SavedViews/SavedViewsFacetSection.tsx +28 -10
  894. package/UI/Components/SavedViews/SavedViewsSearchInput.tsx +6 -2
  895. package/UI/Components/SavedViews/SavedViewsShowMoreButton.tsx +9 -1
  896. package/UI/Components/SideMenu/SideMenu.tsx +4 -6
  897. package/UI/Components/SideMenu/SideMenuSection.tsx +5 -3
  898. package/UI/Components/SideMenu/SideMenuSectionState.ts +52 -9
  899. package/UI/Components/SideOver/SideOver.tsx +24 -6
  900. package/UI/Components/SimpleLogViewer/SimpleLogViewer.tsx +4 -1
  901. package/UI/Components/StackedProgressBar/StackedProgressBar.tsx +4 -1
  902. package/UI/Components/StateTimeline/CurrentlyActiveIndicator.tsx +48 -0
  903. package/UI/Components/StateTimeline/StateTimelineColumns.tsx +134 -0
  904. package/UI/Components/StateTimeline/StateTimelineDuration.tsx +56 -0
  905. package/UI/Components/StateTimeline/StateTimelineEndsAt.tsx +37 -0
  906. package/UI/Components/StatusBadge/StatusBadge.tsx +3 -1
  907. package/UI/Components/StatusBubble/StatusBubble.tsx +8 -2
  908. package/UI/Components/StatusPage/ResourceGrid.tsx +55 -16
  909. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +67 -22
  910. package/UI/Components/StatusPage/ResourceList.tsx +46 -18
  911. package/UI/Components/Table/DragHandle.tsx +74 -0
  912. package/UI/Components/Table/EmptyTableMessage.ts +272 -34
  913. package/UI/Components/Table/Table.tsx +248 -68
  914. package/UI/Components/Table/TableBody.tsx +43 -2
  915. package/UI/Components/Table/TableEmptyState.tsx +250 -0
  916. package/UI/Components/Table/TableEmptyStateBuilders.ts +187 -0
  917. package/UI/Components/Table/TableRow.tsx +107 -32
  918. package/UI/Components/Table/TableSkeletonRows.tsx +9 -2
  919. package/UI/Components/TableColumnList/TableColumnListComponent.tsx +13 -3
  920. package/UI/Components/Tabs/Tabs.tsx +4 -1
  921. package/UI/Components/TelemetryViewer/FacetVisibility.ts +44 -9
  922. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +79 -10
  923. package/UI/Components/TelemetryViewer/components/FacetSearchInput.tsx +11 -4
  924. package/UI/Components/TelemetryViewer/components/FacetShowMoreButton.tsx +9 -1
  925. package/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.tsx +15 -7
  926. package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +99 -33
  927. package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +18 -11
  928. package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +9 -3
  929. package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +6 -3
  930. package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +4 -1
  931. package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +13 -7
  932. package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +15 -8
  933. package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +6 -1
  934. package/UI/Components/TelemetryViewer/components/TelemetryItemLabel.ts +18 -0
  935. package/UI/Components/TelemetryViewer/components/TelemetryPagination.tsx +17 -11
  936. package/UI/Components/TelemetryViewer/components/TelemetryResultTotal.tsx +132 -0
  937. package/UI/Components/TelemetryViewer/components/TelemetrySearchBar.tsx +9 -4
  938. package/UI/Components/TelemetryViewer/components/TelemetrySearchHelp.tsx +30 -17
  939. package/UI/Components/TelemetryViewer/components/TelemetrySearchSuggestions.tsx +10 -2
  940. package/UI/Components/TemplateVariables/InsertTemplateVariableButton.tsx +162 -0
  941. package/UI/Components/TemplateVariables/TemplateVariableIcons.tsx +55 -0
  942. package/UI/Components/TemplateVariables/TemplateVariableMenu.tsx +351 -0
  943. package/UI/Components/TemplateVariables/TemplateVariablePopup.tsx +255 -0
  944. package/UI/Components/TemplateVariables/TemplateVariableTextControl.tsx +128 -0
  945. package/UI/Components/TemplateVariables/TemplateVariablesCopy.ts +38 -0
  946. package/UI/Components/TemplateVariables/TemplateVariablesList.tsx +277 -0
  947. package/UI/Components/TemplateVariables/TextControlUtil.ts +295 -0
  948. package/UI/Components/TemplateVariables/useTemplateVariableTyping.tsx +350 -0
  949. package/UI/Components/TimePicker/TimePicker.tsx +36 -20
  950. package/UI/Components/Toggle/Toggle.tsx +39 -45
  951. package/UI/Components/Tooltip/InfoTooltip.tsx +6 -1
  952. package/UI/Components/Tooltip/Tooltip.tsx +4 -1
  953. package/UI/Components/TranslatedSentence/TranslatedSentence.tsx +76 -0
  954. package/UI/Components/Workflow/ArgumentsForm.tsx +51 -12
  955. package/UI/Components/Workflow/ColumnEditor/AddColumnPicker.tsx +20 -14
  956. package/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.tsx +19 -6
  957. package/UI/Components/Workflow/ColumnEditor/ColumnControl.ts +28 -14
  958. package/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.tsx +24 -10
  959. package/UI/Components/Workflow/ColumnEditor/ColumnOperators.ts +17 -14
  960. package/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.ts +2 -1
  961. package/UI/Components/Workflow/ColumnEditor/ColumnRowSerialization.ts +3 -2
  962. package/UI/Components/Workflow/ColumnEditor/ColumnValueInput.tsx +21 -8
  963. package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +11 -6
  964. package/UI/Components/Workflow/ColumnEditor/ModelRecordForm.tsx +29 -9
  965. package/UI/Components/Workflow/Component.tsx +8 -3
  966. package/UI/Components/Workflow/ComponentArgumentsViewer.tsx +20 -2
  967. package/UI/Components/Workflow/ComponentPicker/PickerItems.tsx +46 -18
  968. package/UI/Components/Workflow/ComponentPortViewer.tsx +6 -1
  969. package/UI/Components/Workflow/ComponentReturnValueViewer.tsx +10 -2
  970. package/UI/Components/Workflow/ComponentSettingsModal.tsx +30 -9
  971. package/UI/Components/Workflow/ComponentSettingsSection.tsx +7 -2
  972. package/UI/Components/Workflow/ComponentsModal.tsx +137 -54
  973. package/UI/Components/Workflow/Condition/ConditionEditor.tsx +52 -21
  974. package/UI/Components/Workflow/Condition/ConditionModel.ts +45 -17
  975. package/UI/Components/Workflow/CronScheduleField.tsx +54 -31
  976. package/UI/Components/Workflow/DocumentationViewer.tsx +10 -2
  977. package/UI/Components/Workflow/GraphLint.ts +78 -13
  978. package/UI/Components/Workflow/GraphLintSummary.ts +24 -11
  979. package/UI/Components/Workflow/ManualTriggerPanel.tsx +26 -6
  980. package/UI/Components/Workflow/ModelColumnEditor.tsx +95 -33
  981. package/UI/Components/Workflow/ModelFieldPicker.tsx +100 -34
  982. package/UI/Components/Workflow/RunForm.tsx +13 -3
  983. package/UI/Components/Workflow/RunStatusWatcher.ts +50 -8
  984. package/UI/Components/Workflow/StepTraceViewer.tsx +130 -42
  985. package/UI/Components/Workflow/UseRunWatch.ts +2 -1
  986. package/UI/Components/Workflow/Utils.ts +7 -1
  987. package/UI/Components/Workflow/ValuePicker/InsertValueButton.tsx +8 -5
  988. package/UI/Components/Workflow/ValuePicker/ValuePickerMenu.tsx +105 -39
  989. package/UI/Components/Workflow/ValuePicker/ValuePickerPopup.tsx +4 -1
  990. package/UI/Components/Workflow/ValuePicker/ValueSingleField.tsx +10 -5
  991. package/UI/Components/Workflow/ValuePicker/ValueTextField.tsx +11 -7
  992. package/UI/Components/Workflow/WorkflowIssuesModal.tsx +48 -16
  993. package/UI/Components/Workflow/WorkflowLogModal.tsx +9 -5
  994. package/UI/Components/Workflow/WorkflowStatusBar.tsx +26 -13
  995. package/UI/Styles/Theme.css +21 -26
  996. package/UI/Types/UseAnchoredFieldPopup.ts +8 -2
  997. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +12 -0
  998. package/UI/Utils/Dropdown.ts +106 -5
  999. package/UI/Utils/ForeignDomMutationGuard.ts +225 -0
  1000. package/UI/Utils/GrantablePermission.ts +197 -0
  1001. package/UI/Utils/PermissionGate.ts +50 -4
  1002. package/UI/Utils/Rules/RuleRunClient.ts +14 -4
  1003. package/UI/Utils/Telemetry/ResultTotal.ts +150 -0
  1004. package/UI/Utils/Telemetry/UseResultTotal.ts +173 -0
  1005. package/UI/Utils/TranslateTemplate.ts +617 -19
  1006. package/UI/Utils/Translation.tsx +56 -2
  1007. package/UI/Utils/UseClockTick.ts +43 -3
  1008. package/UI/Utils/UseLiveDuration.ts +155 -0
  1009. package/UI/Utils/UseTranslator.ts +22 -0
  1010. package/UI/esbuild-config.js +3 -0
  1011. package/UI/esbuild-locales.d.ts +60 -0
  1012. package/UI/esbuild-locales.js +358 -0
  1013. package/Utils/ColorContrast.ts +274 -0
  1014. package/Utils/DeveloperDocs/AiAssistantExamples.ts +3 -2
  1015. package/Utils/DeveloperDocs/ApiExamples.ts +5 -271
  1016. package/Utils/DeveloperDocs/ExampleBuilder.ts +1775 -0
  1017. package/Utils/DeveloperDocs/ExampleValues.ts +82 -0
  1018. package/Utils/DeveloperDocs/Hcl.ts +153 -33
  1019. package/Utils/DeveloperDocs/LiveData.ts +292 -0
  1020. package/Utils/DeveloperDocs/PageLookups.ts +370 -0
  1021. package/Utils/DeveloperDocs/ResourceProfiles.ts +2025 -0
  1022. package/Utils/DeveloperDocs/TerraformConfig.ts +139 -143
  1023. package/Utils/DeveloperDocs/TerraformMonitorSteps.ts +63 -10
  1024. package/Utils/DeveloperDocs/TerraformSchema.ts +88 -1
  1025. package/Utils/Email/EmailColorUtil.ts +135 -0
  1026. package/Utils/Episode/EpisodeTemplateVariables.ts +75 -0
  1027. package/Utils/Incident/IncidentNoteTemplateVariables.ts +37 -6
  1028. package/Utils/Incident/IncidentSlaNoteTemplateVariables.ts +33 -0
  1029. package/Utils/KeyFromName.ts +230 -0
  1030. package/Utils/ListOrder.ts +417 -0
  1031. package/Utils/Measurement/MeasurementMoments.ts +699 -0
  1032. package/Utils/Project/NumberPrefix.ts +188 -0
  1033. package/Utils/Slo/SloBurnRateTemplate.ts +24 -0
  1034. package/Utils/StateOrder.ts +631 -0
  1035. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +4 -3
  1036. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
  1037. package/build/dist/Models/DatabaseModels/AlertMeasurement.js +17 -10
  1038. package/build/dist/Models/DatabaseModels/AlertMeasurement.js.map +1 -1
  1039. package/build/dist/Models/DatabaseModels/AlertReminderRule.js +4 -3
  1040. package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -1
  1041. package/build/dist/Models/DatabaseModels/AlertSeverity.js +4 -2
  1042. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  1043. package/build/dist/Models/DatabaseModels/AlertState.js +4 -2
  1044. package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
  1045. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +8 -0
  1046. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  1047. package/build/dist/Models/DatabaseModels/{IncidentForm.js → Form.js} +113 -219
  1048. package/build/dist/Models/DatabaseModels/Form.js.map +1 -0
  1049. package/build/dist/Models/DatabaseModels/{IncidentFormSubmission.js → FormSubmission.js} +170 -89
  1050. package/build/dist/Models/DatabaseModels/FormSubmission.js.map +1 -0
  1051. package/build/dist/Models/DatabaseModels/Incident.js +1 -1
  1052. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +7 -3
  1053. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  1054. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +4 -3
  1055. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  1056. package/build/dist/Models/DatabaseModels/IncidentMeasurement.js +16 -9
  1057. package/build/dist/Models/DatabaseModels/IncidentMeasurement.js.map +1 -1
  1058. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +4 -3
  1059. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -1
  1060. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +4 -2
  1061. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  1062. package/build/dist/Models/DatabaseModels/IncidentSlaRule.js +4 -3
  1063. package/build/dist/Models/DatabaseModels/IncidentSlaRule.js.map +1 -1
  1064. package/build/dist/Models/DatabaseModels/IncidentState.js +4 -2
  1065. package/build/dist/Models/DatabaseModels/IncidentState.js.map +1 -1
  1066. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
  1067. package/build/dist/Models/DatabaseModels/IncomingCallPolicyEscalationRule.js +4 -1
  1068. package/build/dist/Models/DatabaseModels/IncomingCallPolicyEscalationRule.js.map +1 -1
  1069. package/build/dist/Models/DatabaseModels/Index.js +4 -4
  1070. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  1071. package/build/dist/Models/DatabaseModels/LogDropFilter.js +4 -3
  1072. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  1073. package/build/dist/Models/DatabaseModels/LogPipeline.js +4 -3
  1074. package/build/dist/Models/DatabaseModels/LogPipeline.js.map +1 -1
  1075. package/build/dist/Models/DatabaseModels/LogPipelineProcessor.js +4 -3
  1076. package/build/dist/Models/DatabaseModels/LogPipelineProcessor.js.map +1 -1
  1077. package/build/dist/Models/DatabaseModels/LogScrubRule.js +3 -2
  1078. package/build/dist/Models/DatabaseModels/LogScrubRule.js.map +1 -1
  1079. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js +3 -2
  1080. package/build/dist/Models/DatabaseModels/MetricPipelineRule.js.map +1 -1
  1081. package/build/dist/Models/DatabaseModels/MetricRecordingRule.js +9 -3
  1082. package/build/dist/Models/DatabaseModels/MetricRecordingRule.js.map +1 -1
  1083. package/build/dist/Models/DatabaseModels/MonitorStatus.js +4 -1
  1084. package/build/dist/Models/DatabaseModels/MonitorStatus.js.map +1 -1
  1085. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +3 -1
  1086. package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -1
  1087. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +9 -3
  1088. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
  1089. package/build/dist/Models/DatabaseModels/Project.js +22 -13
  1090. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  1091. package/build/dist/Models/DatabaseModels/RunbookRule.js +334 -0
  1092. package/build/dist/Models/DatabaseModels/RunbookRule.js.map +1 -1
  1093. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +3 -1
  1094. package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
  1095. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js +16 -9
  1096. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceMeasurement.js.map +1 -1
  1097. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +4 -3
  1098. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -1
  1099. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceState.js +4 -2
  1100. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceState.js.map +1 -1
  1101. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -2
  1102. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
  1103. package/build/dist/Models/DatabaseModels/StatusPageFooterLink.js +4 -1
  1104. package/build/dist/Models/DatabaseModels/StatusPageFooterLink.js.map +1 -1
  1105. package/build/dist/Models/DatabaseModels/StatusPageHeaderLink.js +4 -1
  1106. package/build/dist/Models/DatabaseModels/StatusPageHeaderLink.js.map +1 -1
  1107. package/build/dist/Models/DatabaseModels/StatusPageHistoryChartBarColorRule.js +4 -1
  1108. package/build/dist/Models/DatabaseModels/StatusPageHistoryChartBarColorRule.js.map +1 -1
  1109. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +4 -3
  1110. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  1111. package/build/dist/Models/DatabaseModels/TracePipeline.js +4 -3
  1112. package/build/dist/Models/DatabaseModels/TracePipeline.js.map +1 -1
  1113. package/build/dist/Models/DatabaseModels/TracePipelineProcessor.js +4 -3
  1114. package/build/dist/Models/DatabaseModels/TracePipelineProcessor.js.map +1 -1
  1115. package/build/dist/Models/DatabaseModels/TraceRecordingRule.js +9 -3
  1116. package/build/dist/Models/DatabaseModels/TraceRecordingRule.js.map +1 -1
  1117. package/build/dist/Models/DatabaseModels/TraceScrubRule.js +3 -2
  1118. package/build/dist/Models/DatabaseModels/TraceScrubRule.js.map +1 -1
  1119. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +53 -1
  1120. package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
  1121. package/build/dist/Server/API/BaseAnalyticsAPI.js +15 -0
  1122. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  1123. package/build/dist/Server/API/{IncidentFormAPI.js → FormAPI.js} +57 -57
  1124. package/build/dist/Server/API/FormAPI.js.map +1 -0
  1125. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797300000000-TurnOnLinkedAlertSwitchesByDefault.js +29 -0
  1126. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797300000000-TurnOnLinkedAlertSwitchesByDefault.js.map +1 -0
  1127. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797400000000-MigrateIncidentFormsToForms.js +173 -0
  1128. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797400000000-MigrateIncidentFormsToForms.js.map +1 -0
  1129. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797500000000-AddRunbookRuleMatchCriteria.js +77 -0
  1130. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797500000000-AddRunbookRuleMatchCriteria.js.map +1 -0
  1131. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797600000000-AddSeverityAndStateColorsToNotificationEmailRollup.js +14 -0
  1132. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1797600000000-AddSeverityAndStateColorsToNotificationEmailRollup.js.map +1 -0
  1133. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  1134. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  1135. package/build/dist/Server/Middleware/{IncidentFormRateLimit.js → FormRateLimit.js} +159 -146
  1136. package/build/dist/Server/Middleware/FormRateLimit.js.map +1 -0
  1137. package/build/dist/Server/Services/AlertEpisodeService.js +2 -3
  1138. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  1139. package/build/dist/Server/Services/AlertMeasurementService.js +111 -20
  1140. package/build/dist/Server/Services/AlertMeasurementService.js.map +1 -1
  1141. package/build/dist/Server/Services/AlertReminderRuleService.js +0 -30
  1142. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  1143. package/build/dist/Server/Services/AlertService.js +2 -3
  1144. package/build/dist/Server/Services/AlertService.js.map +1 -1
  1145. package/build/dist/Server/Services/AlertSeverityService.js +14 -85
  1146. package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
  1147. package/build/dist/Server/Services/AlertStateService.js +28 -97
  1148. package/build/dist/Server/Services/AlertStateService.js.map +1 -1
  1149. package/build/dist/Server/Services/AnalyticsDatabaseService.js +82 -7
  1150. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  1151. package/build/dist/Server/Services/DatabaseService.js +216 -0
  1152. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  1153. package/build/dist/Server/Services/FormService.js +870 -0
  1154. package/build/dist/Server/Services/FormService.js.map +1 -0
  1155. package/build/dist/Server/Services/FormSubmissionService.js +21 -0
  1156. package/build/dist/Server/Services/FormSubmissionService.js.map +1 -0
  1157. package/build/dist/Server/Services/IncidentAlertService.js +30 -12
  1158. package/build/dist/Server/Services/IncidentAlertService.js.map +1 -1
  1159. package/build/dist/Server/Services/IncidentCustomFieldService.js +0 -83
  1160. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  1161. package/build/dist/Server/Services/IncidentEpisodeService.js +2 -3
  1162. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  1163. package/build/dist/Server/Services/IncidentMeasurementService.js +114 -20
  1164. package/build/dist/Server/Services/IncidentMeasurementService.js.map +1 -1
  1165. package/build/dist/Server/Services/IncidentReminderRuleService.js +0 -30
  1166. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  1167. package/build/dist/Server/Services/IncidentService.js +2 -3
  1168. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  1169. package/build/dist/Server/Services/IncidentSeverityService.js +14 -87
  1170. package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
  1171. package/build/dist/Server/Services/IncidentSlaRuleService.js +0 -30
  1172. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  1173. package/build/dist/Server/Services/IncidentStateService.js +28 -97
  1174. package/build/dist/Server/Services/IncidentStateService.js.map +1 -1
  1175. package/build/dist/Server/Services/IncidentStateTimelineService.js +2 -2
  1176. package/build/dist/Server/Services/IncomingCallPolicyEscalationRuleService.js +14 -145
  1177. package/build/dist/Server/Services/IncomingCallPolicyEscalationRuleService.js.map +1 -1
  1178. package/build/dist/Server/Services/Index.js +4 -4
  1179. package/build/dist/Server/Services/Index.js.map +1 -1
  1180. package/build/dist/Server/Services/LogService.js +9 -0
  1181. package/build/dist/Server/Services/LogService.js.map +1 -1
  1182. package/build/dist/Server/Services/MetricRecordingRuleService.js +92 -0
  1183. package/build/dist/Server/Services/MetricRecordingRuleService.js.map +1 -1
  1184. package/build/dist/Server/Services/MonitorStatusService.js +25 -108
  1185. package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
  1186. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +33 -0
  1187. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
  1188. package/build/dist/Server/Services/OnCallDutyPolicyService.js +261 -0
  1189. package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
  1190. package/build/dist/Server/Services/ProjectService.js +49 -62
  1191. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  1192. package/build/dist/Server/Services/RunbookRuleEngineService.js +289 -32
  1193. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  1194. package/build/dist/Server/Services/RunbookRuleService.js +87 -0
  1195. package/build/dist/Server/Services/RunbookRuleService.js.map +1 -1
  1196. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js +117 -20
  1197. package/build/dist/Server/Services/ScheduledMaintenanceMeasurementService.js.map +1 -1
  1198. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +0 -30
  1199. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  1200. package/build/dist/Server/Services/ScheduledMaintenanceService.js +2 -3
  1201. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  1202. package/build/dist/Server/Services/ScheduledMaintenanceStateService.js +28 -99
  1203. package/build/dist/Server/Services/ScheduledMaintenanceStateService.js.map +1 -1
  1204. package/build/dist/Server/Services/SpanService.js +17 -2
  1205. package/build/dist/Server/Services/SpanService.js.map +1 -1
  1206. package/build/dist/Server/Services/StatusPageFooterLinkService.js +8 -169
  1207. package/build/dist/Server/Services/StatusPageFooterLinkService.js.map +1 -1
  1208. package/build/dist/Server/Services/StatusPageHeaderLinkService.js +7 -168
  1209. package/build/dist/Server/Services/StatusPageHeaderLinkService.js.map +1 -1
  1210. package/build/dist/Server/Services/StatusPageHistoryChartBarColorRuleService.js +8 -169
  1211. package/build/dist/Server/Services/StatusPageHistoryChartBarColorRuleService.js.map +1 -1
  1212. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +14 -5
  1213. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  1214. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +7 -6
  1215. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
  1216. package/build/dist/Server/Services/TraceRecordingRuleService.js +11 -2
  1217. package/build/dist/Server/Services/TraceRecordingRuleService.js.map +1 -1
  1218. package/build/dist/Server/Services/UserNotificationRuleService.js +25 -59
  1219. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  1220. package/build/dist/Server/Utils/Database/ListOrderMaintainer.js +311 -0
  1221. package/build/dist/Server/Utils/Database/ListOrderMaintainer.js.map +1 -0
  1222. package/build/dist/Server/Utils/Database/StateOrderGuard.js +239 -0
  1223. package/build/dist/Server/Utils/Database/StateOrderGuard.js.map +1 -0
  1224. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +2 -0
  1225. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  1226. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +44 -3
  1227. package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
  1228. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +29 -1
  1229. package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
  1230. package/build/dist/Server/Utils/Form/FormRecordOptions.js +111 -0
  1231. package/build/dist/Server/Utils/Form/FormRecordOptions.js.map +1 -0
  1232. package/build/dist/Server/Utils/Form/FormSubmissionNote.js +154 -0
  1233. package/build/dist/Server/Utils/Form/FormSubmissionNote.js.map +1 -0
  1234. package/build/dist/Server/Utils/Form/FormTargetHandler.js +232 -0
  1235. package/build/dist/Server/Utils/Form/FormTargetHandler.js.map +1 -0
  1236. package/build/dist/Server/Utils/Form/FormTargets.js +13 -0
  1237. package/build/dist/Server/Utils/Form/FormTargets.js.map +1 -0
  1238. package/build/dist/Server/Utils/Form/IncidentFormTarget.js +400 -0
  1239. package/build/dist/Server/Utils/Form/IncidentFormTarget.js.map +1 -0
  1240. package/build/dist/Server/Utils/Form/ScheduledMaintenanceFormTarget.js +245 -0
  1241. package/build/dist/Server/Utils/Form/ScheduledMaintenanceFormTarget.js.map +1 -0
  1242. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionChange.js +43 -0
  1243. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionChange.js.map +1 -0
  1244. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js +6 -4
  1245. package/build/dist/Server/Utils/Measurement/MeasurementDefinitionValidator.js.map +1 -1
  1246. package/build/dist/Server/Utils/Measurement/MeasurementKeyAssigner.js +33 -0
  1247. package/build/dist/Server/Utils/Measurement/MeasurementKeyAssigner.js.map +1 -0
  1248. package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js +15 -2
  1249. package/build/dist/Server/Utils/Measurement/MeasurementMetricWriter.js.map +1 -1
  1250. package/build/dist/Server/Utils/Measurement/MeasurementStateReference.js +72 -0
  1251. package/build/dist/Server/Utils/Measurement/MeasurementStateReference.js.map +1 -0
  1252. package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +1 -1
  1253. package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +7 -7
  1254. package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -1
  1255. package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +14 -10
  1256. package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -1
  1257. package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +9 -15
  1258. package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -1
  1259. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +4 -0
  1260. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -1
  1261. package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +5 -4
  1262. package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -1
  1263. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +15 -66
  1264. package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -1
  1265. package/build/dist/Types/CustomField/CustomFieldValueFormat.js +3 -2
  1266. package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -1
  1267. package/build/dist/Types/CustomField/CustomFieldVariableKey.js +97 -88
  1268. package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -1
  1269. package/build/dist/Types/Database/ListOrderColumn.js +12 -0
  1270. package/build/dist/Types/Database/ListOrderColumn.js.map +1 -0
  1271. package/build/dist/Types/Form/FormField.js +713 -0
  1272. package/build/dist/Types/Form/FormField.js.map +1 -0
  1273. package/build/dist/Types/{Incident/IncidentFormIpAllowlist.js → Form/FormIpAllowlist.js} +3 -3
  1274. package/build/dist/Types/Form/FormIpAllowlist.js.map +1 -0
  1275. package/build/dist/Types/Form/FormPublic.js +786 -0
  1276. package/build/dist/Types/Form/FormPublic.js.map +1 -0
  1277. package/build/dist/Types/Form/FormSubmissionAnswer.js +82 -0
  1278. package/build/dist/Types/Form/FormSubmissionAnswer.js.map +1 -0
  1279. package/build/dist/Types/Form/FormTargetCatalog.js +213 -0
  1280. package/build/dist/Types/Form/FormTargetCatalog.js.map +1 -0
  1281. package/build/dist/Types/Form/FormTargetSettings.js +276 -0
  1282. package/build/dist/Types/Form/FormTargetSettings.js.map +1 -0
  1283. package/build/dist/Types/Form/FormTargetType.js +56 -0
  1284. package/build/dist/Types/Form/FormTargetType.js.map +1 -0
  1285. package/build/dist/Types/Form/LegacyIncidentFormConversion.js +131 -0
  1286. package/build/dist/Types/Form/LegacyIncidentFormConversion.js.map +1 -0
  1287. package/build/dist/Types/Measurement/MeasurementKey.js +72 -0
  1288. package/build/dist/Types/Measurement/MeasurementKey.js.map +1 -0
  1289. package/build/dist/Types/Measurement/MeasurementUnit.js +74 -0
  1290. package/build/dist/Types/Measurement/MeasurementUnit.js.map +1 -0
  1291. package/build/dist/Types/Metrics/RecordingRuleOutputMetricName.js +48 -0
  1292. package/build/dist/Types/Metrics/RecordingRuleOutputMetricName.js.map +1 -0
  1293. package/build/dist/Types/Monitor/MonitorCriteria.js +22 -0
  1294. package/build/dist/Types/Monitor/MonitorCriteria.js.map +1 -1
  1295. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +191 -25
  1296. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  1297. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  1298. package/build/dist/Types/Monitor/MonitorSteps.js.map +1 -1
  1299. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +3 -3
  1300. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  1301. package/build/dist/Types/OnCallDutyPolicy/EscalationRuleDefaults.js +95 -0
  1302. package/build/dist/Types/OnCallDutyPolicy/EscalationRuleDefaults.js.map +1 -0
  1303. package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js +87 -0
  1304. package/build/dist/Types/OnCallDutyPolicy/FirstResponders.js.map +1 -0
  1305. package/build/dist/Types/Permission.js +41 -34
  1306. package/build/dist/Types/Permission.js.map +1 -1
  1307. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +38 -1
  1308. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  1309. package/build/dist/Types/Rum/SessionReplay.js +24 -0
  1310. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  1311. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +17 -0
  1312. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -1
  1313. package/build/dist/Types/Runbook/RunbookRuleCriteria.js +151 -0
  1314. package/build/dist/Types/Runbook/RunbookRuleCriteria.js.map +1 -0
  1315. package/build/dist/Types/ScheduledMaintenance/MaintenanceWindow.js +105 -0
  1316. package/build/dist/Types/ScheduledMaintenance/MaintenanceWindow.js.map +1 -0
  1317. package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -1
  1318. package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +3 -2
  1319. package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -1
  1320. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +47 -22
  1321. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
  1322. package/build/dist/Types/Template/TemplateVariable.js +157 -0
  1323. package/build/dist/Types/Template/TemplateVariable.js.map +1 -0
  1324. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js +21 -54
  1325. package/build/dist/Types/Workspace/NotificationRules/NotificationRuleCondition.js.map +1 -1
  1326. package/build/dist/UI/Components/404.js +4 -2
  1327. package/build/dist/UI/Components/404.js.map +1 -1
  1328. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +6 -4
  1329. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  1330. package/build/dist/UI/Components/AIAgent/AIAgent.js +5 -2
  1331. package/build/dist/UI/Components/AIAgent/AIAgent.js.map +1 -1
  1332. package/build/dist/UI/Components/ActionButton/RowActions.js +23 -10
  1333. package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -1
  1334. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +19 -1
  1335. package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -1
  1336. package/build/dist/UI/Components/ActionCard/ActionCard.js +10 -1
  1337. package/build/dist/UI/Components/ActionCard/ActionCard.js.map +1 -1
  1338. package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js +15 -0
  1339. package/build/dist/UI/Components/AdvancedPageSection/AdvancedPageSection.js.map +1 -0
  1340. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +8 -4
  1341. package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
  1342. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js +5 -4
  1343. package/build/dist/UI/Components/AttributesJSON/AttributesJSONPreferences.js.map +1 -1
  1344. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js +11 -4
  1345. package/build/dist/UI/Components/AttributesJSON/AttributesJSONView.js.map +1 -1
  1346. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js +8 -3
  1347. package/build/dist/UI/Components/AttributesJSON/AttributesViewToggle.js.map +1 -1
  1348. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js +47 -23
  1349. package/build/dist/UI/Components/AttributesJSON/CopyAttributesAsJSONButton.js.map +1 -1
  1350. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +4 -2
  1351. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
  1352. package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +1 -1
  1353. package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  1354. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js +35 -131
  1355. package/build/dist/UI/Components/BulkUpdate/BulkOwnerActions.js.map +1 -1
  1356. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +57 -48
  1357. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  1358. package/build/dist/UI/Components/Button/Button.js +1 -1
  1359. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  1360. package/build/dist/UI/Components/Button/DropdownButton.js +1 -1
  1361. package/build/dist/UI/Components/Button/DropdownButton.js.map +1 -1
  1362. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +41 -28
  1363. package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
  1364. package/build/dist/UI/Components/Captcha/Captcha.js +3 -1
  1365. package/build/dist/UI/Components/Captcha/Captcha.js.map +1 -1
  1366. package/build/dist/UI/Components/Card/CardMoreMenu.js +19 -0
  1367. package/build/dist/UI/Components/Card/CardMoreMenu.js.map +1 -0
  1368. package/build/dist/UI/Components/CardSelect/CardSelect.js +26 -16
  1369. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  1370. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +10 -8
  1371. package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
  1372. package/build/dist/UI/Components/Charts/ChartGroup/NoDataMessage.js +3 -1
  1373. package/build/dist/UI/Components/Charts/ChartGroup/NoDataMessage.js.map +1 -1
  1374. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +3 -3
  1375. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -1
  1376. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +19 -5
  1377. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -1
  1378. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +6 -4
  1379. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  1380. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +6 -4
  1381. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  1382. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +6 -4
  1383. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  1384. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +9 -4
  1385. package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -1
  1386. package/build/dist/UI/Components/Checkbox/Checkbox.js +5 -3
  1387. package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
  1388. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +3 -1
  1389. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  1390. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +52 -28
  1391. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  1392. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js +11 -6
  1393. package/build/dist/UI/Components/CollapsibleSection/CollapsibleSection.js.map +1 -1
  1394. package/build/dist/UI/Components/ColorViewer/ColorViewer.js +10 -2
  1395. package/build/dist/UI/Components/ColorViewer/ColorViewer.js.map +1 -1
  1396. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -2
  1397. package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
  1398. package/build/dist/UI/Components/CopyableButton/CopyableButton.js +4 -2
  1399. package/build/dist/UI/Components/CopyableButton/CopyableButton.js.map +1 -1
  1400. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +7 -1
  1401. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  1402. package/build/dist/UI/Components/CustomFields/DropdownOptionsInput.js +16 -7
  1403. package/build/dist/UI/Components/CustomFields/DropdownOptionsInput.js.map +1 -1
  1404. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +63 -17
  1405. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -1
  1406. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +14 -11
  1407. package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
  1408. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +13 -12
  1409. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -1
  1410. package/build/dist/UI/Components/Date/RangeStartAndEndDateEdit.js +18 -16
  1411. package/build/dist/UI/Components/Date/RangeStartAndEndDateEdit.js.map +1 -1
  1412. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +4 -1
  1413. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
  1414. package/build/dist/UI/Components/Date/StartAndEndDate.js +4 -2
  1415. package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
  1416. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +18 -8
  1417. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -1
  1418. package/build/dist/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.js +30 -5
  1419. package/build/dist/UI/Components/DeleteConfirmation/DeleteConfirmationMessage.js.map +1 -1
  1420. package/build/dist/UI/Components/Detail/BooleanValue.js +15 -0
  1421. package/build/dist/UI/Components/Detail/BooleanValue.js.map +1 -0
  1422. package/build/dist/UI/Components/Detail/Detail.js +75 -40
  1423. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  1424. package/build/dist/UI/Components/Detail/DetailIdLine.js +100 -0
  1425. package/build/dist/UI/Components/Detail/DetailIdLine.js.map +1 -0
  1426. package/build/dist/UI/Components/Detail/DetailRecordId.js +72 -0
  1427. package/build/dist/UI/Components/Detail/DetailRecordId.js.map +1 -0
  1428. package/build/dist/UI/Components/Detail/PlaceholderText.js +17 -1
  1429. package/build/dist/UI/Components/Detail/PlaceholderText.js.map +1 -1
  1430. package/build/dist/UI/Components/Dictionary/Dictionary.js +7 -1
  1431. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  1432. package/build/dist/UI/Components/Dictionary/DictionaryOfStingsViewer.js +4 -2
  1433. package/build/dist/UI/Components/Dictionary/DictionaryOfStingsViewer.js.map +1 -1
  1434. package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -4
  1435. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  1436. package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js +19 -5
  1437. package/build/dist/UI/Components/DuplicateModel/DuplicateModel.js.map +1 -1
  1438. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +177 -134
  1439. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  1440. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +32 -26
  1441. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  1442. package/build/dist/UI/Components/ErrorBoundary.js +16 -13
  1443. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  1444. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +2 -2
  1445. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  1446. package/build/dist/UI/Components/EventItem/EventItem.js +8 -4
  1447. package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
  1448. package/build/dist/UI/Components/Events/RecurringViewElement.js +16 -5
  1449. package/build/dist/UI/Components/Events/RecurringViewElement.js.map +1 -1
  1450. package/build/dist/UI/Components/ExpandableText/ExpandableText.js +3 -1
  1451. package/build/dist/UI/Components/ExpandableText/ExpandableText.js.map +1 -1
  1452. package/build/dist/UI/Components/Feed/FeedActionsMenu.js +24 -0
  1453. package/build/dist/UI/Components/Feed/FeedActionsMenu.js.map +1 -0
  1454. package/build/dist/UI/Components/Feed/FeedCard.js +79 -0
  1455. package/build/dist/UI/Components/Feed/FeedCard.js.map +1 -0
  1456. package/build/dist/UI/Components/Feed/FeedEventTypeChecklist.js +122 -0
  1457. package/build/dist/UI/Components/Feed/FeedEventTypeChecklist.js.map +1 -0
  1458. package/build/dist/UI/Components/Feed/FeedFilterModal.js +23 -0
  1459. package/build/dist/UI/Components/Feed/FeedFilterModal.js.map +1 -0
  1460. package/build/dist/UI/Components/Feed/FeedFilterSummary.js +50 -0
  1461. package/build/dist/UI/Components/Feed/FeedFilterSummary.js.map +1 -0
  1462. package/build/dist/UI/Components/Feed/FeedItem.js +4 -1
  1463. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  1464. package/build/dist/UI/Components/Feed/FeedMoreMenu.js +50 -0
  1465. package/build/dist/UI/Components/Feed/FeedMoreMenu.js.map +1 -0
  1466. package/build/dist/UI/Components/Feed/FeedOptions.js +29 -65
  1467. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -1
  1468. package/build/dist/UI/Components/FilePicker/FilePicker.js +27 -27
  1469. package/build/dist/UI/Components/FilePicker/FilePicker.js.map +1 -1
  1470. package/build/dist/UI/Components/FilterButtons/FilterButtons.js +4 -2
  1471. package/build/dist/UI/Components/FilterButtons/FilterButtons.js.map +1 -1
  1472. package/build/dist/UI/Components/Filters/AppliedFilters.js +32 -0
  1473. package/build/dist/UI/Components/Filters/AppliedFilters.js.map +1 -0
  1474. package/build/dist/UI/Components/Filters/BooleanFilter.js +4 -1
  1475. package/build/dist/UI/Components/Filters/BooleanFilter.js.map +1 -1
  1476. package/build/dist/UI/Components/Filters/DateFilter.js +24 -5
  1477. package/build/dist/UI/Components/Filters/DateFilter.js.map +1 -1
  1478. package/build/dist/UI/Components/Filters/DropdownFilter.js +4 -1
  1479. package/build/dist/UI/Components/Filters/DropdownFilter.js.map +1 -1
  1480. package/build/dist/UI/Components/Filters/EntityFilter.js +28 -13
  1481. package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
  1482. package/build/dist/UI/Components/Filters/FilterPlaceholder.js +13 -0
  1483. package/build/dist/UI/Components/Filters/FilterPlaceholder.js.map +1 -0
  1484. package/build/dist/UI/Components/Filters/FilterViewer.js +81 -101
  1485. package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
  1486. package/build/dist/UI/Components/Filters/FiltersForm.js +15 -4
  1487. package/build/dist/UI/Components/Filters/FiltersForm.js.map +1 -1
  1488. package/build/dist/UI/Components/Filters/NumberFilter.js +26 -9
  1489. package/build/dist/UI/Components/Filters/NumberFilter.js.map +1 -1
  1490. package/build/dist/UI/Components/Filters/TextFilter.js +23 -8
  1491. package/build/dist/UI/Components/Filters/TextFilter.js.map +1 -1
  1492. package/build/dist/UI/Components/FormModal/BasicFormModal.js +51 -6
  1493. package/build/dist/UI/Components/FormModal/BasicFormModal.js.map +1 -1
  1494. package/build/dist/UI/Components/Forms/BasicForm.js +139 -23
  1495. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  1496. package/build/dist/UI/Components/Forms/BasicModelForm.js +1 -1
  1497. package/build/dist/UI/Components/Forms/BasicModelForm.js.map +1 -1
  1498. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +16 -3
  1499. package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -1
  1500. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +4 -2
  1501. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  1502. package/build/dist/UI/Components/Forms/Fields/FormField.js +124 -62
  1503. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  1504. package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js +146 -0
  1505. package/build/dist/UI/Components/Forms/Fields/GeneratedKeyField.js.map +1 -0
  1506. package/build/dist/UI/Components/Forms/Fields/IconPicker.js +5 -3
  1507. package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
  1508. package/build/dist/UI/Components/Forms/Fields/PermissionPicker.js +5 -3
  1509. package/build/dist/UI/Components/Forms/Fields/PermissionPicker.js.map +1 -1
  1510. package/build/dist/UI/Components/Forms/FormSummary.js +97 -15
  1511. package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
  1512. package/build/dist/UI/Components/Forms/ModelForm.js +110 -10
  1513. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  1514. package/build/dist/UI/Components/Forms/Steps/Steps.js +3 -1
  1515. package/build/dist/UI/Components/Forms/Steps/Steps.js.map +1 -1
  1516. package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
  1517. package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js +5 -0
  1518. package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js.map +1 -1
  1519. package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js +151 -0
  1520. package/build/dist/UI/Components/Forms/Utils/AdvancedFormSection.js.map +1 -0
  1521. package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js +92 -0
  1522. package/build/dist/UI/Components/Forms/Utils/CreateFormDefaults.js.map +1 -0
  1523. package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js +132 -0
  1524. package/build/dist/UI/Components/Forms/Utils/FinishFromAnyStep.js.map +1 -0
  1525. package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js +2 -0
  1526. package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js.map +1 -1
  1527. package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js +43 -0
  1528. package/build/dist/UI/Components/Forms/Utils/FormModalWidth.js.map +1 -0
  1529. package/build/dist/UI/Components/Forms/Validation.js +51 -34
  1530. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  1531. package/build/dist/UI/Components/FullPageModal/FullPageModal.js +3 -1
  1532. package/build/dist/UI/Components/FullPageModal/FullPageModal.js.map +1 -1
  1533. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +6 -5
  1534. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  1535. package/build/dist/UI/Components/Header/Notifications/Notifications.js +5 -5
  1536. package/build/dist/UI/Components/Header/Notifications/Notifications.js.map +1 -1
  1537. package/build/dist/UI/Components/Header/ProjectPicker/CreateNewProjectButton.js +3 -1
  1538. package/build/dist/UI/Components/Header/ProjectPicker/CreateNewProjectButton.js.map +1 -1
  1539. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.js +3 -1
  1540. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPickerFilterBox.js.map +1 -1
  1541. package/build/dist/UI/Components/Header/SearchBox.js +3 -1
  1542. package/build/dist/UI/Components/Header/SearchBox.js.map +1 -1
  1543. package/build/dist/UI/Components/HeaderAlert/HeaderModelAlert.js +3 -1
  1544. package/build/dist/UI/Components/HeaderAlert/HeaderModelAlert.js.map +1 -1
  1545. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBell.js +3 -1
  1546. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBell.js.map +1 -1
  1547. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +4 -2
  1548. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  1549. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellSection.js +3 -1
  1550. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellSection.js.map +1 -1
  1551. package/build/dist/UI/Components/HiddenText/HiddenText.js +3 -1
  1552. package/build/dist/UI/Components/HiddenText/HiddenText.js.map +1 -1
  1553. package/build/dist/UI/Components/Icon/Icon.js +5 -4
  1554. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  1555. package/build/dist/UI/Components/ImportExport/ExportModelCard.js +13 -2
  1556. package/build/dist/UI/Components/ImportExport/ExportModelCard.js.map +1 -1
  1557. package/build/dist/UI/Components/ImportExport/ImportModelsModal.js +38 -7
  1558. package/build/dist/UI/Components/ImportExport/ImportModelsModal.js.map +1 -1
  1559. package/build/dist/UI/Components/Input/Input.js +27 -3
  1560. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  1561. package/build/dist/UI/Components/IpAddressList/IpAddressList.js +8 -5
  1562. package/build/dist/UI/Components/IpAddressList/IpAddressList.js.map +1 -1
  1563. package/build/dist/UI/Components/JSONTable/JSONTable.js +10 -8
  1564. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  1565. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +45 -32
  1566. package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -1
  1567. package/build/dist/UI/Components/Link/Link.js +5 -2
  1568. package/build/dist/UI/Components/Link/Link.js.map +1 -1
  1569. package/build/dist/UI/Components/List/List.js +78 -14
  1570. package/build/dist/UI/Components/List/List.js.map +1 -1
  1571. package/build/dist/UI/Components/List/ListBody.js +11 -4
  1572. package/build/dist/UI/Components/List/ListBody.js.map +1 -1
  1573. package/build/dist/UI/Components/List/ListRow.js +10 -12
  1574. package/build/dist/UI/Components/List/ListRow.js.map +1 -1
  1575. package/build/dist/UI/Components/List/ListSkeleton.js +3 -1
  1576. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -1
  1577. package/build/dist/UI/Components/Loader/Loader.js +6 -4
  1578. package/build/dist/UI/Components/Loader/Loader.js.map +1 -1
  1579. package/build/dist/UI/Components/LogsViewer/LogsViewer.js +34 -5
  1580. package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
  1581. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +15 -7
  1582. package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
  1583. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +20 -16
  1584. package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
  1585. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +8 -4
  1586. package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
  1587. package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js +3 -1
  1588. package/build/dist/UI/Components/LogsViewer/components/HistogramTooltip.js.map +1 -1
  1589. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js +8 -7
  1590. package/build/dist/UI/Components/LogsViewer/components/KeyboardShortcutsHelp.js.map +1 -1
  1591. package/build/dist/UI/Components/LogsViewer/components/LiveLogsToggle.js +3 -1
  1592. package/build/dist/UI/Components/LogsViewer/components/LiveLogsToggle.js.map +1 -1
  1593. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +24 -22
  1594. package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
  1595. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +7 -3
  1596. package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
  1597. package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js +13 -15
  1598. package/build/dist/UI/Components/LogsViewer/components/LogSearchHelp.js.map +1 -1
  1599. package/build/dist/UI/Components/LogsViewer/components/LogSearchSuggestions.js +4 -5
  1600. package/build/dist/UI/Components/LogsViewer/components/LogSearchSuggestions.js.map +1 -1
  1601. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +13 -6
  1602. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  1603. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +3 -1
  1604. package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
  1605. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +7 -5
  1606. package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
  1607. package/build/dist/UI/Components/LogsViewer/components/LogsPagination.js +1 -1
  1608. package/build/dist/UI/Components/LogsViewer/components/LogsPagination.js.map +1 -1
  1609. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +32 -18
  1610. package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
  1611. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +32 -22
  1612. package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
  1613. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js +17 -11
  1614. package/build/dist/UI/Components/LogsViewer/components/SavedViewsDropdown.js.map +1 -1
  1615. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +3 -1
  1616. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  1617. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +17 -0
  1618. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  1619. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js +674 -112
  1620. package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
  1621. package/build/dist/UI/Components/Markdown.tsx/MarkdownToolbarLayout.js +150 -0
  1622. package/build/dist/UI/Components/Markdown.tsx/MarkdownToolbarLayout.js.map +1 -0
  1623. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +18 -7
  1624. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  1625. package/build/dist/UI/Components/MasterPage/MasterPage.js +3 -1
  1626. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  1627. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +30 -28
  1628. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  1629. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +19 -4
  1630. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  1631. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +15 -3
  1632. package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
  1633. package/build/dist/UI/Components/ModelDetail/ModelDetail.js +10 -5
  1634. package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
  1635. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js +36 -12
  1636. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  1637. package/build/dist/UI/Components/ModelList/ModelList.js +53 -7
  1638. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  1639. package/build/dist/UI/Components/ModelList/StaticModelList.js +14 -7
  1640. package/build/dist/UI/Components/ModelList/StaticModelList.js.map +1 -1
  1641. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +451 -220
  1642. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  1643. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +46 -39
  1644. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
  1645. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +2 -1
  1646. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  1647. package/build/dist/UI/Components/ModelTable/EmptyStateOptions.js +2 -0
  1648. package/build/dist/UI/Components/ModelTable/EmptyStateOptions.js.map +1 -0
  1649. package/build/dist/UI/Components/ModelTable/ModelTable.js +29 -5
  1650. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  1651. package/build/dist/UI/Components/ModelTable/ModelTableEmptyState.js +191 -0
  1652. package/build/dist/UI/Components/ModelTable/ModelTableEmptyState.js.map +1 -0
  1653. package/build/dist/UI/Components/ModelTable/TableView.js +9 -5
  1654. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  1655. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +3 -1
  1656. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -1
  1657. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +23 -1
  1658. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  1659. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +28 -22
  1660. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js.map +1 -1
  1661. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +24 -11
  1662. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  1663. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +16 -4
  1664. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  1665. package/build/dist/UI/Components/Navbar/NavBar.js +11 -19
  1666. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  1667. package/build/dist/UI/Components/Navbar/NavBarCategoryToggle.js +44 -0
  1668. package/build/dist/UI/Components/Navbar/NavBarCategoryToggle.js.map +1 -0
  1669. package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js +154 -0
  1670. package/build/dist/UI/Components/Navbar/NavBarMenuCatalog.js.map +1 -0
  1671. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +210 -86
  1672. package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
  1673. package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js +57 -0
  1674. package/build/dist/UI/Components/Navbar/NavBarMobileMenu.js.map +1 -0
  1675. package/build/dist/UI/Components/ObjectID/ObjectIDView.js +31 -5
  1676. package/build/dist/UI/Components/ObjectID/ObjectIDView.js.map +1 -1
  1677. package/build/dist/UI/Components/OsVersionDisplay/OsVersionDisplay.js +7 -1
  1678. package/build/dist/UI/Components/OsVersionDisplay/OsVersionDisplay.js.map +1 -1
  1679. package/build/dist/UI/Components/Page/ModelPage.js +8 -2
  1680. package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
  1681. package/build/dist/UI/Components/Page/Page.js +1 -1
  1682. package/build/dist/UI/Components/Page/Page.js.map +1 -1
  1683. package/build/dist/UI/Components/Pagination/Pagination.js +143 -65
  1684. package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
  1685. package/build/dist/UI/Components/Pagination/PaginationCopy.js +51 -0
  1686. package/build/dist/UI/Components/Pagination/PaginationCopy.js.map +1 -0
  1687. package/build/dist/UI/Components/Pagination/PaginationSummary.js +53 -0
  1688. package/build/dist/UI/Components/Pagination/PaginationSummary.js.map +1 -0
  1689. package/build/dist/UI/Components/PeoplePicker/OwnersFormField.js +59 -0
  1690. package/build/dist/UI/Components/PeoplePicker/OwnersFormField.js.map +1 -0
  1691. package/build/dist/UI/Components/PeoplePicker/OwnersPicker.js +30 -0
  1692. package/build/dist/UI/Components/PeoplePicker/OwnersPicker.js.map +1 -0
  1693. package/build/dist/UI/Components/PeoplePicker/PeopleAvatar.js +109 -0
  1694. package/build/dist/UI/Components/PeoplePicker/PeopleAvatar.js.map +1 -0
  1695. package/build/dist/UI/Components/PeoplePicker/PeopleList.js +72 -0
  1696. package/build/dist/UI/Components/PeoplePicker/PeopleList.js.map +1 -0
  1697. package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js +93 -0
  1698. package/build/dist/UI/Components/PeoplePicker/PeoplePicker.js.map +1 -0
  1699. package/build/dist/UI/Components/PeoplePicker/PeoplePickerKinds.js +379 -0
  1700. package/build/dist/UI/Components/PeoplePicker/PeoplePickerKinds.js.map +1 -0
  1701. package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js +129 -0
  1702. package/build/dist/UI/Components/PeoplePicker/PeoplePickerTypes.js.map +1 -0
  1703. package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js +280 -0
  1704. package/build/dist/UI/Components/PeoplePicker/PeopleSearchPopup.js.map +1 -0
  1705. package/build/dist/UI/Components/PeoplePicker/usePeopleOptions.js +151 -0
  1706. package/build/dist/UI/Components/PeoplePicker/usePeopleOptions.js.map +1 -0
  1707. package/build/dist/UI/Components/Pill/Pill.js +14 -3
  1708. package/build/dist/UI/Components/Pill/Pill.js.map +1 -1
  1709. package/build/dist/UI/Components/Pill/PillColors.js +22 -181
  1710. package/build/dist/UI/Components/Pill/PillColors.js.map +1 -1
  1711. package/build/dist/UI/Components/Probe/Probe.js +4 -2
  1712. package/build/dist/UI/Components/Probe/Probe.js.map +1 -1
  1713. package/build/dist/UI/Components/ProgressBar/ProgressBar.js +14 -7
  1714. package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
  1715. package/build/dist/UI/Components/ProgressButtons/ProgressButtons.js +3 -1
  1716. package/build/dist/UI/Components/ProgressButtons/ProgressButtons.js.map +1 -1
  1717. package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js +27 -8
  1718. package/build/dist/UI/Components/ProjectInvitations/PendingProjectInvitations.js.map +1 -1
  1719. package/build/dist/UI/Components/PublicForm/PublicFormFields.js +248 -0
  1720. package/build/dist/UI/Components/PublicForm/PublicFormFields.js.map +1 -0
  1721. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +15 -2
  1722. package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
  1723. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +215 -335
  1724. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -1
  1725. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaFields.js +585 -0
  1726. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaFields.js.map +1 -0
  1727. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js +32 -6
  1728. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js.map +1 -1
  1729. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js +69 -16
  1730. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js.map +1 -1
  1731. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js +18 -19
  1732. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js.map +1 -1
  1733. package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +53 -2
  1734. package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -1
  1735. package/build/dist/UI/Components/RuleRun/RuleEnabledField.js +41 -0
  1736. package/build/dist/UI/Components/RuleRun/RuleEnabledField.js.map +1 -0
  1737. package/build/dist/UI/Components/RuleRun/RuleTable.js +9 -1
  1738. package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -1
  1739. package/build/dist/UI/Components/RuleRun/RuleView.js +11 -4
  1740. package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -1
  1741. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +8 -1
  1742. package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -1
  1743. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +12 -13
  1744. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -1
  1745. package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js +19 -8
  1746. package/build/dist/UI/Components/SavedViews/SavedViewsFacetSection.js.map +1 -1
  1747. package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js +5 -2
  1748. package/build/dist/UI/Components/SavedViews/SavedViewsSearchInput.js.map +1 -1
  1749. package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js +5 -1
  1750. package/build/dist/UI/Components/SavedViews/SavedViewsShowMoreButton.js.map +1 -1
  1751. package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -6
  1752. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  1753. package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
  1754. package/build/dist/UI/Components/SideMenu/SideMenuSectionState.js +52 -9
  1755. package/build/dist/UI/Components/SideMenu/SideMenuSectionState.js.map +1 -1
  1756. package/build/dist/UI/Components/SideOver/SideOver.js +9 -6
  1757. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  1758. package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js +3 -1
  1759. package/build/dist/UI/Components/SimpleLogViewer/SimpleLogViewer.js.map +1 -1
  1760. package/build/dist/UI/Components/StackedProgressBar/StackedProgressBar.js +3 -1
  1761. package/build/dist/UI/Components/StackedProgressBar/StackedProgressBar.js.map +1 -1
  1762. package/build/dist/UI/Components/StateTimeline/CurrentlyActiveIndicator.js +28 -0
  1763. package/build/dist/UI/Components/StateTimeline/CurrentlyActiveIndicator.js.map +1 -0
  1764. package/build/dist/UI/Components/StateTimeline/StateTimelineColumns.js +55 -0
  1765. package/build/dist/UI/Components/StateTimeline/StateTimelineColumns.js.map +1 -0
  1766. package/build/dist/UI/Components/StateTimeline/StateTimelineDuration.js +28 -0
  1767. package/build/dist/UI/Components/StateTimeline/StateTimelineDuration.js.map +1 -0
  1768. package/build/dist/UI/Components/StateTimeline/StateTimelineEndsAt.js +19 -0
  1769. package/build/dist/UI/Components/StateTimeline/StateTimelineEndsAt.js.map +1 -0
  1770. package/build/dist/UI/Components/StatusBadge/StatusBadge.js +4 -1
  1771. package/build/dist/UI/Components/StatusBadge/StatusBadge.js.map +1 -1
  1772. package/build/dist/UI/Components/StatusBubble/StatusBubble.js +7 -2
  1773. package/build/dist/UI/Components/StatusBubble/StatusBubble.js.map +1 -1
  1774. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +31 -20
  1775. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
  1776. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +34 -16
  1777. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
  1778. package/build/dist/UI/Components/StatusPage/ResourceList.js +28 -11
  1779. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  1780. package/build/dist/UI/Components/Table/DragHandle.js +30 -0
  1781. package/build/dist/UI/Components/Table/DragHandle.js.map +1 -0
  1782. package/build/dist/UI/Components/Table/EmptyTableMessage.js +159 -35
  1783. package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -1
  1784. package/build/dist/UI/Components/Table/Table.js +140 -50
  1785. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  1786. package/build/dist/UI/Components/Table/TableBody.js +26 -2
  1787. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  1788. package/build/dist/UI/Components/Table/TableEmptyState.js +118 -0
  1789. package/build/dist/UI/Components/Table/TableEmptyState.js.map +1 -0
  1790. package/build/dist/UI/Components/Table/TableEmptyStateBuilders.js +114 -0
  1791. package/build/dist/UI/Components/Table/TableEmptyStateBuilders.js.map +1 -0
  1792. package/build/dist/UI/Components/Table/TableRow.js +46 -20
  1793. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  1794. package/build/dist/UI/Components/Table/TableSkeletonRows.js +4 -2
  1795. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  1796. package/build/dist/UI/Components/TableColumnList/TableColumnListComponent.js +11 -2
  1797. package/build/dist/UI/Components/TableColumnList/TableColumnListComponent.js.map +1 -1
  1798. package/build/dist/UI/Components/Tabs/Tabs.js +3 -1
  1799. package/build/dist/UI/Components/Tabs/Tabs.js.map +1 -1
  1800. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +27 -8
  1801. package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
  1802. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +31 -9
  1803. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  1804. package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js +9 -2
  1805. package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js.map +1 -1
  1806. package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js +5 -1
  1807. package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js.map +1 -1
  1808. package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js +8 -3
  1809. package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js.map +1 -1
  1810. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +56 -27
  1811. package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
  1812. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +17 -11
  1813. package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
  1814. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +9 -3
  1815. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
  1816. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +4 -2
  1817. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
  1818. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +3 -1
  1819. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
  1820. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +8 -4
  1821. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
  1822. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +9 -5
  1823. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
  1824. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +3 -1
  1825. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -1
  1826. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryItemLabel.js +11 -0
  1827. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryItemLabel.js.map +1 -0
  1828. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryPagination.js +3 -10
  1829. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryPagination.js.map +1 -1
  1830. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryResultTotal.js +60 -0
  1831. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryResultTotal.js.map +1 -0
  1832. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js +5 -3
  1833. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchBar.js.map +1 -1
  1834. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchHelp.js +13 -13
  1835. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchHelp.js.map +1 -1
  1836. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchSuggestions.js +4 -5
  1837. package/build/dist/UI/Components/TelemetryViewer/components/TelemetrySearchSuggestions.js.map +1 -1
  1838. package/build/dist/UI/Components/TemplateVariables/InsertTemplateVariableButton.js +90 -0
  1839. package/build/dist/UI/Components/TemplateVariables/InsertTemplateVariableButton.js.map +1 -0
  1840. package/build/dist/UI/Components/TemplateVariables/TemplateVariableIcons.js +15 -0
  1841. package/build/dist/UI/Components/TemplateVariables/TemplateVariableIcons.js.map +1 -0
  1842. package/build/dist/UI/Components/TemplateVariables/TemplateVariableMenu.js +159 -0
  1843. package/build/dist/UI/Components/TemplateVariables/TemplateVariableMenu.js.map +1 -0
  1844. package/build/dist/UI/Components/TemplateVariables/TemplateVariablePopup.js +160 -0
  1845. package/build/dist/UI/Components/TemplateVariables/TemplateVariablePopup.js.map +1 -0
  1846. package/build/dist/UI/Components/TemplateVariables/TemplateVariableTextControl.js +73 -0
  1847. package/build/dist/UI/Components/TemplateVariables/TemplateVariableTextControl.js.map +1 -0
  1848. package/build/dist/UI/Components/TemplateVariables/TemplateVariablesCopy.js +28 -0
  1849. package/build/dist/UI/Components/TemplateVariables/TemplateVariablesCopy.js.map +1 -0
  1850. package/build/dist/UI/Components/TemplateVariables/TemplateVariablesList.js +98 -0
  1851. package/build/dist/UI/Components/TemplateVariables/TemplateVariablesList.js.map +1 -0
  1852. package/build/dist/UI/Components/TemplateVariables/TextControlUtil.js +197 -0
  1853. package/build/dist/UI/Components/TemplateVariables/TextControlUtil.js.map +1 -0
  1854. package/build/dist/UI/Components/TemplateVariables/useTemplateVariableTyping.js +184 -0
  1855. package/build/dist/UI/Components/TemplateVariables/useTemplateVariableTyping.js.map +1 -0
  1856. package/build/dist/UI/Components/TimePicker/TimePicker.js +22 -21
  1857. package/build/dist/UI/Components/TimePicker/TimePicker.js.map +1 -1
  1858. package/build/dist/UI/Components/Toggle/Toggle.js +39 -25
  1859. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  1860. package/build/dist/UI/Components/Tooltip/InfoTooltip.js +6 -1
  1861. package/build/dist/UI/Components/Tooltip/InfoTooltip.js.map +1 -1
  1862. package/build/dist/UI/Components/Tooltip/Tooltip.js +5 -3
  1863. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  1864. package/build/dist/UI/Components/TranslatedSentence/TranslatedSentence.js +22 -0
  1865. package/build/dist/UI/Components/TranslatedSentence/TranslatedSentence.js.map +1 -0
  1866. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +23 -9
  1867. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  1868. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnPicker.js +15 -14
  1869. package/build/dist/UI/Components/Workflow/ColumnEditor/AddColumnPicker.js.map +1 -1
  1870. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.js +8 -6
  1871. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnConditionRow.js.map +1 -1
  1872. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnControl.js +22 -14
  1873. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnControl.js.map +1 -1
  1874. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.js +15 -12
  1875. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnFieldRow.js.map +1 -1
  1876. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnOperators.js +15 -14
  1877. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnOperators.js.map +1 -1
  1878. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.js +2 -1
  1879. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnPickerOptions.js.map +1 -1
  1880. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnRowSerialization.js +3 -2
  1881. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnRowSerialization.js.map +1 -1
  1882. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnValueInput.js +13 -6
  1883. package/build/dist/UI/Components/Workflow/ColumnEditor/ColumnValueInput.js.map +1 -1
  1884. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +9 -6
  1885. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
  1886. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelRecordForm.js +20 -10
  1887. package/build/dist/UI/Components/Workflow/ColumnEditor/ModelRecordForm.js.map +1 -1
  1888. package/build/dist/UI/Components/Workflow/Component.js +7 -3
  1889. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  1890. package/build/dist/UI/Components/Workflow/ComponentArgumentsViewer.js +10 -3
  1891. package/build/dist/UI/Components/Workflow/ComponentArgumentsViewer.js.map +1 -1
  1892. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerItems.js +33 -15
  1893. package/build/dist/UI/Components/Workflow/ComponentPicker/PickerItems.js.map +1 -1
  1894. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js +3 -1
  1895. package/build/dist/UI/Components/Workflow/ComponentPortViewer.js.map +1 -1
  1896. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js +7 -2
  1897. package/build/dist/UI/Components/Workflow/ComponentReturnValueViewer.js.map +1 -1
  1898. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +15 -6
  1899. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
  1900. package/build/dist/UI/Components/Workflow/ComponentSettingsSection.js +4 -2
  1901. package/build/dist/UI/Components/Workflow/ComponentSettingsSection.js.map +1 -1
  1902. package/build/dist/UI/Components/Workflow/ComponentsModal.js +67 -48
  1903. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  1904. package/build/dist/UI/Components/Workflow/Condition/ConditionEditor.js +35 -17
  1905. package/build/dist/UI/Components/Workflow/Condition/ConditionEditor.js.map +1 -1
  1906. package/build/dist/UI/Components/Workflow/Condition/ConditionModel.js +23 -11
  1907. package/build/dist/UI/Components/Workflow/Condition/ConditionModel.js.map +1 -1
  1908. package/build/dist/UI/Components/Workflow/CronScheduleField.js +25 -24
  1909. package/build/dist/UI/Components/Workflow/CronScheduleField.js.map +1 -1
  1910. package/build/dist/UI/Components/Workflow/DocumentationViewer.js +10 -2
  1911. package/build/dist/UI/Components/Workflow/DocumentationViewer.js.map +1 -1
  1912. package/build/dist/UI/Components/Workflow/GraphLint.js +40 -13
  1913. package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -1
  1914. package/build/dist/UI/Components/Workflow/GraphLintSummary.js +16 -7
  1915. package/build/dist/UI/Components/Workflow/GraphLintSummary.js.map +1 -1
  1916. package/build/dist/UI/Components/Workflow/ManualTriggerPanel.js +11 -8
  1917. package/build/dist/UI/Components/Workflow/ManualTriggerPanel.js.map +1 -1
  1918. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +47 -38
  1919. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -1
  1920. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +54 -37
  1921. package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
  1922. package/build/dist/UI/Components/Workflow/RunForm.js +13 -5
  1923. package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
  1924. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +27 -6
  1925. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -1
  1926. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +68 -44
  1927. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
  1928. package/build/dist/UI/Components/Workflow/UseRunWatch.js +2 -2
  1929. package/build/dist/UI/Components/Workflow/UseRunWatch.js.map +1 -1
  1930. package/build/dist/UI/Components/Workflow/Utils.js +4 -1
  1931. package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
  1932. package/build/dist/UI/Components/Workflow/ValuePicker/InsertValueButton.js +4 -2
  1933. package/build/dist/UI/Components/Workflow/ValuePicker/InsertValueButton.js.map +1 -1
  1934. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerMenu.js +60 -48
  1935. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerMenu.js.map +1 -1
  1936. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerPopup.js +3 -1
  1937. package/build/dist/UI/Components/Workflow/ValuePicker/ValuePickerPopup.js.map +1 -1
  1938. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSingleField.js +6 -3
  1939. package/build/dist/UI/Components/Workflow/ValuePicker/ValueSingleField.js.map +1 -1
  1940. package/build/dist/UI/Components/Workflow/ValuePicker/ValueTextField.js +7 -4
  1941. package/build/dist/UI/Components/Workflow/ValuePicker/ValueTextField.js.map +1 -1
  1942. package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js +21 -20
  1943. package/build/dist/UI/Components/Workflow/WorkflowIssuesModal.js.map +1 -1
  1944. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js +9 -5
  1945. package/build/dist/UI/Components/Workflow/WorkflowLogModal.js.map +1 -1
  1946. package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js +16 -9
  1947. package/build/dist/UI/Components/Workflow/WorkflowStatusBar.js.map +1 -1
  1948. package/build/dist/UI/Types/UseAnchoredFieldPopup.js +2 -2
  1949. package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
  1950. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +2 -4
  1951. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  1952. package/build/dist/UI/Utils/Dropdown.js +74 -2
  1953. package/build/dist/UI/Utils/Dropdown.js.map +1 -1
  1954. package/build/dist/UI/Utils/ForeignDomMutationGuard.js +111 -0
  1955. package/build/dist/UI/Utils/ForeignDomMutationGuard.js.map +1 -0
  1956. package/build/dist/UI/Utils/GrantablePermission.js +108 -0
  1957. package/build/dist/UI/Utils/GrantablePermission.js.map +1 -0
  1958. package/build/dist/UI/Utils/PermissionGate.js +30 -2
  1959. package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
  1960. package/build/dist/UI/Utils/Rules/RuleRunClient.js +10 -2
  1961. package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -1
  1962. package/build/dist/UI/Utils/Telemetry/ResultTotal.js +102 -0
  1963. package/build/dist/UI/Utils/Telemetry/ResultTotal.js.map +1 -0
  1964. package/build/dist/UI/Utils/Telemetry/UseResultTotal.js +94 -0
  1965. package/build/dist/UI/Utils/Telemetry/UseResultTotal.js.map +1 -0
  1966. package/build/dist/UI/Utils/TranslateTemplate.js +353 -13
  1967. package/build/dist/UI/Utils/TranslateTemplate.js.map +1 -1
  1968. package/build/dist/UI/Utils/Translation.js +23 -2
  1969. package/build/dist/UI/Utils/Translation.js.map +1 -1
  1970. package/build/dist/UI/Utils/UseClockTick.js +20 -2
  1971. package/build/dist/UI/Utils/UseClockTick.js.map +1 -1
  1972. package/build/dist/UI/Utils/UseLiveDuration.js +66 -0
  1973. package/build/dist/UI/Utils/UseLiveDuration.js.map +1 -0
  1974. package/build/dist/UI/Utils/UseTranslator.js +20 -0
  1975. package/build/dist/UI/Utils/UseTranslator.js.map +1 -0
  1976. package/build/dist/Utils/ColorContrast.js +182 -0
  1977. package/build/dist/Utils/ColorContrast.js.map +1 -0
  1978. package/build/dist/Utils/DeveloperDocs/AiAssistantExamples.js +3 -3
  1979. package/build/dist/Utils/DeveloperDocs/AiAssistantExamples.js.map +1 -1
  1980. package/build/dist/Utils/DeveloperDocs/ApiExamples.js +1 -177
  1981. package/build/dist/Utils/DeveloperDocs/ApiExamples.js.map +1 -1
  1982. package/build/dist/Utils/DeveloperDocs/ExampleBuilder.js +1116 -0
  1983. package/build/dist/Utils/DeveloperDocs/ExampleBuilder.js.map +1 -0
  1984. package/build/dist/Utils/DeveloperDocs/ExampleValues.js +67 -0
  1985. package/build/dist/Utils/DeveloperDocs/ExampleValues.js.map +1 -1
  1986. package/build/dist/Utils/DeveloperDocs/Hcl.js +93 -17
  1987. package/build/dist/Utils/DeveloperDocs/Hcl.js.map +1 -1
  1988. package/build/dist/Utils/DeveloperDocs/LiveData.js +142 -0
  1989. package/build/dist/Utils/DeveloperDocs/LiveData.js.map +1 -0
  1990. package/build/dist/Utils/DeveloperDocs/PageLookups.js +224 -0
  1991. package/build/dist/Utils/DeveloperDocs/PageLookups.js.map +1 -0
  1992. package/build/dist/Utils/DeveloperDocs/ResourceProfiles.js +1447 -0
  1993. package/build/dist/Utils/DeveloperDocs/ResourceProfiles.js.map +1 -0
  1994. package/build/dist/Utils/DeveloperDocs/TerraformConfig.js +82 -79
  1995. package/build/dist/Utils/DeveloperDocs/TerraformConfig.js.map +1 -1
  1996. package/build/dist/Utils/DeveloperDocs/TerraformMonitorSteps.js +35 -12
  1997. package/build/dist/Utils/DeveloperDocs/TerraformMonitorSteps.js.map +1 -1
  1998. package/build/dist/Utils/DeveloperDocs/TerraformSchema.js +54 -0
  1999. package/build/dist/Utils/DeveloperDocs/TerraformSchema.js.map +1 -1
  2000. package/build/dist/Utils/Email/EmailColorUtil.js +101 -0
  2001. package/build/dist/Utils/Email/EmailColorUtil.js.map +1 -0
  2002. package/build/dist/Utils/Episode/EpisodeTemplateVariables.js +60 -0
  2003. package/build/dist/Utils/Episode/EpisodeTemplateVariables.js.map +1 -0
  2004. package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +26 -5
  2005. package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -1
  2006. package/build/dist/Utils/Incident/IncidentSlaNoteTemplateVariables.js +26 -0
  2007. package/build/dist/Utils/Incident/IncidentSlaNoteTemplateVariables.js.map +1 -0
  2008. package/build/dist/Utils/KeyFromName.js +139 -0
  2009. package/build/dist/Utils/KeyFromName.js.map +1 -0
  2010. package/build/dist/Utils/ListOrder.js +242 -0
  2011. package/build/dist/Utils/ListOrder.js.map +1 -0
  2012. package/build/dist/Utils/Measurement/MeasurementMoments.js +477 -0
  2013. package/build/dist/Utils/Measurement/MeasurementMoments.js.map +1 -0
  2014. package/build/dist/Utils/Project/NumberPrefix.js +126 -0
  2015. package/build/dist/Utils/Project/NumberPrefix.js.map +1 -0
  2016. package/build/dist/Utils/Slo/SloBurnRateTemplate.js +17 -0
  2017. package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -1
  2018. package/build/dist/Utils/StateOrder.js +384 -0
  2019. package/build/dist/Utils/StateOrder.js.map +1 -0
  2020. package/package.json +1 -1
  2021. package/Server/Services/IncidentFormService.ts +0 -1566
  2022. package/Server/Services/IncidentFormSubmissionService.ts +0 -97
  2023. package/Tests/App/Accounts/IncidentFormPage.test.tsx +0 -2036
  2024. package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +0 -119
  2025. package/Tests/App/Accounts/IncidentFormUtils.test.ts +0 -1157
  2026. package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +0 -1324
  2027. package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +0 -297
  2028. package/Tests/Server/Services/IncidentFormPublicForm.test.ts +0 -1260
  2029. package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +0 -2520
  2030. package/Tests/Server/Services/IncidentFormService.test.ts +0 -663
  2031. package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +0 -430
  2032. package/Tests/Types/Incident/IncidentFormPublic.test.ts +0 -1916
  2033. package/Tests/UI/Components/FeedOptionsButton.test.tsx +0 -2610
  2034. package/Tests/UI/Components/Item.test.tsx +0 -72
  2035. package/Tests/UI/Components/OrderedStatesList.test.tsx +0 -148
  2036. package/Tests/UI/Components/OrderedStatesListCreateGate.test.tsx +0 -174
  2037. package/Types/Incident/IncidentFormPublic.ts +0 -1145
  2038. package/UI/Components/EventHistoryList/NoEventDay.tsx +0 -27
  2039. package/UI/Components/Feed/FeedOptionsButton.tsx +0 -692
  2040. package/UI/Components/OrderedStatesList/Item.tsx +0 -76
  2041. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +0 -261
  2042. package/build/dist/Models/DatabaseModels/IncidentForm.js.map +0 -1
  2043. package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +0 -1
  2044. package/build/dist/Server/API/IncidentFormAPI.js.map +0 -1
  2045. package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +0 -1
  2046. package/build/dist/Server/Services/IncidentFormService.js +0 -1202
  2047. package/build/dist/Server/Services/IncidentFormService.js.map +0 -1
  2048. package/build/dist/Server/Services/IncidentFormSubmissionService.js +0 -91
  2049. package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +0 -1
  2050. package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +0 -1
  2051. package/build/dist/Types/Incident/IncidentFormPublic.js +0 -678
  2052. package/build/dist/Types/Incident/IncidentFormPublic.js.map +0 -1
  2053. package/build/dist/UI/Components/EventHistoryList/NoEventDay.js +0 -16
  2054. package/build/dist/UI/Components/EventHistoryList/NoEventDay.js.map +0 -1
  2055. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +0 -346
  2056. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +0 -1
  2057. package/build/dist/UI/Components/OrderedStatesList/Item.js +0 -29
  2058. package/build/dist/UI/Components/OrderedStatesList/Item.js.map +0 -1
  2059. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +0 -101
  2060. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +0 -1
@@ -1,2610 +0,0 @@
1
- import {
2
- afterEach,
3
- beforeAll,
4
- describe,
5
- expect,
6
- jest,
7
- test,
8
- } from "@jest/globals";
9
- import "@testing-library/jest-dom";
10
- import {
11
- act,
12
- cleanup,
13
- fireEvent,
14
- render,
15
- RenderResult,
16
- screen,
17
- within,
18
- } from "@testing-library/react";
19
- import { createInstance, i18n } from "i18next";
20
- import type { SpyInstance } from "jest-mock";
21
- import * as React from "react";
22
- import { I18nextProvider } from "react-i18next";
23
- import SortOrder from "../../../Types/BaseDatabase/SortOrder";
24
- import IconProp from "../../../Types/Icon/IconProp";
25
- import {
26
- DEFAULT_FEED_OPTIONS,
27
- FeedEventTypeOption,
28
- FeedOptions,
29
- } from "../../../UI/Components/Feed/FeedOptions";
30
- import FeedOptionsButton, {
31
- FEED_EVENT_TYPE_SEARCH_THRESHOLD,
32
- FEED_OPTIONS_PANEL_WIDTH_PX,
33
- FEED_OPTIONS_VIEWPORT_GUTTER_PX,
34
- FeedOptionsPanelPlacement,
35
- getFeedOptionsPanelPlacement,
36
- } from "../../../UI/Components/Feed/FeedOptionsButton";
37
- import Icon from "../../../UI/Components/Icon/Icon";
38
-
39
- /*
40
- * The one "Filter & Sort" control in every dashboard activity feed's header.
41
- * The component is controlled, so most behaviour is driven through a small
42
- * harness that holds the options in state the way useFeedOptions does, while
43
- * exact payloads are asserted against a bare onChange mock.
44
- */
45
-
46
- type OnChangeMock = ReturnType<typeof jest.fn<(options: FeedOptions) => void>>;
47
-
48
- /*
49
- * The button is named by its visible label alone; the state behind it (order
50
- * and filter) is its description, so a screen reader says each once.
51
- */
52
- const TRIGGER_NAME: string = "Filter & Sort";
53
-
54
- const PANEL_NAME: string = "Filter and sort feed";
55
-
56
- const UNFILTERED_SUMMARY: string =
57
- "Showing every event type. Tick one or more to narrow the feed.";
58
-
59
- const CUSTOMIZED_TRIGGER_CLASSES: Array<string> = [
60
- "border-indigo-300",
61
- "bg-indigo-50",
62
- "text-indigo-700",
63
- ];
64
-
65
- const DEFAULT_TRIGGER_CLASSES: Array<string> = [
66
- "border-gray-300",
67
- "bg-white",
68
- "text-gray-700",
69
- ];
70
-
71
- // Three entries, in checklist order; the last one has no icon.
72
- const EVENT_TYPE_OPTIONS: Array<FeedEventTypeOption> = [
73
- {
74
- value: "IncidentCreated",
75
- label: "Incident Created",
76
- icon: IconProp.Alert,
77
- },
78
- {
79
- value: "IncidentStateChanged",
80
- label: "Incident State Changed",
81
- icon: IconProp.Edit,
82
- },
83
- {
84
- value: "OwnerUserAdded",
85
- label: "User Added as Owner",
86
- },
87
- ];
88
-
89
- // Long enough to earn the search box.
90
- const LONG_EVENT_TYPE_OPTIONS: Array<FeedEventTypeOption> = [
91
- { value: "AlertAcknowledged", label: "Alert Acknowledged" },
92
- { value: "AlertCreated", label: "Alert Created" },
93
- { value: "AlertResolved", label: "Alert Resolved" },
94
- { value: "IncidentCreated", label: "Incident Created" },
95
- { value: "IncidentResolved", label: "Incident Resolved" },
96
- { value: "MonitorStatusChanged", label: "Monitor Status Changed" },
97
- { value: "OwnerNotificationSent", label: "Owner Notification Sent" },
98
- {
99
- value: "SubscriberNotificationSent",
100
- label: "Subscriber Notification Sent",
101
- },
102
- { value: "OwnerTeamAdded", label: "Team Added as Owner" },
103
- { value: "OwnerUserAdded", label: "User Added as Owner" },
104
- ];
105
-
106
- interface HarnessProps {
107
- eventTypeOptions: Array<FeedEventTypeOption>;
108
- initialValue?: FeedOptions | undefined;
109
- onChange?: ((options: FeedOptions) => void) | undefined;
110
- }
111
-
112
- const Harness: React.FunctionComponent<HarnessProps> = (
113
- props: HarnessProps,
114
- ): React.ReactElement => {
115
- const [value, setValue] = React.useState<FeedOptions>(
116
- props.initialValue || DEFAULT_FEED_OPTIONS,
117
- );
118
-
119
- return (
120
- <FeedOptionsButton
121
- value={value}
122
- eventTypeOptions={props.eventTypeOptions}
123
- onChange={(nextValue: FeedOptions): void => {
124
- props.onChange?.(nextValue);
125
- setValue(nextValue);
126
- }}
127
- />
128
- );
129
- };
130
-
131
- const createOnChange: () => OnChangeMock = (): OnChangeMock => {
132
- return jest.fn<(options: FeedOptions) => void>();
133
- };
134
-
135
- const getTrigger: () => HTMLElement = (): HTMLElement => {
136
- return screen.getByRole("button", { name: TRIGGER_NAME });
137
- };
138
-
139
- const queryPanel: () => HTMLElement | null = (): HTMLElement | null => {
140
- return screen.queryByRole("dialog", { name: PANEL_NAME });
141
- };
142
-
143
- const openPanel: () => HTMLElement = (): HTMLElement => {
144
- fireEvent.click(getTrigger());
145
-
146
- return screen.getByRole("dialog", { name: PANEL_NAME });
147
- };
148
-
149
- const getRadio: (name: string) => HTMLElement = (name: string): HTMLElement => {
150
- return screen.getByRole("radio", { name });
151
- };
152
-
153
- const getCheckbox: (name: string) => HTMLElement = (
154
- name: string,
155
- ): HTMLElement => {
156
- return screen.getByRole("checkbox", { name });
157
- };
158
-
159
- const getCheckboxLabels: () => Array<string> = (): Array<string> => {
160
- return screen.queryAllByRole("checkbox").map((checkbox: HTMLElement) => {
161
- return checkbox.closest("label")?.textContent || "";
162
- });
163
- };
164
-
165
- const getEventTypeSummary: () => HTMLElement = (): HTMLElement => {
166
- return screen.getByTestId("feed-options-event-type-summary");
167
- };
168
-
169
- const getSearchInput: () => HTMLElement = (): HTMLElement => {
170
- return screen.getByRole("textbox", { name: "Search event types" });
171
- };
172
-
173
- const getSearchResults: () => HTMLElement = (): HTMLElement => {
174
- return screen.getByTestId("feed-options-search-results");
175
- };
176
-
177
- const getLastCall: (onChange: OnChangeMock) => FeedOptions | undefined = (
178
- onChange: OnChangeMock,
179
- ): FeedOptions | undefined => {
180
- return onChange.mock.calls[onChange.mock.calls.length - 1]?.[0];
181
- };
182
-
183
- const getListeners: (
184
- spy: ReturnType<typeof jest.spyOn>,
185
- eventType: string,
186
- ) => Array<unknown> = (
187
- spy: ReturnType<typeof jest.spyOn>,
188
- eventType: string,
189
- ): Array<unknown> => {
190
- const calls: Array<Array<unknown>> = spy.mock.calls as unknown as Array<
191
- Array<unknown>
192
- >;
193
-
194
- return calls
195
- .filter((call: Array<unknown>): boolean => {
196
- return call[0] === eventType;
197
- })
198
- .map((call: Array<unknown>): unknown => {
199
- return call[1];
200
- });
201
- };
202
-
203
- // The path data of the first glyph drawn inside an element.
204
- const getLeadingGlyphPath: (element: HTMLElement) => string = (
205
- element: HTMLElement,
206
- ): string => {
207
- return element.querySelector("svg path")?.getAttribute("d") || "";
208
- };
209
-
210
- /*
211
- * The path an Icon draws, rendered on its own, so the control's glyphs are
212
- * compared with the icon set rather than with a copied string.
213
- */
214
- const getGlyphPath: (icon: IconProp) => string = (icon: IconProp): string => {
215
- const { container, unmount } = render(<Icon icon={icon} />);
216
- const path: string = getLeadingGlyphPath(container);
217
-
218
- unmount();
219
-
220
- return path;
221
- };
222
-
223
- type MakeRect = (left: number, right: number) => DOMRect;
224
-
225
- const makeRect: MakeRect = (left: number, right: number): DOMRect => {
226
- return {
227
- left,
228
- right,
229
- x: left,
230
- y: 0,
231
- top: 0,
232
- bottom: 38,
233
- width: right - left,
234
- height: 38,
235
- toJSON: (): unknown => {
236
- return {};
237
- },
238
- };
239
- };
240
-
241
- afterEach(() => {
242
- cleanup();
243
- });
244
-
245
- describe("FeedOptionsButton", () => {
246
- describe("closed state", () => {
247
- test("renders one collapsed dialog trigger named by its label and described by the current view", () => {
248
- render(
249
- <FeedOptionsButton
250
- value={DEFAULT_FEED_OPTIONS}
251
- eventTypeOptions={EVENT_TYPE_OPTIONS}
252
- onChange={createOnChange()}
253
- />,
254
- );
255
-
256
- expect(screen.getAllByRole("button")).toHaveLength(1);
257
-
258
- const trigger: HTMLElement = getTrigger();
259
- const summary: HTMLElement = screen.getByTestId("feed-options-summary");
260
-
261
- expect(trigger).toHaveAccessibleName(TRIGGER_NAME);
262
- expect(trigger).toHaveAccessibleDescription(
263
- "Newest first, all event types",
264
- );
265
- expect(trigger).toHaveAttribute("title", "Newest first, all event types");
266
- expect(trigger).toHaveAttribute("type", "button");
267
- expect(trigger).toHaveAttribute("aria-haspopup", "dialog");
268
- expect(trigger).toHaveAttribute("aria-expanded", "false");
269
- expect(trigger).not.toHaveAttribute("aria-label");
270
- expect(trigger).not.toHaveAttribute("aria-controls");
271
- expect(trigger).toHaveTextContent("Filter & Sort");
272
- /*
273
- * The description lives outside the button: text inside it would join
274
- * the name, and the reader would hear the state twice.
275
- */
276
- expect(summary.id).not.toBe("");
277
- expect(trigger).toHaveAttribute("aria-describedby", summary.id);
278
- expect(trigger).not.toContainElement(summary);
279
- expect(queryPanel()).not.toBeInTheDocument();
280
- expect(
281
- screen.queryByTestId("feed-options-panel"),
282
- ).not.toBeInTheDocument();
283
- expect(
284
- screen.queryByTestId("feed-options-count"),
285
- ).not.toBeInTheDocument();
286
- });
287
-
288
- test("keeps its label in the accessibility tree at every width", () => {
289
- render(
290
- <FeedOptionsButton
291
- value={DEFAULT_FEED_OPTIONS}
292
- eventTypeOptions={EVENT_TYPE_OPTIONS}
293
- onChange={createOnChange()}
294
- />,
295
- );
296
-
297
- const label: HTMLElement =
298
- within(getTrigger()).getByTestId("feed-options-label");
299
-
300
- expect(label).toHaveTextContent(TRIGGER_NAME);
301
- /*
302
- * Below xl the label is hidden visually, never with display:none -
303
- * that would drop it from the accessibility tree and leave the button
304
- * with no name at all on phones and tablets. jsdom applies no CSS, so
305
- * the class is the only place this can be seen.
306
- *
307
- * `max-xl:sr-only`, not a bare `sr-only` undone by `xl:not-sr-only`:
308
- * Bootstrap 3 and HTML5 Boilerplate both ship a `.sr-only` rule, and a
309
- * browser extension or user stylesheet that injects one after Tailwind
310
- * would otherwise collapse the visible label on a wide screen too.
311
- */
312
- expect(label).toHaveClass("max-xl:sr-only");
313
- expect(label).toHaveClass("xl:not-sr-only");
314
- expect(label).not.toHaveClass("sr-only");
315
- expect(label).not.toHaveClass("hidden");
316
- });
317
-
318
- test.each<[string, FeedOptions, string]>([
319
- [
320
- "an ascending, unfiltered view",
321
- { sortOrder: SortOrder.Ascending, eventTypes: [] },
322
- "Oldest first, all event types",
323
- ],
324
- [
325
- "a descending, filtered view",
326
- {
327
- sortOrder: SortOrder.Descending,
328
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
329
- },
330
- "Newest first, 2 of 3 event types",
331
- ],
332
- [
333
- "an ascending, filtered view",
334
- { sortOrder: SortOrder.Ascending, eventTypes: ["IncidentCreated"] },
335
- "Oldest first, 1 of 3 event types",
336
- ],
337
- ])(
338
- "summarises %s in the accessible description and tooltip, not the name",
339
- (_label: string, value: FeedOptions, summary: string) => {
340
- render(
341
- <FeedOptionsButton
342
- value={value}
343
- eventTypeOptions={EVENT_TYPE_OPTIONS}
344
- onChange={createOnChange()}
345
- />,
346
- );
347
-
348
- expect(getTrigger()).toHaveAccessibleName(TRIGGER_NAME);
349
- expect(getTrigger()).toHaveAccessibleDescription(summary);
350
- expect(getTrigger()).toHaveAttribute("title", summary);
351
- },
352
- );
353
-
354
- test("shows a count of the chosen event types, hidden from the accessible name", () => {
355
- render(
356
- <FeedOptionsButton
357
- value={{
358
- sortOrder: SortOrder.Descending,
359
- eventTypes: ["IncidentCreated", "IncidentStateChanged"],
360
- }}
361
- eventTypeOptions={EVENT_TYPE_OPTIONS}
362
- onChange={createOnChange()}
363
- />,
364
- );
365
-
366
- const count: HTMLElement =
367
- within(getTrigger()).getByTestId("feed-options-count");
368
-
369
- expect(count).toHaveTextContent(/^2$/);
370
- expect(count).toHaveAttribute("aria-hidden", "true");
371
- expect(getTrigger()).toHaveAccessibleName(TRIGGER_NAME);
372
- });
373
-
374
- test("does not show a count when only the sort order differs from default", () => {
375
- render(
376
- <FeedOptionsButton
377
- value={{ sortOrder: SortOrder.Ascending, eventTypes: [] }}
378
- eventTypeOptions={EVENT_TYPE_OPTIONS}
379
- onChange={createOnChange()}
380
- />,
381
- );
382
-
383
- expect(
384
- screen.queryByTestId("feed-options-count"),
385
- ).not.toBeInTheDocument();
386
- });
387
- });
388
-
389
- describe("default versus customized styling", () => {
390
- test("uses the neutral style for the default view", () => {
391
- render(
392
- <FeedOptionsButton
393
- value={{ sortOrder: SortOrder.Descending, eventTypes: [] }}
394
- eventTypeOptions={EVENT_TYPE_OPTIONS}
395
- onChange={createOnChange()}
396
- />,
397
- );
398
-
399
- const trigger: HTMLElement = getTrigger();
400
-
401
- expect(trigger).toHaveClass(...DEFAULT_TRIGGER_CLASSES);
402
-
403
- for (const className of CUSTOMIZED_TRIGGER_CLASSES) {
404
- expect(trigger).not.toHaveClass(className);
405
- }
406
- });
407
-
408
- test.each<[string, FeedOptions]>([
409
- [
410
- "the oldest-first order",
411
- { sortOrder: SortOrder.Ascending, eventTypes: [] },
412
- ],
413
- [
414
- "an event type filter",
415
- { sortOrder: SortOrder.Descending, eventTypes: ["OwnerUserAdded"] },
416
- ],
417
- [
418
- "both a changed order and a filter",
419
- {
420
- sortOrder: SortOrder.Ascending,
421
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
422
- },
423
- ],
424
- ])(
425
- "tints the trigger indigo for %s",
426
- (_label: string, value: FeedOptions) => {
427
- render(
428
- <FeedOptionsButton
429
- value={value}
430
- eventTypeOptions={EVENT_TYPE_OPTIONS}
431
- onChange={createOnChange()}
432
- />,
433
- );
434
-
435
- const trigger: HTMLElement = getTrigger();
436
-
437
- expect(trigger).toHaveClass(...CUSTOMIZED_TRIGGER_CLASSES);
438
-
439
- for (const className of DEFAULT_TRIGGER_CLASSES) {
440
- expect(trigger).not.toHaveClass(className);
441
- }
442
- },
443
- );
444
-
445
- test("switches between the two styles as the options change", () => {
446
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
447
-
448
- openPanel();
449
- expect(getTrigger()).toHaveClass(...DEFAULT_TRIGGER_CLASSES);
450
-
451
- fireEvent.click(getRadio("Oldest first"));
452
- expect(getTrigger()).toHaveClass(...CUSTOMIZED_TRIGGER_CLASSES);
453
-
454
- fireEvent.click(getRadio("Newest first"));
455
- expect(getTrigger()).toHaveClass(...DEFAULT_TRIGGER_CLASSES);
456
-
457
- fireEvent.click(getCheckbox("Incident Created"));
458
- expect(getTrigger()).toHaveClass(...CUSTOMIZED_TRIGGER_CLASSES);
459
-
460
- fireEvent.click(getCheckbox("Incident Created"));
461
- expect(getTrigger()).toHaveClass(...DEFAULT_TRIGGER_CLASSES);
462
- });
463
- });
464
-
465
- /*
466
- * A reversed feed must not rely on the indigo tint alone to say so: Oldest
467
- * first swaps the trigger's funnel for the up-arrow sort glyph.
468
- */
469
- describe("trigger icon", () => {
470
- // Guards the comparisons below: two empty paths would compare equal.
471
- test("has two distinct, non-empty glyphs to choose between", () => {
472
- const funnel: string = getGlyphPath(IconProp.Filter);
473
- const upArrow: string = getGlyphPath(IconProp.BarsArrowUp);
474
-
475
- expect(funnel).not.toBe("");
476
- expect(upArrow).not.toBe("");
477
- expect(upArrow).not.toBe(funnel);
478
- });
479
-
480
- test.each<[string, FeedOptions, IconProp, IconProp]>([
481
- [
482
- "the default view",
483
- DEFAULT_FEED_OPTIONS,
484
- IconProp.Filter,
485
- IconProp.BarsArrowUp,
486
- ],
487
- [
488
- "a newest-first, filtered view",
489
- { sortOrder: SortOrder.Descending, eventTypes: ["IncidentCreated"] },
490
- IconProp.Filter,
491
- IconProp.BarsArrowUp,
492
- ],
493
- [
494
- "an oldest-first view",
495
- { sortOrder: SortOrder.Ascending, eventTypes: [] },
496
- IconProp.BarsArrowUp,
497
- IconProp.Filter,
498
- ],
499
- [
500
- "an oldest-first, filtered view",
501
- { sortOrder: SortOrder.Ascending, eventTypes: ["IncidentCreated"] },
502
- IconProp.BarsArrowUp,
503
- IconProp.Filter,
504
- ],
505
- ])(
506
- "leads with the right glyph for %s",
507
- (
508
- _label: string,
509
- value: FeedOptions,
510
- expectedIcon: IconProp,
511
- otherIcon: IconProp,
512
- ) => {
513
- render(
514
- <FeedOptionsButton
515
- value={value}
516
- eventTypeOptions={EVENT_TYPE_OPTIONS}
517
- onChange={createOnChange()}
518
- />,
519
- );
520
-
521
- const leadingGlyph: string = getLeadingGlyphPath(getTrigger());
522
-
523
- expect(leadingGlyph).toBe(getGlyphPath(expectedIcon));
524
- expect(leadingGlyph).not.toBe(getGlyphPath(otherIcon));
525
- },
526
- );
527
-
528
- test("shows the Oldest first radio's own glyph while that order is chosen, and the funnel again after", () => {
529
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
530
-
531
- openPanel();
532
- fireEvent.click(getRadio("Oldest first"));
533
-
534
- expect(getLeadingGlyphPath(getTrigger())).toBe(
535
- getLeadingGlyphPath(getRadio("Oldest first")),
536
- );
537
-
538
- fireEvent.click(getRadio("Newest first"));
539
-
540
- expect(getLeadingGlyphPath(getTrigger())).toBe(
541
- getGlyphPath(IconProp.Filter),
542
- );
543
- });
544
- });
545
-
546
- describe("opening", () => {
547
- test("opens a named dialog that the expanded trigger controls", () => {
548
- render(
549
- <FeedOptionsButton
550
- value={DEFAULT_FEED_OPTIONS}
551
- eventTypeOptions={EVENT_TYPE_OPTIONS}
552
- onChange={createOnChange()}
553
- />,
554
- );
555
-
556
- const panel: HTMLElement = openPanel();
557
- const trigger: HTMLElement = getTrigger();
558
-
559
- expect(panel).toHaveAttribute("data-testid", "feed-options-panel");
560
- expect(panel.id).not.toBe("");
561
- expect(trigger).toHaveAttribute("aria-expanded", "true");
562
- expect(trigger).toHaveAttribute("aria-controls", panel.id);
563
- expect(document.getElementById(panel.id)).toBe(panel);
564
- /*
565
- * Focusable, so a press on its padding keeps focus inside the control,
566
- * but not a tab stop of its own.
567
- */
568
- expect(panel).toHaveAttribute("tabindex", "-1");
569
- });
570
-
571
- test.each<[SortOrder, string, string]>([
572
- [SortOrder.Descending, "Newest first", "Oldest first"],
573
- [SortOrder.Ascending, "Oldest first", "Newest first"],
574
- ])(
575
- "moves focus onto the checked sort order (%s)",
576
- (sortOrder: SortOrder, checkedName: string, otherName: string) => {
577
- render(
578
- <FeedOptionsButton
579
- value={{ sortOrder, eventTypes: [] }}
580
- eventTypeOptions={EVENT_TYPE_OPTIONS}
581
- onChange={createOnChange()}
582
- />,
583
- );
584
-
585
- openPanel();
586
-
587
- expect(getRadio(checkedName)).toHaveFocus();
588
- expect(getRadio(checkedName)).toHaveAttribute("aria-checked", "true");
589
- expect(getRadio(otherName)).not.toHaveFocus();
590
- },
591
- );
592
-
593
- test("focuses the order chosen during the previous visit when re-opened", () => {
594
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
595
-
596
- openPanel();
597
- fireEvent.click(getRadio("Oldest first"));
598
- fireEvent.keyDown(getRadio("Oldest first"), { key: "Escape" });
599
-
600
- expect(queryPanel()).not.toBeInTheDocument();
601
-
602
- openPanel();
603
-
604
- expect(getRadio("Oldest first")).toHaveFocus();
605
- });
606
-
607
- test("does not pull focus back to the sort order when it changes while open", () => {
608
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
609
-
610
- openPanel();
611
-
612
- const checkbox: HTMLElement = getCheckbox("Incident Created");
613
-
614
- act(() => {
615
- checkbox.focus();
616
- });
617
-
618
- fireEvent.click(getRadio("Oldest first"));
619
-
620
- expect(getRadio("Oldest first")).toHaveAttribute("aria-checked", "true");
621
- expect(checkbox).toHaveFocus();
622
- });
623
- });
624
-
625
- describe("panel placement", () => {
626
- test("uses a 288px panel kept 16px from the viewport edges", () => {
627
- expect(FEED_OPTIONS_PANEL_WIDTH_PX).toBe(288);
628
- expect(FEED_OPTIONS_VIEWPORT_GUTTER_PX).toBe(16);
629
- });
630
-
631
- test("lines the panel's right edge up with the trigger's when there is room on the left", () => {
632
- const placement: FeedOptionsPanelPlacement = getFeedOptionsPanelPlacement(
633
- {
634
- triggerLeft: 900,
635
- triggerRight: 1000,
636
- viewportWidth: 1280,
637
- },
638
- );
639
-
640
- // left = triggerRight - width - triggerLeft = 1000 - 288 - 900.
641
- expect(placement).toEqual({ left: -188, width: 288 });
642
- expect(900 + placement.left + placement.width).toBe(1000);
643
- });
644
-
645
- test("slides a panel that would cross the left edge of a phone back to the gutter", () => {
646
- /*
647
- * A stacked card header puts the trigger at the left of a 390px
648
- * screen: right-aligned, the panel would start at 150 - 288 = -138.
649
- */
650
- const placement: FeedOptionsPanelPlacement = getFeedOptionsPanelPlacement(
651
- {
652
- triggerLeft: 24,
653
- triggerRight: 150,
654
- viewportWidth: 390,
655
- },
656
- );
657
-
658
- expect(placement).toEqual({ left: -8, width: 288 });
659
- expect(24 + placement.left).toBe(16);
660
- });
661
-
662
- test("slides a panel that would cross the right edge back to the gutter", () => {
663
- // The trigger's right edge sits inside the 16px gutter.
664
- const placement: FeedOptionsPanelPlacement = getFeedOptionsPanelPlacement(
665
- {
666
- triggerLeft: 300,
667
- triggerRight: 385,
668
- viewportWidth: 390,
669
- },
670
- );
671
-
672
- // Panel left = 390 - 16 - 288 = 86, i.e. 86 - 300 from the trigger.
673
- expect(placement).toEqual({ left: -214, width: 288 });
674
- expect(300 + placement.left + placement.width).toBe(390 - 16);
675
- });
676
-
677
- test("narrows the panel to fit a viewport under 288px plus both gutters", () => {
678
- const placement: FeedOptionsPanelPlacement = getFeedOptionsPanelPlacement(
679
- {
680
- triggerLeft: 20,
681
- triggerRight: 100,
682
- viewportWidth: 300,
683
- },
684
- );
685
-
686
- expect(placement).toEqual({ left: -4, width: 300 - 32 });
687
- expect(20 + placement.left).toBe(16);
688
- expect(20 + placement.left + placement.width).toBe(300 - 16);
689
-
690
- // At exactly 288 + 32 the full width still fits.
691
- expect(
692
- getFeedOptionsPanelPlacement({
693
- triggerLeft: 20,
694
- triggerRight: 100,
695
- viewportWidth: 320,
696
- }).width,
697
- ).toBe(288);
698
- });
699
-
700
- test.each<[number]>([[0], [20], [32]])(
701
- "never gives a negative width in a degenerate %ipx viewport",
702
- (viewportWidth: number) => {
703
- const placement: FeedOptionsPanelPlacement =
704
- getFeedOptionsPanelPlacement({
705
- triggerLeft: 0,
706
- triggerRight: 0,
707
- viewportWidth,
708
- });
709
-
710
- expect(placement.width).toBe(0);
711
- expect(Number.isFinite(placement.left)).toBe(true);
712
- },
713
- );
714
-
715
- test("keeps the panel inside the gutters wherever the trigger sits, and right-aligned whenever that fits", () => {
716
- const triggerWidth: number = 40;
717
-
718
- for (const viewportWidth of [320, 390, 768, 1024, 1440]) {
719
- for (
720
- let triggerLeft: number = 0;
721
- triggerLeft + triggerWidth <= viewportWidth;
722
- triggerLeft += 37
723
- ) {
724
- const triggerRight: number = triggerLeft + triggerWidth;
725
- const placement: FeedOptionsPanelPlacement =
726
- getFeedOptionsPanelPlacement({
727
- triggerLeft,
728
- triggerRight,
729
- viewportWidth,
730
- });
731
- const panelLeft: number = triggerLeft + placement.left;
732
- const panelRight: number = panelLeft + placement.width;
733
-
734
- expect(placement.width).toBe(288);
735
- expect(panelLeft).toBeGreaterThanOrEqual(16);
736
- expect(panelRight).toBeLessThanOrEqual(viewportWidth - 16);
737
-
738
- if (triggerRight - 288 >= 16 && triggerRight <= viewportWidth - 16) {
739
- expect(panelRight).toBe(triggerRight);
740
- }
741
- }
742
- }
743
- });
744
-
745
- test("places the open panel from the trigger's box and the viewport, re-places it on resize and again on re-open", () => {
746
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
747
-
748
- // The trigger's wrapper is what the panel is positioned against.
749
- const container: HTMLElement = getTrigger().parentElement!;
750
- let triggerBox: { left: number; right: number } = {
751
- left: 24,
752
- right: 150,
753
- };
754
- let viewportWidth: number = 390;
755
-
756
- const rectSpy: SpyInstance<() => DOMRect> = jest
757
- .spyOn(container, "getBoundingClientRect")
758
- .mockImplementation((): DOMRect => {
759
- return makeRect(triggerBox.left, triggerBox.right);
760
- });
761
- const widthSpy: SpyInstance<() => number> = jest
762
- .spyOn(document.documentElement, "clientWidth", "get")
763
- .mockImplementation((): number => {
764
- return viewportWidth;
765
- });
766
-
767
- try {
768
- const panel: HTMLElement = openPanel();
769
-
770
- expect(rectSpy).toHaveBeenCalled();
771
- // Phone: slid right so its left edge is 16px from the screen's.
772
- expect(panel).toHaveStyle({ left: "-8px", width: "288px" });
773
- // The fallback classes would fight the measured position.
774
- expect(panel).not.toHaveClass("right-0");
775
- expect(panel).not.toHaveClass("w-72");
776
-
777
- // Rotated to a wide screen with the trigger now on the right.
778
- viewportWidth = 1280;
779
- triggerBox = { left: 900, right: 1000 };
780
- fireEvent(window, new Event("resize"));
781
-
782
- expect(queryPanel()).toBe(panel);
783
- expect(panel).toHaveStyle({ left: "-188px", width: "288px" });
784
-
785
- fireEvent.keyDown(getRadio("Newest first"), { key: "Escape" });
786
- expect(queryPanel()).not.toBeInTheDocument();
787
-
788
- // Re-opened on a screen narrower than the panel plus both gutters.
789
- viewportWidth = 300;
790
- triggerBox = { left: 20, right: 100 };
791
-
792
- const reopened: HTMLElement = openPanel();
793
-
794
- expect(reopened).toHaveStyle({ left: "-4px", width: "268px" });
795
- } finally {
796
- rectSpy.mockRestore();
797
- widthSpy.mockRestore();
798
- }
799
-
800
- // Restored, so no later test measures against this fake layout.
801
- expect(jest.isMockFunction(container.getBoundingClientRect)).toBe(false);
802
- expect(
803
- jest.isMockFunction(
804
- Object.getOwnPropertyDescriptor(
805
- document.documentElement,
806
- "clientWidth",
807
- )?.get,
808
- ),
809
- ).toBe(false);
810
- });
811
-
812
- test("falls back to window.innerWidth when the document reports no width", () => {
813
- const originalInnerWidth: number = window.innerWidth;
814
- const innerWidthDescriptor: PropertyDescriptor | undefined =
815
- Object.getOwnPropertyDescriptor(window, "innerWidth");
816
-
817
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
818
-
819
- const container: HTMLElement = getTrigger().parentElement!;
820
- const rectSpy: SpyInstance<() => DOMRect> = jest
821
- .spyOn(container, "getBoundingClientRect")
822
- .mockImplementation((): DOMRect => {
823
- return makeRect(24, 150);
824
- });
825
-
826
- Object.defineProperty(window, "innerWidth", {
827
- configurable: true,
828
- writable: true,
829
- value: 390,
830
- });
831
-
832
- try {
833
- // jsdom lays nothing out, so documentElement.clientWidth is 0.
834
- expect(document.documentElement.clientWidth).toBe(0);
835
-
836
- const panel: HTMLElement = openPanel();
837
-
838
- expect(panel).toHaveStyle({ left: "-8px", width: "288px" });
839
- } finally {
840
- rectSpy.mockRestore();
841
-
842
- if (innerWidthDescriptor) {
843
- Object.defineProperty(window, "innerWidth", innerWidthDescriptor);
844
- } else {
845
- Reflect.deleteProperty(window, "innerWidth");
846
- }
847
- }
848
-
849
- expect(window.innerWidth).toBe(originalInnerWidth);
850
- });
851
-
852
- test("stops listening for resize once the panel closes", () => {
853
- const addSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
854
- window,
855
- "addEventListener",
856
- );
857
- const removeSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
858
- window,
859
- "removeEventListener",
860
- );
861
-
862
- try {
863
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
864
-
865
- openPanel();
866
-
867
- const resizeListeners: Array<unknown> = getListeners(addSpy, "resize");
868
-
869
- expect(resizeListeners.length).toBeGreaterThan(0);
870
-
871
- fireEvent.keyDown(getRadio("Newest first"), { key: "Escape" });
872
-
873
- const removedListeners: Array<unknown> = getListeners(
874
- removeSpy,
875
- "resize",
876
- );
877
-
878
- for (const listener of resizeListeners) {
879
- expect(removedListeners).toContain(listener);
880
- }
881
- } finally {
882
- addSpy.mockRestore();
883
- removeSpy.mockRestore();
884
- }
885
- });
886
- });
887
-
888
- describe("sort order", () => {
889
- test("renders two radios in a group labelled by its heading, with roving tab stops", () => {
890
- render(
891
- <FeedOptionsButton
892
- value={DEFAULT_FEED_OPTIONS}
893
- eventTypeOptions={EVENT_TYPE_OPTIONS}
894
- onChange={createOnChange()}
895
- />,
896
- );
897
-
898
- openPanel();
899
-
900
- const group: HTMLElement = screen.getByRole("radiogroup", {
901
- name: "Sort by time",
902
- });
903
- const radios: Array<HTMLElement> = within(group).getAllByRole("radio");
904
-
905
- expect(radios).toHaveLength(2);
906
- expect(radios[0]).toHaveAccessibleName("Newest first");
907
- expect(radios[1]).toHaveAccessibleName("Oldest first");
908
- expect(radios[0]).toHaveAttribute("aria-checked", "true");
909
- expect(radios[1]).toHaveAttribute("aria-checked", "false");
910
- expect(radios[0]).toHaveAttribute("tabindex", "0");
911
- expect(radios[1]).toHaveAttribute("tabindex", "-1");
912
- expect(
913
- radios.filter((radio: HTMLElement) => {
914
- return radio.getAttribute("aria-checked") === "true";
915
- }),
916
- ).toHaveLength(1);
917
- });
918
-
919
- /*
920
- * BarsArrowUp used to draw the same path as BarsArrowDown, so the two
921
- * orders looked identical.
922
- */
923
- test("draws a different glyph for each order", () => {
924
- render(
925
- <FeedOptionsButton
926
- value={DEFAULT_FEED_OPTIONS}
927
- eventTypeOptions={EVENT_TYPE_OPTIONS}
928
- onChange={createOnChange()}
929
- />,
930
- );
931
-
932
- openPanel();
933
-
934
- const newestGlyph: string = getLeadingGlyphPath(getRadio("Newest first"));
935
- const oldestGlyph: string = getLeadingGlyphPath(getRadio("Oldest first"));
936
-
937
- expect(newestGlyph).not.toBe("");
938
- expect(oldestGlyph).not.toBe("");
939
- expect(oldestGlyph).not.toBe(newestGlyph);
940
- expect(oldestGlyph).toBe(getGlyphPath(IconProp.BarsArrowUp));
941
- });
942
-
943
- test("moves the checked state, the tab stop and the emphasis when the order changes", () => {
944
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
945
-
946
- openPanel();
947
- fireEvent.click(getRadio("Oldest first"));
948
-
949
- expect(getRadio("Oldest first")).toHaveAttribute("aria-checked", "true");
950
- expect(getRadio("Oldest first")).toHaveAttribute("tabindex", "0");
951
- expect(getRadio("Newest first")).toHaveAttribute("aria-checked", "false");
952
- expect(getRadio("Newest first")).toHaveAttribute("tabindex", "-1");
953
- // The chosen order is marked by weight too, not by a pale fill alone.
954
- expect(getRadio("Oldest first")).toHaveClass("font-semibold");
955
- expect(getRadio("Newest first")).not.toHaveClass("font-semibold");
956
- expect(queryPanel()).toBeInTheDocument();
957
- });
958
-
959
- test("reports the new order and keeps the chosen event types", () => {
960
- const onChange: OnChangeMock = createOnChange();
961
- const value: FeedOptions = {
962
- sortOrder: SortOrder.Descending,
963
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
964
- };
965
-
966
- render(
967
- <FeedOptionsButton
968
- value={value}
969
- eventTypeOptions={EVENT_TYPE_OPTIONS}
970
- onChange={onChange}
971
- />,
972
- );
973
-
974
- openPanel();
975
- fireEvent.click(getRadio("Oldest first"));
976
-
977
- expect(onChange).toHaveBeenCalledTimes(1);
978
- expect(onChange).toHaveBeenCalledWith({
979
- sortOrder: SortOrder.Ascending,
980
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
981
- });
982
- // The value it was given is left alone.
983
- expect(value).toEqual({
984
- sortOrder: SortOrder.Descending,
985
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
986
- });
987
- });
988
-
989
- test("reports newest-first from an ascending view", () => {
990
- const onChange: OnChangeMock = createOnChange();
991
-
992
- render(
993
- <FeedOptionsButton
994
- value={{
995
- sortOrder: SortOrder.Ascending,
996
- eventTypes: ["OwnerUserAdded"],
997
- }}
998
- eventTypeOptions={EVENT_TYPE_OPTIONS}
999
- onChange={onChange}
1000
- />,
1001
- );
1002
-
1003
- openPanel();
1004
- fireEvent.click(getRadio("Newest first"));
1005
-
1006
- expect(onChange).toHaveBeenCalledTimes(1);
1007
- expect(onChange).toHaveBeenCalledWith({
1008
- sortOrder: SortOrder.Descending,
1009
- eventTypes: ["OwnerUserAdded"],
1010
- });
1011
- });
1012
-
1013
- test("does not report a change when the checked order is clicked again", () => {
1014
- const onChange: OnChangeMock = createOnChange();
1015
-
1016
- render(
1017
- <FeedOptionsButton
1018
- value={DEFAULT_FEED_OPTIONS}
1019
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1020
- onChange={onChange}
1021
- />,
1022
- );
1023
-
1024
- openPanel();
1025
- fireEvent.click(getRadio("Newest first"));
1026
-
1027
- expect(onChange).not.toHaveBeenCalled();
1028
- expect(queryPanel()).toBeInTheDocument();
1029
- });
1030
-
1031
- test("reports the next order from an arrow key with the exact payload", () => {
1032
- const onChange: OnChangeMock = createOnChange();
1033
-
1034
- render(
1035
- <FeedOptionsButton
1036
- value={{
1037
- sortOrder: SortOrder.Descending,
1038
- eventTypes: ["IncidentStateChanged"],
1039
- }}
1040
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1041
- onChange={onChange}
1042
- />,
1043
- );
1044
-
1045
- openPanel();
1046
-
1047
- // false: the arrow key's default (scrolling the page) is prevented.
1048
- expect(
1049
- fireEvent.keyDown(getRadio("Newest first"), { key: "ArrowDown" }),
1050
- ).toBe(false);
1051
- expect(onChange).toHaveBeenCalledTimes(1);
1052
- expect(onChange).toHaveBeenCalledWith({
1053
- sortOrder: SortOrder.Ascending,
1054
- eventTypes: ["IncidentStateChanged"],
1055
- });
1056
- expect(getRadio("Oldest first")).toHaveFocus();
1057
- });
1058
-
1059
- test("moves selection and focus with every arrow key, wrapping at both ends", () => {
1060
- const onChange: OnChangeMock = createOnChange();
1061
-
1062
- render(
1063
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} onChange={onChange} />,
1064
- );
1065
-
1066
- openPanel();
1067
- expect(getRadio("Newest first")).toHaveFocus();
1068
-
1069
- const steps: Array<[string, string, string, SortOrder]> = [
1070
- ["ArrowRight", "Newest first", "Oldest first", SortOrder.Ascending],
1071
- ["ArrowRight", "Oldest first", "Newest first", SortOrder.Descending],
1072
- ["ArrowLeft", "Newest first", "Oldest first", SortOrder.Ascending],
1073
- ["ArrowUp", "Oldest first", "Newest first", SortOrder.Descending],
1074
- ["ArrowDown", "Newest first", "Oldest first", SortOrder.Ascending],
1075
- ["ArrowLeft", "Oldest first", "Newest first", SortOrder.Descending],
1076
- ["ArrowUp", "Newest first", "Oldest first", SortOrder.Ascending],
1077
- ["ArrowDown", "Oldest first", "Newest first", SortOrder.Descending],
1078
- ];
1079
-
1080
- for (const [key, fromName, toName, sortOrder] of steps) {
1081
- fireEvent.keyDown(getRadio(fromName), { key });
1082
-
1083
- expect(getRadio(toName)).toHaveFocus();
1084
- expect(getRadio(toName)).toHaveAttribute("aria-checked", "true");
1085
- expect(getRadio(toName)).toHaveAttribute("tabindex", "0");
1086
- expect(getRadio(fromName)).toHaveAttribute("aria-checked", "false");
1087
- expect(getRadio(fromName)).toHaveAttribute("tabindex", "-1");
1088
- expect(getLastCall(onChange)).toEqual({ sortOrder, eventTypes: [] });
1089
- }
1090
-
1091
- expect(onChange).toHaveBeenCalledTimes(steps.length);
1092
- expect(queryPanel()).toBeInTheDocument();
1093
- });
1094
-
1095
- test.each<[string]>([["Home"], ["End"], ["Tab"], ["Enter"], ["a"]])(
1096
- "ignores the %s key on a sort radio",
1097
- (key: string) => {
1098
- const onChange: OnChangeMock = createOnChange();
1099
-
1100
- render(
1101
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} onChange={onChange} />,
1102
- );
1103
-
1104
- openPanel();
1105
-
1106
- // true: the key's default action is left alone.
1107
- expect(fireEvent.keyDown(getRadio("Newest first"), { key })).toBe(true);
1108
- expect(onChange).not.toHaveBeenCalled();
1109
- expect(getRadio("Newest first")).toHaveFocus();
1110
- expect(getRadio("Newest first")).toHaveAttribute(
1111
- "aria-checked",
1112
- "true",
1113
- );
1114
- expect(queryPanel()).toBeInTheDocument();
1115
- },
1116
- );
1117
- });
1118
-
1119
- describe("event types", () => {
1120
- test("renders one labelled checkbox per option, in checklist order, inside a group named by its heading", () => {
1121
- render(
1122
- <FeedOptionsButton
1123
- value={DEFAULT_FEED_OPTIONS}
1124
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1125
- onChange={createOnChange()}
1126
- />,
1127
- );
1128
-
1129
- openPanel();
1130
-
1131
- /*
1132
- * The group, not the list, carries the heading: a screen reader
1133
- * announces a group's name as focus enters it from any checkbox.
1134
- */
1135
- const group: HTMLElement = screen.getByRole("group", {
1136
- name: "Event types",
1137
- });
1138
- const list: HTMLElement = within(group).getByRole("list");
1139
-
1140
- expect(within(list).getAllByRole("checkbox")).toHaveLength(3);
1141
- expect(getCheckboxLabels()).toEqual([
1142
- "Incident Created",
1143
- "Incident State Changed",
1144
- "User Added as Owner",
1145
- ]);
1146
-
1147
- for (const option of EVENT_TYPE_OPTIONS) {
1148
- expect(getCheckbox(option.label)).not.toBeChecked();
1149
- }
1150
-
1151
- expect(getEventTypeSummary()).toHaveTextContent(UNFILTERED_SUMMARY);
1152
- // Ticking a box re-words this line; it is read out when it does.
1153
- expect(getEventTypeSummary()).toHaveAttribute("aria-live", "polite");
1154
- expect(
1155
- screen.queryByRole("button", { name: "Show all" }),
1156
- ).not.toBeInTheDocument();
1157
- });
1158
-
1159
- test("checks exactly the event types in the value", () => {
1160
- render(
1161
- <FeedOptionsButton
1162
- value={{
1163
- sortOrder: SortOrder.Descending,
1164
- eventTypes: ["IncidentStateChanged"],
1165
- }}
1166
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1167
- onChange={createOnChange()}
1168
- />,
1169
- );
1170
-
1171
- openPanel();
1172
-
1173
- expect(getCheckbox("Incident Created")).not.toBeChecked();
1174
- expect(getCheckbox("Incident State Changed")).toBeChecked();
1175
- expect(getCheckbox("User Added as Owner")).not.toBeChecked();
1176
- expect(getEventTypeSummary()).toHaveTextContent(
1177
- "Showing 1 of 3 event types.",
1178
- );
1179
- });
1180
-
1181
- test("adds a ticked event type and keeps the sort order", () => {
1182
- const onChange: OnChangeMock = createOnChange();
1183
-
1184
- render(
1185
- <FeedOptionsButton
1186
- value={{ sortOrder: SortOrder.Ascending, eventTypes: [] }}
1187
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1188
- onChange={onChange}
1189
- />,
1190
- );
1191
-
1192
- openPanel();
1193
- fireEvent.click(getCheckbox("User Added as Owner"));
1194
-
1195
- expect(onChange).toHaveBeenCalledTimes(1);
1196
- expect(onChange).toHaveBeenCalledWith({
1197
- sortOrder: SortOrder.Ascending,
1198
- eventTypes: ["OwnerUserAdded"],
1199
- });
1200
- });
1201
-
1202
- test("puts a newly ticked event type in checklist order, not click order", () => {
1203
- const onChange: OnChangeMock = createOnChange();
1204
-
1205
- render(
1206
- <FeedOptionsButton
1207
- value={{
1208
- sortOrder: SortOrder.Descending,
1209
- eventTypes: ["OwnerUserAdded"],
1210
- }}
1211
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1212
- onChange={onChange}
1213
- />,
1214
- );
1215
-
1216
- openPanel();
1217
- fireEvent.click(getCheckbox("Incident Created"));
1218
-
1219
- expect(onChange).toHaveBeenCalledWith({
1220
- sortOrder: SortOrder.Descending,
1221
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
1222
- });
1223
- });
1224
-
1225
- test("removes an unticked event type and keeps the sort order", () => {
1226
- const onChange: OnChangeMock = createOnChange();
1227
-
1228
- render(
1229
- <FeedOptionsButton
1230
- value={{
1231
- sortOrder: SortOrder.Ascending,
1232
- eventTypes: ["IncidentCreated", "IncidentStateChanged"],
1233
- }}
1234
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1235
- onChange={onChange}
1236
- />,
1237
- );
1238
-
1239
- openPanel();
1240
- fireEvent.click(getCheckbox("Incident Created"));
1241
-
1242
- expect(onChange).toHaveBeenCalledTimes(1);
1243
- expect(onChange).toHaveBeenCalledWith({
1244
- sortOrder: SortOrder.Ascending,
1245
- eventTypes: ["IncidentStateChanged"],
1246
- });
1247
- });
1248
-
1249
- /*
1250
- * The value can name an event type the checklist no longer offers (a
1251
- * filter chosen before the feed's event types changed). A toggle reports
1252
- * only what the checklist has, so the stale type never reaches the API.
1253
- */
1254
- test.each<[string, string, Array<string>]>([
1255
- ["ticking", "User Added as Owner", ["IncidentCreated", "OwnerUserAdded"]],
1256
- ["unticking", "Incident Created", []],
1257
- ])(
1258
- "drops an event type missing from the checklist when %s another",
1259
- (
1260
- _label: string,
1261
- checkboxName: string,
1262
- expectedEventTypes: Array<string>,
1263
- ) => {
1264
- const onChange: OnChangeMock = createOnChange();
1265
-
1266
- render(
1267
- <FeedOptionsButton
1268
- value={{
1269
- sortOrder: SortOrder.Descending,
1270
- eventTypes: ["Gone", "IncidentCreated"],
1271
- }}
1272
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1273
- onChange={onChange}
1274
- />,
1275
- );
1276
-
1277
- openPanel();
1278
- fireEvent.click(getCheckbox(checkboxName));
1279
-
1280
- expect(onChange).toHaveBeenCalledTimes(1);
1281
- expect(onChange).toHaveBeenCalledWith({
1282
- sortOrder: SortOrder.Descending,
1283
- eventTypes: expectedEventTypes,
1284
- });
1285
- },
1286
- );
1287
-
1288
- test("ticks, counts and unticks through the controlled round trip", () => {
1289
- const onChange: OnChangeMock = createOnChange();
1290
-
1291
- render(
1292
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} onChange={onChange} />,
1293
- );
1294
-
1295
- openPanel();
1296
-
1297
- // Ticked last-first; every payload still follows the checklist.
1298
- fireEvent.click(getCheckbox("User Added as Owner"));
1299
- expect(getLastCall(onChange)).toEqual({
1300
- sortOrder: SortOrder.Descending,
1301
- eventTypes: ["OwnerUserAdded"],
1302
- });
1303
- expect(screen.getByTestId("feed-options-count")).toHaveTextContent(/^1$/);
1304
- expect(getEventTypeSummary()).toHaveTextContent(
1305
- "Showing 1 of 3 event types.",
1306
- );
1307
-
1308
- fireEvent.click(getCheckbox("Incident Created"));
1309
- expect(getLastCall(onChange)).toEqual({
1310
- sortOrder: SortOrder.Descending,
1311
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
1312
- });
1313
- expect(screen.getByTestId("feed-options-count")).toHaveTextContent(/^2$/);
1314
- expect(getEventTypeSummary()).toHaveTextContent(
1315
- "Showing 2 of 3 event types.",
1316
- );
1317
- expect(getTrigger()).toHaveAccessibleName(TRIGGER_NAME);
1318
- expect(getTrigger()).toHaveAccessibleDescription(
1319
- "Newest first, 2 of 3 event types",
1320
- );
1321
-
1322
- fireEvent.click(getCheckbox("Incident State Changed"));
1323
- expect(getLastCall(onChange)).toEqual({
1324
- sortOrder: SortOrder.Descending,
1325
- eventTypes: [
1326
- "IncidentCreated",
1327
- "IncidentStateChanged",
1328
- "OwnerUserAdded",
1329
- ],
1330
- });
1331
- expect(screen.getByTestId("feed-options-count")).toHaveTextContent(/^3$/);
1332
-
1333
- fireEvent.click(getCheckbox("Incident Created"));
1334
- expect(getLastCall(onChange)).toEqual({
1335
- sortOrder: SortOrder.Descending,
1336
- eventTypes: ["IncidentStateChanged", "OwnerUserAdded"],
1337
- });
1338
- expect(getCheckbox("Incident Created")).not.toBeChecked();
1339
- expect(getCheckbox("Incident State Changed")).toBeChecked();
1340
- expect(getCheckbox("User Added as Owner")).toBeChecked();
1341
-
1342
- fireEvent.click(getCheckbox("Incident State Changed"));
1343
- fireEvent.click(getCheckbox("User Added as Owner"));
1344
- expect(getLastCall(onChange)).toEqual({
1345
- sortOrder: SortOrder.Descending,
1346
- eventTypes: [],
1347
- });
1348
- expect(
1349
- screen.queryByTestId("feed-options-count"),
1350
- ).not.toBeInTheDocument();
1351
- expect(getEventTypeSummary()).toHaveTextContent(UNFILTERED_SUMMARY);
1352
- expect(getTrigger()).toHaveAccessibleDescription(
1353
- "Newest first, all event types",
1354
- );
1355
- expect(onChange).toHaveBeenCalledTimes(6);
1356
- });
1357
-
1358
- test("keeps the panel open while several boxes are ticked in one visit", () => {
1359
- render(<Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />);
1360
-
1361
- openPanel();
1362
-
1363
- for (const option of EVENT_TYPE_OPTIONS) {
1364
- fireEvent.click(getCheckbox(option.label));
1365
-
1366
- expect(queryPanel()).toBeInTheDocument();
1367
- expect(getCheckbox(option.label)).toBeChecked();
1368
- }
1369
-
1370
- expect(getTrigger()).toHaveAttribute("aria-expanded", "true");
1371
- expect(screen.getByTestId("feed-options-count")).toHaveTextContent(/^3$/);
1372
- expect(getEventTypeSummary()).toHaveTextContent(
1373
- "Showing 3 of 3 event types.",
1374
- );
1375
- });
1376
-
1377
- test("offers Show all only while something is ticked, and it clears the filter but not the order", () => {
1378
- const onChange: OnChangeMock = createOnChange();
1379
-
1380
- const { rerender } = render(
1381
- <FeedOptionsButton
1382
- value={{
1383
- sortOrder: SortOrder.Ascending,
1384
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
1385
- }}
1386
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1387
- onChange={onChange}
1388
- />,
1389
- );
1390
-
1391
- openPanel();
1392
- fireEvent.click(screen.getByRole("button", { name: "Show all" }));
1393
-
1394
- expect(onChange).toHaveBeenCalledTimes(1);
1395
- expect(onChange).toHaveBeenCalledWith({
1396
- sortOrder: SortOrder.Ascending,
1397
- eventTypes: [],
1398
- });
1399
-
1400
- // The same open panel with nothing ticked: no Show all to offer.
1401
- rerender(
1402
- <FeedOptionsButton
1403
- value={{ sortOrder: SortOrder.Ascending, eventTypes: [] }}
1404
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1405
- onChange={onChange}
1406
- />,
1407
- );
1408
-
1409
- expect(queryPanel()).toBeInTheDocument();
1410
- expect(
1411
- screen.queryByRole("button", { name: "Show all" }),
1412
- ).not.toBeInTheDocument();
1413
- });
1414
-
1415
- test("Show all empties the checklist and then disappears", () => {
1416
- render(
1417
- <Harness
1418
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1419
- initialValue={{
1420
- sortOrder: SortOrder.Ascending,
1421
- eventTypes: ["IncidentCreated", "IncidentStateChanged"],
1422
- }}
1423
- />,
1424
- );
1425
-
1426
- openPanel();
1427
- fireEvent.click(screen.getByRole("button", { name: "Show all" }));
1428
-
1429
- for (const option of EVENT_TYPE_OPTIONS) {
1430
- expect(getCheckbox(option.label)).not.toBeChecked();
1431
- }
1432
-
1433
- expect(
1434
- screen.queryByRole("button", { name: "Show all" }),
1435
- ).not.toBeInTheDocument();
1436
- expect(getEventTypeSummary()).toHaveTextContent(UNFILTERED_SUMMARY);
1437
- expect(getRadio("Oldest first")).toHaveAttribute("aria-checked", "true");
1438
- expect(queryPanel()).toBeInTheDocument();
1439
- });
1440
-
1441
- test("shows the no-event-types message for a feed with an empty checklist", () => {
1442
- render(
1443
- <FeedOptionsButton
1444
- value={DEFAULT_FEED_OPTIONS}
1445
- eventTypeOptions={[]}
1446
- onChange={createOnChange()}
1447
- />,
1448
- );
1449
-
1450
- expect(getTrigger()).toHaveAccessibleName(TRIGGER_NAME);
1451
- expect(getTrigger()).toHaveAccessibleDescription(
1452
- "Newest first, all event types",
1453
- );
1454
-
1455
- openPanel();
1456
-
1457
- expect(
1458
- screen.getByText("This feed has no event types to filter by."),
1459
- ).toBeVisible();
1460
- expect(screen.queryAllByRole("checkbox")).toHaveLength(0);
1461
- expect(
1462
- screen.queryByRole("textbox", { name: "Search event types" }),
1463
- ).not.toBeInTheDocument();
1464
- expect(getEventTypeSummary()).toHaveTextContent(UNFILTERED_SUMMARY);
1465
- // The sort order still works without any event types.
1466
- expect(screen.getAllByRole("radio")).toHaveLength(2);
1467
- });
1468
- });
1469
-
1470
- describe("icons", () => {
1471
- test("renders an option's icon and leaves an option without one plain", () => {
1472
- render(
1473
- <FeedOptionsButton
1474
- value={DEFAULT_FEED_OPTIONS}
1475
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1476
- onChange={createOnChange()}
1477
- />,
1478
- );
1479
-
1480
- openPanel();
1481
-
1482
- const withIcon: HTMLElement | null =
1483
- getCheckbox("Incident Created").closest("label");
1484
- const withoutIcon: HTMLElement | null = getCheckbox(
1485
- "User Added as Owner",
1486
- ).closest("label");
1487
-
1488
- expect(withIcon).not.toBeNull();
1489
- expect(withoutIcon).not.toBeNull();
1490
- expect(withIcon!.querySelector("svg")).not.toBeNull();
1491
- expect(withoutIcon!.querySelector("svg")).toBeNull();
1492
- // The icon is decoration: the checkbox is named by its label alone.
1493
- expect(getCheckbox("Incident Created")).toHaveAccessibleName(
1494
- "Incident Created",
1495
- );
1496
- expect(getCheckbox("User Added as Owner")).toHaveAccessibleName(
1497
- "User Added as Owner",
1498
- );
1499
- });
1500
- });
1501
-
1502
- describe("reset", () => {
1503
- test("is not offered for the default view", () => {
1504
- render(
1505
- <FeedOptionsButton
1506
- value={DEFAULT_FEED_OPTIONS}
1507
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1508
- onChange={createOnChange()}
1509
- />,
1510
- );
1511
-
1512
- openPanel();
1513
-
1514
- expect(
1515
- screen.queryByRole("button", { name: "Reset to default" }),
1516
- ).not.toBeInTheDocument();
1517
- });
1518
-
1519
- test.each<[string, FeedOptions]>([
1520
- [
1521
- "the order is oldest first",
1522
- { sortOrder: SortOrder.Ascending, eventTypes: [] },
1523
- ],
1524
- [
1525
- "event types are ticked",
1526
- { sortOrder: SortOrder.Descending, eventTypes: ["IncidentCreated"] },
1527
- ],
1528
- [
1529
- "both differ from default",
1530
- {
1531
- sortOrder: SortOrder.Ascending,
1532
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
1533
- },
1534
- ],
1535
- ])(
1536
- "resets both the order and the filter when %s",
1537
- (_label: string, value: FeedOptions) => {
1538
- const onChange: OnChangeMock = createOnChange();
1539
-
1540
- render(
1541
- <FeedOptionsButton
1542
- value={value}
1543
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1544
- onChange={onChange}
1545
- />,
1546
- );
1547
-
1548
- openPanel();
1549
- fireEvent.click(
1550
- screen.getByRole("button", { name: "Reset to default" }),
1551
- );
1552
-
1553
- expect(onChange).toHaveBeenCalledTimes(1);
1554
- expect(onChange).toHaveBeenCalledWith({
1555
- sortOrder: SortOrder.Descending,
1556
- eventTypes: [],
1557
- });
1558
- },
1559
- );
1560
-
1561
- test("returns the whole control to its default look and then disappears", () => {
1562
- render(
1563
- <Harness
1564
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1565
- initialValue={{
1566
- sortOrder: SortOrder.Ascending,
1567
- eventTypes: ["IncidentStateChanged", "OwnerUserAdded"],
1568
- }}
1569
- />,
1570
- );
1571
-
1572
- openPanel();
1573
- fireEvent.click(screen.getByRole("button", { name: "Reset to default" }));
1574
-
1575
- expect(getRadio("Newest first")).toHaveAttribute("aria-checked", "true");
1576
-
1577
- for (const option of EVENT_TYPE_OPTIONS) {
1578
- expect(getCheckbox(option.label)).not.toBeChecked();
1579
- }
1580
-
1581
- expect(
1582
- screen.queryByRole("button", { name: "Reset to default" }),
1583
- ).not.toBeInTheDocument();
1584
- expect(
1585
- screen.queryByTestId("feed-options-count"),
1586
- ).not.toBeInTheDocument();
1587
- expect(getTrigger()).toHaveClass(...DEFAULT_TRIGGER_CLASSES);
1588
- expect(getTrigger()).toHaveAccessibleDescription(
1589
- "Newest first, all event types",
1590
- );
1591
- expect(getLeadingGlyphPath(getTrigger())).toBe(
1592
- getGlyphPath(IconProp.Filter),
1593
- );
1594
- expect(queryPanel()).toBeInTheDocument();
1595
- });
1596
- });
1597
-
1598
- describe("search", () => {
1599
- test("uses a threshold of eight event types", () => {
1600
- expect(FEED_EVENT_TYPE_SEARCH_THRESHOLD).toBe(8);
1601
- });
1602
-
1603
- test("is absent when the checklist is at the threshold", () => {
1604
- render(
1605
- <FeedOptionsButton
1606
- value={DEFAULT_FEED_OPTIONS}
1607
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS.slice(
1608
- 0,
1609
- FEED_EVENT_TYPE_SEARCH_THRESHOLD,
1610
- )}
1611
- onChange={createOnChange()}
1612
- />,
1613
- );
1614
-
1615
- openPanel();
1616
-
1617
- expect(screen.getAllByRole("checkbox")).toHaveLength(
1618
- FEED_EVENT_TYPE_SEARCH_THRESHOLD,
1619
- );
1620
- expect(
1621
- screen.queryByRole("textbox", { name: "Search event types" }),
1622
- ).not.toBeInTheDocument();
1623
- });
1624
-
1625
- test("is absent for a short checklist", () => {
1626
- render(
1627
- <FeedOptionsButton
1628
- value={DEFAULT_FEED_OPTIONS}
1629
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1630
- onChange={createOnChange()}
1631
- />,
1632
- );
1633
-
1634
- openPanel();
1635
-
1636
- expect(
1637
- screen.queryByRole("textbox", { name: "Search event types" }),
1638
- ).not.toBeInTheDocument();
1639
- });
1640
-
1641
- test("appears once the checklist is longer than the threshold", () => {
1642
- render(
1643
- <FeedOptionsButton
1644
- value={DEFAULT_FEED_OPTIONS}
1645
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS.slice(
1646
- 0,
1647
- FEED_EVENT_TYPE_SEARCH_THRESHOLD + 1,
1648
- )}
1649
- onChange={createOnChange()}
1650
- />,
1651
- );
1652
-
1653
- openPanel();
1654
-
1655
- const search: HTMLElement = getSearchInput();
1656
-
1657
- expect(search).toHaveValue("");
1658
- expect(search).toHaveAttribute("placeholder", "Search event types");
1659
- expect(screen.getAllByRole("checkbox")).toHaveLength(
1660
- FEED_EVENT_TYPE_SEARCH_THRESHOLD + 1,
1661
- );
1662
- });
1663
-
1664
- test.each<[string, Array<string>]>([
1665
- ["INCIDENT", ["Incident Created", "Incident Resolved"]],
1666
- ["incident", ["Incident Created", "Incident Resolved"]],
1667
- [
1668
- "notification",
1669
- ["Owner Notification Sent", "Subscriber Notification Sent"],
1670
- ],
1671
- ["as owner", ["Team Added as Owner", "User Added as Owner"]],
1672
- [" resolved ", ["Alert Resolved", "Incident Resolved"]],
1673
- ["ACKNOW", ["Alert Acknowledged"]],
1674
- ])(
1675
- "filters the checklist to labels containing %p, ignoring case",
1676
- (term: string, expectedLabels: Array<string>) => {
1677
- render(
1678
- <FeedOptionsButton
1679
- value={DEFAULT_FEED_OPTIONS}
1680
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
1681
- onChange={createOnChange()}
1682
- />,
1683
- );
1684
-
1685
- openPanel();
1686
- fireEvent.change(getSearchInput(), { target: { value: term } });
1687
-
1688
- expect(getSearchInput()).toHaveValue(term);
1689
- expect(getCheckboxLabels()).toEqual(expectedLabels);
1690
- },
1691
- );
1692
-
1693
- test("restores the whole checklist when the search is cleared", () => {
1694
- render(
1695
- <FeedOptionsButton
1696
- value={DEFAULT_FEED_OPTIONS}
1697
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
1698
- onChange={createOnChange()}
1699
- />,
1700
- );
1701
-
1702
- openPanel();
1703
- fireEvent.change(getSearchInput(), { target: { value: "alert" } });
1704
- expect(getCheckboxLabels()).toHaveLength(3);
1705
-
1706
- fireEvent.change(getSearchInput(), { target: { value: " " } });
1707
- expect(getCheckboxLabels()).toHaveLength(LONG_EVENT_TYPE_OPTIONS.length);
1708
-
1709
- fireEvent.change(getSearchInput(), { target: { value: "" } });
1710
- expect(getCheckboxLabels()).toEqual(
1711
- LONG_EVENT_TYPE_OPTIONS.map((option: FeedEventTypeOption) => {
1712
- return option.label;
1713
- }),
1714
- );
1715
- });
1716
-
1717
- test("matches labels, not raw event type values", () => {
1718
- render(
1719
- <FeedOptionsButton
1720
- value={DEFAULT_FEED_OPTIONS}
1721
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
1722
- onChange={createOnChange()}
1723
- />,
1724
- );
1725
-
1726
- openPanel();
1727
- fireEvent.change(getSearchInput(), { target: { value: "OwnerUser" } });
1728
-
1729
- expect(screen.queryAllByRole("checkbox")).toHaveLength(0);
1730
- });
1731
-
1732
- test("says so when nothing matches", () => {
1733
- render(
1734
- <FeedOptionsButton
1735
- value={DEFAULT_FEED_OPTIONS}
1736
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
1737
- onChange={createOnChange()}
1738
- />,
1739
- );
1740
-
1741
- openPanel();
1742
- fireEvent.change(getSearchInput(), { target: { value: " zzz " } });
1743
-
1744
- expect(screen.queryAllByRole("checkbox")).toHaveLength(0);
1745
- expect(screen.getByText('No event types match "zzz".')).toBeVisible();
1746
- expect(
1747
- screen.queryByText("This feed has no event types to filter by."),
1748
- ).not.toBeInTheDocument();
1749
- });
1750
-
1751
- /*
1752
- * The filtered list changes silently under the search box, so the number
1753
- * of matches is spoken from a live region. It is mounted empty with the
1754
- * search box: a region that appears together with its first text is
1755
- * often not announced at all.
1756
- */
1757
- test("announces the number of matches, and nothing while there is no search", () => {
1758
- render(
1759
- <FeedOptionsButton
1760
- value={DEFAULT_FEED_OPTIONS}
1761
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
1762
- onChange={createOnChange()}
1763
- />,
1764
- );
1765
-
1766
- openPanel();
1767
-
1768
- const results: HTMLElement = getSearchResults();
1769
-
1770
- expect(results).toHaveAttribute("aria-live", "polite");
1771
- expect(results.textContent).toBe("");
1772
-
1773
- fireEvent.change(getSearchInput(), { target: { value: "incident" } });
1774
-
1775
- expect(getCheckboxLabels()).toHaveLength(2);
1776
- expect(getSearchResults()).toBe(results);
1777
- expect(results).toHaveTextContent(/^Matching event types: 2$/);
1778
-
1779
- fireEvent.change(getSearchInput(), { target: { value: " " } });
1780
-
1781
- expect(results.textContent).toBe("");
1782
-
1783
- fireEvent.change(getSearchInput(), { target: { value: "zzz" } });
1784
-
1785
- expect(screen.queryAllByRole("checkbox")).toHaveLength(0);
1786
- expect(screen.getByText('No event types match "zzz".')).toBeVisible();
1787
- expect(results).toHaveTextContent(/^Matching event types: 0$/);
1788
-
1789
- fireEvent.change(getSearchInput(), { target: { value: "" } });
1790
-
1791
- expect(results.textContent).toBe("");
1792
- });
1793
-
1794
- test("ticks a search result without dropping a ticked event type the search hides", () => {
1795
- const onChange: OnChangeMock = createOnChange();
1796
-
1797
- render(
1798
- <Harness
1799
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
1800
- initialValue={{
1801
- sortOrder: SortOrder.Ascending,
1802
- eventTypes: ["OwnerUserAdded"],
1803
- }}
1804
- onChange={onChange}
1805
- />,
1806
- );
1807
-
1808
- openPanel();
1809
- fireEvent.change(getSearchInput(), { target: { value: "incident" } });
1810
- fireEvent.click(getCheckbox("Incident Resolved"));
1811
-
1812
- expect(onChange).toHaveBeenCalledTimes(1);
1813
- expect(onChange).toHaveBeenCalledWith({
1814
- sortOrder: SortOrder.Ascending,
1815
- eventTypes: ["IncidentResolved", "OwnerUserAdded"],
1816
- });
1817
- // The search stays put so the reader can keep ticking results.
1818
- expect(getSearchInput()).toHaveValue("incident");
1819
- expect(getCheckboxLabels()).toEqual([
1820
- "Incident Created",
1821
- "Incident Resolved",
1822
- ]);
1823
- expect(getCheckbox("Incident Resolved")).toBeChecked();
1824
- expect(getEventTypeSummary()).toHaveTextContent(
1825
- `Showing 2 of ${LONG_EVENT_TYPE_OPTIONS.length} event types.`,
1826
- );
1827
- expect(queryPanel()).toBeInTheDocument();
1828
- });
1829
-
1830
- test.each<[string, () => void]>([
1831
- [
1832
- "Escape",
1833
- (): void => {
1834
- fireEvent.keyDown(getSearchInput(), { key: "Escape" });
1835
- },
1836
- ],
1837
- [
1838
- "a press outside",
1839
- (): void => {
1840
- fireEvent.mouseDown(document.body);
1841
- },
1842
- ],
1843
- [
1844
- "the trigger",
1845
- (): void => {
1846
- fireEvent.mouseDown(getTrigger());
1847
- fireEvent.click(getTrigger());
1848
- },
1849
- ],
1850
- [
1851
- "focus leaving the control",
1852
- (): void => {
1853
- const outside: HTMLElement = screen.getByRole("button", {
1854
- name: "Outside",
1855
- });
1856
-
1857
- act(() => {
1858
- outside.focus();
1859
- });
1860
- },
1861
- ],
1862
- ])(
1863
- "clears the search text when closed by %s",
1864
- (_label: string, dismiss: () => void) => {
1865
- render(
1866
- <div>
1867
- <FeedOptionsButton
1868
- value={DEFAULT_FEED_OPTIONS}
1869
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
1870
- onChange={createOnChange()}
1871
- />
1872
- <button type="button">Outside</button>
1873
- </div>,
1874
- );
1875
-
1876
- openPanel();
1877
-
1878
- const search: HTMLElement = getSearchInput();
1879
-
1880
- act(() => {
1881
- search.focus();
1882
- });
1883
- fireEvent.change(search, { target: { value: "incident" } });
1884
- expect(getCheckboxLabels()).toHaveLength(2);
1885
-
1886
- dismiss();
1887
- expect(queryPanel()).not.toBeInTheDocument();
1888
-
1889
- openPanel();
1890
-
1891
- expect(getSearchInput()).toHaveValue("");
1892
- expect(getSearchResults().textContent).toBe("");
1893
- expect(getCheckboxLabels()).toHaveLength(
1894
- LONG_EVENT_TYPE_OPTIONS.length,
1895
- );
1896
- },
1897
- );
1898
- });
1899
-
1900
- describe("dismissal", () => {
1901
- const renderWithOutside: (onChange?: OnChangeMock) => void = (
1902
- onChange?: OnChangeMock,
1903
- ): void => {
1904
- render(
1905
- <div>
1906
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} onChange={onChange} />
1907
- <button type="button">Outside</button>
1908
- </div>,
1909
- );
1910
- };
1911
-
1912
- const getOutside: () => HTMLElement = (): HTMLElement => {
1913
- return screen.getByRole("button", { name: "Outside" });
1914
- };
1915
-
1916
- test("Escape closes the panel and returns focus to the trigger", () => {
1917
- renderWithOutside();
1918
-
1919
- openPanel();
1920
- expect(getRadio("Newest first")).toHaveFocus();
1921
-
1922
- expect(
1923
- fireEvent.keyDown(getRadio("Newest first"), { key: "Escape" }),
1924
- ).toBe(false);
1925
-
1926
- expect(queryPanel()).not.toBeInTheDocument();
1927
- expect(getTrigger()).toHaveAttribute("aria-expanded", "false");
1928
- expect(getTrigger()).not.toHaveAttribute("aria-controls");
1929
- expect(getTrigger()).toHaveFocus();
1930
- });
1931
-
1932
- test("Escape from a checkbox also closes and returns focus", () => {
1933
- renderWithOutside();
1934
-
1935
- openPanel();
1936
-
1937
- const checkbox: HTMLElement = getCheckbox("Incident Created");
1938
-
1939
- act(() => {
1940
- checkbox.focus();
1941
- });
1942
- fireEvent.keyDown(checkbox, { key: "Escape" });
1943
-
1944
- expect(queryPanel()).not.toBeInTheDocument();
1945
- expect(getTrigger()).toHaveFocus();
1946
- });
1947
-
1948
- test("Escape inside the open panel does not reach an enclosing handler, but does when closed", () => {
1949
- const onParentKeyDown: ReturnType<
1950
- typeof jest.fn<(event: React.KeyboardEvent) => void>
1951
- > = jest.fn<(event: React.KeyboardEvent) => void>();
1952
-
1953
- render(
1954
- <div onKeyDown={onParentKeyDown}>
1955
- <FeedOptionsButton
1956
- value={DEFAULT_FEED_OPTIONS}
1957
- eventTypeOptions={EVENT_TYPE_OPTIONS}
1958
- onChange={createOnChange()}
1959
- />
1960
- </div>,
1961
- );
1962
-
1963
- openPanel();
1964
- fireEvent.keyDown(getRadio("Newest first"), { key: "Escape" });
1965
-
1966
- expect(queryPanel()).not.toBeInTheDocument();
1967
- expect(onParentKeyDown).not.toHaveBeenCalled();
1968
-
1969
- // Closed, Escape is none of this control's business.
1970
- expect(fireEvent.keyDown(getTrigger(), { key: "Escape" })).toBe(true);
1971
- expect(onParentKeyDown).toHaveBeenCalledTimes(1);
1972
- expect(queryPanel()).not.toBeInTheDocument();
1973
- });
1974
-
1975
- test("a press outside closes the panel", () => {
1976
- renderWithOutside();
1977
-
1978
- openPanel();
1979
- fireEvent.mouseDown(getOutside());
1980
-
1981
- expect(queryPanel()).not.toBeInTheDocument();
1982
- expect(getTrigger()).toHaveAttribute("aria-expanded", "false");
1983
- });
1984
-
1985
- test("a press on the page body closes the panel", () => {
1986
- renderWithOutside();
1987
-
1988
- openPanel();
1989
- fireEvent.mouseDown(document.body);
1990
-
1991
- expect(queryPanel()).not.toBeInTheDocument();
1992
- });
1993
-
1994
- test("a press inside the panel keeps it open", () => {
1995
- renderWithOutside();
1996
-
1997
- const panel: HTMLElement = openPanel();
1998
-
1999
- fireEvent.mouseDown(panel);
2000
- expect(queryPanel()).toBeInTheDocument();
2001
-
2002
- fireEvent.mouseDown(getCheckbox("Incident State Changed"));
2003
- expect(queryPanel()).toBeInTheDocument();
2004
-
2005
- fireEvent.mouseDown(getRadio("Oldest first"));
2006
- expect(queryPanel()).toBeInTheDocument();
2007
-
2008
- fireEvent.mouseDown(screen.getByText("Sort by time"));
2009
- expect(queryPanel()).toBeInTheDocument();
2010
- });
2011
-
2012
- /*
2013
- * A press on the panel's padding moves focus to the panel itself (the
2014
- * nearest focusable ancestor of the press). Were the panel not focusable,
2015
- * focus would fall to the page body, outside the control's key handler,
2016
- * and Escape would stop closing it.
2017
- */
2018
- test("a press on the panel's padding keeps it open, and Escape from there still closes it", () => {
2019
- renderWithOutside();
2020
-
2021
- const panel: HTMLElement = openPanel();
2022
-
2023
- expect(getRadio("Newest first")).toHaveFocus();
2024
-
2025
- fireEvent.mouseDown(panel);
2026
- act(() => {
2027
- panel.focus();
2028
- });
2029
-
2030
- expect(queryPanel()).toBe(panel);
2031
- expect(panel).toHaveFocus();
2032
-
2033
- expect(fireEvent.keyDown(panel, { key: "Escape" })).toBe(false);
2034
-
2035
- expect(queryPanel()).not.toBeInTheDocument();
2036
- expect(getTrigger()).toHaveAttribute("aria-expanded", "false");
2037
- expect(getTrigger()).toHaveFocus();
2038
- });
2039
-
2040
- test("a press outside while closed changes nothing", () => {
2041
- const onChange: OnChangeMock = createOnChange();
2042
-
2043
- renderWithOutside(onChange);
2044
-
2045
- fireEvent.mouseDown(getOutside());
2046
-
2047
- expect(queryPanel()).not.toBeInTheDocument();
2048
- expect(getTrigger()).toHaveAttribute("aria-expanded", "false");
2049
- expect(onChange).not.toHaveBeenCalled();
2050
- });
2051
-
2052
- test("pressing the trigger while open closes it without re-opening", () => {
2053
- renderWithOutside();
2054
-
2055
- openPanel();
2056
-
2057
- // A real press is mousedown then click.
2058
- fireEvent.mouseDown(getTrigger());
2059
- fireEvent.click(getTrigger());
2060
-
2061
- expect(queryPanel()).not.toBeInTheDocument();
2062
- expect(getTrigger()).toHaveAttribute("aria-expanded", "false");
2063
-
2064
- fireEvent.mouseDown(getTrigger());
2065
- fireEvent.click(getTrigger());
2066
-
2067
- expect(queryPanel()).toBeInTheDocument();
2068
- expect(getTrigger()).toHaveAttribute("aria-expanded", "true");
2069
- });
2070
-
2071
- test("focus moving to an element outside closes the panel", () => {
2072
- renderWithOutside();
2073
-
2074
- openPanel();
2075
- fireEvent.focusOut(getRadio("Newest first"), {
2076
- relatedTarget: getOutside(),
2077
- });
2078
-
2079
- expect(queryPanel()).not.toBeInTheDocument();
2080
- expect(getTrigger()).toHaveAttribute("aria-expanded", "false");
2081
- });
2082
-
2083
- test("tabbing focus out to another control closes the panel", () => {
2084
- renderWithOutside();
2085
-
2086
- openPanel();
2087
-
2088
- act(() => {
2089
- getOutside().focus();
2090
- });
2091
-
2092
- expect(queryPanel()).not.toBeInTheDocument();
2093
- expect(getOutside()).toHaveFocus();
2094
- });
2095
-
2096
- test("a blur with no next focus, like switching to another window, keeps it open", () => {
2097
- renderWithOutside();
2098
-
2099
- openPanel();
2100
- fireEvent.focusOut(getRadio("Newest first"), { relatedTarget: null });
2101
- expect(queryPanel()).toBeInTheDocument();
2102
-
2103
- fireEvent.blur(getRadio("Newest first"));
2104
- expect(queryPanel()).toBeInTheDocument();
2105
- });
2106
-
2107
- test("focus moving between controls inside the panel keeps it open", () => {
2108
- renderWithOutside();
2109
-
2110
- openPanel();
2111
-
2112
- act(() => {
2113
- getCheckbox("Incident Created").focus();
2114
- });
2115
- expect(queryPanel()).toBeInTheDocument();
2116
-
2117
- act(() => {
2118
- getRadio("Newest first").focus();
2119
- });
2120
- expect(queryPanel()).toBeInTheDocument();
2121
-
2122
- // Shift+Tab from the first radio lands on the trigger, still inside.
2123
- act(() => {
2124
- getTrigger().focus();
2125
- });
2126
- expect(queryPanel()).toBeInTheDocument();
2127
- });
2128
-
2129
- test("stops listening for outside presses once unmounted", () => {
2130
- const addSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
2131
- document,
2132
- "addEventListener",
2133
- );
2134
- const removeSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
2135
- document,
2136
- "removeEventListener",
2137
- );
2138
-
2139
- try {
2140
- const { unmount } = render(
2141
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />,
2142
- );
2143
-
2144
- openPanel();
2145
-
2146
- const mouseDownListeners: Array<unknown> = getListeners(
2147
- addSpy,
2148
- "mousedown",
2149
- );
2150
-
2151
- expect(mouseDownListeners.length).toBeGreaterThan(0);
2152
-
2153
- unmount();
2154
-
2155
- /*
2156
- * removeEventListener only detaches when the handler identity matches
2157
- * the add, so compare the functions rather than counting calls.
2158
- */
2159
- const removedListeners: Array<unknown> = getListeners(
2160
- removeSpy,
2161
- "mousedown",
2162
- );
2163
-
2164
- for (const listener of mouseDownListeners) {
2165
- expect(removedListeners).toContain(listener);
2166
- }
2167
- } finally {
2168
- addSpy.mockRestore();
2169
- removeSpy.mockRestore();
2170
- }
2171
- });
2172
- });
2173
-
2174
- /*
2175
- * "Reset to default" and "Show all" each remove themselves once used, so
2176
- * the button a keyboard user just pressed vanishes. Focus must land on
2177
- * another control inside the panel rather than fall back to the page body,
2178
- * where Escape would never reach the control's key handler and the panel
2179
- * could no longer be closed from the keyboard.
2180
- */
2181
- describe("keyboard focus after an action that removes its own button", () => {
2182
- const pressThenEscape: (
2183
- buttonName: string,
2184
- expectFocusOn: () => HTMLElement,
2185
- ) => void = (
2186
- buttonName: string,
2187
- expectFocusOn: () => HTMLElement,
2188
- ): void => {
2189
- const button: HTMLElement = screen.getByRole("button", {
2190
- name: buttonName,
2191
- });
2192
-
2193
- act(() => {
2194
- button.focus();
2195
- });
2196
- fireEvent.click(button);
2197
-
2198
- expect(
2199
- screen.queryByRole("button", { name: buttonName }),
2200
- ).not.toBeInTheDocument();
2201
- expect(queryPanel()).toBeInTheDocument();
2202
- expect(document.activeElement).not.toBe(document.body);
2203
- expect(expectFocusOn()).toHaveFocus();
2204
-
2205
- fireEvent.keyDown(document.activeElement || document.body, {
2206
- key: "Escape",
2207
- });
2208
-
2209
- expect(queryPanel()).not.toBeInTheDocument();
2210
- expect(getTrigger()).toHaveFocus();
2211
- };
2212
-
2213
- test("Reset to default moves focus to Newest first, where Escape still closes the panel", () => {
2214
- render(
2215
- <Harness
2216
- eventTypeOptions={EVENT_TYPE_OPTIONS}
2217
- initialValue={{
2218
- sortOrder: SortOrder.Ascending,
2219
- eventTypes: ["IncidentCreated"],
2220
- }}
2221
- />,
2222
- );
2223
-
2224
- openPanel();
2225
- pressThenEscape("Reset to default", () => {
2226
- return screen.getByRole("radio", { name: "Newest first" });
2227
- });
2228
- });
2229
-
2230
- test("Show all moves focus to the first event type, where Escape still closes the panel", () => {
2231
- render(
2232
- <Harness
2233
- eventTypeOptions={EVENT_TYPE_OPTIONS}
2234
- initialValue={{
2235
- sortOrder: SortOrder.Ascending,
2236
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
2237
- }}
2238
- />,
2239
- );
2240
-
2241
- openPanel();
2242
- pressThenEscape("Show all", () => {
2243
- return screen.getAllByRole("checkbox")[0]!;
2244
- });
2245
- });
2246
-
2247
- /*
2248
- * With a search that hides every row there is no checkbox to land on, so
2249
- * focus goes to the checked sort order. Oldest first is checked here, so
2250
- * this also tells "the checked radio" apart from "the first radio".
2251
- */
2252
- test("Show all while the search hides every row moves focus to the checked sort order, where Escape still closes the panel", () => {
2253
- render(
2254
- <Harness
2255
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
2256
- initialValue={{
2257
- sortOrder: SortOrder.Ascending,
2258
- eventTypes: ["AlertCreated", "OwnerUserAdded"],
2259
- }}
2260
- />,
2261
- );
2262
-
2263
- openPanel();
2264
- fireEvent.change(getSearchInput(), { target: { value: "zzz" } });
2265
- expect(screen.queryAllByRole("checkbox")).toHaveLength(0);
2266
-
2267
- pressThenEscape("Show all", () => {
2268
- return getRadio("Oldest first");
2269
- });
2270
- });
2271
- });
2272
-
2273
- describe("two instances on one page", () => {
2274
- test("get distinct ids and do not interfere with each other", () => {
2275
- const firstOnChange: OnChangeMock = createOnChange();
2276
- const secondOnChange: OnChangeMock = createOnChange();
2277
-
2278
- render(
2279
- <div>
2280
- <Harness
2281
- eventTypeOptions={EVENT_TYPE_OPTIONS}
2282
- onChange={firstOnChange}
2283
- />
2284
- <Harness
2285
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS.slice(0, 2)}
2286
- onChange={secondOnChange}
2287
- />
2288
- </div>,
2289
- );
2290
-
2291
- const triggers: Array<HTMLElement> = screen.getAllByRole("button", {
2292
- name: TRIGGER_NAME,
2293
- });
2294
-
2295
- expect(triggers).toHaveLength(2);
2296
-
2297
- const firstTrigger: HTMLElement = triggers[0]!;
2298
- const secondTrigger: HTMLElement = triggers[1]!;
2299
-
2300
- expect(firstTrigger.id).not.toBe("");
2301
- expect(secondTrigger.id).not.toBe("");
2302
- expect(firstTrigger.id).not.toBe(secondTrigger.id);
2303
- expect(firstTrigger.getAttribute("aria-describedby")).not.toBe(
2304
- secondTrigger.getAttribute("aria-describedby"),
2305
- );
2306
-
2307
- // Open the first one and filter it.
2308
- fireEvent.click(firstTrigger);
2309
-
2310
- const firstPanel: HTMLElement = screen.getByRole("dialog", {
2311
- name: PANEL_NAME,
2312
- });
2313
- const firstPanelId: string = firstPanel.id;
2314
-
2315
- expect(firstTrigger).toHaveAttribute("aria-controls", firstPanelId);
2316
- expect(secondTrigger).toHaveAttribute("aria-expanded", "false");
2317
- expect(secondTrigger).not.toHaveAttribute("aria-controls");
2318
- expect(
2319
- within(firstPanel).getByRole("radiogroup", { name: "Sort by time" }),
2320
- ).toBeInTheDocument();
2321
- expect(
2322
- within(firstPanel).getByRole("group", { name: "Event types" }),
2323
- ).toBeInTheDocument();
2324
-
2325
- fireEvent.click(
2326
- within(firstPanel).getByRole("checkbox", {
2327
- name: "Incident Created",
2328
- }),
2329
- );
2330
-
2331
- expect(firstOnChange).toHaveBeenCalledTimes(1);
2332
- expect(secondOnChange).not.toHaveBeenCalled();
2333
-
2334
- // Pressing the second trigger is a press outside the first control.
2335
- fireEvent.mouseDown(secondTrigger);
2336
- fireEvent.click(secondTrigger);
2337
-
2338
- const panels: Array<HTMLElement> = screen.getAllByRole("dialog", {
2339
- name: PANEL_NAME,
2340
- });
2341
-
2342
- expect(panels).toHaveLength(1);
2343
-
2344
- const secondPanel: HTMLElement = panels[0]!;
2345
-
2346
- expect(secondPanel.id).not.toBe("");
2347
- expect(secondPanel.id).not.toBe(firstPanelId);
2348
- expect(firstTrigger).toHaveAttribute("aria-expanded", "false");
2349
- expect(firstTrigger).not.toHaveAttribute("aria-controls");
2350
- expect(secondTrigger).toHaveAttribute("aria-expanded", "true");
2351
- expect(secondTrigger).toHaveAttribute("aria-controls", secondPanel.id);
2352
- expect(
2353
- within(secondPanel).getByRole("radio", { name: "Newest first" }),
2354
- ).toHaveFocus();
2355
- expect(
2356
- within(secondPanel).getByRole("radiogroup", { name: "Sort by time" }),
2357
- ).toBeInTheDocument();
2358
- expect(
2359
- within(secondPanel)
2360
- .getAllByRole("checkbox")
2361
- .map((checkbox: HTMLElement) => {
2362
- return checkbox.closest("label")?.textContent || "";
2363
- }),
2364
- ).toEqual(["Alert Acknowledged", "Alert Created"]);
2365
-
2366
- fireEvent.click(
2367
- within(secondPanel).getByRole("radio", { name: "Oldest first" }),
2368
- );
2369
-
2370
- expect(secondOnChange).toHaveBeenCalledTimes(1);
2371
- expect(secondOnChange).toHaveBeenCalledWith({
2372
- sortOrder: SortOrder.Ascending,
2373
- eventTypes: [],
2374
- });
2375
- expect(firstOnChange).toHaveBeenCalledTimes(1);
2376
-
2377
- // Each trigger keeps describing only its own feed.
2378
- expect(firstTrigger).toHaveAccessibleDescription(
2379
- "Newest first, 1 of 3 event types",
2380
- );
2381
- expect(secondTrigger).toHaveAccessibleDescription(
2382
- "Oldest first, all event types",
2383
- );
2384
- expect(
2385
- within(firstTrigger).getByTestId("feed-options-count"),
2386
- ).toHaveTextContent(/^1$/);
2387
- expect(
2388
- within(secondTrigger).queryByTestId("feed-options-count"),
2389
- ).not.toBeInTheDocument();
2390
- });
2391
-
2392
- test("focus moving into the other instance closes the first", () => {
2393
- render(
2394
- <div>
2395
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />
2396
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} />
2397
- </div>,
2398
- );
2399
-
2400
- const triggers: Array<HTMLElement> = screen.getAllByRole("button", {
2401
- name: TRIGGER_NAME,
2402
- });
2403
-
2404
- fireEvent.click(triggers[0]!);
2405
- expect(screen.getAllByRole("dialog")).toHaveLength(1);
2406
-
2407
- // A click without a mousedown: only the focus hand-off can close it.
2408
- fireEvent.click(triggers[1]!);
2409
-
2410
- expect(screen.getAllByRole("dialog")).toHaveLength(1);
2411
- expect(triggers[0]).toHaveAttribute("aria-expanded", "false");
2412
- expect(triggers[1]).toHaveAttribute("aria-expanded", "true");
2413
- });
2414
- });
2415
-
2416
- /*
2417
- * A real i18next instance rather than a stubbed t(): the control looks its
2418
- * sentences up whole, relies on i18next leaving the {{placeholders}} it is
2419
- * not given, and fills them itself afterwards. Only a real instance proves
2420
- * that hand-off. The German values are the shipped ones, copied from
2421
- * App/FeatureSet/Dashboard/src/Locales/de.json; the keys are the English
2422
- * source text, exactly as those locale files key them.
2423
- *
2424
- * The instance reaches the component through I18nextProvider only. Adding
2425
- * .use(initReactI18next) would install it as react-i18next's global
2426
- * instance and quietly turn every other test in this file German.
2427
- */
2428
- describe("in German", () => {
2429
- const german: i18n = createInstance();
2430
-
2431
- /*
2432
- * Two event labels whose German order differs from the English one.
2433
- * "Incident State Changed" is left out on purpose: a label with no
2434
- * translation yet stays in English, and is sorted among the German ones.
2435
- */
2436
- const GERMAN_TRANSLATIONS: Record<string, string> = {
2437
- "Filter & Sort": "Filtern & Sortieren",
2438
- "Filter and sort feed": "Feed filtern und sortieren",
2439
- "Newest first": "Neueste zuerst",
2440
- "Oldest first": "Älteste zuerst",
2441
- "Event types": "Ereignistypen",
2442
- "Search event types": "Ereignistypen suchen",
2443
- "Matching event types: {{count}}": "Passende Ereignistypen: {{count}}",
2444
- "Showing {{selected}} of {{total}} event types.":
2445
- "{{selected}} von {{total}} Ereignistypen werden angezeigt.",
2446
- "{{sortOrder}}, all event types": "{{sortOrder}}, alle Ereignistypen",
2447
- "{{sortOrder}}, {{selected}} of {{total}} event types":
2448
- "{{sortOrder}}, {{selected}} von {{total}} Ereignistypen",
2449
- "Incident Created": "Vorfall erstellt",
2450
- "User Added as Owner": "Benutzer als Eigentümer hinzugefügt",
2451
- };
2452
-
2453
- beforeAll(async () => {
2454
- await german.init({
2455
- lng: "de",
2456
- resources: { de: { translation: GERMAN_TRANSLATIONS } },
2457
- interpolation: { escapeValue: false },
2458
- keySeparator: false,
2459
- nsSeparator: false,
2460
- });
2461
- });
2462
-
2463
- const renderInGerman: (ui: React.ReactElement) => RenderResult = (
2464
- ui: React.ReactElement,
2465
- ): RenderResult => {
2466
- return render(<I18nextProvider i18n={german}>{ui}</I18nextProvider>);
2467
- };
2468
-
2469
- const getGermanTrigger: () => HTMLElement = (): HTMLElement => {
2470
- return screen.getByRole("button", { name: "Filtern & Sortieren" });
2471
- };
2472
-
2473
- const openGermanPanel: () => HTMLElement = (): HTMLElement => {
2474
- fireEvent.click(getGermanTrigger());
2475
-
2476
- return screen.getByRole("dialog", { name: "Feed filtern und sortieren" });
2477
- };
2478
-
2479
- test("names the trigger with the German label and describes the view in German", () => {
2480
- renderInGerman(
2481
- <FeedOptionsButton
2482
- value={DEFAULT_FEED_OPTIONS}
2483
- eventTypeOptions={EVENT_TYPE_OPTIONS}
2484
- onChange={createOnChange()}
2485
- />,
2486
- );
2487
-
2488
- const trigger: HTMLElement = getGermanTrigger();
2489
-
2490
- expect(trigger).toHaveAccessibleName("Filtern & Sortieren");
2491
- expect(trigger).toHaveAccessibleDescription(
2492
- "Neueste zuerst, alle Ereignistypen",
2493
- );
2494
- expect(trigger).toHaveAttribute(
2495
- "title",
2496
- "Neueste zuerst, alle Ereignistypen",
2497
- );
2498
-
2499
- openGermanPanel();
2500
-
2501
- expect(
2502
- screen.getByRole("group", { name: "Ereignistypen" }),
2503
- ).toBeInTheDocument();
2504
- expect(
2505
- screen.getAllByRole("radio").map((radio: HTMLElement) => {
2506
- return radio.textContent;
2507
- }),
2508
- ).toEqual(["Neueste zuerst", "Älteste zuerst"]);
2509
- });
2510
-
2511
- test("fills the German sentences with the numbers as boxes are ticked", () => {
2512
- const onChange: OnChangeMock = createOnChange();
2513
-
2514
- renderInGerman(
2515
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} onChange={onChange} />,
2516
- );
2517
-
2518
- openGermanPanel();
2519
- fireEvent.click(getCheckbox("Vorfall erstellt"));
2520
-
2521
- expect(getLastCall(onChange)).toEqual({
2522
- sortOrder: SortOrder.Descending,
2523
- eventTypes: ["IncidentCreated"],
2524
- });
2525
- expect(getEventTypeSummary()).toHaveTextContent(
2526
- /^1 von 3 Ereignistypen werden angezeigt\.$/,
2527
- );
2528
- expect(getGermanTrigger()).toHaveAccessibleDescription(
2529
- "Neueste zuerst, 1 von 3 Ereignistypen",
2530
- );
2531
-
2532
- fireEvent.click(getRadio("Älteste zuerst"));
2533
-
2534
- expect(getGermanTrigger()).toHaveAccessibleDescription(
2535
- "Älteste zuerst, 1 von 3 Ereignistypen",
2536
- );
2537
- });
2538
-
2539
- test("orders the checklist by the German labels, while payloads keep the feed's own order", () => {
2540
- const onChange: OnChangeMock = createOnChange();
2541
-
2542
- renderInGerman(
2543
- <Harness eventTypeOptions={EVENT_TYPE_OPTIONS} onChange={onChange} />,
2544
- );
2545
-
2546
- openGermanPanel();
2547
-
2548
- /*
2549
- * In English this list reads Incident Created, Incident State Changed,
2550
- * User Added as Owner.
2551
- */
2552
- expect(getCheckboxLabels()).toEqual([
2553
- "Benutzer als Eigentümer hinzugefügt",
2554
- "Incident State Changed",
2555
- "Vorfall erstellt",
2556
- ]);
2557
-
2558
- /*
2559
- * Ticked top to bottom as a German reader sees them, the request still
2560
- * lists them in the feed's order, so it - and the reload key - is the
2561
- * same in every language.
2562
- */
2563
- fireEvent.click(getCheckbox("Benutzer als Eigentümer hinzugefügt"));
2564
- fireEvent.click(getCheckbox("Vorfall erstellt"));
2565
-
2566
- expect(getLastCall(onChange)).toEqual({
2567
- sortOrder: SortOrder.Descending,
2568
- eventTypes: ["IncidentCreated", "OwnerUserAdded"],
2569
- });
2570
- });
2571
-
2572
- test("searches the German labels the reader sees, not the English ones behind them", () => {
2573
- const onChange: OnChangeMock = createOnChange();
2574
-
2575
- renderInGerman(
2576
- <Harness
2577
- eventTypeOptions={LONG_EVENT_TYPE_OPTIONS}
2578
- onChange={onChange}
2579
- />,
2580
- );
2581
-
2582
- openGermanPanel();
2583
-
2584
- const search: HTMLElement = screen.getByRole("textbox", {
2585
- name: "Ereignistypen suchen",
2586
- });
2587
-
2588
- fireEvent.change(search, { target: { value: "EIGENTÜMER" } });
2589
-
2590
- expect(getCheckboxLabels()).toEqual([
2591
- "Benutzer als Eigentümer hinzugefügt",
2592
- ]);
2593
- expect(getSearchResults()).toHaveTextContent(
2594
- /^Passende Ereignistypen: 1$/,
2595
- );
2596
-
2597
- fireEvent.click(getCheckbox("Benutzer als Eigentümer hinzugefügt"));
2598
-
2599
- expect(getLastCall(onChange)).toEqual({
2600
- sortOrder: SortOrder.Descending,
2601
- eventTypes: ["OwnerUserAdded"],
2602
- });
2603
-
2604
- // Its English label no longer matches; the untranslated rows still do.
2605
- fireEvent.change(search, { target: { value: "as owner" } });
2606
-
2607
- expect(getCheckboxLabels()).toEqual(["Team Added as Owner"]);
2608
- });
2609
- });
2610
- });