@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
@@ -16,6 +16,18 @@ export interface ComponentProps {
16
16
  links: Array<FooterLink>;
17
17
  style?: React.CSSProperties | undefined;
18
18
  className?: string | undefined;
19
+ /*
20
+ * Classes for the inner row. The default adds its own horizontal padding,
21
+ * which double-indents the footer inside a layout that is already padded —
22
+ * the status page, for one. Override it to align the footer with the content
23
+ * above it.
24
+ */
25
+ innerClassName?: string | undefined;
26
+ /*
27
+ * Classes for the copyright block. The default hides it between md and lg,
28
+ * which is not something every layout wants.
29
+ */
30
+ copyrightClassName?: string | undefined;
19
31
  }
20
32
 
21
33
  const Footer: FunctionComponent<ComponentProps> = (
@@ -29,7 +41,12 @@ const Footer: FunctionComponent<ComponentProps> = (
29
41
  }
30
42
  style={props.style}
31
43
  >
32
- <div className="mx-auto w-full py-6 px-6 md:flex md:items-center md:justify-between lg:px-8">
44
+ <div
45
+ className={
46
+ props.innerClassName ||
47
+ "mx-auto w-full py-6 px-6 md:flex md:items-center md:justify-between lg:px-8"
48
+ }
49
+ >
33
50
  {/* Mobile: Stack links vertically, Desktop: Horizontal layout */}
34
51
  <div className="flex flex-col space-y-3 md:flex-row md:justify-center md:items-center md:space-y-0 md:space-x-8 md:order-2">
35
52
  {props.links &&
@@ -63,14 +80,23 @@ const Footer: FunctionComponent<ComponentProps> = (
63
80
  );
64
81
  })}
65
82
  </div>
66
- {/* Copyright: Show on mobile, hide on larger screens unless specified */}
67
- <div className="mt-5 md:order-1 md:mt-0 block md:hidden lg:block">
68
- {props.copyright && (
83
+ {/*
84
+ * Guard the wrapper, not just the <p>: with no copyright configured
85
+ * the empty div still contributed its mt-5, leaving a dead gap under
86
+ * the links.
87
+ */}
88
+ {props.copyright && (
89
+ <div
90
+ className={
91
+ props.copyrightClassName ||
92
+ "mt-5 md:order-1 md:mt-0 block md:hidden lg:block"
93
+ }
94
+ >
69
95
  <p className="text-center text-sm text-gray-500">
70
96
  &copy; {props.copyright}
71
97
  </p>
72
- )}
73
- </div>
98
+ </div>
99
+ )}
74
100
  </div>
75
101
  </footer>
76
102
  </React.Fragment>
@@ -521,6 +521,9 @@ const FormField: <T extends GenericObject>(
521
521
  tabIndex={0}
522
522
  dataTestId={props.field.dataTestId}
523
523
  singleColumn={props.field.cardSelectSingleColumn}
524
+ searchable={props.field.cardSelectSearchable}
525
+ searchPlaceholder={props.field.cardSelectSearchPlaceholder}
526
+ collapsibleGroups={props.field.cardSelectCollapsibleGroups}
524
527
  onChange={(value: string) => {
525
528
  onChange(value);
526
529
  props.setFieldValue(props.fieldName, value);
@@ -58,6 +58,14 @@ export default interface Field<TEntity> {
58
58
  | Array<CardSelectOption | CardSelectOptionGroup>
59
59
  | undefined;
60
60
  cardSelectSingleColumn?: boolean | undefined;
61
+ /*
62
+ * Give the card picker a search box and collapse its groups behind their
63
+ * headers. Both are opt in: a picker with a handful of cards reads fine as
64
+ * a plain grid, and turning them on there would only add chrome.
65
+ */
66
+ cardSelectSearchable?: boolean | undefined;
67
+ cardSelectSearchPlaceholder?: string | undefined;
68
+ cardSelectCollapsibleGroups?: boolean | undefined;
61
69
  fetchDropdownOptions?:
62
70
  | ((
63
71
  item: FormValues<TEntity>,
@@ -1,6 +1,5 @@
1
1
  import { GetReactElementFunction } from "../../Types/FunctionTypes";
2
2
  import ActionButtonSchema from "../ActionButton/ActionButtonSchema";
3
- import ComponentLoader from "../ComponentLoader/ComponentLoader";
4
3
  import Field from "../Detail/Field";
5
4
  import ErrorMessage from "../ErrorMessage/ErrorMessage";
6
5
  import FilterViewer from "../Filters/FilterViewer";
@@ -8,6 +7,7 @@ import FilterType from "../Filters/Types/Filter";
8
7
  import FilterData from "../Filters/Types/FilterData";
9
8
  import Pagination from "../Pagination/Pagination";
10
9
  import ListBody from "./ListBody";
10
+ import ListSkeleton from "./ListSkeleton";
11
11
  import { ListDetailProps } from "./ListRow";
12
12
  import GenericObject from "../../../Types/GenericObject";
13
13
  import React, { ReactElement } from "react";
@@ -67,12 +67,30 @@ type ListFunction = <T extends GenericObject>(
67
67
  const List: ListFunction = <T extends GenericObject>(
68
68
  props: ComponentProps<T>,
69
69
  ): ReactElement => {
70
+ /*
71
+ * A refetch with cards already on screen (pagination, sort, refresh - the
72
+ * parent never clears `data` while fetching) keeps those cards visible and
73
+ * dims them; skeletons are only for a load with nothing to show yet.
74
+ */
75
+ const isRefetchingWithData: boolean =
76
+ props.isLoading && props.data.length > 0;
77
+
70
78
  const getListbody: GetReactElementFunction = (): ReactElement => {
71
- if (props.isLoading) {
72
- return <ComponentLoader />;
79
+ if (props.isLoading && props.data.length === 0) {
80
+ return (
81
+ <ListSkeleton
82
+ fieldsCount={props.fields.length}
83
+ itemsOnPage={props.itemsOnPage}
84
+ />
85
+ );
73
86
  }
74
87
 
75
- if (props.error) {
88
+ /*
89
+ * Loading still wins over error and empty (same priority as before the
90
+ * skeletons): while a refetch is in flight the stale cards render, never
91
+ * a stale error or a premature "no items".
92
+ */
93
+ if (!props.isLoading && props.error) {
76
94
  return (
77
95
  <div className="p-6">
78
96
  <ErrorMessage
@@ -145,7 +163,21 @@ const List: ListFunction = <T extends GenericObject>(
145
163
  }
146
164
  }}
147
165
  >
148
- {getListbody()}
166
+ {/*
167
+ * Dims the stale cards while a refetch is in flight and blocks
168
+ * clicks on them - actions against data about to be replaced
169
+ * are a race.
170
+ */}
171
+ <div
172
+ data-testid="list-content"
173
+ className={
174
+ isRefetchingWithData
175
+ ? "opacity-60 pointer-events-none transition-opacity duration-150"
176
+ : "transition-opacity duration-150"
177
+ }
178
+ >
179
+ {getListbody()}
180
+ </div>
149
181
  </DragDropContext>
150
182
  {!props.disablePagination && (
151
183
  <div className="mt-5 -mb-6">
@@ -0,0 +1,54 @@
1
+ import Skeleton from "../Skeleton/Skeleton";
2
+ import React, { FunctionComponent, ReactElement } from "react";
3
+
4
+ export interface ComponentProps {
5
+ /*
6
+ * One placeholder line per field the real ListRow will render, so the
7
+ * cards are the right height before the data arrives.
8
+ */
9
+ fieldsCount: number;
10
+ itemsOnPage: number;
11
+ }
12
+
13
+ /*
14
+ * Card-shaped placeholders for the list's first load, matching ListBody's
15
+ * wrapper (space-y-6 p-6 border-t) so nothing shifts when real rows land.
16
+ */
17
+ const ListSkeleton: FunctionComponent<ComponentProps> = (
18
+ props: ComponentProps,
19
+ ): ReactElement => {
20
+ // Enough cards to look like a page without painting offscreen ones.
21
+ const cardCount: number = Math.max(1, Math.min(props.itemsOnPage || 0, 6));
22
+ const cardIndexes: Array<number> = Array.from(Array(cardCount).keys());
23
+ const lineIndexes: Array<number> = Array.from(
24
+ Array(Math.max(1, props.fieldsCount)).keys(),
25
+ );
26
+
27
+ return (
28
+ <div
29
+ data-testid="list-skeleton-loader"
30
+ role="status"
31
+ aria-live="polite"
32
+ className="space-y-6 p-6 border-t border-gray-200"
33
+ >
34
+ <span className="sr-only">Loading...</span>
35
+ {cardIndexes.map((cardIndex: number) => {
36
+ return (
37
+ <div key={cardIndex} className="space-y-3">
38
+ {lineIndexes.map((lineIndex: number) => {
39
+ return (
40
+ <Skeleton
41
+ key={lineIndex}
42
+ className="h-4"
43
+ widthVariantIndex={cardIndex + lineIndex}
44
+ />
45
+ );
46
+ })}
47
+ </div>
48
+ );
49
+ })}
50
+ </div>
51
+ );
52
+ };
53
+
54
+ export default ListSkeleton;
@@ -1,22 +1,43 @@
1
1
  import Loader, { LoaderType } from "./Loader";
2
- import { VeryLightGray } from "../../../Types/BrandColors";
2
+ import { Gray500 } from "../../../Types/BrandColors";
3
3
  import React, { FunctionComponent, ReactElement } from "react";
4
4
 
5
5
  export interface ComponentProps {
6
6
  isVisible: boolean;
7
+ /*
8
+ * Lets a full-page caller reserve height (e.g. "min-h-[60vh]") without
9
+ * changing the footprint of the many inline, in-card call sites that rely on
10
+ * the default spacing.
11
+ */
12
+ className?: string | undefined;
7
13
  }
8
14
 
9
15
  const PageLoader: FunctionComponent<ComponentProps> = (
10
16
  props: ComponentProps,
11
17
  ): ReactElement => {
12
- if (props.isVisible) {
13
- return (
14
- <div className="m-auto w-full text-center w-max mt-52 align-middle flex items-center">
15
- <Loader loaderType={LoaderType.Bar} color={VeryLightGray} size={200} />
16
- </div>
17
- );
18
+ if (!props.isVisible) {
19
+ return <></>;
18
20
  }
19
- return <></>;
21
+
22
+ /*
23
+ * The bar used to be VeryLightGray (#c2c2c2) on white — about 1.7:1, which
24
+ * reads as a blank page rather than a loading one. Gray500 is visible without
25
+ * being loud.
26
+ *
27
+ * "w-full" and "w-max" were both set here, so which one applied came down to
28
+ * the order Tailwind happened to emit them in. The loader is centred by the
29
+ * flex row inside <Loader>, so full width is the one that was wanted.
30
+ */
31
+ return (
32
+ <div
33
+ className={
34
+ props.className ||
35
+ "m-auto mt-52 flex w-full items-center justify-center"
36
+ }
37
+ >
38
+ <Loader loaderType={LoaderType.Bar} color={Gray500} size={200} />
39
+ </div>
40
+ );
20
41
  };
21
42
 
22
43
  export default PageLoader;
@@ -26,6 +26,11 @@ import URL from "../../../../Types/API/URL";
26
26
  import HTTPResponse from "../../../../Types/API/HTTPResponse";
27
27
  import HTTPErrorResponse from "../../../../Types/API/HTTPErrorResponse";
28
28
  import { JSONObject } from "../../../../Types/JSON";
29
+ import {
30
+ ResourceEntityFacetSelections,
31
+ collectResourceEntityFacetSelections,
32
+ collectServiceFacetSelections,
33
+ } from "../../../../Types/Telemetry/ResourceEntityFacet";
29
34
  import { APP_API_URL } from "../../../Config";
30
35
  import ModelAPI from "../../../Utils/ModelAPI/ModelAPI";
31
36
  import ComponentLoader from "../../ComponentLoader/ComponentLoader";
@@ -381,12 +386,29 @@ const LogsAnalyticsView: FunctionComponent<LogsAnalyticsViewProps> = (
381
386
  Array.from(severityValues);
382
387
  }
383
388
 
384
- const serviceFilterValues: Set<string> | undefined =
385
- props.appliedFacetFilters.get("primaryEntityId");
389
+ const serviceFilterValues: Array<string> =
390
+ collectServiceFacetSelections(props.appliedFacetFilters.entries());
386
391
 
387
- if (serviceFilterValues && serviceFilterValues.size > 0) {
392
+ if (serviceFilterValues.length > 0) {
388
393
  (requestData as Record<string, unknown>)["serviceIds"] =
389
- Array.from(serviceFilterValues);
394
+ serviceFilterValues;
395
+ }
396
+
397
+ /*
398
+ * Host / docker / podman / Kubernetes chips ride their own field —
399
+ * their ids are not `primaryEntityId` values for telemetry that
400
+ * carries a service.name, so the server resolves them to the
401
+ * resource's entity key. Without this the analytics tab silently
402
+ * ignored a cluster the sidebar was filtering by.
403
+ */
404
+ const resourceFilters: ResourceEntityFacetSelections =
405
+ collectResourceEntityFacetSelections(
406
+ props.appliedFacetFilters.entries(),
407
+ );
408
+
409
+ if (Object.keys(resourceFilters).length > 0) {
410
+ (requestData as Record<string, unknown>)["resourceFilters"] =
411
+ resourceFilters;
390
412
  }
391
413
 
392
414
  const traceFilterValues: Set<string> | undefined =
@@ -1,4 +1,9 @@
1
- import { ComponentProps } from "./MarkdownViewer";
1
+ /*
2
+ * Type-only on purpose: the sole static edge to MarkdownViewer must be
3
+ * erasable, so the viewer (and the mermaid chunk it lazily pulls) stays out
4
+ * of every eager bundle that imports this wrapper.
5
+ */
6
+ import type { ComponentProps } from "./MarkdownViewer";
2
7
  import React, {
3
8
  FunctionComponent,
4
9
  LazyExoticComponent,
@@ -15,7 +20,23 @@ const LazyMarkdownViewer: FunctionComponent<ComponentProps> = (
15
20
  props: ComponentProps,
16
21
  ): JSX.Element => {
17
22
  return (
18
- <Suspense fallback={<div>Loading...</div>}>
23
+ <Suspense
24
+ fallback={
25
+ /*
26
+ * A bare "Loading..." string here painted raw English text in the
27
+ * middle of the page, then swapped it for content of a different
28
+ * height. Reserve roughly the space two lines of prose take instead.
29
+ *
30
+ * Spans rather than divs: callers such as EventItem render this inside
31
+ * a <p>, where block elements are invalid nesting.
32
+ */
33
+ <span role="status" aria-live="polite" className="block space-y-2">
34
+ <span className="block h-4 w-3/4 animate-pulse rounded bg-gray-100" />
35
+ <span className="block h-4 w-1/2 animate-pulse rounded bg-gray-100" />
36
+ <span className="sr-only">Loading content</span>
37
+ </span>
38
+ }
39
+ >
19
40
  <MarkdownViewer {...props} />
20
41
  </Suspense>
21
42
  );
@@ -76,7 +76,6 @@ SyntaxHighlighter.registerLanguage("ruby", ruby);
76
76
  SyntaxHighlighter.registerLanguage("php", php);
77
77
  SyntaxHighlighter.registerLanguage("graphql", graphql);
78
78
  SyntaxHighlighter.registerLanguage("http", http);
79
- import mermaid from "mermaid";
80
79
  import DOMPurify from "dompurify";
81
80
  import OneUptimeDate from "../../../Types/Date";
82
81
  import { Theme, useTheme } from "../../Utils/Theme";
@@ -90,7 +89,48 @@ import { Theme, useTheme } from "../../Utils/Theme";
90
89
  const ISO_8601_REGEX: RegExp =
91
90
  /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?Z$/;
92
91
 
93
- const initializeMermaid: (theme: Theme) => void = (theme: Theme): void => {
92
+ /*
93
+ * mermaid's pre-bundled build is ~4.5MB — by far the heaviest dependency of
94
+ * this component — so it is loaded on demand the first time a mermaid fence
95
+ * actually renders. Plain markdown (the overwhelmingly common case) never
96
+ * pays for it: there is no static import and no module-scope initialization.
97
+ * The promise is cached module-wide so multiple diagrams share one load, and
98
+ * theme setup runs only after the load resolves.
99
+ */
100
+ type MermaidApi = typeof import("mermaid").default;
101
+
102
+ let mermaidLoadPromise: Promise<MermaidApi> | null = null;
103
+
104
+ const loadMermaid: () => Promise<MermaidApi> = (): Promise<MermaidApi> => {
105
+ if (!mermaidLoadPromise) {
106
+ const loadPromise: Promise<MermaidApi> = import("mermaid").then(
107
+ (mermaidModule: { default: MermaidApi }): MermaidApi => {
108
+ return mermaidModule.default;
109
+ },
110
+ );
111
+
112
+ mermaidLoadPromise = loadPromise;
113
+
114
+ /*
115
+ * A failed chunk load (flaky network, deploy rotating hashed chunk
116
+ * names) must not be cached forever — clear the slot so the next
117
+ * diagram retries the import. The reset rides a side branch of the
118
+ * promise: the original is still returned below, so the caller that
119
+ * triggered this load sees the rejection through its own error path.
120
+ */
121
+ loadPromise.catch((): void => {
122
+ if (mermaidLoadPromise === loadPromise) {
123
+ mermaidLoadPromise = null;
124
+ }
125
+ });
126
+ }
127
+ return mermaidLoadPromise;
128
+ };
129
+
130
+ const initializeMermaid: (mermaid: MermaidApi, theme: Theme) => void = (
131
+ mermaid: MermaidApi,
132
+ theme: Theme,
133
+ ): void => {
94
134
  const isDark: boolean = theme === Theme.Dark;
95
135
 
96
136
  mermaid.initialize({
@@ -120,10 +160,8 @@ const initializeMermaid: (theme: Theme) => void = (theme: Theme): void => {
120
160
  });
121
161
  };
122
162
 
123
- initializeMermaid(Theme.Light);
124
-
125
- // Mermaid diagram component
126
- const MermaidDiagram: FunctionComponent<{ chart: string }> = ({
163
+ // Mermaid diagram component (exported so tests can exercise the lazy load directly)
164
+ export const MermaidDiagram: FunctionComponent<{ chart: string }> = ({
127
165
  chart,
128
166
  }: {
129
167
  chart: string;
@@ -136,27 +174,34 @@ const MermaidDiagram: FunctionComponent<{ chart: string }> = ({
136
174
  let isCancelled: boolean = false;
137
175
 
138
176
  const renderDiagram: () => Promise<void> = async (): Promise<void> => {
139
- if (containerRef.current) {
177
+ try {
178
+ /*
179
+ * Dynamic load first; a failed chunk load surfaces through the same
180
+ * error path as a failed render. Theme setup MUST follow the load —
181
+ * there is deliberately no module-scope initialization any more.
182
+ */
183
+ const mermaid: MermaidApi = await loadMermaid();
184
+ if (!containerRef.current || isCancelled) {
185
+ return;
186
+ }
140
187
  containerRef.current.innerHTML = "";
141
- try {
142
- initializeMermaid(theme);
143
- const id: string = `mermaid-${Math.random().toString(36).substr(2, 9)}`;
144
- const { svg } = await mermaid.render(id, chart);
145
- if (containerRef.current && !isCancelled) {
146
- containerRef.current.innerHTML = DOMPurify.sanitize(svg, {
147
- USE_PROFILES: { svg: true, svgFilters: true },
148
- ADD_TAGS: ["foreignObject"],
149
- });
150
- }
151
- } catch (error) {
152
- if (containerRef.current && !isCancelled) {
153
- const errorMessage: string = String(error);
154
- const errorEl: HTMLPreElement = document.createElement("pre");
155
- errorEl.className = "text-red-500";
156
- errorEl.textContent = `Error rendering diagram: ${errorMessage}`;
157
- containerRef.current.innerHTML = "";
158
- containerRef.current.appendChild(errorEl);
159
- }
188
+ initializeMermaid(mermaid, theme);
189
+ const id: string = `mermaid-${Math.random().toString(36).substr(2, 9)}`;
190
+ const { svg } = await mermaid.render(id, chart);
191
+ if (containerRef.current && !isCancelled) {
192
+ containerRef.current.innerHTML = DOMPurify.sanitize(svg, {
193
+ USE_PROFILES: { svg: true, svgFilters: true },
194
+ ADD_TAGS: ["foreignObject"],
195
+ });
196
+ }
197
+ } catch (error) {
198
+ if (containerRef.current && !isCancelled) {
199
+ const errorMessage: string = String(error);
200
+ const errorEl: HTMLPreElement = document.createElement("pre");
201
+ errorEl.className = "text-red-500";
202
+ errorEl.textContent = `Error rendering diagram: ${errorMessage}`;
203
+ containerRef.current.innerHTML = "";
204
+ containerRef.current.appendChild(errorEl);
160
205
  }
161
206
  }
162
207
  };
@@ -30,6 +30,16 @@ const MasterPage: FunctionComponent<ComponentProps> = (
30
30
  const topSectionRef: React.RefObject<HTMLDivElement> =
31
31
  React.useRef<HTMLDivElement>(null);
32
32
 
33
+ /*
34
+ * The status page supplies neither header nor navbar — it renders its own
35
+ * inside children. Rendering TopSection anyway left an empty white bar with a
36
+ * drop shadow above the content, so only render it when it has something in
37
+ * it.
38
+ */
39
+ const hasTopSection: boolean = Boolean(
40
+ (!props.hideHeader && props.header) || props.navBar,
41
+ );
42
+
33
43
  /*
34
44
  * Publish the sticky top section's height as --app-header-height so anything
35
45
  * that sticks underneath it (the side menu, for example) can offset itself by
@@ -89,6 +99,7 @@ const MasterPage: FunctionComponent<ComponentProps> = (
89
99
  props.isLoading,
90
100
  props.error,
91
101
  props.disableMainContentWrapper,
102
+ hasTopSection,
92
103
  isOnline,
93
104
  ]);
94
105
 
@@ -125,17 +136,19 @@ const MasterPage: FunctionComponent<ComponentProps> = (
125
136
  Skip to main content
126
137
  </a>
127
138
  )}
128
- <div
129
- ref={topSectionRef}
130
- className={props.makeTopSectionUnstick ? "" : "sticky top-0 z-10"}
131
- >
132
- <TopSection
133
- hideHeader={props.hideHeader}
134
- className={props.topSectionClassName}
135
- header={props.header}
136
- navbar={props.navBar}
137
- />
138
- </div>
139
+ {hasTopSection && (
140
+ <div
141
+ ref={topSectionRef}
142
+ className={props.makeTopSectionUnstick ? "" : "sticky top-0 z-10"}
143
+ >
144
+ <TopSection
145
+ hideHeader={props.hideHeader}
146
+ className={props.topSectionClassName}
147
+ header={props.header}
148
+ navbar={props.navBar}
149
+ />
150
+ </div>
151
+ )}
139
152
 
140
153
  {props.disableMainContentWrapper ? (
141
154
  props.children
@@ -413,7 +413,7 @@ const Modal: FunctionComponent<ComponentProps> = (
413
413
  return (
414
414
  <div className="relative z-50">
415
415
  <div
416
- className={`fixed inset-0 bg-gray-950/45 backdrop-blur-[2px] transition-opacity duration-200 ease-out motion-reduce:transition-none ${
416
+ className={`fixed inset-0 bg-gray-950/45 backdrop-blur-[2px] transition-opacity duration-150 ease-out motion-reduce:transition-none ${
417
417
  hasEntered ? "opacity-100" : "opacity-0"
418
418
  }`}
419
419
  data-testid="modal-backdrop"
@@ -429,7 +429,7 @@ const Modal: FunctionComponent<ComponentProps> = (
429
429
  <div className="flex min-h-full items-end justify-center p-0 text-center sm:items-center sm:p-6">
430
430
  <div
431
431
  ref={modalRef}
432
- className={`relative flex max-h-[calc(100dvh-1rem)] w-full flex-col rounded-t-2xl border border-gray-200/80 bg-white text-left shadow-2xl ring-1 ring-black/5 transition duration-200 ease-out focus:outline-none motion-reduce:transition-none sm:my-8 sm:max-h-[calc(100dvh-4rem)] sm:rounded-xl ${modalWidthClassName} ${panelTransitionClassName}`}
432
+ className={`relative flex max-h-[calc(100dvh-1rem)] w-full flex-col rounded-t-2xl border border-gray-200/80 bg-white text-left shadow-2xl ring-1 ring-black/5 transition duration-150 ease-out focus:outline-none motion-reduce:transition-none sm:my-8 sm:max-h-[calc(100dvh-4rem)] sm:rounded-xl ${modalWidthClassName} ${panelTransitionClassName}`}
433
433
  data-testid="modal"
434
434
  aria-labelledby={titleId}
435
435
  aria-describedby={translatedDescription ? descriptionId : undefined}
@@ -47,7 +47,7 @@ import List from "../List/List";
47
47
  import { ListDetailProps } from "../List/ListRow";
48
48
  import ConfirmModal from "../Modal/ConfirmModal";
49
49
  import Modal, { ModalWidth } from "../Modal/Modal";
50
- import MarkdownViewer from "../Markdown.tsx/MarkdownViewer";
50
+ import MarkdownViewer from "../Markdown.tsx/LazyMarkdownViewer";
51
51
  import Icon from "../Icon/Icon";
52
52
  import Filter from "../ModelFilter/Filter";
53
53
  import { DropdownOption, DropdownOptionLabel } from "../Dropdown/Dropdown";
@@ -4,7 +4,7 @@ import {
4
4
  getCustomFieldColumns,
5
5
  getCustomFieldDefinitions,
6
6
  } from "./CustomFieldColumns";
7
- import ModelAPI from "../../Utils/ModelAPI/ModelAPI";
7
+ import ModelListCache from "../../Utils/ModelListCache";
8
8
  import ProjectUtil from "../../Utils/Project";
9
9
  import { Logger } from "../../Utils/Logger";
10
10
  import AnalyticsBaseModel from "../../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
@@ -96,8 +96,14 @@ const useCustomFieldColumns: UseCustomFieldColumnsFunction = <
96
96
  setError("");
97
97
 
98
98
  try {
99
- const result: ListResult<BaseModel> = await ModelAPI.getList<BaseModel>(
100
- {
99
+ /*
100
+ * Through ModelListCache rather than ModelAPI: a table mounts two
101
+ * instances of this hook (the facet bar and the column set), and both
102
+ * want the same definition list - the cache turns that into one
103
+ * request, shared for the next minute.
104
+ */
105
+ const result: ListResult<BaseModel> =
106
+ await ModelListCache.getList<BaseModel>({
101
107
  modelType: customFieldsModelType,
102
108
  query: {
103
109
  projectId: projectId,
@@ -113,8 +119,8 @@ const useCustomFieldColumns: UseCustomFieldColumnsFunction = <
113
119
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
114
120
  } as any,
115
121
  sort: {},
116
- },
117
- );
122
+ projectId: projectId,
123
+ });
118
124
 
119
125
  if (isCancelled) {
120
126
  return;
@@ -114,6 +114,13 @@ const MoreMenu: React.ForwardRefExoticComponent<
114
114
 
115
115
  const [isDropdownVisible, setDropdownVisible] = useState<boolean>(false);
116
116
 
117
+ /*
118
+ * The menu is mounted in its closed state (faded, slightly shrunk towards
119
+ * origin-top-right) and flipped open one frame later so the browser has
120
+ * something to transition from — the same pattern Modal uses.
121
+ */
122
+ const [hasMenuEntered, setHasMenuEntered] = useState<boolean>(false);
123
+
117
124
  useEffect(() => {
118
125
  setDropdownVisible(isComponentVisible);
119
126
  if (isComponentVisible) {
@@ -123,6 +130,30 @@ const MoreMenu: React.ForwardRefExoticComponent<
123
130
  }
124
131
  }, [isComponentVisible]);
125
132
 
133
+ useEffect(() => {
134
+ if (!isComponentVisible) {
135
+ setHasMenuEntered(false);
136
+ return undefined;
137
+ }
138
+
139
+ const open: () => void = (): void => {
140
+ setHasMenuEntered(true);
141
+ };
142
+
143
+ const frame: number = requestAnimationFrame(open);
144
+
145
+ /*
146
+ * A hidden or throttled tab never runs an animation frame; the timer
147
+ * skips the transition rather than leaving the menu at zero opacity.
148
+ */
149
+ const fallbackTimer: ReturnType<typeof setTimeout> = setTimeout(open, 80);
150
+
151
+ return () => {
152
+ cancelAnimationFrame(frame);
153
+ clearTimeout(fallbackTimer);
154
+ };
155
+ }, [isComponentVisible]);
156
+
126
157
  useEffect(() => {
127
158
  if (props.isDisabled && isComponentVisible) {
128
159
  setIsComponentVisible(false);
@@ -427,7 +458,14 @@ const MoreMenu: React.ForwardRefExoticComponent<
427
458
  <div
428
459
  ref={ref}
429
460
  id={menuId}
430
- className="absolute right-0 z-50 mt-2 w-56 origin-top-right rounded-lg bg-white shadow-xl ring-1 ring-gray-200 focus:outline-none py-1"
461
+ /*
462
+ * Once settled the menu carries no transform class at all: a
463
+ * lingering scale would make it the containing block for any
464
+ * position:fixed descendant (the Modal invariant).
465
+ */
466
+ className={`absolute right-0 z-50 mt-2 w-56 origin-top-right rounded-lg bg-white shadow-xl ring-1 ring-gray-200 focus:outline-none py-1 transition duration-150 ease-out motion-reduce:transition-none ${
467
+ hasMenuEntered ? "opacity-100" : "opacity-0 scale-95"
468
+ }`}
431
469
  role="menu"
432
470
  aria-orientation="vertical"
433
471
  aria-labelledby={buttonId}