@oneuptime/common 12.0.12 → 12.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
  2. package/Models/DatabaseModels/NetworkDevice.ts +64 -0
  3. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  4. package/Models/DatabaseModels/StatusPage.ts +59 -0
  5. package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
  6. package/Models/DatabaseModels/UserCall.ts +94 -3
  7. package/Models/DatabaseModels/UserEmail.ts +94 -3
  8. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  9. package/Models/DatabaseModels/UserPush.ts +37 -0
  10. package/Models/DatabaseModels/UserSMS.ts +94 -3
  11. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  12. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
  13. package/Server/API/AIChatAPI.ts +55 -56
  14. package/Server/API/BaseAPI.ts +79 -14
  15. package/Server/API/CommonAPI.ts +89 -0
  16. package/Server/API/MicrosoftTeamsAPI.ts +20 -9
  17. package/Server/API/SlackAPI.ts +13 -10
  18. package/Server/API/StatusPageAPI.ts +2197 -2128
  19. package/Server/API/TelemetryAPI.ts +72 -3
  20. package/Server/API/UserCallAPI.ts +53 -45
  21. package/Server/API/UserEmailAPI.ts +53 -44
  22. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  23. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  24. package/Server/API/UserPushAPI.ts +126 -2
  25. package/Server/API/UserSmsAPI.ts +53 -44
  26. package/Server/API/UserWhatsAppAPI.ts +53 -50
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  33. package/Server/Middleware/UserAuthorization.ts +11 -2
  34. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  35. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  36. package/Server/Services/ApiKeyPermissionService.ts +116 -2
  37. package/Server/Services/DatabaseService.ts +118 -6
  38. package/Server/Services/LogAggregationService.ts +39 -0
  39. package/Server/Services/LogService.ts +21 -0
  40. package/Server/Services/NetworkSiteService.ts +12 -0
  41. package/Server/Services/PushNotificationService.ts +127 -12
  42. package/Server/Services/SpanService.ts +21 -0
  43. package/Server/Services/TeamMemberService.ts +53 -13
  44. package/Server/Services/TraceAggregationService.ts +15 -0
  45. package/Server/Services/UserCallService.ts +55 -24
  46. package/Server/Services/UserEmailService.ts +83 -17
  47. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  48. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  49. package/Server/Services/UserNotificationRuleService.ts +26 -0
  50. package/Server/Services/UserPushService.ts +89 -0
  51. package/Server/Services/UserSmsService.ts +50 -17
  52. package/Server/Services/UserWhatsAppService.ts +48 -15
  53. package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
  54. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
  55. package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
  56. package/Server/Types/Database/QueryHelper.ts +30 -0
  57. package/Server/Utils/APIKey/AccessPermission.ts +16 -40
  58. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  59. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
  60. package/Server/Utils/ChannelVerification.ts +510 -0
  61. package/Server/Utils/LogRedaction.ts +576 -0
  62. package/Server/Utils/Logger.ts +123 -46
  63. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
  64. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
  65. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  66. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  67. package/Server/Utils/Monitor/MonitorResource.ts +29 -9
  68. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  69. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  70. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
  71. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  72. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  73. package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
  74. package/Server/Utils/StartServer.ts +30 -9
  75. package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
  76. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
  77. package/Server/Utils/TotpAuth.ts +137 -9
  78. package/Server/Utils/UserRegistrationToken.ts +182 -0
  79. package/Server/Utils/VerificationCode.ts +134 -0
  80. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
  81. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  82. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  83. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  84. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  85. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  86. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +328 -0
  87. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
  88. package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
  89. package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
  90. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  91. package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
  92. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
  93. package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
  94. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  95. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
  96. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
  97. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  98. package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
  99. package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
  100. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  101. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  102. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  103. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  104. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  105. package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
  106. package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
  107. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
  108. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
  109. package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
  110. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  111. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +280 -0
  112. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  113. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  114. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
  115. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  116. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  117. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  118. package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
  119. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  120. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  121. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  122. package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
  123. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  124. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  125. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  126. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  127. package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
  128. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  129. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  130. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  131. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  132. package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
  133. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  134. package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
  135. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  136. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  137. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  138. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  139. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  140. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
  141. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
  142. package/Tests/Server/Utils/Browser.test.ts +162 -0
  143. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  144. package/Tests/Server/Utils/Express.test.ts +371 -0
  145. package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
  146. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
  147. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  148. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  149. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  150. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  151. package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
  152. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  153. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  154. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  155. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  156. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
  157. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  158. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  159. package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
  160. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
  161. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  162. package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
  163. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  164. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
  165. package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
  166. package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
  167. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  168. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
  169. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  170. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  171. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  172. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
  173. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
  174. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
  175. package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
  176. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  177. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  178. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  179. package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
  180. package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
  181. package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
  182. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  183. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  184. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  185. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  186. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  187. package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
  188. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
  189. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  190. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  191. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  192. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  193. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  194. package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
  195. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
  196. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  197. package/Tests/UI/Components/Button.test.tsx +175 -1
  198. package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
  199. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  200. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  201. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  202. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  203. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  204. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  205. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  206. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  207. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  208. package/Tests/UI/Components/List.test.tsx +9 -2
  209. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  210. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  211. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  212. package/Tests/UI/Components/MasterPage.test.tsx +36 -1
  213. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  214. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  215. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  216. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  217. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  218. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  219. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  220. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  221. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  222. package/Tests/UI/Components/Toast.test.tsx +130 -7
  223. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  224. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  225. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  226. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  227. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  228. package/Tests/Utils/API.test.ts +16 -2
  229. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  230. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  231. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  232. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
  233. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
  234. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
  235. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
  236. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  237. package/Types/API/Hostname.ts +79 -0
  238. package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
  239. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
  240. package/Types/Database/DatabaseProperty.ts +38 -0
  241. package/Types/Database/TableColumn.ts +34 -7
  242. package/Types/Email/EmailTemplateType.ts +1 -0
  243. package/Types/Events/Recurring.ts +16 -1
  244. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  245. package/Types/Monitor/MonitorStep.ts +13 -1
  246. package/Types/Monitor/MonitorType.ts +345 -40
  247. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  248. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  249. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
  250. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  251. package/Types/Permission.ts +35 -0
  252. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  253. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  254. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  255. package/Types/Service/ServiceLanguage.ts +144 -0
  256. package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
  257. package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
  258. package/Types/Text.ts +111 -19
  259. package/UI/Components/Button/Button.tsx +27 -14
  260. package/UI/Components/CardSelect/CardSelect.tsx +714 -105
  261. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  262. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  263. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  264. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  265. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  266. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  267. package/UI/Components/CommandPalette/Types.ts +49 -0
  268. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  269. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  270. package/UI/Components/EmptyState/EmptyState.tsx +8 -1
  271. package/UI/Components/Feed/FeedItem.tsx +1 -1
  272. package/UI/Components/Footer/Footer.tsx +32 -6
  273. package/UI/Components/Forms/Fields/FormField.tsx +3 -0
  274. package/UI/Components/Forms/Types/Field.ts +8 -0
  275. package/UI/Components/List/List.tsx +37 -5
  276. package/UI/Components/List/ListSkeleton.tsx +54 -0
  277. package/UI/Components/Loader/PageLoader.tsx +29 -8
  278. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
  279. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +23 -2
  280. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  281. package/UI/Components/MasterPage/MasterPage.tsx +24 -11
  282. package/UI/Components/Modal/Modal.tsx +2 -2
  283. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  284. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  285. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  286. package/UI/Components/Navbar/NavBar.tsx +14 -1
  287. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  288. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  289. package/UI/Components/SideOver/SideOver.tsx +37 -2
  290. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  291. package/UI/Components/Table/Table.tsx +74 -44
  292. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  293. package/UI/Components/Tabs/Tab.tsx +1 -1
  294. package/UI/Components/Toast/Toast.tsx +118 -53
  295. package/UI/Components/Toast/ToastInit.tsx +82 -32
  296. package/UI/Styles/Theme.css +40 -0
  297. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  298. package/UI/Utils/ModelListCache.ts +188 -0
  299. package/UI/Utils/Project.ts +29 -0
  300. package/Utils/API.ts +6 -1
  301. package/Utils/Monitor/MonitorMetricType.ts +16 -1
  302. package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
  303. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
  304. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
  305. package/Utils/Telemetry/CrossSignalScope.ts +75 -4
  306. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
  307. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
  309. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  311. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
  313. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
  315. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  317. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  319. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  320. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  321. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  322. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  323. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  324. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  325. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  326. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  327. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  328. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  329. package/build/dist/Server/API/AIChatAPI.js +48 -35
  330. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  331. package/build/dist/Server/API/BaseAPI.js +69 -13
  332. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  333. package/build/dist/Server/API/CommonAPI.js +59 -0
  334. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  335. package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
  336. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  337. package/build/dist/Server/API/SlackAPI.js +13 -10
  338. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  339. package/build/dist/Server/API/StatusPageAPI.js +745 -673
  340. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +34 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/API/UserCallAPI.js +42 -38
  344. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  345. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  346. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  347. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  348. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  349. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  350. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  351. package/build/dist/Server/API/UserPushAPI.js +95 -2
  352. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  353. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  354. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  355. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  356. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  357. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  358. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  359. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  360. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  361. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
  362. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
  363. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
  364. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
  365. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  366. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  367. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  368. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  369. package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
  370. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  371. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  372. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  373. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  374. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  375. package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
  376. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  377. package/build/dist/Server/Services/DatabaseService.js +89 -6
  378. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  379. package/build/dist/Server/Services/LogAggregationService.js +7 -0
  380. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  381. package/build/dist/Server/Services/LogService.js +16 -0
  382. package/build/dist/Server/Services/LogService.js.map +1 -1
  383. package/build/dist/Server/Services/NetworkSiteService.js +12 -0
  384. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  385. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  386. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  387. package/build/dist/Server/Services/SpanService.js +16 -0
  388. package/build/dist/Server/Services/SpanService.js.map +1 -1
  389. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  390. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  391. package/build/dist/Server/Services/TraceAggregationService.js +2 -0
  392. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  393. package/build/dist/Server/Services/UserCallService.js +54 -22
  394. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  395. package/build/dist/Server/Services/UserEmailService.js +78 -17
  396. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  397. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  398. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  399. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  400. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  401. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  402. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  403. package/build/dist/Server/Services/UserPushService.js +77 -0
  404. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  405. package/build/dist/Server/Services/UserSmsService.js +50 -17
  406. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  407. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  408. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  409. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
  410. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  411. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
  412. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  413. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
  414. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
  415. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  416. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  417. package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
  418. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  419. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  420. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  421. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
  422. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  423. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  424. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  425. package/build/dist/Server/Utils/LogRedaction.js +449 -0
  426. package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
  427. package/build/dist/Server/Utils/Logger.js +98 -45
  428. package/build/dist/Server/Utils/Logger.js.map +1 -1
  429. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
  430. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  431. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
  432. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  433. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  434. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  435. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  436. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  437. package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
  438. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  439. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  440. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  441. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  442. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  443. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  445. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  446. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  447. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  448. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
  449. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
  450. package/build/dist/Server/Utils/StartServer.js +10 -7
  451. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  452. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
  453. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
  454. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
  455. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
  456. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  457. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  458. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  459. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  460. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  461. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  462. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
  463. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  464. package/build/dist/Types/API/Hostname.js +63 -0
  465. package/build/dist/Types/API/Hostname.js.map +1 -1
  466. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
  467. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  468. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
  469. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  470. package/build/dist/Types/Database/DatabaseProperty.js +38 -0
  471. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  472. package/build/dist/Types/Database/TableColumn.js +24 -6
  473. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  474. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  475. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  476. package/build/dist/Types/Events/Recurring.js +13 -1
  477. package/build/dist/Types/Events/Recurring.js.map +1 -1
  478. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  479. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  480. package/build/dist/Types/Monitor/MonitorStep.js +9 -1
  481. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  482. package/build/dist/Types/Monitor/MonitorType.js +330 -31
  483. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  484. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  485. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  486. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  487. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  488. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  489. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  490. package/build/dist/Types/Permission.js +33 -0
  491. package/build/dist/Types/Permission.js.map +1 -1
  492. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  493. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  494. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  495. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  496. package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
  497. package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
  498. package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
  499. package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
  500. package/build/dist/Types/Text.js +82 -17
  501. package/build/dist/Types/Text.js.map +1 -1
  502. package/build/dist/UI/Components/Button/Button.js +22 -14
  503. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  504. package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
  505. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  506. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  507. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  508. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  509. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  510. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  511. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  512. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  513. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  514. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  515. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  516. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  517. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  518. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  519. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  520. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  521. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  522. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  523. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  524. package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
  525. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  526. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  527. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  528. package/build/dist/UI/Components/Footer/Footer.js +7 -4
  529. package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
  530. package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
  531. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  532. package/build/dist/UI/Components/List/List.js +19 -5
  533. package/build/dist/UI/Components/List/List.js.map +1 -1
  534. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  535. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  536. package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
  537. package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
  538. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
  539. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  540. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
  541. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  542. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  543. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  544. package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
  545. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  546. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  547. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  548. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  549. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  550. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  551. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  552. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  553. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  554. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  555. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  556. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  558. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  562. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  563. package/build/dist/UI/Components/Table/Table.js +35 -24
  564. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  565. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  566. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  567. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  568. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  569. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  570. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  571. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  572. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  573. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  574. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  575. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  576. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  577. package/build/dist/UI/Utils/Project.js +24 -1
  578. package/build/dist/UI/Utils/Project.js.map +1 -1
  579. package/build/dist/Utils/API.js +6 -1
  580. package/build/dist/Utils/API.js.map +1 -1
  581. package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
  582. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  583. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
  584. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  585. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
  586. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
  587. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
  588. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  589. package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
  590. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  591. package/jest.config.json +1 -1
  592. package/package.json +2 -3
  593. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  594. package/Tests/__mocks__/otpauth.js +0 -30
  595. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  596. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -0,0 +1,338 @@
1
+ import {
2
+ afterEach,
3
+ beforeEach,
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
+ screen,
16
+ } from "@testing-library/react";
17
+ import * as React from "react";
18
+ import getJestMockFunction, { MockFunction } from "../../MockType";
19
+
20
+ /*
21
+ * The flagship interaction of the command palette — press Cmd/Ctrl+K anywhere
22
+ * on the dashboard and the palette appears — lives entirely in the
23
+ * DashboardCommandPalette host: a document-level keydown listener plus a
24
+ * GlobalEvents subscription. The App suite runs in plain node and can only
25
+ * pin source patterns, so this suite actually mounts the host (real
26
+ * CommandPalette underneath, portal and all) and fires the real events.
27
+ *
28
+ * Escape/close-key semantics inside the open palette are deliberately NOT
29
+ * pinned here — they belong to the Common CommandPalette's own contract. This
30
+ * suite owns only the host's chord, its politeness rules, the global toggle
31
+ * event, and listener cleanup.
32
+ */
33
+
34
+ const navigateMock: MockFunction = getJestMockFunction();
35
+ const getListMock: MockFunction = getJestMockFunction();
36
+ const getCurrentProjectIdMock: MockFunction = getJestMockFunction();
37
+ const getAllPermissionsMock: MockFunction = getJestMockFunction();
38
+ const isMasterAdminMock: MockFunction = getJestMockFunction();
39
+
40
+ /*
41
+ * The arrow wrappers are load bearing: jest.mock is hoisted above the
42
+ * compiled requires, so the consts above are still in their temporal dead
43
+ * zone when the factory body runs. Dereferencing them lazily, at call time,
44
+ * is what works (same pattern as InvestigationPanel.test.tsx).
45
+ */
46
+ jest.mock("react-i18next", () => {
47
+ return {
48
+ useTranslation: () => {
49
+ return {
50
+ t: (key: string, defaultValue?: string): string => {
51
+ return defaultValue ?? key;
52
+ },
53
+ };
54
+ },
55
+ };
56
+ });
57
+
58
+ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
59
+ return {
60
+ __esModule: true,
61
+ default: {
62
+ getList: (...args: Array<unknown>) => {
63
+ return getListMock(...args);
64
+ },
65
+ },
66
+ };
67
+ });
68
+
69
+ jest.mock("../../../UI/Utils/Navigation", () => {
70
+ return {
71
+ __esModule: true,
72
+ default: {
73
+ navigate: (...args: Array<unknown>) => {
74
+ return navigateMock(...args);
75
+ },
76
+ },
77
+ };
78
+ });
79
+
80
+ jest.mock("../../../UI/Utils/Permission", () => {
81
+ return {
82
+ __esModule: true,
83
+ default: {
84
+ getAllPermissions: (...args: Array<unknown>) => {
85
+ return getAllPermissionsMock(...args);
86
+ },
87
+ },
88
+ };
89
+ });
90
+
91
+ jest.mock("../../../UI/Utils/User", () => {
92
+ return {
93
+ __esModule: true,
94
+ default: {
95
+ isMasterAdmin: (...args: Array<unknown>) => {
96
+ return isMasterAdminMock(...args);
97
+ },
98
+ },
99
+ };
100
+ });
101
+
102
+ jest.mock("../../../UI/Utils/Project", () => {
103
+ return {
104
+ __esModule: true,
105
+ default: {
106
+ getCurrentProjectId: (...args: Array<unknown>) => {
107
+ return getCurrentProjectIdMock(...args);
108
+ },
109
+ },
110
+ };
111
+ });
112
+
113
+ /*
114
+ * The real catalog hook walks the full RouteMap through useTranslation; the
115
+ * host only needs SOME catalog, so a single-page one keeps the suite about
116
+ * the host's event wiring rather than the NavBar's contents.
117
+ */
118
+ jest.mock(
119
+ "../../../../App/FeatureSet/Dashboard/src/Utils/NavigationItems",
120
+ () => {
121
+ const useDashboardNavigationItemsStub: () => unknown = (): unknown => {
122
+ /*
123
+ * Route is loaded lazily for the same hoisting reason as the mock
124
+ * functions above; requireActual keeps it the real class.
125
+ */
126
+ const RouteClass: typeof import("../../../Types/API/Route").default = (
127
+ jest.requireActual("../../../Types/API/Route") as {
128
+ default: typeof import("../../../Types/API/Route").default;
129
+ }
130
+ ).default;
131
+ return {
132
+ navItems: [
133
+ {
134
+ id: "home-nav-bar-item",
135
+ title: "Home",
136
+ icon: "Home",
137
+ route: new RouteClass("/dashboard/abc123/home"),
138
+ },
139
+ ],
140
+ moreMenuItems: [],
141
+ rightElement: {
142
+ id: "user-profile-nav-bar-item",
143
+ title: "User Profile",
144
+ description: "Your account",
145
+ icon: "User",
146
+ route: new RouteClass("/dashboard/user-profile/picture"),
147
+ },
148
+ };
149
+ };
150
+
151
+ // The App source consumes the hook as the module's default export.
152
+ return {
153
+ __esModule: true,
154
+ default: useDashboardNavigationItemsStub,
155
+ useDashboardNavigationItems: useDashboardNavigationItemsStub,
156
+ };
157
+ },
158
+ );
159
+
160
+ import DashboardCommandPalette from "../../../../App/FeatureSet/Dashboard/src/Components/CommandPalette/DashboardCommandPalette";
161
+ import EventName from "../../../../App/FeatureSet/Dashboard/src/Utils/EventName";
162
+ import GlobalEvents from "../../../UI/Utils/GlobalEvents";
163
+
164
+ function palette(): HTMLElement | null {
165
+ return screen.queryByTestId("command-palette");
166
+ }
167
+
168
+ /*
169
+ * The chord is dispatched on document.body — where real key events land when
170
+ * no input is focused — and bubbles up to the host's document-level listener.
171
+ */
172
+ function pressChord(init: KeyboardEventInit): void {
173
+ fireEvent.keyDown(document.body, init);
174
+ }
175
+
176
+ beforeEach(() => {
177
+ /*
178
+ * The open panel schedules an enter-transition frame (rAF + fallback
179
+ * timer); fake timers keep those under act()'s control.
180
+ */
181
+ jest.useFakeTimers();
182
+ getCurrentProjectIdMock.mockReturnValue(null);
183
+ getAllPermissionsMock.mockReturnValue([]);
184
+ isMasterAdminMock.mockReturnValue(false);
185
+ getListMock.mockResolvedValue({ data: [], count: 0 } as never);
186
+ });
187
+
188
+ afterEach(() => {
189
+ cleanup();
190
+ jest.clearAllTimers();
191
+ jest.useRealTimers();
192
+ navigateMock.mockReset();
193
+ getListMock.mockReset();
194
+ getCurrentProjectIdMock.mockReset();
195
+ getAllPermissionsMock.mockReset();
196
+ isMasterAdminMock.mockReset();
197
+ });
198
+
199
+ describe("DashboardCommandPalette Cmd/Ctrl+K chord", () => {
200
+ test("Cmd+K on the document opens the palette", () => {
201
+ render(<DashboardCommandPalette />);
202
+ expect(palette()).toBeNull();
203
+
204
+ pressChord({ key: "k", metaKey: true });
205
+
206
+ expect(palette()).toBeInTheDocument();
207
+ });
208
+
209
+ test("the same chord closes an open palette", () => {
210
+ render(<DashboardCommandPalette />);
211
+
212
+ pressChord({ key: "k", metaKey: true });
213
+ expect(palette()).toBeInTheDocument();
214
+
215
+ pressChord({ key: "k", metaKey: true });
216
+ expect(palette()).toBeNull();
217
+ });
218
+
219
+ test("Ctrl+K works exactly like Cmd+K (Windows/Linux)", () => {
220
+ render(<DashboardCommandPalette />);
221
+
222
+ pressChord({ key: "k", ctrlKey: true });
223
+ expect(palette()).toBeInTheDocument();
224
+
225
+ pressChord({ key: "k", ctrlKey: true });
226
+ expect(palette()).toBeNull();
227
+ });
228
+
229
+ test("a chord another handler already claimed (defaultPrevented) is ignored", () => {
230
+ render(<DashboardCommandPalette />);
231
+
232
+ /*
233
+ * A capture-phase window listener models "some earlier handler took this
234
+ * chord": it runs before the host's document listener and claims the
235
+ * event, exactly the situation defaultPrevented is checked for.
236
+ */
237
+ const claimChord: (event: KeyboardEvent) => void = (
238
+ event: KeyboardEvent,
239
+ ): void => {
240
+ event.preventDefault();
241
+ };
242
+ window.addEventListener("keydown", claimChord, { capture: true });
243
+
244
+ try {
245
+ pressChord({ key: "k", metaKey: true });
246
+ expect(palette()).toBeNull();
247
+ } finally {
248
+ window.removeEventListener("keydown", claimChord, { capture: true });
249
+ }
250
+
251
+ // And with the claimer gone the same chord opens the palette again.
252
+ pressChord({ key: "k", metaKey: true });
253
+ expect(palette()).toBeInTheDocument();
254
+ });
255
+
256
+ test("extra modifiers on the chord do not open the palette", () => {
257
+ render(<DashboardCommandPalette />);
258
+
259
+ pressChord({ key: "k", metaKey: true, shiftKey: true });
260
+ pressChord({ key: "k", ctrlKey: true, altKey: true });
261
+ pressChord({ key: "k" });
262
+
263
+ expect(palette()).toBeNull();
264
+ });
265
+ });
266
+
267
+ describe("DashboardCommandPalette global toggle event", () => {
268
+ test("the COMMAND_PALETTE_TOGGLE event toggles the palette", () => {
269
+ render(<DashboardCommandPalette />);
270
+ expect(palette()).toBeNull();
271
+
272
+ act((): void => {
273
+ GlobalEvents.dispatchEvent(EventName.COMMAND_PALETTE_TOGGLE);
274
+ });
275
+ expect(palette()).toBeInTheDocument();
276
+
277
+ act((): void => {
278
+ GlobalEvents.dispatchEvent(EventName.COMMAND_PALETTE_TOGGLE);
279
+ });
280
+ expect(palette()).toBeNull();
281
+ });
282
+ });
283
+
284
+ describe("DashboardCommandPalette listener cleanup", () => {
285
+ test("unmounting removes every document keydown listener it added, same references", () => {
286
+ const addSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
287
+ document,
288
+ "addEventListener",
289
+ );
290
+ const removeSpy: ReturnType<typeof jest.spyOn> = jest.spyOn(
291
+ document,
292
+ "removeEventListener",
293
+ );
294
+
295
+ try {
296
+ const view: ReturnType<typeof render> = render(
297
+ <DashboardCommandPalette />,
298
+ );
299
+
300
+ const addedKeydownListeners: Array<unknown> = addSpy.mock.calls
301
+ .filter((call: Array<unknown>): boolean => {
302
+ return call[0] === "keydown";
303
+ })
304
+ .map((call: Array<unknown>): unknown => {
305
+ return call[1];
306
+ });
307
+
308
+ // The host claims the chord at the document level while mounted.
309
+ expect(addedKeydownListeners.length).toBeGreaterThanOrEqual(1);
310
+
311
+ view.unmount();
312
+
313
+ const removedKeydownListeners: Array<unknown> = removeSpy.mock.calls
314
+ .filter((call: Array<unknown>): boolean => {
315
+ return call[0] === "keydown";
316
+ })
317
+ .map((call: Array<unknown>): unknown => {
318
+ return call[1];
319
+ });
320
+
321
+ /*
322
+ * Every added listener must be removed with the SAME function
323
+ * reference — an inline re-created arrow in the cleanup would leave
324
+ * the original behind and stack a listener per mount.
325
+ */
326
+ for (const listener of addedKeydownListeners) {
327
+ expect(removedKeydownListeners).toContain(listener);
328
+ }
329
+
330
+ // And a chord after unmount reaches nothing.
331
+ pressChord({ key: "k", metaKey: true });
332
+ expect(palette()).toBeNull();
333
+ } finally {
334
+ addSpy.mockRestore();
335
+ removeSpy.mockRestore();
336
+ }
337
+ });
338
+ });
@@ -60,7 +60,7 @@ jest.mock("../../../UI/Utils/ModelAPI/ModelAPI", () => {
60
60
  * Record MarkdownViewer's props so safeMode remains an asserted part of the
61
61
  * contract even when the Common Jest config replaces its markdown renderer.
62
62
  */
63
- jest.mock("../../../UI/Components/Markdown.tsx/MarkdownViewer", () => {
63
+ jest.mock("../../../UI/Components/Markdown.tsx/LazyMarkdownViewer", () => {
64
64
  return {
65
65
  __esModule: true,
66
66
  default: (props: MarkdownViewerProps): React.ReactElement => {
@@ -0,0 +1,328 @@
1
+ import "@testing-library/jest-dom";
2
+ import { fireEvent, render, screen } from "@testing-library/react";
3
+ import React from "react";
4
+ import { describe, expect, test } from "@jest/globals";
5
+ import getJestMockFunction, { MockFunction } from "../../MockType";
6
+ import MonitorType, {
7
+ MonitorTypeCategory,
8
+ MonitorTypeHelper,
9
+ } from "../../../Types/Monitor/MonitorType";
10
+ import CardSelect, {
11
+ CardSelectOption,
12
+ CardSelectOptionGroup,
13
+ } from "../../../UI/Components/CardSelect/CardSelect";
14
+ import MonitorTypeUtil from "../../../../App/FeatureSet/Dashboard/src/Utils/MonitorType";
15
+
16
+ /*
17
+ * The real catalog, driven through the real picker. The unit tests either side
18
+ * of this one prove the search ranks correctly and the component renders
19
+ * correctly; what is pinned here is that the dashboard hands the component the
20
+ * data it needs to do either - the adapter drops keywords silently, and every
21
+ * search below still "works" while finding nothing.
22
+ */
23
+
24
+ const categorizedOptions: Array<CardSelectOptionGroup> =
25
+ MonitorTypeUtil.monitorTypesAsCategorizedCardSelectOptions();
26
+
27
+ type RenderPickerFunction = (value?: string) => MockFunction;
28
+
29
+ const renderPicker: RenderPickerFunction = (value?: string): MockFunction => {
30
+ const onChange: MockFunction = getJestMockFunction();
31
+
32
+ render(
33
+ <CardSelect
34
+ options={categorizedOptions}
35
+ value={value}
36
+ onChange={onChange}
37
+ searchable={true}
38
+ searchPlaceholder="Search monitor types - try ping, ssl, k8s, postgres"
39
+ collapsibleGroups={true}
40
+ />,
41
+ );
42
+
43
+ return onChange;
44
+ };
45
+
46
+ type SearchFunction = (value: string) => void;
47
+
48
+ const search: SearchFunction = (value: string): void => {
49
+ fireEvent.change(screen.getByTestId("card-select-search"), {
50
+ target: { value: value },
51
+ });
52
+ };
53
+
54
+ // Every type the catalog actually offers, in the order the picker lists them.
55
+ const catalogTypeValues: Array<string> = categorizedOptions.flatMap(
56
+ (group: CardSelectOptionGroup) => {
57
+ return group.options.map((option: CardSelectOption) => {
58
+ return option.value;
59
+ });
60
+ },
61
+ );
62
+
63
+ type ShownTypesFunction = () => Array<string>;
64
+
65
+ const shownTypes: ShownTypesFunction = (): Array<string> => {
66
+ return screen.queryAllByRole("radio").map((card: HTMLElement) => {
67
+ return (card.getAttribute("data-testid") || "").replace(
68
+ "card-select-option-",
69
+ "",
70
+ );
71
+ });
72
+ };
73
+
74
+ describe("Monitor type picker", () => {
75
+ describe("the options the dashboard builds", () => {
76
+ test("carries the keywords through from the monitor type catalog", () => {
77
+ for (const group of categorizedOptions) {
78
+ for (const option of group.options) {
79
+ expect({
80
+ monitorType: option.value,
81
+ hasKeywords: Boolean(option.keywords && option.keywords.length > 0),
82
+ }).toEqual({ monitorType: option.value, hasKeywords: true });
83
+ }
84
+ }
85
+ });
86
+
87
+ test("carries keywords through the flat option list too", () => {
88
+ const flat: Array<CardSelectOption> =
89
+ MonitorTypeUtil.monitorTypesAsCardSelectOptions();
90
+
91
+ for (const option of flat) {
92
+ expect(option.keywords).toBeDefined();
93
+ expect((option.keywords || []).length).toBeGreaterThan(0);
94
+ }
95
+ });
96
+
97
+ test("offers one group per category, in catalog order", () => {
98
+ const categories: Array<MonitorTypeCategory> =
99
+ MonitorTypeHelper.getMonitorTypeCategories();
100
+
101
+ expect(
102
+ categorizedOptions.map((group: CardSelectOptionGroup) => {
103
+ return group.label;
104
+ }),
105
+ ).toEqual(
106
+ categories.map((category: MonitorTypeCategory) => {
107
+ return category.label;
108
+ }),
109
+ );
110
+ });
111
+ });
112
+
113
+ describe("what a user sees on opening the form", () => {
114
+ test("the everyday types are on screen without scrolling past anything", () => {
115
+ renderPicker();
116
+
117
+ expect(screen.getByTestId("card-select-option-Website")).toBeVisible();
118
+ expect(screen.getByTestId("card-select-option-API")).toBeVisible();
119
+ expect(screen.getByTestId("card-select-option-Ping")).toBeVisible();
120
+ });
121
+
122
+ /*
123
+ * The whole point of the change. Every type used to render at once - nine
124
+ * headings and 29 cards, about six thousand pixels of them.
125
+ */
126
+ test("the long tail starts folded away behind its headings", () => {
127
+ renderPicker();
128
+
129
+ expect(
130
+ screen.queryByTestId("card-select-option-Kubernetes"),
131
+ ).not.toBeInTheDocument();
132
+ expect(
133
+ screen.queryByTestId("card-select-option-Ceph"),
134
+ ).not.toBeInTheDocument();
135
+ expect(
136
+ screen.queryByTestId("card-select-option-Traces"),
137
+ ).not.toBeInTheDocument();
138
+ });
139
+
140
+ test("shows far fewer cards than the catalog holds", () => {
141
+ renderPicker();
142
+
143
+ const total: number = categorizedOptions.reduce(
144
+ (count: number, group: CardSelectOptionGroup) => {
145
+ return count + group.options.length;
146
+ },
147
+ 0,
148
+ );
149
+
150
+ expect(shownTypes().length).toBeLessThan(total / 2);
151
+ });
152
+
153
+ test("every category is still reachable, with a count of what is inside", () => {
154
+ renderPicker();
155
+
156
+ for (const group of categorizedOptions) {
157
+ const header: HTMLElement = screen.getByTestId(
158
+ `card-select-group-${group.label}`,
159
+ );
160
+
161
+ expect(header).toBeVisible();
162
+ expect(header).toHaveTextContent(String(group.options.length));
163
+ }
164
+ });
165
+
166
+ test("says how many types there are to choose from", () => {
167
+ renderPicker();
168
+
169
+ expect(
170
+ screen.getByTestId("card-select-search-summary"),
171
+ ).toHaveTextContent("to choose from");
172
+ });
173
+ });
174
+
175
+ describe("finding a type by the words a user already knows", () => {
176
+ test.each([
177
+ ["k8s", MonitorType.Kubernetes],
178
+ ["postgres", MonitorType.SQLQuery],
179
+ ["heartbeat", MonitorType.IncomingRequest],
180
+ ["tls", MonitorType.SSLCertificate],
181
+ ["snmp", MonitorType.NetworkDevice],
182
+ ["icmp", MonitorType.Ping],
183
+ ["whois", MonitorType.Domain],
184
+ ["prometheus", MonitorType.Metrics],
185
+ ])("%s finds %s first", (query: string, expected: MonitorType) => {
186
+ renderPicker();
187
+
188
+ search(query);
189
+
190
+ expect(shownTypes()[0]).toBe(expected);
191
+ });
192
+
193
+ test("a search reaches types that are folded away", () => {
194
+ renderPicker();
195
+
196
+ expect(
197
+ screen.queryByTestId("card-select-option-Kubernetes"),
198
+ ).not.toBeInTheDocument();
199
+
200
+ search("k8s");
201
+
202
+ expect(screen.getByTestId("card-select-option-Kubernetes")).toBeVisible();
203
+ });
204
+
205
+ test("a search for a vendor finds the external status page monitor", () => {
206
+ renderPicker();
207
+
208
+ search("cloudflare");
209
+
210
+ expect(shownTypes()).toContain(MonitorType.ExternalStatusPage);
211
+ });
212
+
213
+ test("a category name gathers its types together", () => {
214
+ renderPicker();
215
+
216
+ search("telemetry");
217
+
218
+ const shown: Array<string> = shownTypes();
219
+
220
+ expect(shown).toContain(MonitorType.Logs);
221
+ expect(shown).toContain(MonitorType.Metrics);
222
+ expect(shown).toContain(MonitorType.Traces);
223
+ expect(shown).not.toContain(MonitorType.Website);
224
+ });
225
+
226
+ test("a word nothing uses says so instead of showing an empty grid", () => {
227
+ renderPicker();
228
+
229
+ search("mainframe");
230
+
231
+ expect(screen.getByTestId("card-select-no-results")).toBeVisible();
232
+ expect(shownTypes()).toEqual([]);
233
+ });
234
+
235
+ test("picking a type from the search results reports the monitor type", () => {
236
+ const onChange: MockFunction = renderPicker();
237
+
238
+ search("k8s");
239
+ fireEvent.click(screen.getByTestId("card-select-option-Kubernetes"));
240
+
241
+ expect(onChange).toHaveBeenCalledWith(MonitorType.Kubernetes);
242
+ });
243
+
244
+ /*
245
+ * The e2e suite reaches a folded-away type by typing its MonitorType value
246
+ * into this box and then clicking card-select-option-<value>
247
+ * (selectMonitorTypeCard in E2E/Tests/Dashboard/Helpers/Monitors.ts). That
248
+ * only holds while every type's own value is a search term that finds it,
249
+ * which a renamed title or a reworded description can quietly break — and
250
+ * the only thing that would notice is a full release e2e run.
251
+ */
252
+ test.each(catalogTypeValues)(
253
+ "typing %s finds the card the e2e suite goes on to click",
254
+ (value: string) => {
255
+ renderPicker();
256
+
257
+ search(value);
258
+
259
+ expect(screen.getByTestId(`card-select-option-${value}`)).toBeVisible();
260
+ },
261
+ );
262
+ });
263
+
264
+ describe("coming back to a form that already has a type", () => {
265
+ test("shows the selection rather than hiding it behind a closed heading", () => {
266
+ renderPicker(MonitorType.Ceph);
267
+
268
+ expect(screen.getByTestId("card-select-option-Ceph")).toBeVisible();
269
+ expect(screen.getByTestId("card-select-option-Ceph")).toHaveAttribute(
270
+ "aria-checked",
271
+ "true",
272
+ );
273
+ });
274
+
275
+ test("leaves the rest folded away", () => {
276
+ renderPicker(MonitorType.Ceph);
277
+
278
+ expect(
279
+ screen.queryByTestId("card-select-option-Traces"),
280
+ ).not.toBeInTheDocument();
281
+ });
282
+ });
283
+
284
+ describe("browsing without searching", () => {
285
+ test("opening a category shows every type in it", () => {
286
+ renderPicker();
287
+
288
+ fireEvent.click(screen.getByTestId("card-select-group-Telemetry"));
289
+
290
+ expect(screen.getByTestId("card-select-option-Logs")).toBeVisible();
291
+ expect(screen.getByTestId("card-select-option-Metrics")).toBeVisible();
292
+ expect(screen.getByTestId("card-select-option-Traces")).toBeVisible();
293
+ expect(screen.getByTestId("card-select-option-Exceptions")).toBeVisible();
294
+ });
295
+
296
+ test("a type can be picked by browsing, with no typing at all", () => {
297
+ const onChange: MockFunction = renderPicker();
298
+
299
+ fireEvent.click(screen.getByTestId("card-select-group-Infrastructure"));
300
+ fireEvent.click(screen.getByTestId("card-select-option-Kubernetes"));
301
+
302
+ expect(onChange).toHaveBeenCalledWith(MonitorType.Kubernetes);
303
+ });
304
+
305
+ test("every type in the catalog can be reached by opening its category", () => {
306
+ renderPicker();
307
+
308
+ // Only the closed ones - clicking an open heading would fold it away.
309
+ for (const group of categorizedOptions) {
310
+ const header: HTMLElement = screen.getByTestId(
311
+ `card-select-group-${group.label}`,
312
+ );
313
+
314
+ if (header.getAttribute("aria-expanded") === "false") {
315
+ fireEvent.click(header);
316
+ }
317
+ }
318
+
319
+ for (const group of categorizedOptions) {
320
+ for (const option of group.options) {
321
+ expect(
322
+ screen.getByTestId(`card-select-option-${option.value}`),
323
+ ).toBeVisible();
324
+ }
325
+ }
326
+ });
327
+ });
328
+ });