@oneuptime/common 12.0.5 → 12.0.6

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 (528) hide show
  1. package/Models/DatabaseModels/AIRun.ts +33 -0
  2. package/Models/DatabaseModels/DataSource.ts +744 -0
  3. package/Models/DatabaseModels/Index.ts +3 -0
  4. package/Models/DatabaseModels/ProjectCallSMSConfig.ts +10 -2
  5. package/Models/DatabaseModels/User.ts +2 -0
  6. package/Models/DatabaseModels/UserOnCallLog.ts +2 -0
  7. package/Models/DatabaseModels/UserOnCallLogTimeline.ts +2 -0
  8. package/Models/DatabaseModels/UserSession.ts +2 -0
  9. package/Models/DatabaseModels/UserTotpAuth.ts +6 -4
  10. package/Models/DatabaseModels/UserWebAuthn.ts +5 -3
  11. package/Server/API/AIInsightAPI.ts +47 -4
  12. package/Server/API/AIInvestigationAPI.ts +25 -0
  13. package/Server/API/DashboardAPI.ts +176 -492
  14. package/Server/API/DataSourceAPI.ts +268 -0
  15. package/Server/API/StatusPageAPI.ts +11 -1
  16. package/Server/API/UserAPI.ts +119 -0
  17. package/Server/Infrastructure/ClickhouseConfig.ts +59 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.ts +24 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.ts +76 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  22. package/Server/Infrastructure/Queue.ts +26 -0
  23. package/Server/Infrastructure/QueueWorker.ts +17 -0
  24. package/Server/Middleware/TelemetryIngest.ts +8 -3
  25. package/Server/Services/AIInsightService.ts +132 -12
  26. package/Server/Services/AIRunService.ts +34 -0
  27. package/Server/Services/AIService.ts +17 -2
  28. package/Server/Services/AlertService.ts +38 -32
  29. package/Server/Services/AnalyticsDatabaseService.ts +8 -4
  30. package/Server/Services/DataSourceService.ts +200 -0
  31. package/Server/Services/HostService.ts +92 -0
  32. package/Server/Services/IncidentService.ts +45 -0
  33. package/Server/Services/Index.ts +2 -0
  34. package/Server/Services/MonitorService.ts +49 -0
  35. package/Server/Services/MonitorStatusService.ts +166 -0
  36. package/Server/Services/OpenTelemetryIngestService.ts +255 -184
  37. package/Server/Services/RumSessionPinService.ts +7 -21
  38. package/Server/Services/StatusPageSubscriberService.ts +13 -0
  39. package/Server/Services/UserService.ts +280 -9
  40. package/Server/Static/Vendor/README.md +62 -0
  41. package/Server/Static/Vendor/fonts/InterVariable.woff2 +0 -0
  42. package/Server/Static/Vendor/highlight/highlight.min.js +1244 -0
  43. package/Server/Static/Vendor/highlight/languages/apache.min.js +15 -0
  44. package/Server/Static/Vendor/highlight/languages/bash.min.js +21 -0
  45. package/Server/Static/Vendor/highlight/languages/c.min.js +41 -0
  46. package/Server/Static/Vendor/highlight/languages/cpp.min.js +47 -0
  47. package/Server/Static/Vendor/highlight/languages/csharp.min.js +49 -0
  48. package/Server/Static/Vendor/highlight/languages/css.min.js +31 -0
  49. package/Server/Static/Vendor/highlight/languages/diff.min.js +9 -0
  50. package/Server/Static/Vendor/highlight/languages/dns.min.js +11 -0
  51. package/Server/Static/Vendor/highlight/languages/dockerfile.min.js +8 -0
  52. package/Server/Static/Vendor/highlight/languages/go.min.js +20 -0
  53. package/Server/Static/Vendor/highlight/languages/graphql.min.js +12 -0
  54. package/Server/Static/Vendor/highlight/languages/http.min.js +14 -0
  55. package/Server/Static/Vendor/highlight/languages/ini.min.js +15 -0
  56. package/Server/Static/Vendor/highlight/languages/java.min.js +38 -0
  57. package/Server/Static/Vendor/highlight/languages/javascript.min.js +81 -0
  58. package/Server/Static/Vendor/highlight/languages/json.min.js +8 -0
  59. package/Server/Static/Vendor/highlight/languages/kotlin.min.js +46 -0
  60. package/Server/Static/Vendor/highlight/languages/lua.min.js +15 -0
  61. package/Server/Static/Vendor/highlight/languages/makefile.min.js +14 -0
  62. package/Server/Static/Vendor/highlight/languages/nginx.min.js +21 -0
  63. package/Server/Static/Vendor/highlight/languages/perl.min.js +41 -0
  64. package/Server/Static/Vendor/highlight/languages/php.min.js +59 -0
  65. package/Server/Static/Vendor/highlight/languages/powershell.min.js +39 -0
  66. package/Server/Static/Vendor/highlight/languages/python.min.js +42 -0
  67. package/Server/Static/Vendor/highlight/languages/r.min.js +26 -0
  68. package/Server/Static/Vendor/highlight/languages/ruby.min.js +54 -0
  69. package/Server/Static/Vendor/highlight/languages/rust.min.js +27 -0
  70. package/Server/Static/Vendor/highlight/languages/scala.min.js +28 -0
  71. package/Server/Static/Vendor/highlight/languages/sql.min.js +21 -0
  72. package/Server/Static/Vendor/highlight/languages/swift.min.js +68 -0
  73. package/Server/Static/Vendor/highlight/languages/typescript.min.js +99 -0
  74. package/Server/Static/Vendor/highlight/languages/xml.min.js +29 -0
  75. package/Server/Static/Vendor/highlight/languages/yaml.min.js +28 -0
  76. package/Server/Static/Vendor/highlight/styles/github-dark.min.css +10 -0
  77. package/Server/Static/Vendor/highlight/styles/vs2015.min.css +1 -0
  78. package/Server/Static/Vendor/tailwind/tailwind-3.4.5.js +21028 -0
  79. package/Server/Types/Database/Permissions/BasePermission.ts +7 -0
  80. package/Server/Types/Database/Permissions/DeletePermission.ts +2 -0
  81. package/Server/Types/Database/Permissions/ReadPermission.ts +3 -0
  82. package/Server/Types/Database/Permissions/TenantPermission.ts +101 -16
  83. package/Server/Utils/AI/CodeFix/FixRunBudget.ts +2 -2
  84. package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +90 -11
  85. package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +1 -0
  86. package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +1 -0
  87. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.ts +125 -0
  88. package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +25 -15
  89. package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +256 -57
  90. package/Server/Utils/AI/SRE/Insights/InsightStore.ts +76 -18
  91. package/Server/Utils/AI/SRE/InvestigationTldr.ts +352 -0
  92. package/Server/Utils/AnalyticsDatabase/InsertDedupContext.ts +7 -2
  93. package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +1793 -0
  94. package/Server/Utils/Dashboard/PublicDashboardViewConfig.ts +65 -0
  95. package/Server/Utils/DataSource/ConnectorRegistry.ts +53 -0
  96. package/Server/Utils/DataSource/Connectors/ClickHouseConnector.ts +338 -0
  97. package/Server/Utils/DataSource/Connectors/ElasticsearchConnector.ts +717 -0
  98. package/Server/Utils/DataSource/Connectors/LokiConnector.ts +606 -0
  99. package/Server/Utils/DataSource/Connectors/MySqlConnector.ts +307 -0
  100. package/Server/Utils/DataSource/Connectors/PostgresConnector.ts +260 -0
  101. package/Server/Utils/DataSource/Connectors/PrometheusConnector.ts +555 -0
  102. package/Server/Utils/DataSource/Connectors/RestApiConnector.ts +597 -0
  103. package/Server/Utils/DataSource/Connectors/SqlServerConnector.ts +318 -0
  104. package/Server/Utils/DataSource/EgressGuard.ts +446 -0
  105. package/Server/Utils/DataSource/HttpFetch.ts +221 -0
  106. package/Server/Utils/DataSource/SqlQueryGuard.ts +383 -0
  107. package/Server/Utils/DataSource/SqlResultShaper.ts +372 -0
  108. package/Server/Utils/DataSource/Types.ts +93 -0
  109. package/Server/Utils/Database/PostgresErrorTranslator.ts +172 -17
  110. package/Server/Utils/InProcessMemo.ts +141 -0
  111. package/Server/Utils/InstanceHealth/TelemetryIngestion.ts +628 -0
  112. package/Server/Utils/Monitor/MonitorMetricUtil.ts +58 -0
  113. package/Server/Utils/Monitor/MonitorResource.ts +14 -0
  114. package/Server/Utils/Response.ts +12 -1
  115. package/Server/Utils/SSRFProtection.ts +237 -0
  116. package/Server/Utils/StartServer.ts +8 -0
  117. package/Server/Utils/StatusPageSubscriberWebhook.ts +30 -0
  118. package/Server/Utils/Telemetry/CaptureSpan.ts +30 -18
  119. package/Server/Utils/Telemetry/IngestionTimestamp.ts +75 -0
  120. package/Server/Utils/Telemetry/ResourceHeartbeat.ts +99 -7
  121. package/Server/Utils/Telemetry/Telemetry.ts +112 -1
  122. package/Server/Utils/Telemetry.ts +104 -3
  123. package/Server/Utils/VendorAssets.ts +165 -0
  124. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +28 -5
  125. package/Server/Utils/Workspace/Slack/Slack.ts +5 -0
  126. package/Server/Views/Partials/Head.ejs +21 -7
  127. package/Tests/App/AdminDashboard/AdminProjectsIdFilter.test.tsx +207 -0
  128. package/Tests/App/AdminDashboard/AdminUsersIdFilter.test.tsx +216 -0
  129. package/Tests/App/Dashboard/AIInsightViewActions.test.tsx +422 -0
  130. package/Tests/App/Dashboard/AddWidgetModal.test.tsx +10 -3
  131. package/Tests/App/Dashboard/AlertsSideMenu.test.tsx +387 -0
  132. package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +199 -0
  133. package/Tests/App/Dashboard/DataSourceChartSyntheticConfig.test.tsx +736 -0
  134. package/Tests/App/Dashboard/DataSourceQueryEditor.test.tsx +868 -0
  135. package/Tests/App/Dashboard/DataSourceWidgetCatalog.test.ts +440 -0
  136. package/Tests/App/Dashboard/DataSourceWidgetFetching.test.tsx +2109 -0
  137. package/Tests/App/Dashboard/DataSourceWidgetViews.test.tsx +726 -0
  138. package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +447 -0
  139. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +514 -3
  140. package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +391 -0
  141. package/Tests/App/Dashboard/ScheduledMaintenanceSideMenu.test.tsx +326 -0
  142. package/Tests/App/Dashboard/SideMenuHarness.tsx +187 -0
  143. package/Tests/App/Dashboard/WidgetCatalog.test.ts +6 -1
  144. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +1858 -0
  145. package/Tests/Models/DatabaseModels/DataSourceModelSecrets.test.ts +70 -0
  146. package/Tests/Server/API/AIInvestigationAPI.test.ts +187 -0
  147. package/Tests/Server/API/DashboardPublicDataSourceStrip.test.ts +686 -0
  148. package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +585 -823
  149. package/Tests/Server/API/DataSourceAPIRoutes.test.ts +486 -0
  150. package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +291 -0
  151. package/Tests/Server/API/UserAuthenticationAPI.test.ts +641 -0
  152. package/Tests/Server/Infrastructure/ClickhouseKeepAliveOptions.test.ts +441 -0
  153. package/Tests/Server/Middleware/TelemetryIngestTokenLog.test.ts +140 -0
  154. package/Tests/Server/Services/AIInsightService.test.ts +266 -11
  155. package/Tests/Server/Services/AIRunAnalysisTldrPersistence.test.ts +160 -0
  156. package/Tests/Server/Services/AIServiceDailyBudget.test.ts +4 -0
  157. package/Tests/Server/Services/AlertMetricResourceAttributes.test.ts +352 -0
  158. package/Tests/Server/Services/DataSourceServiceSettings.test.ts +244 -0
  159. package/Tests/Server/Services/HostServiceFindOrCreateMemo.test.ts +397 -0
  160. package/Tests/Server/Services/HostServiceUpdateLastSeen.test.ts +41 -2
  161. package/Tests/Server/Services/IncidentMetricResourceAttributes.test.ts +408 -0
  162. package/Tests/Server/Services/MonitorStatusServiceDeleteReferenceCleanup.test.ts +351 -0
  163. package/Tests/Server/Services/MonitorStatusServiceValidation.test.ts +171 -0
  164. package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +398 -0
  165. package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +19 -0
  166. package/Tests/Server/Services/ProjectCallSMSConfigCredentialUniqueness.test.ts +305 -0
  167. package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +36 -1
  168. package/Tests/Server/Services/RumSessionPinUniqueViolationRecovery.test.ts +163 -0
  169. package/Tests/Server/Services/UserAuthenticationService.test.ts +973 -0
  170. package/Tests/Server/Types/Database/ObjectIdColumnQuery.test.ts +262 -0
  171. package/Tests/Server/Types/Database/Permissions/TenantPermission.test.ts +358 -0
  172. package/Tests/Server/Utils/AI/FixRunBudget.test.ts +2 -2
  173. package/Tests/Server/Utils/AI/Insights/ExceptionSpikeDetector.test.ts +6 -1
  174. package/Tests/Server/Utils/AI/Insights/InsightStore.test.ts +121 -4
  175. package/Tests/Server/Utils/AI/Insights/NewExceptionDetector.test.ts +361 -10
  176. package/Tests/Server/Utils/AI/InvestigationSettlement.test.ts +292 -0
  177. package/Tests/Server/Utils/AI/InvestigationTldr.test.ts +623 -0
  178. package/Tests/Server/Utils/AI/InvestigationTldrWiring.test.ts +98 -0
  179. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +857 -0
  180. package/Tests/Server/Utils/Dashboard/PublicDashboardViewConfig.test.ts +480 -0
  181. package/Tests/Server/Utils/DataSource/ClickHouseConnector.test.ts +759 -0
  182. package/Tests/Server/Utils/DataSource/ConnectorRegistry.test.ts +37 -0
  183. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +645 -0
  184. package/Tests/Server/Utils/DataSource/ElasticsearchConnector.test.ts +1206 -0
  185. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +616 -0
  186. package/Tests/Server/Utils/DataSource/LokiConnector.test.ts +970 -0
  187. package/Tests/Server/Utils/DataSource/MySqlConnector.test.ts +935 -0
  188. package/Tests/Server/Utils/DataSource/PostgresConnector.test.ts +854 -0
  189. package/Tests/Server/Utils/DataSource/PrometheusConnector.test.ts +881 -0
  190. package/Tests/Server/Utils/DataSource/RestApiConnector.test.ts +1020 -0
  191. package/Tests/Server/Utils/DataSource/SqlQueryGuard.test.ts +425 -0
  192. package/Tests/Server/Utils/DataSource/SqlResultShaper.test.ts +555 -0
  193. package/Tests/Server/Utils/DataSource/SqlServerConnector.test.ts +934 -0
  194. package/Tests/Server/Utils/Database/PostgresErrorTranslator.test.ts +228 -7
  195. package/Tests/Server/Utils/InProcessMemo.test.ts +292 -0
  196. package/Tests/Server/Utils/InstanceHealth/TelemetryIngestion.test.ts +960 -0
  197. package/Tests/Server/Utils/MicrosoftTeamsWebhookUrlValidation.test.ts +103 -0
  198. package/Tests/Server/Utils/Monitor/MonitorMetricResourceAttributes.test.ts +336 -0
  199. package/Tests/Server/Utils/OfflineAssetHygiene.test.ts +521 -0
  200. package/Tests/Server/Utils/ResponseRenderAnalytics.test.ts +143 -0
  201. package/Tests/Server/Utils/SSRFProtection.test.ts +193 -0
  202. package/Tests/Server/Utils/StatusPageSubscriberWebhook.test.ts +101 -0
  203. package/Tests/Server/Utils/TailwindBuildCopy.test.ts +225 -0
  204. package/Tests/Server/Utils/Telemetry/ResourceHeartbeatL1Memo.test.ts +355 -0
  205. package/Tests/Server/Utils/Telemetry/TelemetryFanInWriter.test.ts +128 -0
  206. package/Tests/Server/Utils/Telemetry/TelemetryUtilAttributeKeys.test.ts +381 -0
  207. package/Tests/Server/Utils/Telemetry.test.ts +87 -0
  208. package/Tests/Server/Utils/VendorAssetIntegrity.test.ts +343 -0
  209. package/Tests/Server/Utils/VendorAssets.test.ts +671 -0
  210. package/Tests/Server/Views/OfflineRender.test.ts +297 -0
  211. package/Tests/Types/Dashboard/DataSourceComponentTypes.test.ts +618 -0
  212. package/Tests/Types/DateClickhouseFormat.test.ts +192 -0
  213. package/Tests/Types/Password.test.ts +363 -0
  214. package/Tests/UI/Components/ConfirmModal.test.tsx +7 -0
  215. package/Tests/UI/Components/ErrorBoundary.test.tsx +53 -0
  216. package/Tests/UI/Components/Modal.test.tsx +281 -1
  217. package/Tests/UI/Components/ObjectIdFilterPipeline.test.tsx +396 -0
  218. package/Tests/UI/Components/StatusPage/ResourceGroupNavigator.test.tsx +1147 -0
  219. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +116 -1
  220. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
  221. package/Tests/Utils/Analytics.test.ts +23 -0
  222. package/Tests/Utils/Dashboard/Components/DashboardDataSourceComponents.test.ts +640 -0
  223. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +138 -0
  224. package/Tests/Utils/DataSource/DataSourceValueReducer.test.ts +526 -0
  225. package/Tests/Utils/Metrics/MetricResourceAttributeUtil.test.ts +691 -0
  226. package/Tests/Utils/StatusPage/GroupHierarchyView.test.ts +1452 -0
  227. package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +931 -0
  228. package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +288 -0
  229. package/Tests/Utils/Telemetry/IngestionTimestamp.test.ts +170 -0
  230. package/Types/AI/AIInsightEvidence.ts +6 -0
  231. package/Types/Analytics/RevenueEvent.ts +31 -0
  232. package/Types/Dashboard/DashboardComponentType.ts +31 -0
  233. package/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.ts +27 -0
  234. package/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.ts +32 -0
  235. package/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.ts +30 -0
  236. package/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.ts +55 -0
  237. package/Types/DataSource/DataSourceLimits.ts +62 -0
  238. package/Types/DataSource/DataSourceQueryConfig.ts +41 -0
  239. package/Types/DataSource/DataSourceTableResult.ts +38 -0
  240. package/Types/DataSource/DataSourceType.ts +213 -0
  241. package/Types/Date.ts +43 -3
  242. package/Types/Password.ts +64 -0
  243. package/Types/Permission.ts +46 -0
  244. package/Types/UserAuthenticationStatus.ts +34 -0
  245. package/UI/Components/Button/Button.tsx +1 -1
  246. package/UI/Components/ErrorBoundary.tsx +459 -108
  247. package/UI/Components/Icon/Icon.tsx +10 -9
  248. package/UI/Components/Modal/ConfirmModal.tsx +6 -1
  249. package/UI/Components/Modal/Modal.tsx +267 -35
  250. package/UI/Components/Modal/ModalFooter.tsx +6 -1
  251. package/UI/Components/MoreMenu/MoreMenu.tsx +19 -4
  252. package/UI/Components/MoreMenu/MoreMenuItem.tsx +6 -1
  253. package/UI/Components/StatusPage/ResourceGrid.tsx +314 -0
  254. package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +808 -0
  255. package/UI/Components/StatusPage/ResourceList.tsx +570 -0
  256. package/UI/Styles/Theme.css +18 -0
  257. package/UI/Utils/API/RequestOptions.ts +7 -0
  258. package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +1 -0
  259. package/UI/Utils/ModelAPI/ModelAPI.ts +1 -0
  260. package/UI/Utils/TestDataSource.ts +61 -0
  261. package/UI/esbuild-config.js +45 -0
  262. package/Utils/Analytics.ts +15 -0
  263. package/Utils/Dashboard/Components/DashboardDataSourceChartComponent.ts +88 -0
  264. package/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.ts +123 -0
  265. package/Utils/Dashboard/Components/DashboardDataSourceShared.ts +16 -0
  266. package/Utils/Dashboard/Components/DashboardDataSourceTableComponent.ts +72 -0
  267. package/Utils/Dashboard/Components/DashboardDataSourceValueComponent.ts +126 -0
  268. package/Utils/Dashboard/Components/Index.ts +28 -0
  269. package/Utils/DataSource/DataSourceQueryText.ts +94 -0
  270. package/Utils/DataSource/DataSourceValueReducer.ts +156 -0
  271. package/Utils/Metrics/MetricResourceAttributeUtil.ts +380 -0
  272. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +8 -6
  273. package/Utils/StatusPage/GroupHierarchyView.ts +931 -0
  274. package/Utils/StatusPage/ResourceExplorer.ts +853 -0
  275. package/build/dist/Models/DatabaseModels/AIRun.js +34 -0
  276. package/build/dist/Models/DatabaseModels/AIRun.js.map +1 -1
  277. package/build/dist/Models/DatabaseModels/DataSource.js +774 -0
  278. package/build/dist/Models/DatabaseModels/DataSource.js.map +1 -0
  279. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  280. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  281. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js +14 -4
  282. package/build/dist/Models/DatabaseModels/ProjectCallSMSConfig.js.map +1 -1
  283. package/build/dist/Models/DatabaseModels/User.js +2 -0
  284. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  285. package/build/dist/Models/DatabaseModels/UserOnCallLog.js +2 -0
  286. package/build/dist/Models/DatabaseModels/UserOnCallLog.js.map +1 -1
  287. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +2 -0
  288. package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
  289. package/build/dist/Models/DatabaseModels/UserSession.js +2 -0
  290. package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -1
  291. package/build/dist/Models/DatabaseModels/UserTotpAuth.js +6 -4
  292. package/build/dist/Models/DatabaseModels/UserTotpAuth.js.map +1 -1
  293. package/build/dist/Models/DatabaseModels/UserWebAuthn.js +5 -3
  294. package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
  295. package/build/dist/Server/API/AIInsightAPI.js +34 -4
  296. package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
  297. package/build/dist/Server/API/AIInvestigationAPI.js +23 -0
  298. package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
  299. package/build/dist/Server/API/DashboardAPI.js +119 -433
  300. package/build/dist/Server/API/DashboardAPI.js.map +1 -1
  301. package/build/dist/Server/API/DataSourceAPI.js +173 -0
  302. package/build/dist/Server/API/DataSourceAPI.js.map +1 -0
  303. package/build/dist/Server/API/StatusPageAPI.js +11 -1
  304. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  305. package/build/dist/Server/API/UserAPI.js +94 -2
  306. package/build/dist/Server/API/UserAPI.js.map +1 -1
  307. package/build/dist/Server/Infrastructure/ClickhouseConfig.js +49 -0
  308. package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
  309. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js +20 -0
  310. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786303472848-AddDataSourceTable.js.map +1 -0
  311. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js +19 -0
  312. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786600000000-AddInvestigationAnalysisTldr.js.map +1 -0
  313. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js +64 -0
  314. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786700000000-DropProjectCallSMSConfigCredentialUniques.js.map +1 -0
  315. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  316. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  317. package/build/dist/Server/Infrastructure/Queue.js +27 -0
  318. package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
  319. package/build/dist/Server/Infrastructure/QueueWorker.js +13 -0
  320. package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
  321. package/build/dist/Server/Middleware/TelemetryIngest.js +8 -3
  322. package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
  323. package/build/dist/Server/Services/AIInsightService.js +110 -10
  324. package/build/dist/Server/Services/AIInsightService.js.map +1 -1
  325. package/build/dist/Server/Services/AIRunService.js +34 -0
  326. package/build/dist/Server/Services/AIRunService.js.map +1 -1
  327. package/build/dist/Server/Services/AIService.js +16 -2
  328. package/build/dist/Server/Services/AIService.js.map +1 -1
  329. package/build/dist/Server/Services/AlertService.js +28 -35
  330. package/build/dist/Server/Services/AlertService.js.map +1 -1
  331. package/build/dist/Server/Services/AnalyticsDatabaseService.js +8 -4
  332. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  333. package/build/dist/Server/Services/DataSourceService.js +159 -0
  334. package/build/dist/Server/Services/DataSourceService.js.map +1 -0
  335. package/build/dist/Server/Services/HostService.js +74 -0
  336. package/build/dist/Server/Services/HostService.js.map +1 -1
  337. package/build/dist/Server/Services/IncidentService.js +35 -24
  338. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  339. package/build/dist/Server/Services/Index.js +2 -0
  340. package/build/dist/Server/Services/Index.js.map +1 -1
  341. package/build/dist/Server/Services/MonitorService.js +45 -0
  342. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  343. package/build/dist/Server/Services/MonitorStatusService.js +129 -0
  344. package/build/dist/Server/Services/MonitorStatusService.js.map +1 -1
  345. package/build/dist/Server/Services/OpenTelemetryIngestService.js +222 -159
  346. package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
  347. package/build/dist/Server/Services/RumSessionPinService.js +7 -15
  348. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  349. package/build/dist/Server/Services/StatusPageSubscriberService.js +10 -0
  350. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  351. package/build/dist/Server/Services/UserService.js +241 -10
  352. package/build/dist/Server/Services/UserService.js.map +1 -1
  353. package/build/dist/Server/Types/Database/Permissions/BasePermission.js +6 -0
  354. package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js +1 -0
  356. package/build/dist/Server/Types/Database/Permissions/DeletePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +2 -0
  358. package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js +68 -12
  360. package/build/dist/Server/Types/Database/Permissions/TenantPermission.js.map +1 -1
  361. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +2 -2
  362. package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
  363. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +68 -8
  364. package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
  365. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +1 -0
  366. package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +1 -0
  368. package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
  369. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js +97 -0
  370. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionIdentity.js.map +1 -0
  371. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +17 -15
  372. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
  373. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +178 -54
  374. package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
  375. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js +65 -16
  376. package/build/dist/Server/Utils/AI/SRE/Insights/InsightStore.js.map +1 -1
  377. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js +303 -0
  378. package/build/dist/Server/Utils/AI/SRE/InvestigationTldr.js.map +1 -0
  379. package/build/dist/Server/Utils/AnalyticsDatabase/InsertDedupContext.js.map +1 -1
  380. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +1261 -0
  381. package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -0
  382. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js +47 -0
  383. package/build/dist/Server/Utils/Dashboard/PublicDashboardViewConfig.js.map +1 -0
  384. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js +42 -0
  385. package/build/dist/Server/Utils/DataSource/ConnectorRegistry.js.map +1 -0
  386. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js +187 -0
  387. package/build/dist/Server/Utils/DataSource/Connectors/ClickHouseConnector.js.map +1 -0
  388. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js +493 -0
  389. package/build/dist/Server/Utils/DataSource/Connectors/ElasticsearchConnector.js.map +1 -0
  390. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js +399 -0
  391. package/build/dist/Server/Utils/DataSource/Connectors/LokiConnector.js.map +1 -0
  392. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js +195 -0
  393. package/build/dist/Server/Utils/DataSource/Connectors/MySqlConnector.js.map +1 -0
  394. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js +149 -0
  395. package/build/dist/Server/Utils/DataSource/Connectors/PostgresConnector.js.map +1 -0
  396. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js +362 -0
  397. package/build/dist/Server/Utils/DataSource/Connectors/PrometheusConnector.js.map +1 -0
  398. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js +342 -0
  399. package/build/dist/Server/Utils/DataSource/Connectors/RestApiConnector.js.map +1 -0
  400. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js +186 -0
  401. package/build/dist/Server/Utils/DataSource/Connectors/SqlServerConnector.js.map +1 -0
  402. package/build/dist/Server/Utils/DataSource/EgressGuard.js +305 -0
  403. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -0
  404. package/build/dist/Server/Utils/DataSource/HttpFetch.js +134 -0
  405. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -0
  406. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js +331 -0
  407. package/build/dist/Server/Utils/DataSource/SqlQueryGuard.js.map +1 -0
  408. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js +280 -0
  409. package/build/dist/Server/Utils/DataSource/SqlResultShaper.js.map +1 -0
  410. package/build/dist/Server/Utils/DataSource/Types.js +2 -0
  411. package/build/dist/Server/Utils/DataSource/Types.js.map +1 -0
  412. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js +103 -9
  413. package/build/dist/Server/Utils/Database/PostgresErrorTranslator.js.map +1 -1
  414. package/build/dist/Server/Utils/InProcessMemo.js +113 -0
  415. package/build/dist/Server/Utils/InProcessMemo.js.map +1 -0
  416. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js +406 -0
  417. package/build/dist/Server/Utils/InstanceHealth/TelemetryIngestion.js.map +1 -0
  418. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +34 -0
  419. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  420. package/build/dist/Server/Utils/Monitor/MonitorResource.js +14 -0
  421. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  422. package/build/dist/Server/Utils/Response.js +9 -1
  423. package/build/dist/Server/Utils/Response.js.map +1 -1
  424. package/build/dist/Server/Utils/SSRFProtection.js +192 -0
  425. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -0
  426. package/build/dist/Server/Utils/StartServer.js +7 -0
  427. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  428. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js +24 -0
  429. package/build/dist/Server/Utils/StatusPageSubscriberWebhook.js.map +1 -1
  430. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +25 -11
  431. package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
  432. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js +32 -0
  433. package/build/dist/Server/Utils/Telemetry/IngestionTimestamp.js.map +1 -0
  434. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js +92 -5
  435. package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
  436. package/build/dist/Server/Utils/Telemetry/Telemetry.js +92 -6
  437. package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
  438. package/build/dist/Server/Utils/Telemetry.js +93 -6
  439. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  440. package/build/dist/Server/Utils/VendorAssets.js +121 -0
  441. package/build/dist/Server/Utils/VendorAssets.js.map +1 -0
  442. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +25 -4
  443. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  444. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +5 -0
  445. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  446. package/build/dist/Types/Analytics/RevenueEvent.js +26 -0
  447. package/build/dist/Types/Analytics/RevenueEvent.js.map +1 -0
  448. package/build/dist/Types/Dashboard/DashboardComponentType.js +27 -0
  449. package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
  450. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js +2 -0
  451. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceChartComponent.js.map +1 -0
  452. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js +2 -0
  453. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceGaugeComponent.js.map +1 -0
  454. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js +2 -0
  455. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceTableComponent.js.map +1 -0
  456. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js +16 -0
  457. package/build/dist/Types/Dashboard/DashboardComponents/DashboardDataSourceValueComponent.js.map +1 -0
  458. package/build/dist/Types/DataSource/DataSourceLimits.js +47 -0
  459. package/build/dist/Types/DataSource/DataSourceLimits.js.map +1 -0
  460. package/build/dist/Types/DataSource/DataSourceQueryConfig.js +10 -0
  461. package/build/dist/Types/DataSource/DataSourceQueryConfig.js.map +1 -0
  462. package/build/dist/Types/DataSource/DataSourceTableResult.js +14 -0
  463. package/build/dist/Types/DataSource/DataSourceTableResult.js.map +1 -0
  464. package/build/dist/Types/DataSource/DataSourceType.js +183 -0
  465. package/build/dist/Types/DataSource/DataSourceType.js.map +1 -0
  466. package/build/dist/Types/Date.js +38 -3
  467. package/build/dist/Types/Date.js.map +1 -1
  468. package/build/dist/Types/Password.js +56 -0
  469. package/build/dist/Types/Password.js.map +1 -0
  470. package/build/dist/Types/Permission.js +42 -0
  471. package/build/dist/Types/Permission.js.map +1 -1
  472. package/build/dist/Types/UserAuthenticationStatus.js +2 -0
  473. package/build/dist/Types/UserAuthenticationStatus.js.map +1 -0
  474. package/build/dist/UI/Components/ErrorBoundary.js +388 -72
  475. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  476. package/build/dist/UI/Components/Icon/Icon.js +10 -4
  477. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  478. package/build/dist/UI/Components/Modal/ConfirmModal.js +1 -1
  479. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  480. package/build/dist/UI/Components/Modal/Modal.js +178 -19
  481. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  482. package/build/dist/UI/Components/Modal/ModalFooter.js +3 -1
  483. package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
  484. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +9 -6
  485. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  486. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +7 -1
  487. package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
  488. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +119 -0
  489. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -0
  490. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +354 -0
  491. package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -0
  492. package/build/dist/UI/Components/StatusPage/ResourceList.js +203 -0
  493. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -0
  494. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +1 -6
  495. package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
  496. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +3 -8
  497. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  498. package/build/dist/UI/Utils/TestDataSource.js +39 -0
  499. package/build/dist/UI/Utils/TestDataSource.js.map +1 -0
  500. package/build/dist/Utils/Analytics.js +4 -0
  501. package/build/dist/Utils/Analytics.js.map +1 -1
  502. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js +79 -0
  503. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceChartComponent.js.map +1 -0
  504. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js +111 -0
  505. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceGaugeComponent.js.map +1 -0
  506. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js +15 -0
  507. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceShared.js.map +1 -0
  508. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js +62 -0
  509. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceTableComponent.js.map +1 -0
  510. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js +112 -0
  511. package/build/dist/Utils/Dashboard/Components/DashboardDataSourceValueComponent.js.map +1 -0
  512. package/build/dist/Utils/Dashboard/Components/Index.js +16 -0
  513. package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
  514. package/build/dist/Utils/DataSource/DataSourceQueryText.js +64 -0
  515. package/build/dist/Utils/DataSource/DataSourceQueryText.js.map +1 -0
  516. package/build/dist/Utils/DataSource/DataSourceValueReducer.js +124 -0
  517. package/build/dist/Utils/DataSource/DataSourceValueReducer.js.map +1 -0
  518. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js +281 -0
  519. package/build/dist/Utils/Metrics/MetricResourceAttributeUtil.js.map +1 -0
  520. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +8 -6
  521. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
  522. package/build/dist/Utils/StatusPage/GroupHierarchyView.js +560 -0
  523. package/build/dist/Utils/StatusPage/GroupHierarchyView.js.map +1 -0
  524. package/build/dist/Utils/StatusPage/ResourceExplorer.js +519 -0
  525. package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -0
  526. package/jest.config.json +1 -0
  527. package/package.json +5 -1
  528. package/tsconfig.json +12 -10
@@ -0,0 +1,570 @@
1
+ import StatusPageResource from "../../../Models/DatabaseModels/StatusPageResource";
2
+ import IconProp from "../../../Types/Icon/IconProp";
3
+ import StatusPageResourceExplorerUtil from "../../../Utils/StatusPage/ResourceExplorer";
4
+ import Button, { ButtonSize, ButtonStyleType } from "../Button/Button";
5
+ import Icon from "../Icon/Icon";
6
+ import MoreMenu from "../MoreMenu/MoreMenu";
7
+ import MoreMenuItem from "../MoreMenu/MoreMenuItem";
8
+ import React, { FunctionComponent, ReactElement } from "react";
9
+ import {
10
+ DragDropContext,
11
+ Draggable,
12
+ DraggableProvided,
13
+ DraggableStateSnapshot,
14
+ DropResult,
15
+ Droppable,
16
+ DroppableProvided,
17
+ } from "react-beautiful-dnd";
18
+
19
+ export interface ComponentProps {
20
+ statusPageResources: Array<StatusPageResource>;
21
+ /*
22
+ * Distinguishes this list's drag scope from any other on the page. Two
23
+ * droppables sharing an id would let a row be dropped into the wrong one.
24
+ */
25
+ listKey: string;
26
+
27
+ /*
28
+ * How a resource's monitor is drawn. The monitor element lives in the
29
+ * dashboard - it links through to the monitor and knows about project
30
+ * routing - and this component is in Common, so the caller hands it in.
31
+ */
32
+ getResourceElement: (statusPageResource: StatusPageResource) => ReactElement;
33
+
34
+ isEditable: boolean;
35
+ isDeleteable: boolean;
36
+ /*
37
+ * False while a filter is on. The order a drag writes is "take the place of
38
+ * the row you were dropped on", and in a filtered list the row above is not
39
+ * the row above - so the reorder is offered only over the whole list.
40
+ */
41
+ isReorderable: boolean;
42
+
43
+ onEdit: (statusPageResource: StatusPageResource) => void;
44
+ onDelete: (statusPageResource: StatusPageResource) => void;
45
+ onShowId: (statusPageResource: StatusPageResource) => void;
46
+ /*
47
+ * From and to are positions in the list as drawn. The caller turns them into
48
+ * the one write the server understands.
49
+ */
50
+ onReorder: (fromIndex: number, toIndex: number) => void;
51
+
52
+ /* The row whose write is in flight; its actions are disabled while it is. */
53
+ busyResourceId?: string | null | undefined;
54
+
55
+ /* Rows past this are held back behind "Show more". */
56
+ visibleCount: number;
57
+ onShowMore: () => void;
58
+
59
+ emptyState: ReactElement;
60
+ }
61
+
62
+ /*
63
+ * The resources of one status page group, as the list they are.
64
+ *
65
+ * This used to be a ModelTable, mounted inside a row of a tree of other groups:
66
+ * a card with its own title, description, create button and overflow menu, a
67
+ * checkbox column, a sortable header and a pagination footer, all to show two
68
+ * columns of at most a few dozen rows. Everything about that chrome was a
69
+ * second, competing frame around content that was already inside one, and the
70
+ * deeper the group sat the more it read as a page inside a page.
71
+ *
72
+ * What is actually being edited here is a short ordered list, and the order is
73
+ * the point - it is the order visitors see. So it is drawn as an ordered list
74
+ * with a grip on each row, and everything else (creating, filtering, the group
75
+ * this belongs to) lives once, in the pane header above it.
76
+ *
77
+ * It is drawn in columns rather than as free floating rows. A dashboard pane is
78
+ * as wide as the window, and a row holding one short name on the left and two
79
+ * icons on the right leaves a metre of empty white between the thing and the
80
+ * buttons that act on it - which is both ugly and a long way for the eye to
81
+ * travel. So the row carries what an operator actually wants to compare down
82
+ * the column: the position visitors see it in, the monitor, and the name it is
83
+ * published under.
84
+ */
85
+
86
+ /*
87
+ * One set of column widths, used by the header and by every row, so the two
88
+ * cannot drift apart. The published-name column takes the whole row on a phone
89
+ * (basis-full) and shares the width from sm up, which keeps it a single element
90
+ * rather than one copy per breakpoint.
91
+ */
92
+ const GRIP_COLUMN_CLASS_NAME: string = "w-5 flex-shrink-0";
93
+ /*
94
+ * Held back on a phone, where 24px of number costs a fifth of what is left for
95
+ * the monitor's name and the rows are already in the order it describes.
96
+ */
97
+ const POSITION_COLUMN_CLASS_NAME: string =
98
+ "hidden w-6 flex-shrink-0 text-right text-xs tabular-nums sm:block";
99
+ const MONITOR_COLUMN_CLASS_NAME: string = "min-w-0 flex-[2_1_0%]";
100
+ /*
101
+ * Its own line on a phone, indented to sit under the monitor it renames rather
102
+ * than out beneath the grip; beside the monitor from sm up.
103
+ *
104
+ * order-last is what keeps the row's buttons up on the first line with the
105
+ * monitor: a full width column wraps everything after it, and the buttons are
106
+ * after it in the markup because that is the order they are read in.
107
+ */
108
+ const PUBLISHED_NAME_COLUMN_CLASS_NAME: string =
109
+ "order-last min-w-0 flex-[3_1_100%] pl-8 sm:order-none sm:flex-[3_1_0%] sm:pl-0";
110
+ const ACTIONS_COLUMN_CLASS_NAME: string =
111
+ "flex w-[3.75rem] flex-shrink-0 items-center justify-end gap-0.5";
112
+
113
+ const ROW_CLASS_NAME: string =
114
+ "group flex flex-wrap items-center gap-x-3 gap-y-1 px-4 py-3 transition-colors";
115
+ const ResourceList: FunctionComponent<ComponentProps> = (
116
+ props: ComponentProps,
117
+ ): ReactElement => {
118
+ const visibleResources: Array<StatusPageResource> =
119
+ props.statusPageResources.slice(0, props.visibleCount);
120
+
121
+ const hiddenCount: number =
122
+ props.statusPageResources.length - visibleResources.length;
123
+
124
+ type RenderActionsFunction = (
125
+ statusPageResource: StatusPageResource,
126
+ index: number,
127
+ ) => ReactElement;
128
+
129
+ const renderActions: RenderActionsFunction = (
130
+ statusPageResource: StatusPageResource,
131
+ index: number,
132
+ ): ReactElement => {
133
+ const resourceId: string = statusPageResource._id?.toString() || "";
134
+ const isBusy: boolean = props.busyResourceId === resourceId;
135
+ const name: string =
136
+ StatusPageResourceExplorerUtil.getResourceName(statusPageResource);
137
+
138
+ const menuItems: Array<ReactElement> = [];
139
+
140
+ if (props.isReorderable) {
141
+ /*
142
+ * The same move a drag makes, reachable from the keyboard and from a
143
+ * touch screen - neither of which has anywhere to drag to.
144
+ */
145
+ menuItems.push(
146
+ <MoreMenuItem
147
+ key="move-up"
148
+ text="Move up"
149
+ icon={IconProp.ArrowUp}
150
+ isDisabled={isBusy || index === 0}
151
+ onClick={() => {
152
+ props.onReorder(index, index - 1);
153
+ }}
154
+ />,
155
+ );
156
+
157
+ menuItems.push(
158
+ <MoreMenuItem
159
+ key="move-down"
160
+ text="Move down"
161
+ icon={IconProp.ArrowDown}
162
+ isDisabled={isBusy || index === props.statusPageResources.length - 1}
163
+ onClick={() => {
164
+ props.onReorder(index, index + 1);
165
+ }}
166
+ />,
167
+ );
168
+ }
169
+
170
+ menuItems.push(
171
+ <MoreMenuItem
172
+ key="show-id"
173
+ text="Show ID"
174
+ icon={IconProp.Info}
175
+ onClick={() => {
176
+ props.onShowId(statusPageResource);
177
+ }}
178
+ />,
179
+ );
180
+
181
+ if (props.isDeleteable) {
182
+ menuItems.push(
183
+ <MoreMenuItem
184
+ key="delete"
185
+ text="Remove from status page"
186
+ icon={IconProp.Trash}
187
+ className="text-red-600 enabled:hover:bg-red-50 enabled:hover:text-red-700"
188
+ iconClassName="text-red-400 group-hover:text-red-500"
189
+ isDisabled={isBusy}
190
+ onClick={() => {
191
+ props.onDelete(statusPageResource);
192
+ }}
193
+ />,
194
+ );
195
+ }
196
+
197
+ return (
198
+ <div
199
+ className={ACTIONS_COLUMN_CLASS_NAME}
200
+ data-testid="status-page-resource-row-actions"
201
+ >
202
+ {props.isEditable ? (
203
+ <Button
204
+ buttonSize={ButtonSize.Small}
205
+ buttonStyle={ButtonStyleType.ICON}
206
+ icon={IconProp.Edit}
207
+ title=""
208
+ tooltip="Edit this resource"
209
+ ariaLabel={`Edit ${name}`}
210
+ dataTestId="status-page-resource-row-edit"
211
+ disabled={isBusy}
212
+ className="text-gray-400 hover:bg-gray-200 hover:text-gray-700"
213
+ onClick={() => {
214
+ props.onEdit(statusPageResource);
215
+ }}
216
+ />
217
+ ) : (
218
+ <></>
219
+ )}
220
+
221
+ <MoreMenu
222
+ text={`More actions for ${name}`}
223
+ menuIcon={IconProp.EllipsisHorizontal}
224
+ isDisabled={isBusy}
225
+ elementToBeShownInsteadOfButton={
226
+ <button
227
+ type="button"
228
+ aria-label={`More actions for ${name}`}
229
+ data-testid="status-page-resource-row-more"
230
+ className="flex h-7 w-7 items-center justify-center rounded-md text-gray-400 transition-colors hover:bg-gray-200 hover:text-gray-700 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400"
231
+ >
232
+ <Icon icon={IconProp.EllipsisHorizontal} className="h-5 w-5" />
233
+ </button>
234
+ }
235
+ >
236
+ {menuItems}
237
+ </MoreMenu>
238
+ </div>
239
+ );
240
+ };
241
+
242
+ type RenderRowBodyFunction = (
243
+ statusPageResource: StatusPageResource,
244
+ index: number,
245
+ dragHandle: ReactElement,
246
+ ) => ReactElement;
247
+
248
+ const renderRowBody: RenderRowBodyFunction = (
249
+ statusPageResource: StatusPageResource,
250
+ index: number,
251
+ dragHandle: ReactElement,
252
+ ): ReactElement => {
253
+ const monitorName: string =
254
+ StatusPageResourceExplorerUtil.getResourceName(statusPageResource);
255
+ const displayName: string = statusPageResource.displayName || "";
256
+
257
+ return (
258
+ <>
259
+ {dragHandle}
260
+
261
+ {/*
262
+ * The position visitors see this resource in. The order is the whole
263
+ * point of this list, and until it was numbered the only way to read it
264
+ * was to count rows.
265
+ */}
266
+ <span
267
+ className={`${POSITION_COLUMN_CLASS_NAME} text-gray-400`}
268
+ aria-hidden="true"
269
+ data-testid="status-page-resource-row-position"
270
+ >
271
+ {index + 1}
272
+ </span>
273
+
274
+ <div className={MONITOR_COLUMN_CLASS_NAME}>
275
+ <div
276
+ /*
277
+ * The monitor element draws its name inside a flex span (it may
278
+ * carry an icon), and text-overflow does not reach the anonymous
279
+ * item a flex container makes of its text - so a long name was
280
+ * clipped mid-letter with no ellipsis. Laying that span out as a
281
+ * block puts the name back in an inline formatting context, where
282
+ * truncation means what it says.
283
+ */
284
+ className="truncate text-sm font-medium text-gray-900 [&_span]:block [&_span]:truncate"
285
+ data-testid="status-page-resource-row-name"
286
+ >
287
+ {props.getResourceElement(statusPageResource)}
288
+ </div>
289
+ </div>
290
+
291
+ {/*
292
+ * The display name is what visitors actually read, so it gets a column
293
+ * of its own rather than a second line under the monitor - but only a
294
+ * value when it is not simply the monitor's own name repeated back.
295
+ */}
296
+ <div className={PUBLISHED_NAME_COLUMN_CLASS_NAME}>
297
+ {displayName && displayName !== monitorName ? (
298
+ <p
299
+ className="truncate text-sm text-gray-500"
300
+ title={displayName}
301
+ data-testid="status-page-resource-row-display-name"
302
+ >
303
+ {displayName}
304
+ </p>
305
+ ) : (
306
+ <p className="truncate text-sm text-gray-400">
307
+ Same as the monitor name
308
+ </p>
309
+ )}
310
+ </div>
311
+
312
+ {renderActions(statusPageResource, index)}
313
+ </>
314
+ );
315
+ };
316
+
317
+ type RenderDragHandleFunction = (
318
+ provided: DraggableProvided | null,
319
+ statusPageResource: StatusPageResource,
320
+ ) => ReactElement;
321
+
322
+ const renderDragHandle: RenderDragHandleFunction = (
323
+ provided: DraggableProvided | null,
324
+ statusPageResource: StatusPageResource,
325
+ ): ReactElement => {
326
+ if (!props.isReorderable || !provided) {
327
+ /*
328
+ * The column stays so that a filtered list does not shift sideways the
329
+ * moment a filter is typed.
330
+ */
331
+ return (
332
+ <span className={`${GRIP_COLUMN_CLASS_NAME} h-5`} aria-hidden="true" />
333
+ );
334
+ }
335
+
336
+ return (
337
+ <span
338
+ {...provided.dragHandleProps}
339
+ className={`${GRIP_COLUMN_CLASS_NAME} flex h-6 cursor-grab items-center justify-center rounded text-gray-300 transition-colors hover:bg-gray-200 hover:text-gray-600 group-hover:text-gray-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400 active:cursor-grabbing`}
340
+ data-testid="status-page-resource-row-drag-handle"
341
+ aria-label={`Reorder ${StatusPageResourceExplorerUtil.getResourceName(
342
+ statusPageResource,
343
+ )}`}
344
+ >
345
+ <Icon icon={IconProp.Drag} className="h-4 w-4" />
346
+ </span>
347
+ );
348
+ };
349
+
350
+ type GetRowClassNameFunction = (
351
+ isDragging: boolean,
352
+ isBusy: boolean,
353
+ isLastRow: boolean,
354
+ ) => string;
355
+
356
+ const getRowClassName: GetRowClassNameFunction = (
357
+ isDragging: boolean,
358
+ isBusy: boolean,
359
+ isLastRow: boolean,
360
+ ): string => {
361
+ return `${ROW_CLASS_NAME} ${
362
+ isDragging
363
+ ? /*
364
+ * bg-indigo-50 rather than bg-indigo-50/70: the dark theme remaps the
365
+ * un-suffixed colour tokens and not the transparent ones, so an
366
+ * opacity modifier leaves a light row in a dark list.
367
+ *
368
+ * A lifted row is rounded on all four corners because it is off the
369
+ * list while it is being dragged; a settled one only rounds where the
370
+ * container does, so its hover fill cannot square off the card's own
371
+ * bottom corners.
372
+ */
373
+ "rounded-xl bg-indigo-50 shadow-md ring-1 ring-indigo-200"
374
+ : `bg-white hover:bg-gray-50 ${isLastRow ? "rounded-b-xl" : ""}`
375
+ } ${isBusy ? "opacity-60" : ""}`;
376
+ };
377
+
378
+ type IsLastRowFunction = (index: number) => boolean;
379
+
380
+ /*
381
+ * Only the bottom row of the whole card rounds its corners, and a card that
382
+ * ends in a "show more" footer has no such row.
383
+ */
384
+ const isLastRow: IsLastRowFunction = (index: number): boolean => {
385
+ return hiddenCount === 0 && index === visibleResources.length - 1;
386
+ };
387
+
388
+ type RenderHeaderFunction = () => ReactElement;
389
+
390
+ /*
391
+ * Column headings, from sm up. They are what makes the second column read as
392
+ * "the name visitors see" rather than as a stray subtitle, and they are the
393
+ * only place the position column can be explained at all.
394
+ *
395
+ * Below sm the published name wraps under the monitor instead of sitting
396
+ * beside it, so a header row would be labelling columns that are not there.
397
+ */
398
+ const renderHeader: RenderHeaderFunction = (): ReactElement => {
399
+ return (
400
+ <div
401
+ className="hidden items-center gap-x-3 rounded-t-xl border-b border-gray-200 bg-gray-50 px-4 py-2 text-[11px] font-semibold uppercase tracking-wide text-gray-500 sm:flex"
402
+ data-testid="status-page-resource-list-header"
403
+ aria-hidden="true"
404
+ >
405
+ <span className={GRIP_COLUMN_CLASS_NAME} />
406
+ <span
407
+ className={POSITION_COLUMN_CLASS_NAME}
408
+ title="Position on the status page"
409
+ >
410
+ #
411
+ </span>
412
+ <span className={MONITOR_COLUMN_CLASS_NAME}>Monitor</span>
413
+ <span className={PUBLISHED_NAME_COLUMN_CLASS_NAME}>
414
+ Shown on the status page as
415
+ </span>
416
+ <span className={ACTIONS_COLUMN_CLASS_NAME} />
417
+ </div>
418
+ );
419
+ };
420
+
421
+ type RenderRowsFunction = () => ReactElement;
422
+
423
+ const renderRows: RenderRowsFunction = (): ReactElement => {
424
+ if (!props.isReorderable) {
425
+ return (
426
+ <div
427
+ className="divide-y divide-gray-100"
428
+ data-testid="status-page-resource-rows"
429
+ >
430
+ {visibleResources.map(
431
+ (statusPageResource: StatusPageResource, index: number) => {
432
+ const resourceId: string =
433
+ statusPageResource._id?.toString() || `${index}`;
434
+
435
+ return (
436
+ <div
437
+ key={resourceId}
438
+ data-testid="status-page-resource-row"
439
+ data-resource-id={resourceId}
440
+ className={getRowClassName(
441
+ false,
442
+ props.busyResourceId === resourceId,
443
+ isLastRow(index),
444
+ )}
445
+ >
446
+ {renderRowBody(
447
+ statusPageResource,
448
+ index,
449
+ renderDragHandle(null, statusPageResource),
450
+ )}
451
+ </div>
452
+ );
453
+ },
454
+ )}
455
+ </div>
456
+ );
457
+ }
458
+
459
+ return (
460
+ <DragDropContext
461
+ onDragEnd={(result: DropResult) => {
462
+ if (!result.destination) {
463
+ return;
464
+ }
465
+
466
+ props.onReorder(result.source.index, result.destination.index);
467
+ }}
468
+ >
469
+ <Droppable droppableId={`status-page-resources-${props.listKey}`}>
470
+ {(droppableProvided: DroppableProvided) => {
471
+ return (
472
+ <div
473
+ ref={droppableProvided.innerRef}
474
+ {...droppableProvided.droppableProps}
475
+ className="divide-y divide-gray-100"
476
+ data-testid="status-page-resource-rows"
477
+ >
478
+ {visibleResources.map(
479
+ (statusPageResource: StatusPageResource, index: number) => {
480
+ const resourceId: string =
481
+ statusPageResource._id?.toString() || `${index}`;
482
+
483
+ return (
484
+ <Draggable
485
+ key={resourceId}
486
+ draggableId={resourceId}
487
+ index={index}
488
+ isDragDisabled={props.busyResourceId === resourceId}
489
+ >
490
+ {(
491
+ draggableProvided: DraggableProvided,
492
+ snapshot: DraggableStateSnapshot,
493
+ ) => {
494
+ return (
495
+ <div
496
+ ref={draggableProvided.innerRef}
497
+ {...draggableProvided.draggableProps}
498
+ data-testid="status-page-resource-row"
499
+ data-resource-id={resourceId}
500
+ className={getRowClassName(
501
+ snapshot.isDragging,
502
+ props.busyResourceId === resourceId,
503
+ isLastRow(index),
504
+ )}
505
+ >
506
+ {renderRowBody(
507
+ statusPageResource,
508
+ index,
509
+ renderDragHandle(
510
+ draggableProvided,
511
+ statusPageResource,
512
+ ),
513
+ )}
514
+ </div>
515
+ );
516
+ }}
517
+ </Draggable>
518
+ );
519
+ },
520
+ )}
521
+ {droppableProvided.placeholder}
522
+ </div>
523
+ );
524
+ }}
525
+ </Droppable>
526
+ </DragDropContext>
527
+ );
528
+ };
529
+
530
+ if (props.statusPageResources.length === 0) {
531
+ return props.emptyState;
532
+ }
533
+
534
+ return (
535
+ <div
536
+ /*
537
+ * One bordered card around the whole list rather than a border per row.
538
+ * No overflow-hidden: a dragged row is moved with a transform, and a
539
+ * clipping ancestor would cut it off the moment it left the list.
540
+ */
541
+ className="rounded-xl border border-gray-200 bg-white"
542
+ data-testid="status-page-resource-list"
543
+ >
544
+ {renderHeader()}
545
+ {renderRows()}
546
+
547
+ {hiddenCount > 0 ? (
548
+ <div
549
+ className="rounded-b-xl border-t border-gray-100 bg-gray-50 px-4 py-2.5 text-center [&_button]:md:ml-0"
550
+ data-testid="status-page-resource-list-show-more"
551
+ >
552
+ <Button
553
+ title={`Show ${Math.min(
554
+ hiddenCount,
555
+ StatusPageResourceExplorerUtil.ResourceRowsPerPage,
556
+ ).toLocaleString()} more of ${hiddenCount.toLocaleString()}`}
557
+ icon={IconProp.ChevronDown}
558
+ buttonSize={ButtonSize.Small}
559
+ buttonStyle={ButtonStyleType.NORMAL}
560
+ onClick={props.onShowMore}
561
+ />
562
+ </div>
563
+ ) : (
564
+ <></>
565
+ )}
566
+ </div>
567
+ );
568
+ };
569
+
570
+ export default ResourceList;
@@ -44,6 +44,13 @@
44
44
  --ou-shadow-sm: 0 1px 3px rgb(15 23 42 / 8%);
45
45
  --ou-shadow-md: 0 8px 20px -6px rgb(15 23 42 / 18%);
46
46
  --ou-shadow-lg: 0 18px 40px -12px rgb(15 23 42 / 24%);
47
+ /*
48
+ * The colour a scrolled modal's header and footer cast over the body. Only
49
+ * the colour lives here: the geometry stays in the component, which repeats
50
+ * this value as its own fallback so the shadow survives in the apps that do
51
+ * not load this file.
52
+ */
53
+ --ou-modal-scroll-shadow: rgb(15 23 42 / 35%);
47
54
  }
48
55
 
49
56
  html.dark {
@@ -89,6 +96,11 @@ html.dark {
89
96
  0 0 0 1px rgb(148 163 184 / 10%);
90
97
  --ou-shadow-lg: 0 24px 52px -14px rgb(0 0 0 / 64%),
91
98
  0 0 0 1px rgb(148 163 184 / 12%);
99
+ /*
100
+ * Near-black at 35% is all but invisible against a dark surface, and the
101
+ * scroll shadow is the only thing that says a modal body has more content.
102
+ */
103
+ --ou-modal-scroll-shadow: rgb(0 0 0 / 85%);
92
104
  }
93
105
 
94
106
  html.dark,
@@ -210,6 +222,12 @@ html.dark :is(
210
222
  [class~="active:bg-gray-100"]
211
223
  ):hover,
212
224
  html.dark [class~="active:bg-gray-100"]:active,
225
+ /*
226
+ * A row that gives its keyboard focus the same ground its hover gets. Without
227
+ * this token the light utility survives into the dark theme and paints a
228
+ * near-white bar across whatever it is on - see the status page group tree.
229
+ */
230
+ html.dark [class~="focus-within:bg-gray-100"]:focus-within,
213
231
  html.dark [class~="disabled:bg-gray-100"]:disabled {
214
232
  background-color: var(--ou-surface-tertiary) !important;
215
233
  }
@@ -1,9 +1,16 @@
1
1
  import URL from "../../../Types/API/URL";
2
2
  import type { RequestOptions as CoreRequestOptions } from "../../../Utils/API";
3
3
  import Dictionary from "../../../Types/Dictionary";
4
+ import { JSONObject } from "../../../Types/JSON";
4
5
 
5
6
  export default interface RequestOptions {
6
7
  requestHeaders?: Dictionary<string> | undefined;
7
8
  overrideRequestUrl?: URL | undefined;
8
9
  apiRequestOptions?: CoreRequestOptions | undefined;
10
+ /*
11
+ * Extra top-level fields merged into a list request body before the
12
+ * canonical query/select/sort/groupBy fields. This lets callers attach
13
+ * endpoint-specific context without being able to replace the list query.
14
+ */
15
+ additionalRequestBody?: JSONObject | undefined;
9
16
  }
@@ -292,6 +292,7 @@ export default class ModelAPI {
292
292
  method: HTTPMethod.POST,
293
293
  url: apiUrl,
294
294
  data: {
295
+ ...(requestOptions?.additionalRequestBody || {}),
295
296
  query: JSONFunctions.serialize(query as JSONObject),
296
297
  select: JSONFunctions.serialize(select as JSONObject),
297
298
  sort: JSONFunctions.serialize(sort as JSONObject),
@@ -238,6 +238,7 @@ export default class ModelAPI {
238
238
  method: HTTPMethod.POST,
239
239
  url: apiUrl,
240
240
  data: {
241
+ ...(data.requestOptions?.additionalRequestBody || {}),
241
242
  query: JSONFunctions.serialize(data.query as JSONObject),
242
243
  select: JSONFunctions.serialize(data.select as JSONObject),
243
244
  sort: JSONFunctions.serialize(data.sort as JSONObject),