@oneuptime/common 12.0.33 → 12.0.34

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 (652) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +117 -1
  2. package/Models/AnalyticsModels/RumSessionChunk.ts +13 -0
  3. package/Models/DatabaseModels/AlertCustomField.ts +77 -3
  4. package/Models/DatabaseModels/ApiKeyPermission.ts +3 -27
  5. package/Models/DatabaseModels/IncidentCustomField.ts +77 -3
  6. package/Models/DatabaseModels/InventoryItemCustomField.ts +77 -3
  7. package/Models/DatabaseModels/MonitorCustomField.ts +77 -3
  8. package/Models/DatabaseModels/OnCallDutyPolicyCustomField.ts +77 -3
  9. package/Models/DatabaseModels/RumApplication.ts +6 -6
  10. package/Models/DatabaseModels/ScheduledMaintenanceCustomField.ts +77 -3
  11. package/Models/DatabaseModels/StatusPageCustomField.ts +77 -3
  12. package/Models/DatabaseModels/TeamCustomField.ts +77 -3
  13. package/Models/DatabaseModels/TeamMember.ts +0 -9
  14. package/Models/DatabaseModels/TeamMemberCustomField.ts +77 -3
  15. package/Models/DatabaseModels/TeamPermission.ts +3 -24
  16. package/Models/DatabaseModels/TelemetryIngestionKey.ts +260 -0
  17. package/Models/DatabaseModels/UserTelegram.ts +0 -4
  18. package/Scripts/benchmark-fanin-capacity.js +181 -0
  19. package/Server/API/TelemetryAPI.ts +1284 -164
  20. package/Server/API/UserNotificationSettingAPI.ts +55 -0
  21. package/Server/API/UserTelegramAPI.ts +48 -4
  22. package/Server/EnvironmentConfig.ts +35 -2
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.ts +91 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.ts +67 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.ts +139 -0
  26. package/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.ts +121 -0
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
  28. package/Server/Infrastructure/QueueWorker.ts +20 -14
  29. package/Server/Infrastructure/Semaphore.ts +2 -0
  30. package/Server/Middleware/TelemetryIngest.ts +453 -7
  31. package/Server/Services/AccessTokenService.ts +1 -0
  32. package/Server/Services/AlertCustomFieldService.ts +98 -0
  33. package/Server/Services/AlertService.ts +37 -0
  34. package/Server/Services/ApiKeyPermissionService.ts +461 -29
  35. package/Server/Services/CustomFieldMappingService.ts +879 -0
  36. package/Server/Services/GlobalConfigService.ts +194 -0
  37. package/Server/Services/IncidentCustomFieldService.ts +98 -0
  38. package/Server/Services/IncidentService.ts +35 -0
  39. package/Server/Services/MetricService.ts +194 -0
  40. package/Server/Services/MonitorService.ts +32 -0
  41. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +78 -25
  42. package/Server/Services/ProjectService.ts +22 -0
  43. package/Server/Services/RoutineEmailSettingsService.ts +73 -0
  44. package/Server/Services/RumSessionReplayViewService.ts +104 -24
  45. package/Server/Services/ScheduledMaintenanceCustomFieldService.ts +98 -0
  46. package/Server/Services/ScheduledMaintenanceService.ts +32 -0
  47. package/Server/Services/TeamMemberService.ts +78 -0
  48. package/Server/Services/TeamPermissionService.ts +235 -3
  49. package/Server/Services/TelemetryIngestionKeyService.ts +722 -19
  50. package/Server/Services/UserNotificationSettingService.ts +34 -6
  51. package/Server/Services/UserTelegramService.ts +326 -5
  52. package/Server/Types/Database/QueryHelper.ts +2 -0
  53. package/Server/Utils/APIKey/AccessPermission.ts +5 -2
  54. package/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.ts +54 -0
  55. package/Server/Utils/CustomField/CustomFieldMappingRegistry.ts +415 -0
  56. package/Server/Utils/CustomField/CustomFieldMappingValidator.ts +335 -0
  57. package/Server/Utils/DataSource/EgressGuard.ts +177 -8
  58. package/Server/Utils/EmailRollup/EmailRollupConstants.ts +38 -5
  59. package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +57 -4
  60. package/Server/Utils/FrontendEnvironment.ts +40 -0
  61. package/Server/Utils/LogRedaction.ts +20 -0
  62. package/Server/Utils/Logger.ts +11 -0
  63. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +338 -77
  64. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +30 -4
  65. package/Server/Utils/Monitor/MonitorAlert.ts +29 -6
  66. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +110 -15
  67. package/Server/Utils/Monitor/MonitorIncident.ts +22 -6
  68. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +29 -0
  69. package/Server/Utils/Monitor/SeriesContextEnricher.ts +304 -0
  70. package/Server/Utils/SSRFProtection.ts +217 -10
  71. package/Server/Utils/SessionReplay/SessionReplayGateCache.ts +239 -138
  72. package/Server/Utils/SessionReplay/SessionReplayHealthCounters.ts +305 -0
  73. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +1430 -289
  74. package/Server/Utils/StartServer.ts +2 -17
  75. package/Server/Utils/TelegramVerificationToken.ts +185 -0
  76. package/Server/Utils/Telemetry/PinServiceName.ts +197 -0
  77. package/Server/Utils/Telemetry/TelemetryFanInWriter.ts +38 -16
  78. package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +92 -0
  79. package/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.ts +217 -0
  80. package/Server/Utils/VM/VMAPI.ts +1 -0
  81. package/Server/Utils/VM/VMRunner.ts +975 -95
  82. package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +202 -0
  83. package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +404 -0
  84. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +468 -0
  85. package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +399 -0
  86. package/Tests/App/StatusPage/StatusPageLastUpdated.test.tsx +263 -0
  87. package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +753 -0
  88. package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +224 -0
  89. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +262 -0
  90. package/Tests/Models/CustomFieldMappingColumns.test.ts +166 -0
  91. package/Tests/Models/DatabaseModels/SessionReplayModels.test.ts +20 -6
  92. package/Tests/ResponsiveVisibility.test.ts +115 -0
  93. package/Tests/ResponsiveVisibility.ts +183 -0
  94. package/Tests/Server/API/SessionReplayAPI.test.ts +1940 -216
  95. package/Tests/Server/API/UserNotificationSettingAPI.test.ts +186 -0
  96. package/Tests/Server/API/UserTelegramAPISecurity.test.ts +231 -0
  97. package/Tests/Server/EnvironmentConfigFrontendSecurity.test.ts +234 -0
  98. package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +202 -0
  99. package/Tests/Server/Infrastructure/Postgres/InventoryItemArchiveMigration.test.ts +41 -0
  100. package/Tests/Server/Infrastructure/Postgres/SessionReplayRecordEverySessionByDefaultMigration.test.ts +169 -0
  101. package/Tests/Server/Infrastructure/QueueWorkerTimeout.test.ts +210 -0
  102. package/Tests/Server/Infrastructure/TelemetryExporterDeploymentConfig.test.ts +130 -0
  103. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +4 -1
  104. package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +1163 -0
  105. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +5 -3
  106. package/Tests/Server/Services/AddTelemetryIngestionKeyTypeMigration.test.ts +555 -0
  107. package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +678 -0
  108. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +276 -28
  109. package/Tests/Server/Services/CustomFieldDropdownOptionsColumnWidth.test.ts +431 -0
  110. package/Tests/Server/Services/CustomFieldMappingService.test.ts +850 -0
  111. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +32 -0
  112. package/Tests/Server/Services/GlobalConfigService.test.ts +414 -1
  113. package/Tests/Server/Services/MetricRawEntityKeyPrune.test.ts +592 -0
  114. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +226 -1
  115. package/Tests/Server/Services/RoutineEmailSettingsPostgres.test.ts +329 -0
  116. package/Tests/Server/Services/RumSessionReplayViewService.test.ts +267 -0
  117. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +9 -0
  118. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +9 -0
  119. package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +834 -0
  120. package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +814 -0
  121. package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +998 -0
  122. package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +141 -0
  123. package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +18 -10
  124. package/Tests/Server/Services/UserTelegramVerificationSecurity.test.ts +688 -0
  125. package/Tests/Server/Utils/AI/SRE/Insights/FixRouting.test.ts +497 -0
  126. package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +383 -0
  127. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +7 -3
  128. package/Tests/Server/Utils/AnalyticsDatabase/ClusterConfig.test.ts +315 -0
  129. package/Tests/Server/Utils/CustomField/CustomFieldMappingValidator.test.ts +437 -0
  130. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +300 -11
  131. package/Tests/Server/Utils/EmailRollup/EmailRollupBurstWindow.test.ts +83 -0
  132. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
  133. package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerPreferences.test.ts +362 -0
  134. package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +77 -1
  135. package/Tests/Server/Utils/FrontendEnvironment.test.ts +190 -0
  136. package/Tests/Server/Utils/LogRedaction.test.ts +26 -0
  137. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +23 -9
  138. package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +584 -0
  139. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestHeaderCriteria.test.ts +236 -0
  140. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +437 -0
  141. package/Tests/Server/Utils/Monitor/MonitorTemplateUtilSeriesContext.test.ts +176 -0
  142. package/Tests/Server/Utils/Monitor/SeriesContextEnricher.test.ts +356 -0
  143. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +595 -0
  144. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCachePolicy.test.ts +198 -1
  145. package/Tests/Server/Utils/SessionReplay/SessionReplayHealthCounters.test.ts +453 -0
  146. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1378 -0
  147. package/Tests/Server/Utils/SessionReplayOriginAllowListRefactor.test.ts +420 -0
  148. package/Tests/Server/Utils/TelegramVerificationToken.test.ts +253 -0
  149. package/Tests/Server/Utils/Telemetry/PinServiceName.test.ts +666 -0
  150. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriterCapacity.test.ts +458 -0
  151. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +424 -0
  152. package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.test.ts +528 -0
  153. package/Tests/Server/Utils/TelemetryExporterEnvironment.test.ts +56 -0
  154. package/Tests/Server/Utils/VM/VMRunnerHostBridgeLatency.test.ts +74 -0
  155. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +100 -7
  156. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +1176 -6
  157. package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +220 -0
  158. package/Tests/Types/CustomField/CustomFieldValueMapping.test.ts +348 -0
  159. package/Tests/Types/JSONFunctions.test.ts +260 -0
  160. package/Tests/Types/Monitor/CephAlertTemplates.test.ts +422 -53
  161. package/Tests/Types/Monitor/DockerAlertTemplates.test.ts +495 -15
  162. package/Tests/Types/Monitor/DockerSwarmAlertTemplates.test.ts +191 -45
  163. package/Tests/Types/Monitor/HostAlertTemplates.test.ts +370 -42
  164. package/Tests/Types/Monitor/IotAlertTemplates.test.ts +375 -20
  165. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +636 -42
  166. package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +189 -0
  167. package/Tests/Types/Monitor/KubernetesTemplateGroupByKeys.test.ts +95 -14
  168. package/Tests/Types/Monitor/PodmanAlertTemplates.test.ts +190 -21
  169. package/Tests/Types/Monitor/ProxmoxAlertTemplates.test.ts +352 -22
  170. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +363 -0
  171. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +93 -18
  172. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +259 -0
  173. package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +476 -0
  174. package/Tests/Types/Monitor/RumAlertTemplates.test.ts +136 -0
  175. package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +661 -0
  176. package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +507 -0
  177. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +270 -0
  178. package/Tests/Types/Monitor/TemplateGroupByKeys.test.ts +38 -10
  179. package/Tests/Types/Monitor/Utils/RecommendationCriteriaAssertions.ts +102 -0
  180. package/Tests/Types/NotificationSetting/RoutineEmailEvents.test.ts +47 -0
  181. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +608 -0
  182. package/Tests/Types/Rum/SessionReplayCustomEvents.test.ts +434 -0
  183. package/Tests/Types/WebsiteRequest.test.ts +285 -3
  184. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +16 -3
  185. package/Tests/UI/Components/Charts/ChartTrailingBucketGap.test.ts +691 -0
  186. package/Tests/UI/Components/ComponentsModal.test.tsx +12 -4
  187. package/Tests/UI/Components/ComponentsModalUsability.test.tsx +518 -0
  188. package/Tests/UI/Components/CustomFields/CustomFieldsDetailMapping.test.tsx +324 -0
  189. package/Tests/UI/Components/CustomFields/MapFromCustomFieldInput.test.tsx +176 -0
  190. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +484 -0
  191. package/Tests/UI/Components/HeaderRightRail.test.tsx +157 -0
  192. package/Tests/UI/Components/IconDropdownItem.test.tsx +102 -0
  193. package/Tests/UI/Components/JSONTablePrototypePollution.test.tsx +117 -0
  194. package/Tests/UI/Components/KeyboardShortcutsModal.test.tsx +214 -0
  195. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +561 -0
  196. package/Tests/UI/Components/MonitorGraphs/UptimeBarDayModal.test.tsx +302 -0
  197. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +28 -12
  198. package/Tests/UI/Components/ShortcutDialogGuard.test.tsx +74 -0
  199. package/Tests/UI/Components/StatusPage/ResourceGroupSectionAutoExpand.test.tsx +248 -0
  200. package/Tests/UI/Components/TableCellWrapping.test.tsx +625 -0
  201. package/Tests/UI/Components/TableLoadingStates.test.tsx +205 -0
  202. package/Tests/UI/Components/Workflow/NodePlacement.test.ts +148 -0
  203. package/Tests/UI/Components/Workflow/Workflow.test.tsx +981 -0
  204. package/Tests/UI/ConfigBrowserTelemetry.test.ts +70 -0
  205. package/Tests/UI/Rum/ChunkLoader.test.ts +1036 -2
  206. package/Tests/UI/Rum/FidelityNotices.test.ts +187 -0
  207. package/Tests/UI/Rum/InactivityMap.test.ts +341 -0
  208. package/Tests/UI/Rum/PrivacySummaryCard.test.tsx +259 -0
  209. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +855 -0
  210. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +594 -0
  211. package/Tests/UI/Rum/ReplayCard.test.tsx +451 -0
  212. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +536 -0
  213. package/Tests/UI/Rum/ReplayEngine.test.ts +2503 -0
  214. package/Tests/UI/Rum/ReplayEngineTypes.test.ts +171 -0
  215. package/Tests/UI/Rum/ReplayHeader.test.tsx +711 -0
  216. package/Tests/UI/Rum/ReplayLink.test.tsx +119 -0
  217. package/Tests/UI/Rum/ReplayPinControl.test.tsx +408 -0
  218. package/Tests/UI/Rum/ReplayPlaybackIntent.test.ts +152 -0
  219. package/Tests/UI/Rum/ReplayRail.test.tsx +1296 -0
  220. package/Tests/UI/Rum/ReplayRailDetail.test.tsx +900 -0
  221. package/Tests/UI/Rum/ReplayScrubber.test.tsx +763 -147
  222. package/Tests/UI/Rum/ReplaySignalTypes.test.ts +189 -0
  223. package/Tests/UI/Rum/ReplaySignals.test.ts +1579 -0
  224. package/Tests/UI/Rum/ReplayStage.test.tsx +396 -473
  225. package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +918 -0
  226. package/Tests/UI/Rum/ReplayTimeline.test.tsx +696 -0
  227. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +499 -0
  228. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +346 -0
  229. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +545 -0
  230. package/Tests/UI/Rum/SessionReplayTable.test.tsx +991 -0
  231. package/Tests/UI/Rum/TargetedCapturePanel.test.tsx +254 -0
  232. package/Tests/UI/Telemetry/BrowserExporterIsolation.test.ts +71 -0
  233. package/Tests/UI/Utils/GlobalKeyboardShortcut.test.ts +344 -0
  234. package/Tests/Utils/API.test.ts +308 -0
  235. package/Tests/Utils/HTTPResponseBodyReader.test.ts +323 -0
  236. package/Tests/Utils/NetworkDiscovery/DiscoveryScanStatus.test.ts +117 -0
  237. package/Tests/Utils/Rum/ChunkMath.test.ts +83 -0
  238. package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +993 -0
  239. package/Tests/Utils/Rum/SessionReplayStringMap.test.ts +245 -0
  240. package/Tests/Utils/StatusPage/ResourceSearch.test.ts +631 -0
  241. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +633 -0
  242. package/Tests/Utils/Uptime/DayUptimeGraphUtil.test.ts +461 -0
  243. package/Tests/Utils/ValueFormatter.test.ts +148 -0
  244. package/Types/CustomField/CustomFieldMappingCatalog.ts +161 -0
  245. package/Types/CustomField/CustomFieldMappingSourceResource.ts +19 -0
  246. package/Types/CustomField/CustomFieldValueMapping.ts +288 -0
  247. package/Types/Icon/IconProp.ts +1 -0
  248. package/Types/JSONFunctions.ts +189 -43
  249. package/Types/Monitor/CephAlertTemplates.ts +157 -195
  250. package/Types/Monitor/DockerAlertTemplates.ts +338 -128
  251. package/Types/Monitor/DockerSwarmAlertTemplates.ts +95 -112
  252. package/Types/Monitor/HostAlertTemplates.ts +302 -130
  253. package/Types/Monitor/IotAlertTemplates.ts +112 -104
  254. package/Types/Monitor/KubernetesAlertTemplates.ts +415 -224
  255. package/Types/Monitor/KubernetesMetricCatalog.ts +23 -19
  256. package/Types/Monitor/PodmanAlertTemplates.ts +116 -163
  257. package/Types/Monitor/ProxmoxAlertTemplates.ts +217 -99
  258. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +98 -6
  259. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +44 -7
  260. package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +383 -0
  261. package/Types/Monitor/RumAlertTemplates.ts +46 -7
  262. package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +596 -0
  263. package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +554 -0
  264. package/Types/Monitor/ServiceAlertTemplates.ts +98 -11
  265. package/Types/Monitor/UptimeHistoryLabels.ts +56 -0
  266. package/Types/NotificationSetting/RoutineEmailEvents.ts +30 -0
  267. package/Types/Rum/SessionReplay.ts +209 -0
  268. package/Types/Rum/SessionReplayApi.ts +722 -0
  269. package/Types/Rum/SessionReplayCaptureTrigger.ts +21 -12
  270. package/Types/Rum/SessionReplayConsentMode.ts +11 -7
  271. package/Types/Rum/SessionReplayCustomEvents.ts +549 -0
  272. package/Types/Rum/SessionReplayHealth.ts +238 -0
  273. package/Types/Telemetry/TelemetryIngestSurface.ts +95 -0
  274. package/Types/Telemetry/TelemetryIngestionKeyPolicy.ts +75 -0
  275. package/Types/Telemetry/TelemetryIngestionKeyType.ts +29 -0
  276. package/Types/WebsiteRequest.ts +85 -3
  277. package/UI/Components/Charts/Area/AreaChart.tsx +13 -2
  278. package/UI/Components/Charts/Bar/BarChart.tsx +6 -2
  279. package/UI/Components/Charts/Line/LineChart.tsx +13 -2
  280. package/UI/Components/Charts/Types/XAxis/XAxis.ts +29 -0
  281. package/UI/Components/Charts/Utils/DataPoint.ts +22 -3
  282. package/UI/Components/Charts/Utils/TimeAnnotation.ts +76 -9
  283. package/UI/Components/Charts/Utils/XAxis.ts +217 -0
  284. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +143 -25
  285. package/UI/Components/CustomFields/MapFromCustomFieldInput.tsx +216 -0
  286. package/UI/Components/Graphs/DayUptimeGraph.tsx +173 -8
  287. package/UI/Components/Graphs/UptimeBarTooltip.tsx +22 -278
  288. package/UI/Components/Graphs/UptimeDaySummary.tsx +327 -0
  289. package/UI/Components/Header/Header.tsx +25 -9
  290. package/UI/Components/Header/IconDropdown/IconDropdownItem.tsx +10 -1
  291. package/UI/Components/Header/IconDropdown/IconDropdownMenu.tsx +6 -1
  292. package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +6 -1
  293. package/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.tsx +6 -1
  294. package/UI/Components/Icon/Icon.tsx +11 -0
  295. package/UI/Components/JSONTable/JSONTable.tsx +2 -2
  296. package/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.tsx +125 -0
  297. package/UI/Components/KeyboardShortcut/Screenshots/README.md +19 -0
  298. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-command-palette.png +0 -0
  299. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog-dark.png +0 -0
  300. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-dialog.png +0 -0
  301. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-help-menu.png +0 -0
  302. package/UI/Components/KeyboardShortcut/Screenshots/keyboard-shortcuts-narrow.png +0 -0
  303. package/UI/Components/ModelTable/Column.ts +15 -0
  304. package/UI/Components/Monitor/SeriesDebugCommandsViewer.tsx +64 -0
  305. package/UI/Components/Monitor/SeriesLabelsViewer.tsx +93 -0
  306. package/UI/Components/MonitorGraphs/Uptime.tsx +14 -2
  307. package/UI/Components/MonitorGraphs/UptimeBarDayModal.tsx +63 -10
  308. package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
  309. package/UI/Components/StatusPage/ResourceGroupSection.tsx +40 -0
  310. package/UI/Components/Table/CellClassName.ts +81 -0
  311. package/UI/Components/Table/TableRow.tsx +20 -14
  312. package/UI/Components/Table/TableSkeletonRows.tsx +9 -9
  313. package/UI/Components/Table/Types/Column.ts +36 -0
  314. package/UI/Components/Tooltip/Tooltip.tsx +11 -1
  315. package/UI/Components/Workflow/ComponentsModal.tsx +60 -39
  316. package/UI/Components/Workflow/NodePlacement.ts +57 -0
  317. package/UI/Components/Workflow/Workflow.tsx +47 -18
  318. package/UI/Config.ts +15 -33
  319. package/UI/Utils/GlobalKeyboardShortcut.ts +208 -0
  320. package/UI/Utils/Telemetry/BrowserTelemetryConfig.ts +28 -0
  321. package/UI/Utils/Telemetry/Telemetry.ts +10 -8
  322. package/Utils/API.ts +129 -3
  323. package/Utils/HTTPResponseBodyReader.ts +221 -0
  324. package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +77 -0
  325. package/Utils/Rum/ChunkMath.ts +106 -0
  326. package/Utils/Rum/SessionReplayHealth.ts +732 -0
  327. package/Utils/Rum/SessionReplayStringMap.ts +226 -0
  328. package/Utils/Schema/ModelSchema.ts +1 -0
  329. package/Utils/StatusPage/ResourceSearch.ts +290 -0
  330. package/Utils/Telemetry/OriginAllowList.ts +355 -0
  331. package/Utils/Uptime/DayUptimeGraphUtil.ts +205 -0
  332. package/Utils/ValueFormatter.ts +35 -1
  333. package/build/dist/Models/AnalyticsModels/RumSession.js +102 -19
  334. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  335. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js +11 -9
  336. package/build/dist/Models/AnalyticsModels/RumSessionChunk.js.map +1 -1
  337. package/build/dist/Models/DatabaseModels/AlertCustomField.js +79 -3
  338. package/build/dist/Models/DatabaseModels/AlertCustomField.js.map +1 -1
  339. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js +3 -27
  340. package/build/dist/Models/DatabaseModels/ApiKeyPermission.js.map +1 -1
  341. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +79 -3
  342. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js +79 -3
  344. package/build/dist/Models/DatabaseModels/InventoryItemCustomField.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/MonitorCustomField.js +79 -3
  346. package/build/dist/Models/DatabaseModels/MonitorCustomField.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js +79 -3
  348. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyCustomField.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/RumApplication.js +6 -6
  350. package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js +79 -3
  352. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceCustomField.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js +79 -3
  354. package/build/dist/Models/DatabaseModels/StatusPageCustomField.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/TeamCustomField.js +79 -3
  356. package/build/dist/Models/DatabaseModels/TeamCustomField.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/TeamMember.js +0 -9
  358. package/build/dist/Models/DatabaseModels/TeamMember.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js +79 -3
  360. package/build/dist/Models/DatabaseModels/TeamMemberCustomField.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/TeamPermission.js +3 -24
  362. package/build/dist/Models/DatabaseModels/TeamPermission.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +267 -0
  364. package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/UserTelegram.js +0 -4
  366. package/build/dist/Models/DatabaseModels/UserTelegram.js.map +1 -1
  367. package/build/dist/Server/API/TelemetryAPI.js +769 -109
  368. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  369. package/build/dist/Server/API/UserNotificationSettingAPI.js +35 -0
  370. package/build/dist/Server/API/UserNotificationSettingAPI.js.map +1 -0
  371. package/build/dist/Server/API/UserTelegramAPI.js +28 -6
  372. package/build/dist/Server/API/UserTelegramAPI.js.map +1 -1
  373. package/build/dist/Server/EnvironmentConfig.js +29 -2
  374. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  375. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js +60 -0
  376. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791300000000-AddTelemetryIngestionKeyType.js.map +1 -0
  377. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js +53 -0
  378. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791400000000-SessionReplayRecordEverySessionByDefault.js.map +1 -0
  379. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js +82 -0
  380. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791500000000-WidenCustomFieldDropdownOptions.js.map +1 -0
  381. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js +46 -0
  382. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791600000000-AddCustomFieldValueMapping.js.map +1 -0
  383. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
  384. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  385. package/build/dist/Server/Infrastructure/QueueWorker.js +19 -7
  386. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  387. package/build/dist/Server/Infrastructure/Semaphore.js +1 -0
  388. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  389. package/build/dist/Server/Middleware/TelemetryIngest.js +315 -8
  390. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  391. package/build/dist/Server/Services/AccessTokenService.js +1 -0
  392. package/build/dist/Server/Services/AccessTokenService.js.map +1 -1
  393. package/build/dist/Server/Services/AlertCustomFieldService.js +93 -0
  394. package/build/dist/Server/Services/AlertCustomFieldService.js.map +1 -1
  395. package/build/dist/Server/Services/AlertService.js +34 -0
  396. package/build/dist/Server/Services/AlertService.js.map +1 -1
  397. package/build/dist/Server/Services/ApiKeyPermissionService.js +331 -28
  398. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  399. package/build/dist/Server/Services/CustomFieldMappingService.js +614 -0
  400. package/build/dist/Server/Services/CustomFieldMappingService.js.map +1 -0
  401. package/build/dist/Server/Services/GlobalConfigService.js +133 -0
  402. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  403. package/build/dist/Server/Services/IncidentCustomFieldService.js +93 -0
  404. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  405. package/build/dist/Server/Services/IncidentService.js +32 -0
  406. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  407. package/build/dist/Server/Services/MetricService.js +163 -0
  408. package/build/dist/Server/Services/MetricService.js.map +1 -1
  409. package/build/dist/Server/Services/MonitorService.js +29 -0
  410. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  411. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +79 -27
  412. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  413. package/build/dist/Server/Services/ProjectService.js +22 -0
  414. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  415. package/build/dist/Server/Services/RoutineEmailSettingsService.js +69 -0
  416. package/build/dist/Server/Services/RoutineEmailSettingsService.js.map +1 -0
  417. package/build/dist/Server/Services/RumSessionReplayViewService.js +86 -24
  418. package/build/dist/Server/Services/RumSessionReplayViewService.js.map +1 -1
  419. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js +93 -0
  420. package/build/dist/Server/Services/ScheduledMaintenanceCustomFieldService.js.map +1 -1
  421. package/build/dist/Server/Services/ScheduledMaintenanceService.js +29 -0
  422. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  423. package/build/dist/Server/Services/TeamMemberService.js +62 -2
  424. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  425. package/build/dist/Server/Services/TeamPermissionService.js +166 -3
  426. package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
  427. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +562 -18
  428. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  429. package/build/dist/Server/Services/UserNotificationSettingService.js +26 -6
  430. package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
  431. package/build/dist/Server/Services/UserTelegramService.js +257 -4
  432. package/build/dist/Server/Services/UserTelegramService.js.map +1 -1
  433. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  434. package/build/dist/Server/Utils/APIKey/AccessPermission.js +2 -2
  435. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  436. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js +27 -0
  437. package/build/dist/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.js.map +1 -0
  438. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js +226 -0
  439. package/build/dist/Server/Utils/CustomField/CustomFieldMappingRegistry.js.map +1 -0
  440. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js +189 -0
  441. package/build/dist/Server/Utils/CustomField/CustomFieldMappingValidator.js.map +1 -0
  442. package/build/dist/Server/Utils/DataSource/EgressGuard.js +121 -7
  443. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  444. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +38 -5
  445. package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -1
  446. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +44 -2
  447. package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
  448. package/build/dist/Server/Utils/FrontendEnvironment.js +33 -0
  449. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -0
  450. package/build/dist/Server/Utils/LogRedaction.js +20 -0
  451. package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
  452. package/build/dist/Server/Utils/Logger.js +10 -0
  453. package/build/dist/Server/Utils/Logger.js.map +1 -1
  454. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +287 -68
  455. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
  456. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +20 -4
  457. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  458. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +29 -6
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  460. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +88 -13
  461. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  462. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  464. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +22 -0
  465. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  466. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js +237 -0
  467. package/build/dist/Server/Utils/Monitor/SeriesContextEnricher.js.map +1 -0
  468. package/build/dist/Server/Utils/SSRFProtection.js +136 -9
  469. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  470. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js +174 -89
  471. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCache.js.map +1 -1
  472. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js +223 -0
  473. package/build/dist/Server/Utils/SessionReplay/SessionReplayHealthCounters.js.map +1 -0
  474. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +945 -164
  475. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  476. package/build/dist/Server/Utils/StartServer.js +3 -14
  477. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  478. package/build/dist/Server/Utils/TelegramVerificationToken.js +129 -0
  479. package/build/dist/Server/Utils/TelegramVerificationToken.js.map +1 -0
  480. package/build/dist/Server/Utils/Telemetry/PinServiceName.js +163 -0
  481. package/build/dist/Server/Utils/Telemetry/PinServiceName.js.map +1 -0
  482. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js +28 -15
  483. package/build/dist/Server/Utils/Telemetry/TelemetryFanInWriter.js.map +1 -1
  484. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +64 -0
  485. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -0
  486. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js +171 -0
  487. package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyRateLimiter.js.map +1 -0
  488. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  489. package/build/dist/Server/Utils/VM/VMRunner.js +780 -69
  490. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  491. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +60 -0
  492. package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -0
  493. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js +20 -0
  494. package/build/dist/Types/CustomField/CustomFieldMappingSourceResource.js.map +1 -0
  495. package/build/dist/Types/CustomField/CustomFieldValueMapping.js +141 -0
  496. package/build/dist/Types/CustomField/CustomFieldValueMapping.js.map +1 -0
  497. package/build/dist/Types/Icon/IconProp.js +1 -0
  498. package/build/dist/Types/Icon/IconProp.js.map +1 -1
  499. package/build/dist/Types/JSONFunctions.js +118 -37
  500. package/build/dist/Types/JSONFunctions.js.map +1 -1
  501. package/build/dist/Types/Monitor/CephAlertTemplates.js +130 -171
  502. package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
  503. package/build/dist/Types/Monitor/DockerAlertTemplates.js +286 -121
  504. package/build/dist/Types/Monitor/DockerAlertTemplates.js.map +1 -1
  505. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js +84 -105
  506. package/build/dist/Types/Monitor/DockerSwarmAlertTemplates.js.map +1 -1
  507. package/build/dist/Types/Monitor/HostAlertTemplates.js +250 -122
  508. package/build/dist/Types/Monitor/HostAlertTemplates.js.map +1 -1
  509. package/build/dist/Types/Monitor/IotAlertTemplates.js +81 -81
  510. package/build/dist/Types/Monitor/IotAlertTemplates.js.map +1 -1
  511. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +375 -215
  512. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  513. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +19 -19
  514. package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
  515. package/build/dist/Types/Monitor/PodmanAlertTemplates.js +104 -153
  516. package/build/dist/Types/Monitor/PodmanAlertTemplates.js.map +1 -1
  517. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +156 -91
  518. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
  519. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +67 -6
  520. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  521. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +38 -7
  522. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
  523. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +261 -0
  524. package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -0
  525. package/build/dist/Types/Monitor/RumAlertTemplates.js +46 -7
  526. package/build/dist/Types/Monitor/RumAlertTemplates.js.map +1 -1
  527. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +422 -0
  528. package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -0
  529. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +441 -0
  530. package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -0
  531. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +79 -15
  532. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -1
  533. package/build/dist/Types/Monitor/UptimeHistoryLabels.js +17 -0
  534. package/build/dist/Types/Monitor/UptimeHistoryLabels.js.map +1 -0
  535. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js +29 -0
  536. package/build/dist/Types/NotificationSetting/RoutineEmailEvents.js.map +1 -0
  537. package/build/dist/Types/Rum/SessionReplay.js +117 -0
  538. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  539. package/build/dist/Types/Rum/SessionReplayApi.js +181 -0
  540. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -0
  541. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js +21 -12
  542. package/build/dist/Types/Rum/SessionReplayCaptureTrigger.js.map +1 -1
  543. package/build/dist/Types/Rum/SessionReplayConsentMode.js +11 -7
  544. package/build/dist/Types/Rum/SessionReplayConsentMode.js.map +1 -1
  545. package/build/dist/Types/Rum/SessionReplayCustomEvents.js +172 -0
  546. package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -0
  547. package/build/dist/Types/Rum/SessionReplayHealth.js +37 -0
  548. package/build/dist/Types/Rum/SessionReplayHealth.js.map +1 -0
  549. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +85 -0
  550. package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -0
  551. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js +15 -0
  552. package/build/dist/Types/Telemetry/TelemetryIngestionKeyPolicy.js.map +1 -0
  553. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js +30 -0
  554. package/build/dist/Types/Telemetry/TelemetryIngestionKeyType.js.map +1 -0
  555. package/build/dist/Types/WebsiteRequest.js +55 -3
  556. package/build/dist/Types/WebsiteRequest.js.map +1 -1
  557. package/build/dist/UI/Components/Charts/Area/AreaChart.js +13 -2
  558. package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
  559. package/build/dist/UI/Components/Charts/Bar/BarChart.js +6 -2
  560. package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
  561. package/build/dist/UI/Components/Charts/Line/LineChart.js +13 -2
  562. package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
  563. package/build/dist/UI/Components/Charts/Types/XAxis/XAxis.js.map +1 -1
  564. package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -3
  565. package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
  566. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +40 -9
  567. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  568. package/build/dist/UI/Components/Charts/Utils/XAxis.js +186 -0
  569. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  570. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +80 -6
  571. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  572. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js +118 -0
  573. package/build/dist/UI/Components/CustomFields/MapFromCustomFieldInput.js.map +1 -0
  574. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +112 -7
  575. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  576. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js +5 -162
  577. package/build/dist/UI/Components/Graphs/UptimeBarTooltip.js.map +1 -1
  578. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js +181 -0
  579. package/build/dist/UI/Components/Graphs/UptimeDaySummary.js.map +1 -0
  580. package/build/dist/UI/Components/Header/Header.js +2 -3
  581. package/build/dist/UI/Components/Header/Header.js.map +1 -1
  582. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js +2 -1
  583. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownItem.js.map +1 -1
  584. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js +7 -1
  585. package/build/dist/UI/Components/Header/IconDropdown/IconDropdownMenu.js.map +1 -1
  586. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +7 -1
  587. package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
  588. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js +7 -1
  589. package/build/dist/UI/Components/HeaderAlert/NotificationBell/NotificationBellDropdown.js.map +1 -1
  590. package/build/dist/UI/Components/Icon/Icon.js +5 -0
  591. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  592. package/build/dist/UI/Components/JSONTable/JSONTable.js +2 -2
  593. package/build/dist/UI/Components/JSONTable/JSONTable.js.map +1 -1
  594. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js +35 -0
  595. package/build/dist/UI/Components/KeyboardShortcut/KeyboardShortcutsModal.js.map +1 -0
  596. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js +34 -0
  597. package/build/dist/UI/Components/Monitor/SeriesDebugCommandsViewer.js.map +1 -0
  598. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js +49 -0
  599. package/build/dist/UI/Components/Monitor/SeriesLabelsViewer.js.map +1 -0
  600. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +1 -1
  601. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  602. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js +32 -6
  603. package/build/dist/UI/Components/MonitorGraphs/UptimeBarDayModal.js.map +1 -1
  604. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +38 -0
  605. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
  606. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +22 -1
  607. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -1
  608. package/build/dist/UI/Components/Table/CellClassName.js +55 -0
  609. package/build/dist/UI/Components/Table/CellClassName.js.map +1 -0
  610. package/build/dist/UI/Components/Table/TableRow.js +16 -13
  611. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  612. package/build/dist/UI/Components/Table/TableSkeletonRows.js +9 -8
  613. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -1
  614. package/build/dist/UI/Components/Tooltip/Tooltip.js +25 -1
  615. package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
  616. package/build/dist/UI/Components/Workflow/ComponentsModal.js +47 -30
  617. package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
  618. package/build/dist/UI/Components/Workflow/NodePlacement.js +37 -0
  619. package/build/dist/UI/Components/Workflow/NodePlacement.js.map +1 -0
  620. package/build/dist/UI/Components/Workflow/Workflow.js +35 -18
  621. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  622. package/build/dist/UI/Config.js +10 -20
  623. package/build/dist/UI/Config.js.map +1 -1
  624. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js +138 -0
  625. package/build/dist/UI/Utils/GlobalKeyboardShortcut.js.map +1 -0
  626. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js +14 -0
  627. package/build/dist/UI/Utils/Telemetry/BrowserTelemetryConfig.js.map +1 -0
  628. package/build/dist/UI/Utils/Telemetry/Telemetry.js +7 -5
  629. package/build/dist/UI/Utils/Telemetry/Telemetry.js.map +1 -1
  630. package/build/dist/Utils/API.js +67 -5
  631. package/build/dist/Utils/API.js.map +1 -1
  632. package/build/dist/Utils/HTTPResponseBodyReader.js +157 -0
  633. package/build/dist/Utils/HTTPResponseBodyReader.js.map +1 -0
  634. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +69 -0
  635. package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -0
  636. package/build/dist/Utils/Rum/ChunkMath.js +76 -0
  637. package/build/dist/Utils/Rum/ChunkMath.js.map +1 -1
  638. package/build/dist/Utils/Rum/SessionReplayHealth.js +534 -0
  639. package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -0
  640. package/build/dist/Utils/Rum/SessionReplayStringMap.js +165 -0
  641. package/build/dist/Utils/Rum/SessionReplayStringMap.js.map +1 -0
  642. package/build/dist/Utils/Schema/ModelSchema.js +1 -0
  643. package/build/dist/Utils/Schema/ModelSchema.js.map +1 -1
  644. package/build/dist/Utils/StatusPage/ResourceSearch.js +200 -0
  645. package/build/dist/Utils/StatusPage/ResourceSearch.js.map +1 -0
  646. package/build/dist/Utils/Telemetry/OriginAllowList.js +299 -0
  647. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -0
  648. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js +147 -0
  649. package/build/dist/Utils/Uptime/DayUptimeGraphUtil.js.map +1 -0
  650. package/build/dist/Utils/ValueFormatter.js +32 -1
  651. package/build/dist/Utils/ValueFormatter.js.map +1 -1
  652. package/package.json +1 -1
@@ -19,6 +19,12 @@ import {
19
19
  CustomFieldDropdownOption,
20
20
  parseCustomFieldDropdownOptions,
21
21
  } from "../../../Types/CustomField/CustomFieldDropdownOption";
22
+ import {
23
+ CustomFieldMappingSourceInfo,
24
+ getCustomFieldMappingRelationSelect,
25
+ getCustomFieldMappingSources,
26
+ hasCustomFieldMappingSource,
27
+ } from "../../../Types/CustomField/CustomFieldMappingCatalog";
22
28
  import Color from "../../../Types/Color";
23
29
  import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
24
30
  import { PromiseVoidFunction } from "../../../Types/FunctionTypes";
@@ -94,6 +100,74 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
94
100
  const [model, setModel] = useState<BaseModel | null>(null);
95
101
  const [showModelForm, setShowModelForm] = useState<boolean>(false);
96
102
 
103
+ /*
104
+ * Which related resources this resource's custom fields may inherit from.
105
+ * Empty for most of them, in which case everything below behaves exactly as
106
+ * it did before mapping existed.
107
+ */
108
+ const mappingSources: Array<CustomFieldMappingSourceInfo> =
109
+ getCustomFieldMappingSources(new props.customFieldType().tableName!);
110
+
111
+ /*
112
+ * A mapped field is a derived value, so it is shown rather than edited — but
113
+ * only on records that actually have a source to derive it from. On a record
114
+ * with none, the mapping can never fill it in and there is no reason to take
115
+ * the field away from the operator.
116
+ */
117
+ type IsMappedAndInheritedFunction = (schemaItem: BaseModel) => boolean;
118
+
119
+ const isMappedAndInherited: IsMappedAndInheritedFunction = (
120
+ schemaItem: BaseModel,
121
+ ): boolean => {
122
+ const resource: string | undefined = (schemaItem as any)
123
+ .mapFromResourceType;
124
+ const fieldName: string | undefined = (schemaItem as any)
125
+ .mapFromCustomFieldName;
126
+
127
+ if (!resource || !fieldName) {
128
+ return false;
129
+ }
130
+
131
+ const source: CustomFieldMappingSourceInfo | undefined =
132
+ mappingSources.find((candidate: CustomFieldMappingSourceInfo) => {
133
+ return candidate.resource === resource;
134
+ });
135
+
136
+ if (!source) {
137
+ return false;
138
+ }
139
+
140
+ return hasCustomFieldMappingSource({
141
+ source: source,
142
+ record: model as unknown as Record<string, unknown>,
143
+ });
144
+ };
145
+
146
+ type GetMappedDescriptionFunction = (
147
+ schemaItem: BaseModel,
148
+ ) => string | undefined;
149
+
150
+ const getMappedDescription: GetMappedDescriptionFunction = (
151
+ schemaItem: BaseModel,
152
+ ): string | undefined => {
153
+ const description: string | undefined = (schemaItem as any).description;
154
+
155
+ if (!isMappedAndInherited(schemaItem)) {
156
+ return description;
157
+ }
158
+
159
+ const source: CustomFieldMappingSourceInfo | undefined =
160
+ mappingSources.find((candidate: CustomFieldMappingSourceInfo) => {
161
+ return candidate.resource === (schemaItem as any).mapFromResourceType;
162
+ });
163
+
164
+ const note: string = `Copied from the ${source?.title} custom field "${
165
+ (schemaItem as any).mapFromCustomFieldName
166
+ }".`;
167
+
168
+ return description ? `${description} ${note}` : note;
169
+ };
170
+
97
171
  const onLoad: PromiseVoidFunction = async (): Promise<void> => {
98
172
  try {
99
173
  // load schema.
@@ -113,16 +187,33 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
113
187
  customFieldType: true,
114
188
  description: true,
115
189
  dropdownOptions: true,
190
+ mapFromResourceType: true,
191
+ mapFromCustomFieldName: true,
116
192
  } as any,
117
193
  sort: {},
118
194
  });
119
195
 
196
+ /*
197
+ * The relation a mapped field would inherit through is read alongside
198
+ * the values, so the card can tell "this field is mapped and this record
199
+ * has a monitor" (show it, read-only) from "this field is mapped but
200
+ * this record has none" (leave it editable — an SLO or security-event
201
+ * alert has no monitor and would otherwise be locked out of the field
202
+ * entirely). Nothing extra is selected for the six resources that have
203
+ * no mapping sources at all.
204
+ */
205
+ const itemSelect: JSONObject = {
206
+ customFields: true,
207
+ };
208
+
209
+ for (const source of mappingSources) {
210
+ Object.assign(itemSelect, getCustomFieldMappingRelationSelect(source));
211
+ }
212
+
120
213
  const item: BaseModel | null = await ModelAPI.getItem<BaseModel>({
121
214
  modelType: props.modelType,
122
215
  id: props.modelId,
123
- select: {
124
- customFields: true,
125
- } as any,
216
+ select: itemSelect as any,
126
217
  });
127
218
 
128
219
  setSchemaList(schemaList.data);
@@ -195,8 +286,19 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
195
286
  * take the button away, or the error message is telling the operator to
196
287
  * retry something they can no longer reach.
197
288
  */
289
+ /*
290
+ * A field whose value is copied from a related resource is not one the
291
+ * modal offers, so a card where EVERY field is mapped has nothing to edit
292
+ * and the button would open an empty form.
293
+ */
294
+ const editableSchemaCount: number = schemaList.filter(
295
+ (schemaItem: BaseModel) => {
296
+ return !isMappedAndInherited(schemaItem);
297
+ },
298
+ ).length;
299
+
198
300
  const canEdit: boolean =
199
- isEditable && !isLoading && schemaList.length > 0 && Boolean(model);
301
+ isEditable && !isLoading && editableSchemaCount > 0 && Boolean(model);
200
302
 
201
303
  /*
202
304
  * Custom field values live on the record itself, so editing them is an
@@ -269,7 +371,7 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
269
371
  return {
270
372
  key: (schemaItem as any).name,
271
373
  title: (schemaItem as any).name,
272
- description: (schemaItem as any).description,
374
+ description: getMappedDescription(schemaItem) as string,
273
375
  fieldType: (schemaItem as any).customFieldType,
274
376
  placeholder: "No data entered",
275
377
  dropdownOptions: isDropdown
@@ -292,26 +394,42 @@ const CustomFieldsDetail: FunctionComponent<ComponentProps> = (
292
394
  }}
293
395
  formProps={{
294
396
  initialValues: (model as any)?.["customFields"] || {},
295
- fields: schemaList.map((schemaItem: BaseModel) => {
296
- const isDropdown: boolean =
297
- (schemaItem as any).customFieldType ===
298
- CustomFieldType.Dropdown ||
299
- (schemaItem as any).customFieldType ===
300
- CustomFieldType.MultiSelectDropdown;
301
- return {
302
- field: {
303
- [(schemaItem as any).name]: true,
304
- },
305
- title: (schemaItem as any).name,
306
- description: (schemaItem as any).description,
307
- fieldType: (schemaItem as any).customFieldType,
308
- required: false,
309
- placeholder: "",
310
- dropdownOptions: isDropdown
311
- ? parseDropdownOptions((schemaItem as any).dropdownOptions)
312
- : undefined,
313
- };
314
- }),
397
+ /*
398
+ * Mapped fields are left OUT of the form rather than rendered
399
+ * disabled: `Field.disabled` is honoured by only three of the
400
+ * form's input branches, so a disabled Dropdown, multi-select or
401
+ * toggle stays fully editable and the value would silently snap
402
+ * back on the next sync. Their stored values still survive the
403
+ * save — this form submits its whole values object, which starts
404
+ * from the record's existing bag — and the server re-applies the
405
+ * mapping on update either way.
406
+ */
407
+ fields: schemaList
408
+ .filter((schemaItem: BaseModel) => {
409
+ return !isMappedAndInherited(schemaItem);
410
+ })
411
+ .map((schemaItem: BaseModel) => {
412
+ const isDropdown: boolean =
413
+ (schemaItem as any).customFieldType ===
414
+ CustomFieldType.Dropdown ||
415
+ (schemaItem as any).customFieldType ===
416
+ CustomFieldType.MultiSelectDropdown;
417
+ return {
418
+ field: {
419
+ [(schemaItem as any).name]: true,
420
+ },
421
+ title: (schemaItem as any).name,
422
+ description: (schemaItem as any).description,
423
+ fieldType: (schemaItem as any).customFieldType,
424
+ required: false,
425
+ placeholder: "",
426
+ dropdownOptions: isDropdown
427
+ ? parseDropdownOptions(
428
+ (schemaItem as any).dropdownOptions,
429
+ )
430
+ : undefined,
431
+ };
432
+ }),
315
433
  }}
316
434
  />
317
435
  )}
@@ -0,0 +1,216 @@
1
+ import API from "../../Utils/API/API";
2
+ import ModelAPI, { ListResult } from "../../Utils/ModelAPI/ModelAPI";
3
+ import ComponentLoader from "../ComponentLoader/ComponentLoader";
4
+ import Dropdown, { DropdownOption, DropdownValue } from "../Dropdown/Dropdown";
5
+ import ErrorMessage from "../ErrorMessage/ErrorMessage";
6
+ import BaseModel, {
7
+ DatabaseBaseModelType,
8
+ } from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
9
+ import CustomFieldType from "../../../Types/CustomField/CustomFieldType";
10
+ import { LIMIT_PER_PROJECT } from "../../../Types/Database/LimitMax";
11
+ import ObjectID from "../../../Types/ObjectID";
12
+ import React, {
13
+ FunctionComponent,
14
+ ReactElement,
15
+ useEffect,
16
+ useState,
17
+ } from "react";
18
+
19
+ /*
20
+ * Picks the field a custom field copies its value from
21
+ * (OneUptime/oneuptime#3549) — the "map from" half of the settings form.
22
+ *
23
+ * WHY THIS IS A CUSTOM COMPONENT AND NOT `fetchDropdownOptions`. The list of
24
+ * offerable fields depends on ANOTHER value in the same form: only source
25
+ * fields of the same type can be mapped, so choosing "Number" has to change
26
+ * what this picker shows. `Field.fetchDropdownOptions` is awaited from a
27
+ * `useAsyncEffect` in BasicForm whose dependency array is
28
+ * `[props.fields, currentFormStepId]` — it does not re-run when a value
29
+ * changes, so a picker built on it would keep offering the previous type's
30
+ * fields. `getCustomElement` receives the live form values on every render
31
+ * instead, which is the route three other call sites in this codebase already
32
+ * take for exactly this reason.
33
+ *
34
+ * A configured value that is no longer offered — the source field was renamed
35
+ * or deleted — is still shown, flagged. The mapping has quietly stopped
36
+ * resolving at that point, and the settings page is the only place anyone
37
+ * would find out.
38
+ */
39
+
40
+ export interface ComponentProps {
41
+ projectId: ObjectID;
42
+ /** Definition table listing the fields available on the source resource. */
43
+ sourceDefinitionModelType: DatabaseBaseModelType;
44
+ /** How the source is named to the operator, e.g. "Monitor". */
45
+ sourceTitle: string;
46
+ /** The type this field holds; only same-typed sources can be mapped. */
47
+ targetFieldType?: CustomFieldType | undefined;
48
+ initialValue?: string | undefined;
49
+ onChange?: ((value: string) => void) | undefined;
50
+ onBlur?: (() => void) | undefined;
51
+ error?: string | undefined;
52
+ tabIndex?: number | undefined;
53
+ }
54
+
55
+ interface SourceField {
56
+ name: string;
57
+ customFieldType?: CustomFieldType | undefined;
58
+ }
59
+
60
+ const MapFromCustomFieldInput: FunctionComponent<ComponentProps> = (
61
+ props: ComponentProps,
62
+ ): ReactElement => {
63
+ const [sourceFields, setSourceFields] = useState<Array<SourceField>>([]);
64
+ const [isLoading, setIsLoading] = useState<boolean>(true);
65
+ const [loadError, setLoadError] = useState<string>("");
66
+ const [selectedValue, setSelectedValue] = useState<string>(
67
+ props.initialValue || "",
68
+ );
69
+
70
+ const sourceModelName: string = props.sourceDefinitionModelType.name;
71
+
72
+ useEffect(() => {
73
+ let isMounted: boolean = true;
74
+
75
+ const load: () => Promise<void> = async (): Promise<void> => {
76
+ try {
77
+ setIsLoading(true);
78
+ setLoadError("");
79
+
80
+ const result: ListResult<BaseModel> = await ModelAPI.getList<BaseModel>(
81
+ {
82
+ modelType: props.sourceDefinitionModelType,
83
+ query: {
84
+ projectId: props.projectId,
85
+ } as any,
86
+ limit: LIMIT_PER_PROJECT,
87
+ skip: 0,
88
+ select: {
89
+ name: true,
90
+ customFieldType: true,
91
+ } as any,
92
+ sort: {},
93
+ },
94
+ );
95
+
96
+ if (!isMounted) {
97
+ return;
98
+ }
99
+
100
+ setSourceFields(
101
+ result.data.map((item: BaseModel): SourceField => {
102
+ return {
103
+ name: (item as any)["name"],
104
+ customFieldType: (item as any)["customFieldType"],
105
+ };
106
+ }),
107
+ );
108
+ setIsLoading(false);
109
+ } catch (err) {
110
+ if (!isMounted) {
111
+ return;
112
+ }
113
+
114
+ setIsLoading(false);
115
+ setLoadError(API.getFriendlyMessage(err));
116
+ }
117
+ };
118
+
119
+ load().catch(() => {
120
+ // load() reports its own failures through loadError.
121
+ });
122
+
123
+ return () => {
124
+ isMounted = false;
125
+ };
126
+ /*
127
+ * The source list is per-project and per-source-table; neither changes
128
+ * while this input is mounted. The type filter below is applied on each
129
+ * render instead, so choosing a different field type re-filters without a
130
+ * refetch.
131
+ */
132
+ }, [props.projectId.toString(), sourceModelName]);
133
+
134
+ const options: Array<DropdownOption> = sourceFields
135
+ .filter((field: SourceField) => {
136
+ if (!field.name) {
137
+ return false;
138
+ }
139
+
140
+ /*
141
+ * With no type chosen yet there is nothing to be compatible with, so
142
+ * offer nothing rather than a list that will be rejected on save.
143
+ */
144
+ if (!props.targetFieldType) {
145
+ return false;
146
+ }
147
+
148
+ return field.customFieldType === props.targetFieldType;
149
+ })
150
+ .map((field: SourceField): DropdownOption => {
151
+ return { label: field.name, value: field.name };
152
+ });
153
+
154
+ const isSelectedValueOffered: boolean = options.some(
155
+ (option: DropdownOption) => {
156
+ return option.value === selectedValue;
157
+ },
158
+ );
159
+
160
+ if (selectedValue && !isSelectedValueOffered) {
161
+ options.unshift({
162
+ label: `${selectedValue} (no longer available on ${props.sourceTitle})`,
163
+ value: selectedValue,
164
+ });
165
+ }
166
+
167
+ if (isLoading) {
168
+ return <ComponentLoader />;
169
+ }
170
+
171
+ if (loadError) {
172
+ return <ErrorMessage message={loadError} />;
173
+ }
174
+
175
+ if (!props.targetFieldType) {
176
+ return (
177
+ <ErrorMessage message="Choose a field type above before picking the field to map from." />
178
+ );
179
+ }
180
+
181
+ if (options.length === 0) {
182
+ return (
183
+ <ErrorMessage
184
+ message={`No ${props.sourceTitle} custom field of this type exists in this project. Create one first, or choose a different field type.`}
185
+ />
186
+ );
187
+ }
188
+
189
+ return (
190
+ <Dropdown
191
+ options={options}
192
+ value={options.find((option: DropdownOption) => {
193
+ return option.value === selectedValue;
194
+ })}
195
+ tabIndex={props.tabIndex}
196
+ error={props.error}
197
+ placeholder={`Select a ${props.sourceTitle} custom field`}
198
+ onBlur={() => {
199
+ if (props.onBlur) {
200
+ props.onBlur();
201
+ }
202
+ }}
203
+ onChange={(value: DropdownValue | Array<DropdownValue> | null) => {
204
+ const nextValue: string = value ? value.toString() : "";
205
+
206
+ setSelectedValue(nextValue);
207
+
208
+ if (props.onChange) {
209
+ props.onChange(nextValue);
210
+ }
211
+ }}
212
+ />
213
+ );
214
+ };
215
+
216
+ export default MapFromCustomFieldInput;
@@ -6,10 +6,13 @@ import OneUptimeDate from "../../../Types/Date";
6
6
  import Dictionary from "../../../Types/Dictionary";
7
7
  import ObjectID from "../../../Types/ObjectID";
8
8
  import UptimeBarTooltipIncident from "../../../Types/Monitor/UptimeBarTooltipIncident";
9
+ import DayUptimeGraphUtil from "../../../Utils/Uptime/DayUptimeGraphUtil";
10
+ import UptimeHistoryLabels from "../../../Types/Monitor/UptimeHistoryLabels";
9
11
  import React, {
10
12
  FunctionComponent,
11
13
  ReactElement,
12
14
  useEffect,
15
+ useRef,
13
16
  useState,
14
17
  } from "react";
15
18
  import UptimeEvent from "../../../Utils/Uptime/Event";
@@ -21,6 +24,20 @@ export interface BarChartRule {
21
24
  uptimePercentGreaterThanOrEqualTo: number;
22
25
  }
23
26
 
27
+ /*
28
+ * Everything the tooltip shows for one day, handed to onBarClick so that a
29
+ * caller opening a dialog can show the same reading rather than a strictly
30
+ * poorer one. Before this existed the only way to see a day's uptime was to
31
+ * hover it, which is not something a touch screen or a keyboard can do.
32
+ */
33
+ export interface UptimeBarDaySummary {
34
+ date: Date;
35
+ uptimePercent: number;
36
+ hasEvents: boolean;
37
+ statusDurations: Array<StatusDuration>;
38
+ incidents: Array<UptimeBarTooltipIncident>;
39
+ }
40
+
24
41
  export interface ComponentProps {
25
42
  startDate: Date;
26
43
  endDate: Date;
@@ -31,9 +48,18 @@ export interface ComponentProps {
31
48
  defaultBarColor: Color;
32
49
  incidents?: Array<UptimeBarTooltipIncident> | undefined;
33
50
  onBarClick?:
34
- | ((date: Date, incidents: Array<UptimeBarTooltipIncident>) => void)
51
+ | ((
52
+ date: Date,
53
+ incidents: Array<UptimeBarTooltipIncident>,
54
+ summary: UptimeBarDaySummary,
55
+ ) => void)
35
56
  | undefined;
36
57
  onIncidentClick?: ((incidentId: string) => void) | undefined;
58
+ /*
59
+ * Wording for the accessible names. Defaults to English, matching the
60
+ * tooltip; the status page passes translated strings.
61
+ */
62
+ labels?: UptimeHistoryLabels | undefined;
37
63
  }
38
64
 
39
65
  const DayUptimeGraph: FunctionComponent<ComponentProps> = (
@@ -41,6 +67,39 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
41
67
  ): ReactElement => {
42
68
  const [days, setDays] = useState<number>(0);
43
69
 
70
+ /*
71
+ * The strip is one tab stop with a roving tabindex inside it - see
72
+ * DayUptimeGraphUtil. null means "nothing focused yet", which resolves to
73
+ * today rather than to three months ago.
74
+ */
75
+ const [focusedBarIndex, setFocusedBarIndex] = useState<number | null>(null);
76
+ const barRefs: React.MutableRefObject<Array<HTMLButtonElement | null>> =
77
+ useRef<Array<HTMLButtonElement | null>>([]);
78
+
79
+ /*
80
+ * Set only by a key press, so that moving focus is a thing the widget does
81
+ * in response to the keyboard and never a thing it does to a visitor who
82
+ * simply clicked. Focus is applied in an effect rather than in the handler
83
+ * because the bar the visitor is moving to may not be the same DOM node
84
+ * after the render that the key press causes.
85
+ */
86
+ const shouldRestoreFocus: React.MutableRefObject<boolean> =
87
+ useRef<boolean>(false);
88
+
89
+ useEffect(() => {
90
+ if (!shouldRestoreFocus.current) {
91
+ return;
92
+ }
93
+
94
+ shouldRestoreFocus.current = false;
95
+
96
+ if (focusedBarIndex === null) {
97
+ return;
98
+ }
99
+
100
+ barRefs.current[focusedBarIndex]?.focus();
101
+ }, [focusedBarIndex]);
102
+
44
103
  useEffect(() => {
45
104
  setDays(
46
105
  OneUptimeDate.getNumberOfDaysBetweenDatesInclusive(
@@ -50,6 +109,40 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
50
109
  );
51
110
  }, [props.startDate, props.endDate]);
52
111
 
112
+ const activeBarIndex: number = DayUptimeGraphUtil.getActiveBarIndex({
113
+ storedIndex: focusedBarIndex,
114
+ barCount: days,
115
+ });
116
+
117
+ type MoveFocusFunction = (event: React.KeyboardEvent, index: number) => void;
118
+
119
+ const moveFocus: MoveFocusFunction = (
120
+ event: React.KeyboardEvent,
121
+ index: number,
122
+ ): void => {
123
+ const nextIndex: number | null = DayUptimeGraphUtil.getNextFocusIndex({
124
+ key: event.key,
125
+ currentIndex: index,
126
+ barCount: days,
127
+ });
128
+
129
+ if (nextIndex === null) {
130
+ // Not ours: Tab, Enter and Space must keep their normal meaning.
131
+ return;
132
+ }
133
+
134
+ event.preventDefault();
135
+ shouldRestoreFocus.current = true;
136
+ setFocusedBarIndex(nextIndex);
137
+
138
+ /*
139
+ * Focused here as well as in the effect: when the strip does not re-render
140
+ * (the index it was already on), the effect does not run, and focus must
141
+ * still land somewhere real.
142
+ */
143
+ barRefs.current[nextIndex]?.focus();
144
+ };
145
+
53
146
  type GetIncidentsForDayFunction = (
54
147
  startOfDay: Date,
55
148
  endOfDay: Date,
@@ -236,8 +329,33 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
236
329
  });
237
330
  }
238
331
 
239
- const hasDayIncidents: boolean = dayIncidents.length > 0;
240
- const isClickable: boolean = hasDayIncidents && Boolean(props.onBarClick);
332
+ /*
333
+ * Every day opens, not only the days that happen to carry an incident.
334
+ * The uptime reading and the status breakdown used to live in a hover
335
+ * tooltip and nowhere else, which put them out of reach of every phone
336
+ * and every keyboard - and a phone is how most people read a status page
337
+ * during an outage.
338
+ */
339
+ const isClickable: boolean = Boolean(props.onBarClick);
340
+
341
+ const summary: UptimeBarDaySummary = {
342
+ date: todaysDay,
343
+ uptimePercent: uptimePercentForTheDay,
344
+ hasEvents: hasEvents,
345
+ statusDurations: statusDurations,
346
+ incidents: dayIncidents,
347
+ };
348
+
349
+ const ariaLabel: string = DayUptimeGraphUtil.getDayAriaLabel({
350
+ dateLabel: OneUptimeDate.getDateAsUserFriendlyLocalFormattedString(
351
+ todaysDay,
352
+ true,
353
+ ),
354
+ hasEvents: hasEvents,
355
+ uptimePercent: uptimePercentForTheDay,
356
+ incidentCount: dayIncidents.length,
357
+ labels: props.labels,
358
+ });
241
359
 
242
360
  return (
243
361
  <Tooltip
@@ -250,22 +368,56 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
250
368
  statusDurations={statusDurations}
251
369
  incidents={dayIncidents}
252
370
  onIncidentClick={props.onIncidentClick}
371
+ labels={props.labels}
253
372
  />
254
373
  }
255
374
  >
256
- <div
257
- className={`${className}${isClickable ? " cursor-pointer hover:opacity-80" : ""}`}
375
+ <button
376
+ type="button"
377
+ ref={(element: HTMLButtonElement | null) => {
378
+ barRefs.current[dayNumber] = element;
379
+ }}
380
+ data-testid="uptime-bar"
381
+ data-day-index={dayNumber}
382
+ aria-label={ariaLabel}
383
+ /*
384
+ * One tab stop for the whole strip. Ninety bars per resource across
385
+ * a page of resources would otherwise bury the footer behind
386
+ * thousands of Tab presses.
387
+ */
388
+ tabIndex={DayUptimeGraphUtil.getBarTabIndex({
389
+ index: dayNumber,
390
+ activeIndex: activeBarIndex,
391
+ })}
392
+ /*
393
+ * The focus indicator is drawn *inside* the bar (a negative outline
394
+ * offset), not around it. Callers wrap this strip in an
395
+ * overflow-x-auto scroller so it can be swiped on a phone, and
396
+ * overflow-x also clips vertically - anything drawn outside the
397
+ * bar's own box loses its top and bottom edge to that scroller. Two
398
+ * pixels of indigo inside a seven pixel bar reads clearly against
399
+ * every bar colour and cannot be clipped by anything.
400
+ */
401
+ className={`${className} relative block p-0 border-0 appearance-none focus:outline-none focus-visible:z-10 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-indigo-600${
402
+ isClickable ? " cursor-pointer hover:opacity-80" : ""
403
+ }`}
258
404
  style={{
259
405
  backgroundColor: color.toString(),
260
406
  }}
407
+ onFocus={() => {
408
+ setFocusedBarIndex(dayNumber);
409
+ }}
410
+ onKeyDown={(event: React.KeyboardEvent) => {
411
+ moveFocus(event, dayNumber);
412
+ }}
261
413
  onClick={
262
414
  isClickable
263
415
  ? () => {
264
- props.onBarClick!(todaysDay, dayIncidents);
416
+ props.onBarClick!(todaysDay, dayIncidents, summary);
265
417
  }
266
418
  : undefined
267
419
  }
268
- ></div>
420
+ />
269
421
  </Tooltip>
270
422
  );
271
423
  };
@@ -282,8 +434,21 @@ const DayUptimeGraph: FunctionComponent<ComponentProps> = (
282
434
  return elements;
283
435
  };
284
436
 
437
+ /*
438
+ * Deliberately not overflow-hidden any more: it clipped the focus ring of
439
+ * the first and last bar, which is the one part of this widget a keyboard
440
+ * user has to be able to see.
441
+ */
285
442
  return (
286
- <div className="flex space-x-0.5 rounded overflow-hidden">
443
+ <div
444
+ className="flex space-x-0.5 rounded"
445
+ role="group"
446
+ aria-label={DayUptimeGraphUtil.getGraphAriaLabel({
447
+ dayCount: days,
448
+ labels: props.labels,
449
+ })}
450
+ data-testid="day-uptime-graph"
451
+ >
287
452
  {getUptimeGraph()}
288
453
  </div>
289
454
  );