@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,354 @@
1
+ import IconProp from "../../../Types/Icon/IconProp";
2
+ import StatusPageGroupViewMode from "../../../Types/StatusPage/StatusPageGroupViewMode";
3
+ import StatusPageResourceExplorerUtil, { StatusPageResourceSelectionType, } 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 Tooltip from "../Tooltip/Tooltip";
9
+ import React, { Fragment, useRef, } from "react";
10
+ /*
11
+ * The left hand side of the Resources explorer: the group hierarchy, as
12
+ * somewhere to go AND as the thing being built.
13
+ *
14
+ * Groups used to be managed on a page of their own, which meant the two halves
15
+ * of one job - "make a section" and "put monitors in it" - lived behind
16
+ * different links, and building a status page was a loop of navigating between
17
+ * them. They are one screen now: the tree here is what an operator selects to
18
+ * fill, and the same rows are where a group is created, renamed, moved and
19
+ * deleted.
20
+ *
21
+ * Three controls per row, and they do different things. The chevron opens the
22
+ * group's sub groups; the row itself selects the group, which is what puts its
23
+ * monitors in the pane on the right; the cluster that appears on hover acts on
24
+ * the group. Keeping the first two apart is what lets an operator look inside a
25
+ * branch without losing the group they were working in.
26
+ */
27
+ /*
28
+ * An indent column is exactly as wide as a chevron, and its rail runs down the
29
+ * middle of it, so every rail lands on the centre line of the chevron of the
30
+ * group it descends from, at every depth.
31
+ */
32
+ const INDENT_COLUMN_CLASS_NAME = "relative w-5 flex-shrink-0";
33
+ const RAIL_CLASS_NAME = "absolute inset-y-0 left-2.5 w-px bg-gray-200";
34
+ /* The vertical centre of a row: py-2 (8px) plus half of its 20px line. */
35
+ const CONNECTOR_OFFSET_CLASS_NAME = "top-[1.125rem]";
36
+ /*
37
+ * Every control in a row's hover cluster is the same square with the same glyph
38
+ * size, hover and focus ring, because they read as one cluster and any drift
39
+ * between them is visible at a glance.
40
+ *
41
+ * Native buttons rather than <Button buttonStyle={ICON} />: the overflow trigger
42
+ * has to be one - MoreMenu only enhances a custom trigger in place when it
43
+ * already is a native button - and ButtonStyleType.ICON cannot be talked into
44
+ * matching it from a className, because its padding, its 20px glyph and its
45
+ * indigo-500 offset focus ring are all baked into the style.
46
+ */
47
+ const ROW_ACTION_CLASS_NAME = "flex h-6 w-6 flex-shrink-0 items-center justify-center rounded 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 disabled:pointer-events-none disabled:opacity-40";
48
+ const ROW_SELECTOR = "[data-testid='status-page-resource-navigator-row']";
49
+ const SELECT_SELECTOR = "[data-testid='status-page-resource-navigator-select']";
50
+ const ResourceGroupNavigator = (props) => {
51
+ const isUngroupedSelected = props.selection.type === StatusPageResourceSelectionType.Ungrouped;
52
+ /*
53
+ * Whether a row has anything to act on it with. Every one of these is a
54
+ * property of the screen rather than of a row, so it is worked out once - and
55
+ * the count needs to know, because it is drawn where the cluster lands.
56
+ */
57
+ const hasRowActions = Boolean((props.isCreateable && props.onAddSubGroup) ||
58
+ (props.isEditable && (props.onEditGroup || props.onMoveGroupUp)) ||
59
+ props.onShowGroupId ||
60
+ (props.isDeleteable && props.onDeleteGroup));
61
+ const treeRef = useRef(null);
62
+ /*
63
+ * The arrow keys everybody already knows from a file tree: up and down walk
64
+ * the rows that are on screen, right opens a branch and then steps into it,
65
+ * left closes the branch you are in and then climbs out of it.
66
+ *
67
+ * Without this the only way through a large hierarchy from the keyboard is
68
+ * Tab, which stops on every chevron and every hover action on the way past -
69
+ * three stops per row, and no way to skip a subtree at all.
70
+ */
71
+ const onTreeKeyDown = (event) => {
72
+ var _a, _b, _c;
73
+ const navigationKeys = [
74
+ "ArrowDown",
75
+ "ArrowUp",
76
+ "ArrowRight",
77
+ "ArrowLeft",
78
+ "Home",
79
+ "End",
80
+ ];
81
+ if (!navigationKeys.includes(event.key)) {
82
+ return;
83
+ }
84
+ const rowElements = Array.from(((_a = treeRef.current) === null || _a === void 0 ? void 0 : _a.querySelectorAll(ROW_SELECTOR)) || []);
85
+ const activeElement = document.activeElement;
86
+ const currentIndex = rowElements.findIndex((rowElement) => {
87
+ return (activeElement instanceof Node && rowElement.contains(activeElement));
88
+ });
89
+ if (currentIndex < 0) {
90
+ return;
91
+ }
92
+ const row = props.rows[currentIndex];
93
+ if (!row) {
94
+ return;
95
+ }
96
+ const focusRow = (index) => {
97
+ var _a;
98
+ const target = rowElements[Math.max(0, Math.min(rowElements.length - 1, index))];
99
+ (_a = target === null || target === void 0 ? void 0 : target.querySelector(SELECT_SELECTOR)) === null || _a === void 0 ? void 0 : _a.focus();
100
+ };
101
+ /*
102
+ * Claimed before anything is done with it, so the page does not scroll out
103
+ * from under a tree the operator is walking.
104
+ */
105
+ event.preventDefault();
106
+ if (event.key === "ArrowDown") {
107
+ focusRow(currentIndex + 1);
108
+ return;
109
+ }
110
+ if (event.key === "ArrowUp") {
111
+ focusRow(currentIndex - 1);
112
+ return;
113
+ }
114
+ if (event.key === "Home") {
115
+ focusRow(0);
116
+ return;
117
+ }
118
+ if (event.key === "End") {
119
+ focusRow(rowElements.length - 1);
120
+ return;
121
+ }
122
+ if (event.key === "ArrowRight") {
123
+ if (!row.hasVisibleSubGroups) {
124
+ return;
125
+ }
126
+ if (row.isExpanded) {
127
+ /* Already open, so the first child is the next row drawn. */
128
+ focusRow(currentIndex + 1);
129
+ return;
130
+ }
131
+ props.onToggleExpand(row.id);
132
+ return;
133
+ }
134
+ /* ArrowLeft: close this branch, or climb to the one that contains it. */
135
+ if (row.hasVisibleSubGroups && row.isExpanded) {
136
+ props.onToggleExpand(row.id);
137
+ return;
138
+ }
139
+ for (let index = currentIndex - 1; index >= 0; index--) {
140
+ if (((_c = (_b = props.rows[index]) === null || _b === void 0 ? void 0 : _b.depth) !== null && _c !== void 0 ? _c : 0) < row.depth) {
141
+ focusRow(index);
142
+ return;
143
+ }
144
+ }
145
+ };
146
+ const renderIndent = (row) => {
147
+ if (row.depth <= 0) {
148
+ return React.createElement(React.Fragment, null);
149
+ }
150
+ return (React.createElement(Fragment, null,
151
+ row.ancestorRails.map((doesRailContinue, column) => {
152
+ return (React.createElement("span", { key: `rail-${column}`, "aria-hidden": "true", className: INDENT_COLUMN_CLASS_NAME, "data-testid": "status-page-resource-navigator-rail", "data-rail-continues": doesRailContinue ? "true" : "false" }, doesRailContinue ? React.createElement("span", { className: RAIL_CLASS_NAME }) : React.createElement(React.Fragment, null)));
153
+ }),
154
+ React.createElement("span", { "aria-hidden": "true", className: INDENT_COLUMN_CLASS_NAME, "data-testid": "status-page-resource-navigator-connector", "data-is-last-sibling": row.isLastVisibleSibling ? "true" : "false" },
155
+ React.createElement("span", { className: `absolute left-2.5 top-0 w-px bg-gray-200 ${row.isLastVisibleSibling ? "h-[1.125rem]" : "bottom-0"}` }),
156
+ React.createElement("span", { className: `absolute left-2.5 h-px w-2.5 bg-gray-200 ${CONNECTOR_OFFSET_CLASS_NAME}` }))));
157
+ };
158
+ const renderDisclosure = (row) => {
159
+ if (!row.hasVisibleSubGroups) {
160
+ /*
161
+ * A leaf keeps the column so every name in the navigator starts on the
162
+ * same vertical line whether or not its row can be opened.
163
+ */
164
+ return (React.createElement("span", { className: "h-5 w-5 flex-shrink-0", "aria-hidden": "true", "data-testid": "status-page-resource-navigator-leaf-spacer" }));
165
+ }
166
+ return (React.createElement("button", { type: "button", "aria-label": row.isExpanded
167
+ ? `Collapse ${row.name || "group"}`
168
+ : `Expand ${row.name || "group"}`, "aria-expanded": row.isExpanded, "data-testid": "status-page-resource-navigator-disclosure", className: "flex h-5 w-5 flex-shrink-0 items-center justify-center rounded text-gray-400 transition-colors hover:bg-gray-200 hover:text-gray-600 focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400", onClick: () => {
169
+ props.onToggleExpand(row.id);
170
+ } },
171
+ React.createElement(Icon, { icon: row.isExpanded ? IconProp.ChevronDown : IconProp.ChevronRight, className: "h-4 w-4" })));
172
+ };
173
+ const renderCount = (row, isSelected) => {
174
+ const label = StatusPageResourceExplorerUtil.getNavigatorCountLabel({
175
+ row: row,
176
+ countIndex: props.countIndex,
177
+ });
178
+ if (label === null) {
179
+ return React.createElement(React.Fragment, null);
180
+ }
181
+ return (React.createElement("span", {
182
+ /*
183
+ * A pill rather than loose digits: a bare number at the end of a name
184
+ * reads as part of the name, which on a status page full of "Region
185
+ * 1000" and "Market 1001" is not a theoretical problem.
186
+ *
187
+ * It gives the row up to the action cluster, which is drawn over this
188
+ * end of the row - `invisible` rather than `hidden` so the name is
189
+ * truncated to the same width either way and cannot reflow under the
190
+ * pointer. The cluster's own background cannot be relied on to cover
191
+ * it: the dark theme maps indigo-50 to a translucent fill, and the
192
+ * digits read straight through it.
193
+ */
194
+ className: `flex-shrink-0 rounded-full px-1.5 py-0.5 text-[11px] font-medium tabular-nums ${hasRowActions
195
+ ? "group-hover/nav-row:invisible group-focus-within/nav-row:invisible"
196
+ : ""} ${isSelected
197
+ ? hasRowActions
198
+ ? "invisible"
199
+ : "bg-indigo-100 text-indigo-700"
200
+ : row.ownResourceCount === 0
201
+ ? "bg-gray-100 text-gray-400"
202
+ : "bg-gray-100 text-gray-500"}`, title: StatusPageResourceExplorerUtil.getNavigatorCountTooltip({
203
+ row: row,
204
+ countIndex: props.countIndex,
205
+ }), "data-testid": "status-page-resource-navigator-count" }, label));
206
+ };
207
+ /*
208
+ * The group's own actions. They sit over the right hand end of the row rather
209
+ * than beside the name, so a row is exactly as wide for its name whether or
210
+ * not the pointer is on it - a cluster that pushed the name aside on hover
211
+ * would make every name in a narrow sidebar jump as the pointer travelled
212
+ * down it.
213
+ *
214
+ * bg-inherit is what makes the overlay work: the row underneath is the thing
215
+ * carrying the hover and selected backgrounds, so the cluster is always
216
+ * painted on whatever the row currently is.
217
+ */
218
+ const renderActions = (row, isSelected) => {
219
+ const isBusy = props.busyGroupId === row.id;
220
+ const menuItems = [];
221
+ if (props.isEditable && props.onEditGroup) {
222
+ menuItems.push(React.createElement(MoreMenuItem, { key: "edit", text: "Edit group", icon: IconProp.Edit, isDisabled: isBusy, onClick: () => {
223
+ var _a;
224
+ (_a = props.onEditGroup) === null || _a === void 0 ? void 0 : _a.call(props, row.statusPageGroup);
225
+ } }));
226
+ }
227
+ if (props.isEditable && props.onMoveGroupUp) {
228
+ menuItems.push(React.createElement(MoreMenuItem, { key: "move-up", text: "Move up", icon: IconProp.ArrowUp, isDisabled: isBusy || !row.canMoveUp, onClick: () => {
229
+ var _a;
230
+ (_a = props.onMoveGroupUp) === null || _a === void 0 ? void 0 : _a.call(props, row.statusPageGroup);
231
+ } }));
232
+ }
233
+ if (props.isEditable && props.onMoveGroupDown) {
234
+ menuItems.push(React.createElement(MoreMenuItem, { key: "move-down", text: "Move down", icon: IconProp.ArrowDown, isDisabled: isBusy || !row.canMoveDown, onClick: () => {
235
+ var _a;
236
+ (_a = props.onMoveGroupDown) === null || _a === void 0 ? void 0 : _a.call(props, row.statusPageGroup);
237
+ } }));
238
+ }
239
+ if (props.onShowGroupId) {
240
+ menuItems.push(React.createElement(MoreMenuItem, { key: "show-id", text: "Show ID", icon: IconProp.Info, onClick: () => {
241
+ var _a;
242
+ (_a = props.onShowGroupId) === null || _a === void 0 ? void 0 : _a.call(props, row.statusPageGroup);
243
+ } }));
244
+ }
245
+ if (props.isDeleteable && props.onDeleteGroup) {
246
+ menuItems.push(React.createElement(MoreMenuItem, { key: "delete", text: "Delete group", icon: IconProp.Trash, className: "text-red-600 enabled:hover:bg-red-50 enabled:hover:text-red-700", iconClassName: "text-red-400 group-hover:text-red-500", isDisabled: isBusy, onClick: () => {
247
+ var _a;
248
+ (_a = props.onDeleteGroup) === null || _a === void 0 ? void 0 : _a.call(props, row.statusPageGroup);
249
+ } }));
250
+ }
251
+ const canAddSubGroup = Boolean(props.isCreateable && props.onAddSubGroup);
252
+ if (!canAddSubGroup && menuItems.length === 0) {
253
+ return React.createElement(React.Fragment, null);
254
+ }
255
+ return (React.createElement("div", {
256
+ /*
257
+ * The selected row keeps its actions on screen. Hover is the discovery
258
+ * affordance, not the only one: a touch screen has no hover at all, and
259
+ * the row an operator is working in is precisely the one they are most
260
+ * likely to want to act on. Its count is the thing given up for it, and
261
+ * the pane beside it is already showing that number.
262
+ */
263
+ className: `absolute inset-y-0 right-0 items-center gap-0.5 rounded-r-md pl-4 pr-1 group-hover/nav-row:flex group-focus-within/nav-row:flex ${isSelected ? "flex bg-indigo-50" : "hidden bg-gray-100"}`, "data-testid": "status-page-resource-navigator-actions" },
264
+ canAddSubGroup ? (React.createElement(Tooltip, { text: "Add a sub group inside this group" },
265
+ React.createElement("button", { type: "button", "aria-label": `Add a sub group inside ${row.name || "this group"}`, "data-testid": "status-page-resource-navigator-add-sub-group", disabled: isBusy, className: ROW_ACTION_CLASS_NAME, onClick: () => {
266
+ var _a;
267
+ (_a = props.onAddSubGroup) === null || _a === void 0 ? void 0 : _a.call(props, row.statusPageGroup);
268
+ } },
269
+ React.createElement(Icon, { icon: IconProp.FolderPlus, className: "h-3.5 w-3.5" })))) : (React.createElement(React.Fragment, null)),
270
+ menuItems.length > 0 ? (React.createElement(MoreMenu, { ariaLabel: `More actions for ${row.name || "this group"}`, isDisabled: isBusy, elementToBeShownInsteadOfButton: React.createElement("button", { type: "button", "data-testid": "status-page-resource-navigator-more", className: ROW_ACTION_CLASS_NAME },
271
+ React.createElement(Icon, { icon: IconProp.EllipsisHorizontal, className: "h-4 w-4" })) }, menuItems)) : (React.createElement(React.Fragment, null))));
272
+ };
273
+ const renderRow = (row) => {
274
+ const isSelected = props.selection.type === StatusPageResourceSelectionType.Group &&
275
+ props.selection.statusPageGroupId === row.id;
276
+ const isBusy = props.busyGroupId === row.id;
277
+ return (React.createElement("div", { key: row.id, role: "treeitem", "aria-level": row.depth + 1, "aria-posinset": row.visibleSiblingIndex + 1, "aria-setsize": row.visibleSiblingCount, "aria-expanded": row.hasVisibleSubGroups ? row.isExpanded : undefined, "aria-selected": isSelected, "aria-busy": isBusy ? true : undefined, "data-testid": "status-page-resource-navigator-row", "data-group-id": row.id, "data-depth": row.depth, "data-selected": isSelected ? "true" : "false", "data-view-mode": row.viewMode || StatusPageGroupViewMode.List, className: `group/nav-row relative flex items-stretch rounded-lg transition-colors ${isSelected
278
+ ? "bg-indigo-50"
279
+ : "hover:bg-gray-100 focus-within:bg-gray-100"} ${isBusy ? "opacity-60" : ""}` },
280
+ renderIndent(row),
281
+ React.createElement("div", { className: "flex min-w-0 flex-1 items-center gap-1" },
282
+ renderDisclosure(row),
283
+ React.createElement("button", { type: "button", "data-testid": "status-page-resource-navigator-select", className: `flex min-w-0 flex-1 items-center gap-2 rounded-lg py-2 pl-1 pr-2 text-left focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400 ${isSelected ? "text-indigo-700" : "text-gray-700"}`, onClick: () => {
284
+ props.onSelect({
285
+ type: StatusPageResourceSelectionType.Group,
286
+ statusPageGroupId: row.id,
287
+ });
288
+ } },
289
+ React.createElement(Icon, { icon: row.viewMode === StatusPageGroupViewMode.Grid
290
+ ? IconProp.Grid
291
+ : row.hasSubGroups && row.isExpanded
292
+ ? IconProp.FolderOpen
293
+ : IconProp.Folder, className: `h-4 w-4 flex-shrink-0 ${isSelected
294
+ ? "text-indigo-500"
295
+ : row.hasSubGroups
296
+ ? "text-gray-400"
297
+ : "text-gray-300"}` }),
298
+ React.createElement("span", { className: `min-w-0 flex-1 truncate text-sm ${isSelected ? "font-semibold" : "font-medium"} ${
299
+ /*
300
+ * A row that is only on screen to give a match its place in the
301
+ * hierarchy is context, not a result.
302
+ */
303
+ row.isSearchMatch ? "" : "text-gray-400"}`, title: row.name || "Untitled group", "data-testid": "status-page-resource-navigator-name" }, row.name || "Untitled group"),
304
+ renderCount(row, isSelected))),
305
+ renderActions(row, isSelected)));
306
+ };
307
+ /*
308
+ * The resources that belong to no group. "Top of page" rather than
309
+ * "Uncategorized": on the public status page these are drawn first, above
310
+ * every group, so where they appear is the useful thing to know about them -
311
+ * and it is a place an operator can picture, which "uncategorized" is not.
312
+ */
313
+ const renderUngroupedRow = () => {
314
+ return (React.createElement("button", { type: "button", "data-testid": "status-page-resource-navigator-ungrouped", title: "Resources that are not in any group. Visitors see these first, above every group.", "aria-current": isUngroupedSelected ? "true" : undefined, className: `flex w-full items-center gap-2 rounded-lg py-2 pl-2 pr-2 text-left transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-400 ${isUngroupedSelected
315
+ ? "bg-indigo-50 text-indigo-700"
316
+ : "text-gray-700 hover:bg-gray-100"}`, onClick: () => {
317
+ props.onSelect({
318
+ type: StatusPageResourceSelectionType.Ungrouped,
319
+ statusPageGroupId: null,
320
+ });
321
+ } },
322
+ React.createElement(Icon, { icon: IconProp.List, className: `h-4 w-4 flex-shrink-0 ${isUngroupedSelected ? "text-indigo-500" : "text-gray-400"}` }),
323
+ React.createElement("span", { className: `min-w-0 flex-1 truncate text-sm ${isUngroupedSelected ? "font-semibold" : "font-medium"}` }, "Top of page"),
324
+ props.countIndex.isComplete ? (React.createElement("span", { className: `flex-shrink-0 rounded-full px-1.5 py-0.5 text-[11px] font-medium tabular-nums ${isUngroupedSelected
325
+ ? "bg-indigo-100 text-indigo-700"
326
+ : props.countIndex.ungroupedCount === 0
327
+ ? "bg-gray-100 text-gray-400"
328
+ : "bg-gray-100 text-gray-500"}`, title: `${props.countIndex.ungroupedCount.toLocaleString()} ${props.countIndex.ungroupedCount === 1 ? "resource" : "resources"} that are not in any group`, "data-testid": "status-page-resource-navigator-ungrouped-count" }, props.countIndex.ungroupedCount.toLocaleString())) : (React.createElement(React.Fragment, null))));
329
+ };
330
+ const renderGroups = () => {
331
+ if (props.rows.length === 0) {
332
+ return (React.createElement("p", { className: "rounded-lg border border-dashed border-gray-300 px-3 py-3 text-xs text-gray-500", role: "status", "data-testid": "status-page-resource-navigator-empty" }, props.searchText
333
+ ? `No groups match “${props.searchText}”.`
334
+ : "No groups yet. Groups split a longer status page into sections, and they can be nested."));
335
+ }
336
+ return (React.createElement(Fragment, null,
337
+ React.createElement("div", { ref: treeRef, role: "tree", "aria-label": "Status page groups", "data-testid": "status-page-resource-navigator-tree", className: "space-y-0.5", onKeyDown: onTreeKeyDown }, props.rows.map((row) => {
338
+ return renderRow(row);
339
+ })),
340
+ props.hiddenRowCount > 0 ? (React.createElement("div", { className: "px-1 pt-2 [&_button]:md:ml-0", "data-testid": "status-page-resource-navigator-show-more" },
341
+ React.createElement(Button, { title: `Show ${Math.min(props.hiddenRowCount, StatusPageResourceExplorerUtil.NavigatorRowsPerPage).toLocaleString()} more of ${props.hiddenRowCount.toLocaleString()}`, icon: IconProp.ChevronDown, buttonSize: ButtonSize.Small, buttonStyle: ButtonStyleType.NORMAL, onClick: props.onShowMore }))) : (React.createElement(React.Fragment, null))));
342
+ };
343
+ return (React.createElement("div", { "data-testid": "status-page-resource-navigator" },
344
+ renderUngroupedRow(),
345
+ React.createElement("div", { className: "mt-3 border-t border-gray-200 pt-3" },
346
+ React.createElement("div", { className: "flex items-center justify-between gap-2 px-1.5 pb-1.5" },
347
+ React.createElement("p", { className: "text-[11px] font-semibold uppercase tracking-wide text-gray-500" }, "Groups"),
348
+ props.isCreateable && props.onCreateGroup ? (React.createElement(Tooltip, { text: "Create a top level group" },
349
+ React.createElement("button", { type: "button", "aria-label": "Create a top level group", "data-testid": "status-page-resource-navigator-create-group", className: ROW_ACTION_CLASS_NAME, onClick: props.onCreateGroup },
350
+ React.createElement(Icon, { icon: IconProp.Add, className: "h-4 w-4" })))) : (React.createElement(React.Fragment, null))),
351
+ renderGroups())));
352
+ };
353
+ export default ResourceGroupNavigator;
354
+ //# sourceMappingURL=ResourceGroupNavigator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceGroupNavigator.js","sourceRoot":"","sources":["../../../../../UI/Components/StatusPage/ResourceGroupNavigator.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ import IconProp from "../../../Types/Icon/IconProp";
2
+ import StatusPageResourceExplorerUtil from "../../../Utils/StatusPage/ResourceExplorer";
3
+ import Button, { ButtonSize, ButtonStyleType } from "../Button/Button";
4
+ import Icon from "../Icon/Icon";
5
+ import MoreMenu from "../MoreMenu/MoreMenu";
6
+ import MoreMenuItem from "../MoreMenu/MoreMenuItem";
7
+ import React from "react";
8
+ import { DragDropContext, Draggable, Droppable, } from "react-beautiful-dnd";
9
+ /*
10
+ * The resources of one status page group, as the list they are.
11
+ *
12
+ * This used to be a ModelTable, mounted inside a row of a tree of other groups:
13
+ * a card with its own title, description, create button and overflow menu, a
14
+ * checkbox column, a sortable header and a pagination footer, all to show two
15
+ * columns of at most a few dozen rows. Everything about that chrome was a
16
+ * second, competing frame around content that was already inside one, and the
17
+ * deeper the group sat the more it read as a page inside a page.
18
+ *
19
+ * What is actually being edited here is a short ordered list, and the order is
20
+ * the point - it is the order visitors see. So it is drawn as an ordered list
21
+ * with a grip on each row, and everything else (creating, filtering, the group
22
+ * this belongs to) lives once, in the pane header above it.
23
+ *
24
+ * It is drawn in columns rather than as free floating rows. A dashboard pane is
25
+ * as wide as the window, and a row holding one short name on the left and two
26
+ * icons on the right leaves a metre of empty white between the thing and the
27
+ * buttons that act on it - which is both ugly and a long way for the eye to
28
+ * travel. So the row carries what an operator actually wants to compare down
29
+ * the column: the position visitors see it in, the monitor, and the name it is
30
+ * published under.
31
+ */
32
+ /*
33
+ * One set of column widths, used by the header and by every row, so the two
34
+ * cannot drift apart. The published-name column takes the whole row on a phone
35
+ * (basis-full) and shares the width from sm up, which keeps it a single element
36
+ * rather than one copy per breakpoint.
37
+ */
38
+ const GRIP_COLUMN_CLASS_NAME = "w-5 flex-shrink-0";
39
+ /*
40
+ * Held back on a phone, where 24px of number costs a fifth of what is left for
41
+ * the monitor's name and the rows are already in the order it describes.
42
+ */
43
+ const POSITION_COLUMN_CLASS_NAME = "hidden w-6 flex-shrink-0 text-right text-xs tabular-nums sm:block";
44
+ const MONITOR_COLUMN_CLASS_NAME = "min-w-0 flex-[2_1_0%]";
45
+ /*
46
+ * Its own line on a phone, indented to sit under the monitor it renames rather
47
+ * than out beneath the grip; beside the monitor from sm up.
48
+ *
49
+ * order-last is what keeps the row's buttons up on the first line with the
50
+ * monitor: a full width column wraps everything after it, and the buttons are
51
+ * after it in the markup because that is the order they are read in.
52
+ */
53
+ const PUBLISHED_NAME_COLUMN_CLASS_NAME = "order-last min-w-0 flex-[3_1_100%] pl-8 sm:order-none sm:flex-[3_1_0%] sm:pl-0";
54
+ const ACTIONS_COLUMN_CLASS_NAME = "flex w-[3.75rem] flex-shrink-0 items-center justify-end gap-0.5";
55
+ const ROW_CLASS_NAME = "group flex flex-wrap items-center gap-x-3 gap-y-1 px-4 py-3 transition-colors";
56
+ const ResourceList = (props) => {
57
+ const visibleResources = props.statusPageResources.slice(0, props.visibleCount);
58
+ const hiddenCount = props.statusPageResources.length - visibleResources.length;
59
+ const renderActions = (statusPageResource, index) => {
60
+ var _a;
61
+ const resourceId = ((_a = statusPageResource._id) === null || _a === void 0 ? void 0 : _a.toString()) || "";
62
+ const isBusy = props.busyResourceId === resourceId;
63
+ const name = StatusPageResourceExplorerUtil.getResourceName(statusPageResource);
64
+ const menuItems = [];
65
+ if (props.isReorderable) {
66
+ /*
67
+ * The same move a drag makes, reachable from the keyboard and from a
68
+ * touch screen - neither of which has anywhere to drag to.
69
+ */
70
+ menuItems.push(React.createElement(MoreMenuItem, { key: "move-up", text: "Move up", icon: IconProp.ArrowUp, isDisabled: isBusy || index === 0, onClick: () => {
71
+ props.onReorder(index, index - 1);
72
+ } }));
73
+ menuItems.push(React.createElement(MoreMenuItem, { key: "move-down", text: "Move down", icon: IconProp.ArrowDown, isDisabled: isBusy || index === props.statusPageResources.length - 1, onClick: () => {
74
+ props.onReorder(index, index + 1);
75
+ } }));
76
+ }
77
+ menuItems.push(React.createElement(MoreMenuItem, { key: "show-id", text: "Show ID", icon: IconProp.Info, onClick: () => {
78
+ props.onShowId(statusPageResource);
79
+ } }));
80
+ if (props.isDeleteable) {
81
+ menuItems.push(React.createElement(MoreMenuItem, { key: "delete", text: "Remove from status page", icon: IconProp.Trash, className: "text-red-600 enabled:hover:bg-red-50 enabled:hover:text-red-700", iconClassName: "text-red-400 group-hover:text-red-500", isDisabled: isBusy, onClick: () => {
82
+ props.onDelete(statusPageResource);
83
+ } }));
84
+ }
85
+ return (React.createElement("div", { className: ACTIONS_COLUMN_CLASS_NAME, "data-testid": "status-page-resource-row-actions" },
86
+ props.isEditable ? (React.createElement(Button, { buttonSize: ButtonSize.Small, buttonStyle: ButtonStyleType.ICON, icon: IconProp.Edit, title: "", tooltip: "Edit this resource", ariaLabel: `Edit ${name}`, dataTestId: "status-page-resource-row-edit", disabled: isBusy, className: "text-gray-400 hover:bg-gray-200 hover:text-gray-700", onClick: () => {
87
+ props.onEdit(statusPageResource);
88
+ } })) : (React.createElement(React.Fragment, null)),
89
+ React.createElement(MoreMenu, { text: `More actions for ${name}`, menuIcon: IconProp.EllipsisHorizontal, isDisabled: isBusy, elementToBeShownInsteadOfButton: React.createElement("button", { type: "button", "aria-label": `More actions for ${name}`, "data-testid": "status-page-resource-row-more", 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" },
90
+ React.createElement(Icon, { icon: IconProp.EllipsisHorizontal, className: "h-5 w-5" })) }, menuItems)));
91
+ };
92
+ const renderRowBody = (statusPageResource, index, dragHandle) => {
93
+ const monitorName = StatusPageResourceExplorerUtil.getResourceName(statusPageResource);
94
+ const displayName = statusPageResource.displayName || "";
95
+ return (React.createElement(React.Fragment, null,
96
+ dragHandle,
97
+ React.createElement("span", { className: `${POSITION_COLUMN_CLASS_NAME} text-gray-400`, "aria-hidden": "true", "data-testid": "status-page-resource-row-position" }, index + 1),
98
+ React.createElement("div", { className: MONITOR_COLUMN_CLASS_NAME },
99
+ React.createElement("div", {
100
+ /*
101
+ * The monitor element draws its name inside a flex span (it may
102
+ * carry an icon), and text-overflow does not reach the anonymous
103
+ * item a flex container makes of its text - so a long name was
104
+ * clipped mid-letter with no ellipsis. Laying that span out as a
105
+ * block puts the name back in an inline formatting context, where
106
+ * truncation means what it says.
107
+ */
108
+ className: "truncate text-sm font-medium text-gray-900 [&_span]:block [&_span]:truncate", "data-testid": "status-page-resource-row-name" }, props.getResourceElement(statusPageResource))),
109
+ React.createElement("div", { className: PUBLISHED_NAME_COLUMN_CLASS_NAME }, displayName && displayName !== monitorName ? (React.createElement("p", { className: "truncate text-sm text-gray-500", title: displayName, "data-testid": "status-page-resource-row-display-name" }, displayName)) : (React.createElement("p", { className: "truncate text-sm text-gray-400" }, "Same as the monitor name"))),
110
+ renderActions(statusPageResource, index)));
111
+ };
112
+ const renderDragHandle = (provided, statusPageResource) => {
113
+ if (!props.isReorderable || !provided) {
114
+ /*
115
+ * The column stays so that a filtered list does not shift sideways the
116
+ * moment a filter is typed.
117
+ */
118
+ return (React.createElement("span", { className: `${GRIP_COLUMN_CLASS_NAME} h-5`, "aria-hidden": "true" }));
119
+ }
120
+ return (React.createElement("span", Object.assign({}, provided.dragHandleProps, { 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`, "data-testid": "status-page-resource-row-drag-handle", "aria-label": `Reorder ${StatusPageResourceExplorerUtil.getResourceName(statusPageResource)}` }),
121
+ React.createElement(Icon, { icon: IconProp.Drag, className: "h-4 w-4" })));
122
+ };
123
+ const getRowClassName = (isDragging, isBusy, isLastRow) => {
124
+ return `${ROW_CLASS_NAME} ${isDragging
125
+ ? /*
126
+ * bg-indigo-50 rather than bg-indigo-50/70: the dark theme remaps the
127
+ * un-suffixed colour tokens and not the transparent ones, so an
128
+ * opacity modifier leaves a light row in a dark list.
129
+ *
130
+ * A lifted row is rounded on all four corners because it is off the
131
+ * list while it is being dragged; a settled one only rounds where the
132
+ * container does, so its hover fill cannot square off the card's own
133
+ * bottom corners.
134
+ */
135
+ "rounded-xl bg-indigo-50 shadow-md ring-1 ring-indigo-200"
136
+ : `bg-white hover:bg-gray-50 ${isLastRow ? "rounded-b-xl" : ""}`} ${isBusy ? "opacity-60" : ""}`;
137
+ };
138
+ /*
139
+ * Only the bottom row of the whole card rounds its corners, and a card that
140
+ * ends in a "show more" footer has no such row.
141
+ */
142
+ const isLastRow = (index) => {
143
+ return hiddenCount === 0 && index === visibleResources.length - 1;
144
+ };
145
+ /*
146
+ * Column headings, from sm up. They are what makes the second column read as
147
+ * "the name visitors see" rather than as a stray subtitle, and they are the
148
+ * only place the position column can be explained at all.
149
+ *
150
+ * Below sm the published name wraps under the monitor instead of sitting
151
+ * beside it, so a header row would be labelling columns that are not there.
152
+ */
153
+ const renderHeader = () => {
154
+ return (React.createElement("div", { 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", "data-testid": "status-page-resource-list-header", "aria-hidden": "true" },
155
+ React.createElement("span", { className: GRIP_COLUMN_CLASS_NAME }),
156
+ React.createElement("span", { className: POSITION_COLUMN_CLASS_NAME, title: "Position on the status page" }, "#"),
157
+ React.createElement("span", { className: MONITOR_COLUMN_CLASS_NAME }, "Monitor"),
158
+ React.createElement("span", { className: PUBLISHED_NAME_COLUMN_CLASS_NAME }, "Shown on the status page as"),
159
+ React.createElement("span", { className: ACTIONS_COLUMN_CLASS_NAME })));
160
+ };
161
+ const renderRows = () => {
162
+ if (!props.isReorderable) {
163
+ return (React.createElement("div", { className: "divide-y divide-gray-100", "data-testid": "status-page-resource-rows" }, visibleResources.map((statusPageResource, index) => {
164
+ var _a;
165
+ const resourceId = ((_a = statusPageResource._id) === null || _a === void 0 ? void 0 : _a.toString()) || `${index}`;
166
+ return (React.createElement("div", { key: resourceId, "data-testid": "status-page-resource-row", "data-resource-id": resourceId, className: getRowClassName(false, props.busyResourceId === resourceId, isLastRow(index)) }, renderRowBody(statusPageResource, index, renderDragHandle(null, statusPageResource))));
167
+ })));
168
+ }
169
+ return (React.createElement(DragDropContext, { onDragEnd: (result) => {
170
+ if (!result.destination) {
171
+ return;
172
+ }
173
+ props.onReorder(result.source.index, result.destination.index);
174
+ } },
175
+ React.createElement(Droppable, { droppableId: `status-page-resources-${props.listKey}` }, (droppableProvided) => {
176
+ return (React.createElement("div", Object.assign({ ref: droppableProvided.innerRef }, droppableProvided.droppableProps, { className: "divide-y divide-gray-100", "data-testid": "status-page-resource-rows" }),
177
+ visibleResources.map((statusPageResource, index) => {
178
+ var _a;
179
+ const resourceId = ((_a = statusPageResource._id) === null || _a === void 0 ? void 0 : _a.toString()) || `${index}`;
180
+ return (React.createElement(Draggable, { key: resourceId, draggableId: resourceId, index: index, isDragDisabled: props.busyResourceId === resourceId }, (draggableProvided, snapshot) => {
181
+ return (React.createElement("div", Object.assign({ ref: draggableProvided.innerRef }, draggableProvided.draggableProps, { "data-testid": "status-page-resource-row", "data-resource-id": resourceId, className: getRowClassName(snapshot.isDragging, props.busyResourceId === resourceId, isLastRow(index)) }), renderRowBody(statusPageResource, index, renderDragHandle(draggableProvided, statusPageResource))));
182
+ }));
183
+ }),
184
+ droppableProvided.placeholder));
185
+ })));
186
+ };
187
+ if (props.statusPageResources.length === 0) {
188
+ return props.emptyState;
189
+ }
190
+ return (React.createElement("div", {
191
+ /*
192
+ * One bordered card around the whole list rather than a border per row.
193
+ * No overflow-hidden: a dragged row is moved with a transform, and a
194
+ * clipping ancestor would cut it off the moment it left the list.
195
+ */
196
+ className: "rounded-xl border border-gray-200 bg-white", "data-testid": "status-page-resource-list" },
197
+ renderHeader(),
198
+ renderRows(),
199
+ hiddenCount > 0 ? (React.createElement("div", { className: "rounded-b-xl border-t border-gray-100 bg-gray-50 px-4 py-2.5 text-center [&_button]:md:ml-0", "data-testid": "status-page-resource-list-show-more" },
200
+ React.createElement(Button, { title: `Show ${Math.min(hiddenCount, StatusPageResourceExplorerUtil.ResourceRowsPerPage).toLocaleString()} more of ${hiddenCount.toLocaleString()}`, icon: IconProp.ChevronDown, buttonSize: ButtonSize.Small, buttonStyle: ButtonStyleType.NORMAL, onClick: props.onShowMore }))) : (React.createElement(React.Fragment, null))));
201
+ };
202
+ export default ResourceList;
203
+ //# sourceMappingURL=ResourceList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceList.js","sourceRoot":"","sources":["../../../../../UI/Components/StatusPage/ResourceList.tsx"],"names":[],"mappings":"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"}
@@ -137,12 +137,7 @@ export default class ModelAPI {
137
137
  const result = await API.fetch({
138
138
  method: HTTPMethod.POST,
139
139
  url: apiUrl,
140
- data: {
141
- query: JSONFunctions.serialize(query),
142
- select: JSONFunctions.serialize(select),
143
- sort: JSONFunctions.serialize(sort),
144
- groupBy: JSONFunctions.serialize(groupBy),
145
- },
140
+ data: Object.assign(Object.assign({}, ((requestOptions === null || requestOptions === void 0 ? void 0 : requestOptions.additionalRequestBody) || {})), { query: JSONFunctions.serialize(query), select: JSONFunctions.serialize(select), sort: JSONFunctions.serialize(sort), groupBy: JSONFunctions.serialize(groupBy) }),
146
141
  headers,
147
142
  params: {
148
143
  limit: limit.toString(),