@oneuptime/common 11.7.2 → 11.7.4

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 (414) hide show
  1. package/Models/AnalyticsModels/KubernetesCostAllocation.ts +103 -0
  2. package/Models/DatabaseModels/AlertEpisodeStateTimeline.ts +1 -0
  3. package/Models/DatabaseModels/AlertStateTimeline.ts +1 -0
  4. package/Models/DatabaseModels/IncidentEpisodeStateTimeline.ts +1 -0
  5. package/Models/DatabaseModels/IncidentStateTimeline.ts +1 -0
  6. package/Models/DatabaseModels/Index.ts +5 -0
  7. package/Models/DatabaseModels/LogDropFilter.ts +89 -0
  8. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +13 -3
  9. package/Models/DatabaseModels/RecommendationDismissal.ts +463 -0
  10. package/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.ts +1 -0
  11. package/Models/DatabaseModels/StatusPageGroup.ts +95 -0
  12. package/Models/DatabaseModels/TableView.ts +40 -0
  13. package/Models/DatabaseModels/TraceDropFilter.ts +89 -0
  14. package/Models/DatabaseModels/WorkflowVariable.ts +5 -1
  15. package/Server/API/AlertAPI.ts +32 -17
  16. package/Server/API/BaseAPI.ts +31 -2
  17. package/Server/API/BaseAnalyticsAPI.ts +36 -2
  18. package/Server/API/CommonAPI.ts +57 -0
  19. package/Server/API/IncidentAPI.ts +60 -33
  20. package/Server/API/IncidentEpisodeAPI.ts +31 -16
  21. package/Server/API/MonitorAPI.ts +30 -0
  22. package/Server/API/MonitorTemplateAPI.ts +8 -0
  23. package/Server/API/ProbeAPI.ts +196 -15
  24. package/Server/API/ProjectAPI.ts +79 -1
  25. package/Server/API/ScheduledMaintenanceAPI.ts +33 -18
  26. package/Server/API/StatusPageAPI.ts +74 -37
  27. package/Server/API/WorkspaceNotificationRuleAPI.ts +34 -4
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.ts +13 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.ts +527 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.ts +31 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.ts +55 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.ts +53 -0
  33. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  34. package/Server/Services/AlertEpisodeService.ts +47 -0
  35. package/Server/Services/AlertService.ts +125 -0
  36. package/Server/Services/BillingService.ts +98 -0
  37. package/Server/Services/DatabaseService.ts +184 -20
  38. package/Server/Services/IncidentEpisodeService.ts +47 -0
  39. package/Server/Services/IncidentService.ts +123 -0
  40. package/Server/Services/IncidentTemplateService.ts +123 -1
  41. package/Server/Services/Index.ts +2 -0
  42. package/Server/Services/LogDropFilterService.ts +133 -0
  43. package/Server/Services/MonitorProbeService.ts +94 -4
  44. package/Server/Services/MonitorService.ts +48 -43
  45. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +70 -0
  46. package/Server/Services/ProbeService.ts +66 -0
  47. package/Server/Services/ProjectService.ts +131 -7
  48. package/Server/Services/RecommendationDismissalService.ts +52 -0
  49. package/Server/Services/RunbookAgentJobService.ts +68 -7
  50. package/Server/Services/ScheduledMaintenanceService.ts +103 -0
  51. package/Server/Services/ScheduledMaintenanceTemplateService.ts +90 -0
  52. package/Server/Services/StatusPageGroupService.ts +186 -0
  53. package/Server/Services/TraceDropFilterService.ts +133 -0
  54. package/Server/Types/Workflow/Components/API/Delete.ts +12 -0
  55. package/Server/Types/Workflow/Components/API/Get.ts +12 -0
  56. package/Server/Types/Workflow/Components/API/Patch.ts +12 -0
  57. package/Server/Types/Workflow/Components/API/Post.ts +12 -0
  58. package/Server/Types/Workflow/Components/API/Put.ts +13 -0
  59. package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +212 -0
  60. package/Server/Utils/DropFilterValidation.ts +127 -0
  61. package/Server/Utils/Errors.ts +5 -0
  62. package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
  63. package/Server/Utils/Monitor/MonitorIncident.ts +31 -2
  64. package/Server/Utils/Telemetry/AppMetrics.ts +31 -0
  65. package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +16 -0
  66. package/Tests/Models/DatabaseModels/MonitorProbeColumnAccessControl.test.ts +196 -0
  67. package/Tests/Models/RecommendationDismissalModel.test.ts +269 -0
  68. package/Tests/Server/API/BaseAPIUpdatePayloadValidation.test.ts +320 -0
  69. package/Tests/Server/API/BaseAnalyticsAPIUpdatePayloadValidation.test.ts +293 -0
  70. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +164 -0
  71. package/Tests/Server/API/ProbeAPI.test.ts +422 -53
  72. package/Tests/Server/API/ProjectAPI.test.ts +180 -0
  73. package/Tests/Server/API/ProjectAPIExtendTrialBillingDisabled.test.ts +138 -0
  74. package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +458 -0
  75. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +359 -0
  76. package/Tests/Server/Infrastructure/ProcessSignalDelivery.test.ts +427 -0
  77. package/Tests/Server/Services/BillingServiceExtendTrial.test.ts +439 -0
  78. package/Tests/Server/Services/CrossProjectReferenceWriteGuard.test.ts +810 -0
  79. package/Tests/Server/Services/DatabaseServiceAtomicAddToColumns.test.ts +269 -0
  80. package/Tests/Server/Services/DatabaseServiceEmptyUpdate.test.ts +277 -0
  81. package/Tests/Server/Services/DatabaseServiceSortColumnSelect.test.ts +201 -0
  82. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +81 -23
  83. package/Tests/Server/Services/DropFilterSaveValidation.test.ts +398 -0
  84. package/Tests/Server/Services/MonitorProbeDeleteHooks.test.ts +280 -0
  85. package/Tests/Server/Services/MonitorProbeServiceProbeTenancy.test.ts +304 -0
  86. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +262 -0
  87. package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +614 -0
  88. package/Tests/Server/Services/RecommendationDismissalService.test.ts +306 -0
  89. package/Tests/Server/Services/RepairCrossProjectIncidentReferencesMigration.test.ts +528 -0
  90. package/Tests/Server/Services/StatusPageGroupNesting.test.ts +395 -0
  91. package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +26 -21
  92. package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +227 -0
  93. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +285 -0
  94. package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +463 -0
  95. package/Tests/Server/Utils/DropFilterValidation.test.ts +269 -0
  96. package/Tests/Server/Utils/Telemetry/SpanUtil.test.ts +94 -0
  97. package/Tests/Types/DateUserTimezone.test.ts +52 -0
  98. package/Tests/Types/JSONFunctions.test.ts +103 -1
  99. package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +177 -9
  100. package/Tests/Types/Monitor/MonitorStepDnsMonitor.test.ts +105 -0
  101. package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +131 -0
  102. package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +60 -0
  103. package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +82 -0
  104. package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +268 -0
  105. package/Tests/Types/Monitor/MonitorStepMetricMonitor.test.ts +386 -0
  106. package/Tests/Types/Monitor/MonitorStepProfileMonitor.test.ts +185 -0
  107. package/Tests/Types/Monitor/MonitorStepSnmpMonitor.test.ts +156 -0
  108. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +371 -0
  109. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +901 -0
  110. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +607 -0
  111. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +754 -0
  112. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +960 -0
  113. package/Tests/Types/RollingTime/RollingTimeUtil.test.ts +186 -0
  114. package/Tests/Types/Runbook/RunbookStepTimeout.test.ts +410 -0
  115. package/Tests/Types/Telemetry/DropFilterSampling.test.ts +241 -0
  116. package/Tests/Types/Workspace/NotificationRuleConditionUtil.test.ts +353 -0
  117. package/Tests/Types/Workspace/NotificationRuleUtil.test.ts +566 -0
  118. package/Tests/UI/Components/CodeEditor.test.tsx +174 -0
  119. package/Tests/UI/Components/ErrorBoundary.test.tsx +555 -24
  120. package/Tests/UI/Components/InfoCard.test.tsx +358 -0
  121. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +138 -0
  122. package/Tests/UI/Components/Modal.test.tsx +43 -5
  123. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +679 -0
  124. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +397 -0
  125. package/Tests/UI/Components/ModelTable/ColumnCustomizationModal.test.tsx +999 -0
  126. package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +1678 -0
  127. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1094 -0
  128. package/Tests/UI/Components/Runbook/StepTimeoutInput.test.tsx +386 -0
  129. package/Tests/UI/Components/StatusPage/ResourceGroupSection.test.tsx +671 -0
  130. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +404 -0
  131. package/Tests/UI/Utils/DropdownAlignment.test.ts +306 -0
  132. package/Tests/UI/Utils/TableFilterUrlState.test.ts +292 -0
  133. package/Tests/Utils/Monitor/MonitorSummaryProbeUtil.test.ts +263 -0
  134. package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +583 -0
  135. package/Tests/Utils/StatusPage/GroupNestingLayout.test.ts +1072 -0
  136. package/Tests/Utils/StatusPage/GroupTree.test.ts +583 -0
  137. package/Tests/Utils/StatusPage/ResourceUptime.test.ts +411 -0
  138. package/Tests/Utils/UserPreferences.test.ts +563 -0
  139. package/Types/Date.ts +15 -6
  140. package/Types/JSONFunctions.ts +7 -2
  141. package/Types/Kubernetes/KubernetesCostIngest.ts +37 -1
  142. package/Types/Monitor/KubernetesAlertTemplates.ts +205 -0
  143. package/Types/Monitor/MonitorStep.ts +10 -1
  144. package/Types/Monitor/MonitorStepMetricMonitor.ts +46 -1
  145. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +413 -0
  146. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +168 -0
  147. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +175 -0
  148. package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +743 -0
  149. package/Types/Permission.ts +45 -0
  150. package/Types/Recommendation/RecommendationType.ts +20 -0
  151. package/Types/Runbook/RunbookExecutionDeadline.ts +129 -0
  152. package/Types/Runbook/RunbookStepTimeout.ts +202 -0
  153. package/Types/Telemetry/DropFilterSampling.ts +92 -0
  154. package/UI/Components/AI/GenerateFromAIModal.tsx +0 -2
  155. package/UI/Components/Accordion/Accordion.tsx +10 -2
  156. package/UI/Components/BulkUpdate/BulkLabelActions.tsx +0 -1
  157. package/UI/Components/CodeEditor/CodeEditor.tsx +34 -20
  158. package/UI/Components/Date/RangeStartAndEndDateView.tsx +0 -1
  159. package/UI/Components/EditionLabel/EditionLabel.tsx +1 -27
  160. package/UI/Components/Error/PageError.tsx +0 -4
  161. package/UI/Components/ErrorBoundary.tsx +252 -15
  162. package/UI/Components/InfoCard/InfoCard.tsx +58 -1
  163. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +34 -1
  164. package/UI/Components/MasterPage/MasterPage.tsx +65 -0
  165. package/UI/Components/Modal/Modal.tsx +16 -60
  166. package/UI/Components/ModelFormModal/ModelFormModal.tsx +0 -8
  167. package/UI/Components/ModelTable/BaseModelTable.tsx +503 -71
  168. package/UI/Components/ModelTable/Column.ts +17 -0
  169. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +523 -0
  170. package/UI/Components/ModelTable/ColumnPreference.ts +482 -0
  171. package/UI/Components/ModelTable/CustomFieldColumns.tsx +326 -0
  172. package/UI/Components/ModelTable/TableView.tsx +24 -2
  173. package/UI/Components/ModelTable/useCustomFieldColumns.ts +150 -0
  174. package/UI/Components/Runbook/StepTimeoutInput.tsx +173 -0
  175. package/UI/Components/SideMenu/SideMenu.tsx +24 -4
  176. package/UI/Components/StatusPage/ResourceGroupSection.tsx +231 -0
  177. package/UI/Components/Table/Table.tsx +14 -1
  178. package/UI/Components/Table/TableRow.tsx +180 -175
  179. package/UI/Components/Table/Types/Column.ts +2 -0
  180. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +34 -1
  181. package/UI/Utils/DropdownAlignment.ts +162 -0
  182. package/UI/Utils/TableFilterUrlState.ts +59 -20
  183. package/Utils/API.ts +106 -2
  184. package/Utils/Monitor/MonitorSummaryProbeUtil.ts +130 -0
  185. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +434 -0
  186. package/Utils/StatusPage/GroupNestingLayout.ts +343 -0
  187. package/Utils/StatusPage/GroupTree.ts +307 -0
  188. package/Utils/StatusPage/ResourceUptime.ts +90 -17
  189. package/Utils/UserPreferences.ts +53 -0
  190. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +86 -0
  191. package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -1
  192. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js +1 -0
  193. package/build/dist/Models/DatabaseModels/AlertEpisodeStateTimeline.js.map +1 -1
  194. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js +1 -0
  195. package/build/dist/Models/DatabaseModels/AlertStateTimeline.js.map +1 -1
  196. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js +1 -0
  197. package/build/dist/Models/DatabaseModels/IncidentEpisodeStateTimeline.js.map +1 -1
  198. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js +1 -0
  199. package/build/dist/Models/DatabaseModels/IncidentStateTimeline.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  201. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/LogDropFilter.js +91 -0
  203. package/build/dist/Models/DatabaseModels/LogDropFilter.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +14 -4
  205. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js +484 -0
  207. package/build/dist/Models/DatabaseModels/RecommendationDismissal.js.map +1 -0
  208. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js +1 -0
  209. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceStateTimeline.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/StatusPageGroup.js +94 -0
  211. package/build/dist/Models/DatabaseModels/StatusPageGroup.js.map +1 -1
  212. package/build/dist/Models/DatabaseModels/TableView.js +40 -0
  213. package/build/dist/Models/DatabaseModels/TableView.js.map +1 -1
  214. package/build/dist/Models/DatabaseModels/TraceDropFilter.js +91 -0
  215. package/build/dist/Models/DatabaseModels/TraceDropFilter.js.map +1 -1
  216. package/build/dist/Models/DatabaseModels/WorkflowVariable.js +5 -1
  217. package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
  218. package/build/dist/Server/API/AlertAPI.js +22 -13
  219. package/build/dist/Server/API/AlertAPI.js.map +1 -1
  220. package/build/dist/Server/API/BaseAPI.js +22 -1
  221. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  222. package/build/dist/Server/API/BaseAnalyticsAPI.js +24 -1
  223. package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
  224. package/build/dist/Server/API/CommonAPI.js +42 -0
  225. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  226. package/build/dist/Server/API/IncidentAPI.js +43 -26
  227. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  228. package/build/dist/Server/API/IncidentEpisodeAPI.js +21 -12
  229. package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
  230. package/build/dist/Server/API/MonitorAPI.js +23 -0
  231. package/build/dist/Server/API/MonitorAPI.js.map +1 -1
  232. package/build/dist/Server/API/MonitorTemplateAPI.js +4 -0
  233. package/build/dist/Server/API/MonitorTemplateAPI.js.map +1 -1
  234. package/build/dist/Server/API/ProbeAPI.js +131 -15
  235. package/build/dist/Server/API/ProbeAPI.js.map +1 -1
  236. package/build/dist/Server/API/ProjectAPI.js +62 -3
  237. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  238. package/build/dist/Server/API/ScheduledMaintenanceAPI.js +23 -14
  239. package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
  240. package/build/dist/Server/API/StatusPageAPI.js +61 -33
  241. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  242. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js +26 -2
  243. package/build/dist/Server/API/WorkspaceNotificationRuleAPI.js.map +1 -1
  244. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js +12 -0
  245. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785241000000-AddColumnsToTableView.js.map +1 -0
  246. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js +397 -0
  247. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785320000000-RepairCrossProjectIncidentReferences.js.map +1 -0
  248. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js +16 -0
  249. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785329453269-AddParentGroupToStatusPageGroup.js.map +1 -0
  250. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js +30 -0
  251. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785397674289-AddRecommendationDismissalTable.js.map +1 -0
  252. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js +34 -0
  253. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1785405581596-AddDroppedCountersToDropFilters.js.map +1 -0
  254. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  255. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  256. package/build/dist/Server/Services/AlertEpisodeService.js +39 -0
  257. package/build/dist/Server/Services/AlertEpisodeService.js.map +1 -1
  258. package/build/dist/Server/Services/AlertService.js +95 -0
  259. package/build/dist/Server/Services/AlertService.js.map +1 -1
  260. package/build/dist/Server/Services/BillingService.js +71 -0
  261. package/build/dist/Server/Services/BillingService.js.map +1 -1
  262. package/build/dist/Server/Services/DatabaseService.js +140 -17
  263. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  264. package/build/dist/Server/Services/IncidentEpisodeService.js +39 -0
  265. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  266. package/build/dist/Server/Services/IncidentService.js +100 -0
  267. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  268. package/build/dist/Server/Services/IncidentTemplateService.js +97 -0
  269. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  270. package/build/dist/Server/Services/Index.js +2 -0
  271. package/build/dist/Server/Services/Index.js.map +1 -1
  272. package/build/dist/Server/Services/LogDropFilterService.js +93 -0
  273. package/build/dist/Server/Services/LogDropFilterService.js.map +1 -1
  274. package/build/dist/Server/Services/MonitorProbeService.js +73 -5
  275. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  276. package/build/dist/Server/Services/MonitorService.js +34 -39
  277. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  278. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +71 -0
  279. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  280. package/build/dist/Server/Services/ProbeService.js +64 -0
  281. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  282. package/build/dist/Server/Services/ProjectService.js +103 -7
  283. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  284. package/build/dist/Server/Services/RecommendationDismissalService.js +50 -0
  285. package/build/dist/Server/Services/RecommendationDismissalService.js.map +1 -0
  286. package/build/dist/Server/Services/RunbookAgentJobService.js +63 -5
  287. package/build/dist/Server/Services/RunbookAgentJobService.js.map +1 -1
  288. package/build/dist/Server/Services/ScheduledMaintenanceService.js +83 -0
  289. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  290. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js +65 -0
  291. package/build/dist/Server/Services/ScheduledMaintenanceTemplateService.js.map +1 -1
  292. package/build/dist/Server/Services/StatusPageGroupService.js +136 -0
  293. package/build/dist/Server/Services/StatusPageGroupService.js.map +1 -1
  294. package/build/dist/Server/Services/TraceDropFilterService.js +93 -0
  295. package/build/dist/Server/Services/TraceDropFilterService.js.map +1 -1
  296. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +11 -0
  297. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  298. package/build/dist/Server/Types/Workflow/Components/API/Get.js +11 -0
  299. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  300. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +11 -0
  301. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  302. package/build/dist/Server/Types/Workflow/Components/API/Post.js +11 -0
  303. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  304. package/build/dist/Server/Types/Workflow/Components/API/Put.js +12 -0
  305. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  306. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +132 -0
  307. package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -0
  308. package/build/dist/Server/Utils/DropFilterValidation.js +80 -0
  309. package/build/dist/Server/Utils/DropFilterValidation.js.map +1 -0
  310. package/build/dist/Server/Utils/Errors.js +3 -0
  311. package/build/dist/Server/Utils/Errors.js.map +1 -1
  312. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +30 -12
  313. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  314. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +38 -18
  315. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  316. package/build/dist/Server/Utils/Telemetry/AppMetrics.js +26 -0
  317. package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
  318. package/build/dist/Types/Date.js +14 -4
  319. package/build/dist/Types/Date.js.map +1 -1
  320. package/build/dist/Types/JSONFunctions.js +8 -3
  321. package/build/dist/Types/JSONFunctions.js.map +1 -1
  322. package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -1
  323. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +192 -0
  324. package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
  325. package/build/dist/Types/Monitor/MonitorStep.js +6 -1
  326. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  327. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +32 -1
  328. package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
  329. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +294 -0
  330. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -0
  331. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +110 -0
  332. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -0
  333. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +58 -0
  334. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -0
  335. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +451 -0
  336. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -0
  337. package/build/dist/Types/Permission.js +40 -0
  338. package/build/dist/Types/Permission.js.map +1 -1
  339. package/build/dist/Types/Recommendation/RecommendationType.js +21 -0
  340. package/build/dist/Types/Recommendation/RecommendationType.js.map +1 -0
  341. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js +93 -0
  342. package/build/dist/Types/Runbook/RunbookExecutionDeadline.js.map +1 -0
  343. package/build/dist/Types/Runbook/RunbookStepTimeout.js +142 -0
  344. package/build/dist/Types/Runbook/RunbookStepTimeout.js.map +1 -0
  345. package/build/dist/Types/Telemetry/DropFilterSampling.js +75 -0
  346. package/build/dist/Types/Telemetry/DropFilterSampling.js.map +1 -0
  347. package/build/dist/UI/Components/AI/GenerateFromAIModal.js +1 -2
  348. package/build/dist/UI/Components/AI/GenerateFromAIModal.js.map +1 -1
  349. package/build/dist/UI/Components/Accordion/Accordion.js +9 -2
  350. package/build/dist/UI/Components/Accordion/Accordion.js.map +1 -1
  351. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js +1 -1
  352. package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
  353. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +27 -14
  354. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  355. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js +1 -1
  356. package/build/dist/UI/Components/Date/RangeStartAndEndDateView.js.map +1 -1
  357. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +2 -20
  358. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  359. package/build/dist/UI/Components/Error/PageError.js +1 -3
  360. package/build/dist/UI/Components/Error/PageError.js.map +1 -1
  361. package/build/dist/UI/Components/ErrorBoundary.js +145 -11
  362. package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
  363. package/build/dist/UI/Components/InfoCard/InfoCard.js +28 -1
  364. package/build/dist/UI/Components/InfoCard/InfoCard.js.map +1 -1
  365. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +13 -2
  366. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  367. package/build/dist/UI/Components/MasterPage/MasterPage.js +50 -1
  368. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  369. package/build/dist/UI/Components/Modal/Modal.js +4 -32
  370. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  371. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  372. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +308 -40
  373. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  374. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +230 -0
  375. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -0
  376. package/build/dist/UI/Components/ModelTable/ColumnPreference.js +258 -0
  377. package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -0
  378. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +168 -0
  379. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -0
  380. package/build/dist/UI/Components/ModelTable/TableView.js +13 -2
  381. package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
  382. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +84 -0
  383. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -0
  384. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js +101 -0
  385. package/build/dist/UI/Components/Runbook/StepTimeoutInput.js.map +1 -0
  386. package/build/dist/UI/Components/SideMenu/SideMenu.js +15 -5
  387. package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
  388. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js +73 -0
  389. package/build/dist/UI/Components/StatusPage/ResourceGroupSection.js.map +1 -0
  390. package/build/dist/UI/Components/Table/Table.js +15 -2
  391. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  392. package/build/dist/UI/Components/Table/TableRow.js +11 -6
  393. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  394. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +13 -2
  395. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  396. package/build/dist/UI/Utils/DropdownAlignment.js +98 -0
  397. package/build/dist/UI/Utils/DropdownAlignment.js.map +1 -0
  398. package/build/dist/UI/Utils/TableFilterUrlState.js +48 -15
  399. package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
  400. package/build/dist/Utils/API.js +39 -2
  401. package/build/dist/Utils/API.js.map +1 -1
  402. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js +97 -0
  403. package/build/dist/Utils/Monitor/MonitorSummaryProbeUtil.js.map +1 -0
  404. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +330 -0
  405. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -0
  406. package/build/dist/Utils/StatusPage/GroupNestingLayout.js +280 -0
  407. package/build/dist/Utils/StatusPage/GroupNestingLayout.js.map +1 -0
  408. package/build/dist/Utils/StatusPage/GroupTree.js +214 -0
  409. package/build/dist/Utils/StatusPage/GroupTree.js.map +1 -0
  410. package/build/dist/Utils/StatusPage/ResourceUptime.js +60 -16
  411. package/build/dist/Utils/StatusPage/ResourceUptime.js.map +1 -1
  412. package/build/dist/Utils/UserPreferences.js +33 -0
  413. package/build/dist/Utils/UserPreferences.js.map +1 -1
  414. package/package.json +1 -1
@@ -0,0 +1,173 @@
1
+ import React, {
2
+ FunctionComponent,
3
+ ReactElement,
4
+ ReactNode,
5
+ useEffect,
6
+ useId,
7
+ useState,
8
+ } from "react";
9
+ import {
10
+ NON_NUMERIC_TIMEOUT_MESSAGE,
11
+ TimeoutBounds,
12
+ getTimeoutValidationError,
13
+ secondsInputValueToTimeoutInMs,
14
+ timeoutInMsToSecondsInputValue,
15
+ willTimeoutBeClamped,
16
+ } from "../../../Types/Runbook/RunbookStepTimeout";
17
+
18
+ export interface ComponentProps {
19
+ label: string;
20
+ // Stored value, in milliseconds. Undefined means "use the default".
21
+ value: number | undefined;
22
+ bounds: TimeoutBounds;
23
+ onChange: (timeoutInMs: number | undefined) => void;
24
+ description?: ReactNode | undefined;
25
+ dataTestId?: string | undefined;
26
+ disabled?: boolean | undefined;
27
+ }
28
+
29
+ /*
30
+ * Seconds-in, milliseconds-out editor for a per-step timeout.
31
+ *
32
+ * The typed text is held locally rather than derived from the stored value on
33
+ * every keystroke: deriving it would fight the author mid-edit, because a
34
+ * partially typed "0" or an emptied field both resolve to "unset" and would
35
+ * erase what they were typing. The stored value only moves when the text
36
+ * parses to something usable.
37
+ */
38
+ const StepTimeoutInput: FunctionComponent<ComponentProps> = (
39
+ props: ComponentProps,
40
+ ): ReactElement => {
41
+ const uniqueId: string = useId();
42
+ const inputId: string = `step-timeout-${uniqueId}`;
43
+ const describedById: string = `step-timeout-help-${uniqueId}`;
44
+ const errorId: string = `step-timeout-error-${uniqueId}`;
45
+
46
+ const [text, setText] = useState<string>(
47
+ timeoutInMsToSecondsInputValue(props.value),
48
+ );
49
+
50
+ /*
51
+ * A number input reports an empty string for text it cannot parse — a
52
+ * dangling exponent ("1e"), a lone "-" — while still showing that text to
53
+ * the author. Tracked separately from `text` so an unparseable keystroke
54
+ * does not read as "the author cleared the field".
55
+ */
56
+ const [hasUnparseableInput, setHasUnparseableInput] =
57
+ useState<boolean>(false);
58
+
59
+ /*
60
+ * Re-sync when the step being edited changes underneath us (collapse /
61
+ * reorder / reload). Skipped while the text still represents the stored
62
+ * value so the author's in-progress typing survives re-renders.
63
+ */
64
+ useEffect(() => {
65
+ const storedAsText: string = timeoutInMsToSecondsInputValue(props.value);
66
+ setText((currentText: string) => {
67
+ return secondsInputValueToTimeoutInMs(currentText) === props.value
68
+ ? currentText
69
+ : storedAsText;
70
+ });
71
+ }, [props.value]);
72
+
73
+ const validationError: string | null = hasUnparseableInput
74
+ ? NON_NUMERIC_TIMEOUT_MESSAGE
75
+ : getTimeoutValidationError(text, props.bounds);
76
+
77
+ const defaultInSeconds: number = props.bounds.defaultInMs / 1000;
78
+
79
+ const handleChange: (value: string, isUnparseable: boolean) => void = (
80
+ value: string,
81
+ isUnparseable: boolean,
82
+ ): void => {
83
+ if (isUnparseable) {
84
+ /*
85
+ * Hold the stored value. Reporting undefined here would discard a
86
+ * timeout the author had already saved, without them touching a digit —
87
+ * the field would look edited, save cleanly, and the step would silently
88
+ * drop back to the default.
89
+ */
90
+ setHasUnparseableInput(true);
91
+ return;
92
+ }
93
+
94
+ setHasUnparseableInput(false);
95
+ setText(value);
96
+ props.onChange(secondsInputValueToTimeoutInMs(value));
97
+ };
98
+
99
+ /*
100
+ * Only a usable-but-out-of-range value gets clamped at run time. Anything
101
+ * unusable falls back to the default instead, so the two cases need
102
+ * different copy.
103
+ */
104
+ const consequence: string = hasUnparseableInput
105
+ ? "The saved value is unchanged."
106
+ : willTimeoutBeClamped(text, props.bounds)
107
+ ? "Values outside the range are clamped when the step runs."
108
+ : "Leave the field blank to use the default.";
109
+
110
+ let inputClassName: string =
111
+ "block w-full rounded-md border border-gray-300 bg-white py-2 pl-3 pr-3 text-sm placeholder-gray-500 focus:border-indigo-500 focus:text-gray-900 focus:placeholder-gray-400 focus:outline-none focus:ring-1 focus:ring-indigo-500 sm:text-sm";
112
+
113
+ if (validationError) {
114
+ inputClassName +=
115
+ " border-red-300 text-red-900 placeholder-red-300 focus:border-red-500 focus:ring-red-500";
116
+ }
117
+
118
+ if (props.disabled) {
119
+ inputClassName += " bg-gray-100 text-gray-500 cursor-not-allowed";
120
+ }
121
+
122
+ return (
123
+ <div>
124
+ <label
125
+ htmlFor={inputId}
126
+ className="block text-xs font-medium text-gray-700 mb-1.5"
127
+ >
128
+ {props.label}
129
+ <span className="ml-2 text-[10px] font-normal text-gray-400">
130
+ seconds
131
+ </span>
132
+ </label>
133
+ <input
134
+ id={inputId}
135
+ type="number"
136
+ inputMode="decimal"
137
+ min={props.bounds.minInMs / 1000}
138
+ max={props.bounds.maxInMs / 1000}
139
+ step="any"
140
+ disabled={props.disabled}
141
+ className={inputClassName}
142
+ value={text}
143
+ placeholder={`${defaultInSeconds}`}
144
+ /*
145
+ * The error is part of the field's description, not only a live region:
146
+ * a screen reader that reaches an already-invalid field on focus still
147
+ * hears why.
148
+ */
149
+ aria-describedby={
150
+ validationError ? `${describedById} ${errorId}` : describedById
151
+ }
152
+ aria-invalid={validationError ? true : undefined}
153
+ data-testid={props.dataTestId}
154
+ onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
155
+ handleChange(e.target.value, e.target.validity?.badInput === true);
156
+ }}
157
+ />
158
+ <p id={describedById} className="text-xs text-gray-500 mt-1.5">
159
+ {props.description ? <>{props.description} </> : null}
160
+ Leave blank to use the default of {defaultInSeconds} seconds. Allowed
161
+ range: {props.bounds.minInMs / 1000}–{props.bounds.maxInMs / 1000}{" "}
162
+ seconds.
163
+ </p>
164
+ {validationError ? (
165
+ <p id={errorId} role="alert" className="text-xs text-red-600 mt-1">
166
+ {validationError} {consequence}
167
+ </p>
168
+ ) : null}
169
+ </div>
170
+ );
171
+ };
172
+
173
+ export default StepTimeoutInput;
@@ -415,30 +415,50 @@ const SideMenu: FunctionComponent<ComponentProps> = (props: ComponentProps) => {
415
415
  role="navigation"
416
416
  aria-label="Main navigation"
417
417
  >
418
- <div className="sticky top-6">
418
+ {/*
419
+ * Stick below the app header, not at the top of the viewport. The header
420
+ * is sticky too, so a plain `top-6` slides the first menu items behind it
421
+ * as soon as the page scrolls. --app-header-height is measured and
422
+ * published by MasterPage; the 0px fallback keeps this correct on pages
423
+ * that render without a sticky header.
424
+ */}
425
+ <div
426
+ className="sticky"
427
+ style={{ top: "calc(var(--app-header-height, 0px) + 1.5rem)" }}
428
+ >
419
429
  <div
420
430
  className={`
431
+ flex flex-col
421
432
  bg-white rounded-2xl
422
433
  border border-gray-200/80
423
434
  shadow-sm
424
435
  overflow-hidden
425
436
  `}
437
+ /*
438
+ * Menus longer than the viewport (the Kubernetes cluster menu, for
439
+ * one) would otherwise get pushed back up behind the header near the
440
+ * bottom of a long page. Cap the card to the space left under the
441
+ * header and let the item list scroll inside it instead.
442
+ */
443
+ style={{
444
+ maxHeight: "calc(100vh - var(--app-header-height, 0px) - 3rem)",
445
+ }}
426
446
  >
427
447
  {/* Optional Header */}
428
448
  {props.header && (
429
- <div className="px-3 py-3 border-b border-gray-100 bg-gradient-to-b from-gray-50 to-white">
449
+ <div className="flex-shrink-0 px-3 py-3 border-b border-gray-100 bg-gradient-to-b from-gray-50 to-white">
430
450
  {props.header}
431
451
  </div>
432
452
  )}
433
453
 
434
454
  {/* Menu Content */}
435
- <nav className="p-2">
455
+ <nav className="p-2 min-h-0 overflow-y-auto">
436
456
  <div className="space-y-0.5">{renderMenuContent()}</div>
437
457
  </nav>
438
458
 
439
459
  {/* Optional Footer */}
440
460
  {props.footer && (
441
- <div className="px-3 py-2 border-t border-gray-100 bg-gray-50/50">
461
+ <div className="flex-shrink-0 px-3 py-2 border-t border-gray-100 bg-gray-50/50">
442
462
  {props.footer}
443
463
  </div>
444
464
  )}
@@ -0,0 +1,231 @@
1
+ import Icon, { ThickProp } from "../Icon/Icon";
2
+ import MarkdownViewer from "../Markdown.tsx/LazyMarkdownViewer";
3
+ import IconProp from "../../../Types/Icon/IconProp";
4
+ import StatusPageGroupNestingLayoutUtil from "../../../Utils/StatusPage/GroupNestingLayout";
5
+ import React, {
6
+ FunctionComponent,
7
+ ReactElement,
8
+ useEffect,
9
+ useState,
10
+ } from "react";
11
+
12
+ export interface ComponentProps {
13
+ /*
14
+ * 0 for a top level group, 1 for its children, and so on. Everything about
15
+ * how this section is drawn comes from it - see GroupNestingLayout.
16
+ */
17
+ depth: number;
18
+ name: string;
19
+ /*
20
+ * Markdown. Rendered below the header rather than inside it - a description
21
+ * may contain links, and a link inside a button is not something a browser or
22
+ * a screen reader can make sense of.
23
+ */
24
+ description?: string | undefined;
25
+ /*
26
+ * Rendered next to the name when the group has sub groups. Pre-translated by
27
+ * the caller: this component has no i18n of its own.
28
+ */
29
+ subGroupCountLabel?: string | undefined;
30
+ /*
31
+ * The group's rolled up status or uptime, already formatted and translated by
32
+ * the caller ("99.9% uptime", "Operational"). Drawn with a status dot so it
33
+ * reads as a rollup of everything below rather than as one more resource
34
+ * reading, and it stays visible while the section is open - the point of the
35
+ * hierarchy is that every level always shows what it rolls up, and a number
36
+ * that disappears on expand is a number you cannot compare against the level
37
+ * below it.
38
+ */
39
+ rollupLabel?: string | undefined;
40
+ /* Hex or css colour for the rollup, from the rolled up status. */
41
+ rollupColor?: string | undefined;
42
+ isInitiallyExpanded?: boolean | undefined;
43
+ /* The group's own resources. */
44
+ resourcesElement?: ReactElement | undefined;
45
+ /* Nested sections, normally one per sub group. */
46
+ subGroupsElement?: ReactElement | undefined;
47
+ hasOwnResources?: boolean | undefined;
48
+ subGroupCount?: number | undefined;
49
+ testId?: string | undefined;
50
+ }
51
+
52
+ /*
53
+ * One level of the status page resource group hierarchy.
54
+ *
55
+ * A top level group is a card. Everything under it is a row on a tree rail -
56
+ * no card, no second border, no background tint stacked on the last one - so
57
+ * the hierarchy stays readable however deep it goes and the uptime bars keep
58
+ * the width they need.
59
+ */
60
+ const ResourceGroupSection: FunctionComponent<ComponentProps> = (
61
+ props: ComponentProps,
62
+ ): ReactElement => {
63
+ const [isOpen, setIsOpen] = useState<boolean>(
64
+ Boolean(props.isInitiallyExpanded),
65
+ );
66
+
67
+ /*
68
+ * Groups arrive with the page payload, so isInitiallyExpanded can flip after
69
+ * the first render. Keyed on the *boolean*, not on the prop: the column is an
70
+ * optional boolean, so it routinely arrives as undefined and settles to false,
71
+ * and keying on the prop would fire on that and slam shut a section the
72
+ * visitor had just opened.
73
+ */
74
+ const initiallyExpanded: boolean = Boolean(props.isInitiallyExpanded);
75
+
76
+ useEffect(() => {
77
+ setIsOpen(initiallyExpanded);
78
+ }, [initiallyExpanded]);
79
+
80
+ const generatedId: string = React.useId();
81
+ const bodyId: string = `status-page-group-body-${generatedId}`;
82
+ const descriptionId: string = `status-page-group-description-${generatedId}`;
83
+
84
+ const isRootLevel: boolean = StatusPageGroupNestingLayoutUtil.isRootLevel({
85
+ depth: props.depth,
86
+ });
87
+
88
+ const subGroupCount: number = props.subGroupCount || 0;
89
+
90
+ const showSubGroupDivider: boolean =
91
+ StatusPageGroupNestingLayoutUtil.shouldShowSubGroupDivider({
92
+ hasOwnResources: Boolean(props.hasOwnResources),
93
+ subGroupCount: subGroupCount,
94
+ });
95
+
96
+ return (
97
+ <div
98
+ className={StatusPageGroupNestingLayoutUtil.getContainerClassName({
99
+ depth: props.depth,
100
+ })}
101
+ data-testid={
102
+ props.testId ||
103
+ (isRootLevel ? "status-page-group" : "status-page-nested-group")
104
+ }
105
+ data-depth={props.depth}
106
+ >
107
+ <button
108
+ type="button"
109
+ className={StatusPageGroupNestingLayoutUtil.getHeaderClassName({
110
+ depth: props.depth,
111
+ })}
112
+ aria-expanded={isOpen}
113
+ aria-controls={isOpen ? bodyId : undefined}
114
+ aria-describedby={props.description ? descriptionId : undefined}
115
+ data-testid="status-page-group-header"
116
+ onClick={() => {
117
+ setIsOpen(!isOpen);
118
+ }}
119
+ >
120
+ <span
121
+ className={StatusPageGroupNestingLayoutUtil.getHeaderRowClassName()}
122
+ >
123
+ <span
124
+ className={`${StatusPageGroupNestingLayoutUtil.getChevronBoxClassName()} ${
125
+ isOpen ? "bg-gray-900/5 text-gray-700" : "text-gray-400"
126
+ }`}
127
+ data-testid="status-page-group-chevron"
128
+ aria-hidden="true"
129
+ >
130
+ <Icon
131
+ className={`h-3.5 w-3.5 transition-transform duration-200 ease-out ${
132
+ isOpen ? "rotate-90" : ""
133
+ }`}
134
+ icon={IconProp.ChevronRight}
135
+ thick={ThickProp.Thick}
136
+ />
137
+ </span>
138
+ <span
139
+ className={StatusPageGroupNestingLayoutUtil.getTitleClassName({
140
+ depth: props.depth,
141
+ })}
142
+ title={props.name}
143
+ >
144
+ {props.name}
145
+ </span>
146
+ {props.subGroupCountLabel ? (
147
+ <span
148
+ className={StatusPageGroupNestingLayoutUtil.getSubGroupCountBadgeClassName()}
149
+ data-testid="status-page-group-sub-group-count"
150
+ >
151
+ {props.subGroupCountLabel}
152
+ </span>
153
+ ) : (
154
+ <></>
155
+ )}
156
+ </span>
157
+ {props.rollupLabel ? (
158
+ <span
159
+ className={StatusPageGroupNestingLayoutUtil.getRollupClassName()}
160
+ data-testid="status-page-group-rollup"
161
+ >
162
+ <span className="inline-flex items-center gap-1.5">
163
+ <span
164
+ className={StatusPageGroupNestingLayoutUtil.getRollupDotClassName()}
165
+ style={
166
+ props.rollupColor
167
+ ? { backgroundColor: props.rollupColor }
168
+ : undefined
169
+ }
170
+ data-testid="status-page-group-rollup-dot"
171
+ aria-hidden="true"
172
+ />
173
+ <span
174
+ className={StatusPageGroupNestingLayoutUtil.getRollupLabelClassName()}
175
+ style={
176
+ props.rollupColor ? { color: props.rollupColor } : undefined
177
+ }
178
+ >
179
+ {props.rollupLabel}
180
+ </span>
181
+ </span>
182
+ </span>
183
+ ) : (
184
+ <></>
185
+ )}
186
+ </button>
187
+ {props.description ? (
188
+ <div
189
+ id={descriptionId}
190
+ className={StatusPageGroupNestingLayoutUtil.getDescriptionClassName()}
191
+ data-testid="status-page-group-description"
192
+ >
193
+ <MarkdownViewer text={props.description} />
194
+ </div>
195
+ ) : (
196
+ <></>
197
+ )}
198
+ {isOpen ? (
199
+ <div
200
+ id={bodyId}
201
+ className={StatusPageGroupNestingLayoutUtil.getBodyClassName({
202
+ depth: props.depth,
203
+ })}
204
+ data-testid="status-page-group-body"
205
+ >
206
+ {props.resourcesElement || <></>}
207
+ {props.subGroupsElement ? (
208
+ <div
209
+ className={`${
210
+ showSubGroupDivider
211
+ ? StatusPageGroupNestingLayoutUtil.getSubGroupDividerClassName()
212
+ : ""
213
+ } ${StatusPageGroupNestingLayoutUtil.getSubGroupListClassName({
214
+ depth: props.depth,
215
+ })}`.trim()}
216
+ data-testid="status-page-sub-group-list"
217
+ >
218
+ {props.subGroupsElement}
219
+ </div>
220
+ ) : (
221
+ <></>
222
+ )}
223
+ </div>
224
+ ) : (
225
+ <></>
226
+ )}
227
+ </div>
228
+ );
229
+ };
230
+
231
+ export default ResourceGroupSection;
@@ -181,10 +181,23 @@ const Table: TableFunction = <T extends GenericObject>(
181
181
  }
182
182
  }, [props.bulkSelectedItems]);
183
183
 
184
+ /*
185
+ * Width of the loading / error / "no items" row, in cells. It has to match
186
+ * what TableHeader actually renders or those messages sit under part of the
187
+ * table instead of spanning it: the Actions column is already one of
188
+ * `props.columns`, and the drag-handle and bulk-select cells are extra
189
+ * leading columns that only exist when those features are on.
190
+ */
184
191
  let colspan: number = props.columns.length || 0;
185
- if (props.actionButtons && props.actionButtons?.length > 0) {
192
+ if (props.enableDragAndDrop) {
186
193
  colspan++;
187
194
  }
195
+ if (isBulkActionsEnabled) {
196
+ colspan++;
197
+ }
198
+ if (colspan === 0) {
199
+ colspan = 1;
200
+ }
188
201
 
189
202
  const getTablebody: GetReactElementFunction = (): ReactElement => {
190
203
  if (props.isLoading) {