@oneuptime/common 13.0.8 → 14.0.1

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 (514) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Index.ts +4 -0
  4. package/Models/DatabaseModels/Monitor.ts +3 -2
  5. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  6. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  7. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  8. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  9. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  10. package/Scripts/generate-service-worker.js +65 -4
  11. package/Server/API/BaseAPI.ts +26 -5
  12. package/Server/API/GlobalConfigAPI.ts +228 -462
  13. package/Server/API/ProjectOIDC.ts +25 -16
  14. package/Server/API/ProjectSSO.ts +24 -16
  15. package/Server/API/StatusPageAPI.ts +100 -42
  16. package/Server/API/TeamMemberAPI.ts +10 -1
  17. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  18. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  19. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  20. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  21. package/Server/EnvironmentConfig.ts +147 -2
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  26. package/Server/Middleware/UserAuthorization.ts +38 -16
  27. package/Server/Services/AuditLogService.ts +84 -1079
  28. package/Server/Services/DatabaseService.ts +10 -0
  29. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  30. package/Server/Services/GlobalConfigService.ts +80 -1
  31. package/Server/Services/Index.ts +4 -0
  32. package/Server/Services/MonitorProbeService.ts +116 -20
  33. package/Server/Services/MonitorService.ts +59 -6
  34. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  35. package/Server/Services/MonitorTemplateService.ts +26 -0
  36. package/Server/Services/ProjectService.ts +284 -0
  37. package/Server/Services/RumSessionPinService.ts +25 -6
  38. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  39. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  40. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  41. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  42. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  43. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  44. package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
  45. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  46. package/Server/Services/StatusPageService.ts +78 -1
  47. package/Server/Services/TeamMemberService.ts +11 -0
  48. package/Server/Services/TeamService.ts +10 -0
  49. package/Server/Services/UserService.ts +10 -17
  50. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  51. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  52. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  53. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  54. package/Server/Types/Markdown.ts +41 -0
  55. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  56. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  57. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  58. package/Server/Utils/EditionEnforcement.ts +233 -0
  59. package/Server/Utils/FrontendEnvironment.ts +41 -2
  60. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  61. package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
  62. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  63. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  64. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  65. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
  66. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  67. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  68. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  69. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  70. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  71. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  72. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  73. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  74. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  75. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  76. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  77. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  78. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  79. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  80. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  81. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  82. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  83. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  84. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  85. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  86. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
  87. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  88. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  89. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  90. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  91. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  92. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  93. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  94. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  95. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  96. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  97. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  98. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  99. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  100. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  101. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  102. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  103. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  104. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  105. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  106. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  107. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  108. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  109. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  110. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  111. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  112. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  113. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  114. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  115. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  116. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  117. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  118. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  119. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  120. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  121. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  122. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  123. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  124. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  125. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  126. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  127. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  128. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  129. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  130. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  131. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  133. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  134. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  135. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  136. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  137. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  138. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  139. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  140. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  141. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  142. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  143. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  144. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  145. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  146. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  147. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
  148. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  149. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
  150. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  151. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  152. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  153. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  154. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  155. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
  156. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  157. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  158. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  159. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  160. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  161. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  162. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  163. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  164. package/Tests/Server/Types/Markdown.test.ts +183 -1
  165. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  166. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  167. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  168. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  169. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  170. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  171. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  172. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  175. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
  176. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
  177. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  178. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  179. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  180. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  181. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  182. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  183. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  184. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  185. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  186. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  187. package/Tests/Types/API/Route.test.ts +56 -0
  188. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  189. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  190. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  191. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  192. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  193. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  194. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  195. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  196. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  197. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  198. package/Tests/UI/Components/Icon.test.tsx +26 -0
  199. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  200. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  201. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  202. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  203. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  204. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  205. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  206. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  207. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  208. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  209. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  210. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  211. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  212. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  213. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  214. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  215. package/Types/API/Hostname.ts +63 -16
  216. package/Types/API/Route.ts +19 -2
  217. package/Types/API/URL.ts +26 -2
  218. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  219. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  220. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  221. package/Types/Database/CanonicalModelInstance.ts +102 -0
  222. package/Types/Database/TableColumn.ts +20 -6
  223. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  224. package/Types/IP/IPv6.ts +6 -1
  225. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  226. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  227. package/Types/Monitor/MonitorStep.ts +6 -1
  228. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  229. package/Types/Permission.ts +90 -0
  230. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  231. package/Types/Rules/RuleRun.ts +4 -0
  232. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  233. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  234. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  235. package/UI/Components/Feed/FeedOptions.ts +427 -0
  236. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  237. package/UI/Components/Feed/useFeedItems.ts +28 -9
  238. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  239. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  240. package/UI/Components/Icon/Icon.tsx +1 -1
  241. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  242. package/UI/Components/ModelList/ModelList.tsx +11 -1
  243. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  244. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  245. package/UI/esbuild-enterprise.js +263 -0
  246. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  247. package/Utils/HostAddressUtil.ts +94 -0
  248. package/Utils/LabelRuleImportExport.ts +27 -9
  249. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  250. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  251. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  252. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  253. package/Utils/Slo/SloDuration.ts +22 -6
  254. package/Utils/Slo/SloHealth.ts +8 -7
  255. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  256. package/Utils/Slo/SloOverviewText.ts +33 -0
  257. package/Utils/Slo/SloProjection.ts +4 -3
  258. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  259. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  260. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  262. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  264. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  266. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  268. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  270. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  272. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  273. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  274. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  276. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  277. package/build/dist/Server/API/BaseAPI.js +26 -5
  278. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  279. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  280. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  281. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  282. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  283. package/build/dist/Server/API/ProjectSSO.js +24 -16
  284. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  285. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  286. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  287. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  288. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  289. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  290. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  291. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  292. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  293. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  294. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  295. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  296. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  297. package/build/dist/Server/EnvironmentConfig.js +84 -2
  298. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  307. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  308. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  309. package/build/dist/Server/Services/AuditLogService.js +71 -740
  310. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  311. package/build/dist/Server/Services/DatabaseService.js +7 -0
  312. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  313. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  314. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  315. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  316. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  317. package/build/dist/Server/Services/Index.js +4 -0
  318. package/build/dist/Server/Services/Index.js.map +1 -1
  319. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  320. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  321. package/build/dist/Server/Services/MonitorService.js +48 -6
  322. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  323. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  324. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  325. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  326. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  327. package/build/dist/Server/Services/ProjectService.js +214 -0
  328. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  329. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  330. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  331. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  332. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  333. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  334. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  335. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  336. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  337. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  338. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  339. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  340. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  341. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  342. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  343. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
  344. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  345. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  346. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  347. package/build/dist/Server/Services/StatusPageService.js +71 -0
  348. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  349. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  350. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  351. package/build/dist/Server/Services/TeamService.js +9 -0
  352. package/build/dist/Server/Services/TeamService.js.map +1 -1
  353. package/build/dist/Server/Services/UserService.js +10 -16
  354. package/build/dist/Server/Services/UserService.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  356. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  358. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  360. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  361. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  362. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  363. package/build/dist/Server/Types/Markdown.js +31 -0
  364. package/build/dist/Server/Types/Markdown.js.map +1 -1
  365. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  366. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  368. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  369. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  370. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  371. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  372. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  373. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  374. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  375. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  376. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  377. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
  378. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  379. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  380. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  381. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  382. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  383. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
  384. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  385. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  386. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  387. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  388. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  389. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  390. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  391. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  392. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  393. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  394. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  395. package/build/dist/Types/API/Hostname.js +59 -11
  396. package/build/dist/Types/API/Hostname.js.map +1 -1
  397. package/build/dist/Types/API/Route.js +18 -2
  398. package/build/dist/Types/API/Route.js.map +1 -1
  399. package/build/dist/Types/API/URL.js +23 -2
  400. package/build/dist/Types/API/URL.js.map +1 -1
  401. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  402. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  403. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  404. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  405. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  406. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  407. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  408. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  409. package/build/dist/Types/Database/TableColumn.js +19 -6
  410. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  411. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  412. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  413. package/build/dist/Types/IP/IPv6.js +6 -1
  414. package/build/dist/Types/IP/IPv6.js.map +1 -1
  415. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  416. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  417. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  418. package/build/dist/Types/Permission.js +84 -0
  419. package/build/dist/Types/Permission.js.map +1 -1
  420. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  421. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  422. package/build/dist/Types/Rules/RuleRun.js +4 -0
  423. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  424. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  425. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  426. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  427. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  428. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  429. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  430. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  431. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  432. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  433. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  434. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  435. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  436. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  437. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  438. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  439. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  440. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  441. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  442. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  443. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  444. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  445. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  446. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  447. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  448. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  449. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  450. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  451. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  452. package/build/dist/Utils/HostAddressUtil.js +80 -0
  453. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  454. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  455. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  456. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  457. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  458. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  459. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  460. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  461. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  462. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  463. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  464. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  465. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  466. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  467. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  468. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  469. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  470. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  471. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  472. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  473. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  474. package/jest.config.json +3 -1
  475. package/package.json +1 -1
  476. package/test-setup.sh +103 -34
  477. package/tsconfig.json +13 -0
  478. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  479. package/Server/API/TeamComplianceAPI.ts +0 -158
  480. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  481. package/Server/Services/TeamComplianceService.ts +0 -733
  482. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  483. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  484. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  485. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  486. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  487. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  488. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  489. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  490. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  491. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  492. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  493. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  494. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  495. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  496. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  497. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  498. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  499. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  500. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  501. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  502. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  503. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  504. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  505. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  506. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  507. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  508. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  509. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  510. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  511. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  512. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  513. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  514. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -0,0 +1,119 @@
1
+ import { JSONObject } from "../../../Types/JSON";
2
+ import { ComponentType, ReactElement, ReactNode } from "react";
3
+
4
+ /*
5
+ * The contract between the edition dialog (EditionLabel) and the Enterprise
6
+ * license management UI.
7
+ *
8
+ * EditionLabel only READS the license: it asks GET /global-config/license and
9
+ * shows what the answer says - the edition pill, the status, grace and trial
10
+ * notices, the version card. Everything that CHANGES the license lives in the
11
+ * Enterprise Edition (ee/AdminDashboard/License, under ee/LICENSE), because
12
+ * the routes it calls exist only in the Enterprise server: activating it with
13
+ * a key or an offline token, refreshing it from oneuptime.com, replacing it,
14
+ * and the seat usage and instance tables a master admin manages it by.
15
+ *
16
+ * The Dashboard and the Admin Dashboard hand that UI to EditionLabel as their
17
+ * LicenseManager plugin (src/Enterprise/EnterprisePlugins.ts). The Community
18
+ * stubs have none, and the login page passes none: there the dialog shows
19
+ * the license status only, and nobody is told to manage the license from it.
20
+ *
21
+ * The manager wraps the dialog rather than filling one spot inside it. Its
22
+ * sections land in three places in the dialog body (messages at the top, seat
23
+ * usage after the version card, the activation input near the bottom) and it
24
+ * drives the dialog's footer buttons, so EditionLabel gives it renderDialog
25
+ * and the manager calls it with those parts. It stays mounted while the
26
+ * dialog is closed, so what an admin typed and which input they chose
27
+ * survive closing and reopening the dialog.
28
+ *
29
+ * Types only: nothing here ships any license management code.
30
+ */
31
+
32
+ /*
33
+ * How close the installation is to its licensed seats. "breached" also
34
+ * covers an enforced limit that is exactly full: new users are already
35
+ * refused there.
36
+ */
37
+ export type SeatTone = "healthy" | "approaching" | "breached";
38
+
39
+ // What EditionLabel knows about the license, read-only.
40
+ export interface LicenseSnapshot {
41
+ /*
42
+ * The body of the last GET /global-config/license that succeeded, or null
43
+ * before the first one and after one that failed. A new object on every
44
+ * successful load, so a manager can tell that the license was (re)loaded.
45
+ */
46
+ payload: JSONObject | null;
47
+ isLoading: boolean;
48
+ // Why the last load failed; "" when it did not.
49
+ loadError: string;
50
+ /*
51
+ * A master admin, in a dialog that has a license manager. The server
52
+ * accepts license writes from a master admin only, so nobody else is
53
+ * offered them.
54
+ */
55
+ canManageLicense: boolean;
56
+ licenseValid: boolean;
57
+ // Enterprise Edition with no license yet, inside its first-run trial.
58
+ isUnlicensedTrial: boolean;
59
+ // A real license (not the trial) is valid and loaded: show what it covers.
60
+ showLicenseDetails: boolean;
61
+ // "" when the server did not say.
62
+ companyName: string;
63
+ // The stored license key; "" when there is none or the caller may not see it.
64
+ licenseKey: string;
65
+ userLimit: number | null;
66
+ // What oneuptime.com last counted across every instance on the license.
67
+ currentUserCount: number | null;
68
+ /*
69
+ * The seat figure everything is measured against: the live, enforced count
70
+ * when this installation enforces its seat limit, else currentUserCount.
71
+ */
72
+ effectiveUserCount: number | null;
73
+ isSeatLimitEnforced: boolean;
74
+ canAddMoreUsers: boolean;
75
+ seatTone: SeatTone;
76
+ // The percent of licensed seats in use, as the admin reads it (may exceed 100).
77
+ seatUsageDisplayPercent: number | null;
78
+ currentVersion: string;
79
+ latestVersion: string;
80
+ // currentVersion is a real release number that can be compared.
81
+ hasComparableVersion: boolean;
82
+ }
83
+
84
+ // What a manager adds to the dialog. Every part is optional.
85
+ export interface LicenseManagerDialogParts {
86
+ // Top of the body: the outcome of the last license action.
87
+ messages?: ReactNode | undefined;
88
+ // After the version card: seat usage and the instances on the license.
89
+ usage?: ReactNode | undefined;
90
+ // Near the bottom of the body: the license key or offline token input.
91
+ activation?: ReactNode | undefined;
92
+ // The dialog's primary button, when the manager offers one.
93
+ submitButtonText?: string | undefined;
94
+ onSubmit?: (() => void) | undefined;
95
+ isSubmitting?: boolean | undefined;
96
+ disableSubmitButton?: boolean | undefined;
97
+ // Left of the footer: actions on a license that is already in place.
98
+ leftFooterElement?: ReactElement | undefined;
99
+ }
100
+
101
+ export interface LicenseManagerProps {
102
+ license: LicenseSnapshot;
103
+ isDialogOpen: boolean;
104
+ // Asks GET /global-config/license again; the pill and the dialog follow.
105
+ reloadLicense: () => Promise<void>;
106
+ /*
107
+ * Applies the seat fields (isSeatLimitEnforced, seatsInUse, canAddMoreUsers)
108
+ * a license write answers with, the same way the GET's are applied.
109
+ */
110
+ applySeatEnforcement: (payload: JSONObject) => void;
111
+ // Renders the dialog (nothing while it is closed) with the manager's parts.
112
+ renderDialog: (parts: LicenseManagerDialogParts) => ReactElement;
113
+ }
114
+
115
+ /*
116
+ * Must render renderDialog's result, and must not be React.lazy: it is
117
+ * mounted with the edition pill on every page, and the dialog is inside it.
118
+ */
119
+ export type LicenseManagerComponent = ComponentType<LicenseManagerProps>;
@@ -0,0 +1,427 @@
1
+ import GenericObject from "../../../Types/GenericObject";
2
+ import Includes from "../../../Types/BaseDatabase/Includes";
3
+ import Query from "../../../Types/BaseDatabase/Query";
4
+ import SortOrder from "../../../Types/BaseDatabase/SortOrder";
5
+ import IconProp from "../../../Types/Icon/IconProp";
6
+
7
+ /*
8
+ * What a reader can change about a dashboard activity feed from its one
9
+ * "Filter & Sort" button: which way the timeline runs, and which kinds of
10
+ * event it shows.
11
+ *
12
+ * Both are applied by the API, never to the rows already in the browser. A
13
+ * feed is read a window at a time (see useFeedItems), so filtering the loaded
14
+ * window would show "no items" while matching events sat one page further
15
+ * back, and reversing it would show the newest ten upside down instead of the
16
+ * oldest ten.
17
+ *
18
+ * This module is React-free so the rules can be tested on their own.
19
+ */
20
+ export interface FeedOptions {
21
+ sortOrder: SortOrder;
22
+ /*
23
+ * The event types to show. Empty means no filter, so every event type is
24
+ * shown - including one a feed model gains after the reader last looked.
25
+ */
26
+ eventTypes: Array<string>;
27
+ }
28
+
29
+ export const DEFAULT_FEED_SORT_ORDER: SortOrder = SortOrder.Descending;
30
+
31
+ export const DEFAULT_FEED_OPTIONS: FeedOptions = {
32
+ sortOrder: DEFAULT_FEED_SORT_ORDER,
33
+ eventTypes: [],
34
+ };
35
+
36
+ export interface FeedSortOrderOption {
37
+ value: SortOrder;
38
+ label: string;
39
+ icon: IconProp;
40
+ }
41
+
42
+ export const FEED_SORT_ORDER_OPTIONS: Array<FeedSortOrderOption> = [
43
+ {
44
+ value: SortOrder.Descending,
45
+ label: "Newest first",
46
+ icon: IconProp.BarsArrowDown,
47
+ },
48
+ {
49
+ value: SortOrder.Ascending,
50
+ label: "Oldest first",
51
+ icon: IconProp.BarsArrowUp,
52
+ },
53
+ ];
54
+
55
+ export interface FeedEventTypeOption {
56
+ value: string;
57
+ label: string;
58
+ icon?: IconProp | undefined;
59
+ }
60
+
61
+ export type GetFeedEventTypeLabelFunction = (
62
+ eventType: string,
63
+ ) => string | undefined;
64
+
65
+ export type GetFeedEventTypeIconFunction = (
66
+ eventType: string,
67
+ ) => IconProp | undefined;
68
+
69
+ /*
70
+ * Event types shared by many feeds whose split name reads badly
71
+ * ("Owner User Added"). A Map rather than an object literal, so an event type
72
+ * that happens to share a name with an Object.prototype member ("toString")
73
+ * cannot come back as a function.
74
+ */
75
+ const EVENT_TYPE_LABELS: Map<string, string> = new Map<string, string>([
76
+ ["OwnerUserAdded", "User Added as Owner"],
77
+ ["OwnerUserRemoved", "User Removed as Owner"],
78
+ ["OwnerTeamAdded", "Team Added as Owner"],
79
+ ["OwnerTeamRemoved", "Team Removed as Owner"],
80
+ ["AutoRemediation", "Auto-Remediation"],
81
+ ]);
82
+
83
+ /*
84
+ * Runs that camel-case splitting would get wrong, matched before any other
85
+ * word: "VMware" would split into "V Mware", "OnCall" should read
86
+ * "On-Call", and the SLO feed's "ServiceLevelObjective" prefix is written
87
+ * "SLO" everywhere else in the dashboard.
88
+ */
89
+ const EVENT_TYPE_WORDS: Array<{ word: string; label: string }> = [
90
+ { word: "ServiceLevelObjective", label: "SLO" },
91
+ { word: "VMware", label: "VMware" },
92
+ { word: "VCenter", label: "vCenter" },
93
+ { word: "OnCall", label: "On-Call" },
94
+ ];
95
+
96
+ // Joining words stay lower case inside a title ("Added to Episode").
97
+ const LOWER_CASE_WORDS: Set<string> = new Set<string>([
98
+ "a",
99
+ "an",
100
+ "and",
101
+ "as",
102
+ "by",
103
+ "for",
104
+ "from",
105
+ "in",
106
+ "of",
107
+ "on",
108
+ "or",
109
+ "the",
110
+ "to",
111
+ ]);
112
+
113
+ const EVENT_TYPE_WORD_PATTERN: RegExp = new RegExp(
114
+ `${EVENT_TYPE_WORDS.map((entry: { word: string }) => {
115
+ return entry.word;
116
+ }).join("|")}|[A-Z]+(?![a-z])|[A-Z]?[a-z]+|[0-9]+`,
117
+ "g",
118
+ );
119
+
120
+ type GetFeedEventTypeLabel = (eventType: string) => string;
121
+
122
+ /*
123
+ * Feed event types are enum values named like "IncidentStateChanged", so a
124
+ * readable label is the value split into words. A feed with a better name for
125
+ * one of its own events passes getEventTypeLabel to getFeedEventTypeOptions.
126
+ */
127
+ export const getFeedEventTypeLabel: GetFeedEventTypeLabel = (
128
+ eventType: string,
129
+ ): string => {
130
+ const knownLabel: string | undefined = EVENT_TYPE_LABELS.get(eventType);
131
+
132
+ if (knownLabel) {
133
+ return knownLabel;
134
+ }
135
+
136
+ const words: Array<string> = eventType.match(EVENT_TYPE_WORD_PATTERN) || [];
137
+
138
+ if (words.length === 0) {
139
+ return eventType;
140
+ }
141
+
142
+ return words
143
+ .map((word: string, index: number): string => {
144
+ const knownWord: { word: string; label: string } | undefined =
145
+ EVENT_TYPE_WORDS.find((entry: { word: string }) => {
146
+ return entry.word === word;
147
+ });
148
+
149
+ if (knownWord) {
150
+ return knownWord.label;
151
+ }
152
+
153
+ if (index > 0 && LOWER_CASE_WORDS.has(word.toLowerCase())) {
154
+ return word.toLowerCase();
155
+ }
156
+
157
+ return word.charAt(0).toUpperCase() + word.slice(1);
158
+ })
159
+ .join(" ");
160
+ };
161
+
162
+ type GetFeedEventTypeOptions = (data: {
163
+ eventTypes: Array<string>;
164
+ getEventTypeLabel?: GetFeedEventTypeLabelFunction | undefined;
165
+ getEventTypeIcon?: GetFeedEventTypeIconFunction | undefined;
166
+ }) => Array<FeedEventTypeOption>;
167
+
168
+ /*
169
+ * The checklist behind the button: one entry per event type, alphabetical by
170
+ * label so the reader can scan for the one they want.
171
+ */
172
+ export const getFeedEventTypeOptions: GetFeedEventTypeOptions = (data: {
173
+ eventTypes: Array<string>;
174
+ getEventTypeLabel?: GetFeedEventTypeLabelFunction | undefined;
175
+ getEventTypeIcon?: GetFeedEventTypeIconFunction | undefined;
176
+ }): Array<FeedEventTypeOption> => {
177
+ const uniqueEventTypes: Array<string> = Array.from(
178
+ new Set<string>(
179
+ data.eventTypes.filter((eventType: string) => {
180
+ return Boolean(eventType);
181
+ }),
182
+ ),
183
+ );
184
+
185
+ return uniqueEventTypes
186
+ .map((eventType: string): FeedEventTypeOption => {
187
+ return {
188
+ value: eventType,
189
+ label:
190
+ data.getEventTypeLabel?.(eventType) ||
191
+ getFeedEventTypeLabel(eventType),
192
+ icon: data.getEventTypeIcon?.(eventType),
193
+ };
194
+ })
195
+ .sort((a: FeedEventTypeOption, b: FeedEventTypeOption): number => {
196
+ return a.label.localeCompare(b.label);
197
+ });
198
+ };
199
+
200
+ type SanitizeFeedEventTypes = (data: {
201
+ selectedEventTypes: Array<string>;
202
+ knownEventTypes: Array<string>;
203
+ }) => Array<string>;
204
+
205
+ /*
206
+ * Keep only event types the feed actually has, once each, in the feed's own
207
+ * order. The order matters: it makes the request - and so the reload key -
208
+ * the same whichever order the reader ticked the boxes in.
209
+ */
210
+ export const sanitizeFeedEventTypes: SanitizeFeedEventTypes = (data: {
211
+ selectedEventTypes: Array<string>;
212
+ knownEventTypes: Array<string>;
213
+ }): Array<string> => {
214
+ const selected: Set<string> = new Set<string>(data.selectedEventTypes);
215
+
216
+ return Array.from(new Set<string>(data.knownEventTypes)).filter(
217
+ (eventType: string) => {
218
+ return selected.has(eventType);
219
+ },
220
+ );
221
+ };
222
+
223
+ type IsFeedSortOrder = (value: unknown) => value is SortOrder;
224
+
225
+ export const isFeedSortOrder: IsFeedSortOrder = (
226
+ value: unknown,
227
+ ): value is SortOrder => {
228
+ return value === SortOrder.Ascending || value === SortOrder.Descending;
229
+ };
230
+
231
+ type GetFeedOptionsKey = (options: FeedOptions) => string;
232
+
233
+ /*
234
+ * A stable string for "what this feed is showing". useFeedItems re-reads the
235
+ * feed from its first window whenever it changes.
236
+ */
237
+ export const getFeedOptionsKey: GetFeedOptionsKey = (
238
+ options: FeedOptions,
239
+ ): string => {
240
+ return `${options.sortOrder}|${options.eventTypes.join(",")}`;
241
+ };
242
+
243
+ type IsFeedFiltered = (options: FeedOptions) => boolean;
244
+
245
+ export const isFeedFiltered: IsFeedFiltered = (
246
+ options: FeedOptions,
247
+ ): boolean => {
248
+ return options.eventTypes.length > 0;
249
+ };
250
+
251
+ type IsDefaultFeedOptions = (options: FeedOptions) => boolean;
252
+
253
+ export const isDefaultFeedOptions: IsDefaultFeedOptions = (
254
+ options: FeedOptions,
255
+ ): boolean => {
256
+ return (
257
+ options.sortOrder === DEFAULT_FEED_SORT_ORDER && !isFeedFiltered(options)
258
+ );
259
+ };
260
+
261
+ /*
262
+ * The query fragment for the event type filter, keyed by the feed model's
263
+ * event type column. It is empty when nothing is filtered, so an unfiltered
264
+ * feed sends exactly the query it always sent.
265
+ */
266
+ export const getFeedEventTypeQuery: <TFeedModel extends GenericObject>(
267
+ eventTypeColumn: Extract<keyof TFeedModel, string>,
268
+ options: FeedOptions,
269
+ ) => Query<TFeedModel> = <TFeedModel extends GenericObject>(
270
+ eventTypeColumn: Extract<keyof TFeedModel, string>,
271
+ options: FeedOptions,
272
+ ): Query<TFeedModel> => {
273
+ if (!isFeedFiltered(options)) {
274
+ return {};
275
+ }
276
+
277
+ return {
278
+ [eventTypeColumn]: new Includes([...options.eventTypes]),
279
+ } as unknown as Query<TFeedModel>;
280
+ };
281
+
282
+ export const FILTERED_FEED_NO_ITEMS_MESSAGE: string =
283
+ "No events in this feed match the selected event types.";
284
+
285
+ type GetFeedNoItemsMessage = (data: {
286
+ options: FeedOptions;
287
+ noItemsMessage: string;
288
+ }) => string;
289
+
290
+ /*
291
+ * An empty filtered feed says so, rather than claiming the resource has no
292
+ * activity at all.
293
+ */
294
+ export const getFeedNoItemsMessage: GetFeedNoItemsMessage = (data: {
295
+ options: FeedOptions;
296
+ noItemsMessage: string;
297
+ }): string => {
298
+ return isFeedFiltered(data.options)
299
+ ? FILTERED_FEED_NO_ITEMS_MESSAGE
300
+ : data.noItemsMessage;
301
+ };
302
+
303
+ /*
304
+ * The control's own sentences, as the English keys the dashboard's locale
305
+ * files translate (see Utils/Translation). The ones with placeholders are
306
+ * looked up whole and filled afterwards, so a translation can reorder the
307
+ * words around the numbers.
308
+ */
309
+ export const FEED_OPTIONS_TEXT: {
310
+ triggerLabel: string;
311
+ searchResults: string;
312
+ panelLabel: string;
313
+ sortHeading: string;
314
+ eventTypesHeading: string;
315
+ showAll: string;
316
+ searchPlaceholder: string;
317
+ showingEveryEventType: string;
318
+ showingSomeEventTypes: string;
319
+ noSearchMatches: string;
320
+ noEventTypes: string;
321
+ reset: string;
322
+ summaryAllEventTypes: string;
323
+ summarySomeEventTypes: string;
324
+ summarySomeOfOneEventType: string;
325
+ } = {
326
+ triggerLabel: "Filter & Sort",
327
+ searchResults: "Matching event types: {{count}}",
328
+ panelLabel: "Filter and sort feed",
329
+ sortHeading: "Sort by time",
330
+ eventTypesHeading: "Event types",
331
+ showAll: "Show all",
332
+ searchPlaceholder: "Search event types",
333
+ showingEveryEventType:
334
+ "Showing every event type. Tick one or more to narrow the feed.",
335
+ showingSomeEventTypes: "Showing {{selected}} of {{total}} event types.",
336
+ noSearchMatches: 'No event types match "{{search}}".',
337
+ noEventTypes: "This feed has no event types to filter by.",
338
+ reset: "Reset to default",
339
+ summaryAllEventTypes: "{{sortOrder}}, all event types",
340
+ summarySomeEventTypes: "{{sortOrder}}, {{selected}} of {{total}} event types",
341
+ summarySomeOfOneEventType:
342
+ "{{sortOrder}}, {{selected}} of {{total}} event type",
343
+ };
344
+
345
+ // Looks a sentence up in the reader's language; undefined means "as written".
346
+ export type FeedOptionsTranslateFunction = (
347
+ text: string | undefined,
348
+ ) => string | undefined;
349
+
350
+ const PLACEHOLDER_PATTERN: RegExp = /\{\{\s*([A-Za-z0-9_]+)\s*\}\}/g;
351
+
352
+ type TranslateFeedOptionsText = (data: {
353
+ text: string;
354
+ values?: Record<string, string | number> | undefined;
355
+ translate?: FeedOptionsTranslateFunction | undefined;
356
+ }) => string;
357
+
358
+ /*
359
+ * Translate, then fill the placeholders. A placeholder with no value is left
360
+ * showing, so a broken translation is visible rather than a sentence with a
361
+ * hole in it.
362
+ */
363
+ export const translateFeedOptionsText: TranslateFeedOptionsText = (data: {
364
+ text: string;
365
+ values?: Record<string, string | number> | undefined;
366
+ translate?: FeedOptionsTranslateFunction | undefined;
367
+ }): string => {
368
+ const translated: string =
369
+ (data.translate ? data.translate(data.text) : undefined) || data.text;
370
+ const values: Record<string, string | number> = data.values || {};
371
+
372
+ return translated.replace(
373
+ PLACEHOLDER_PATTERN,
374
+ (placeholder: string, name: string): string => {
375
+ const value: string | number | undefined = values[name];
376
+
377
+ return value === undefined ? placeholder : String(value);
378
+ },
379
+ );
380
+ };
381
+
382
+ type GetFeedOptionsSummary = (data: {
383
+ options: FeedOptions;
384
+ eventTypeCount: number;
385
+ translate?: FeedOptionsTranslateFunction | undefined;
386
+ }) => string;
387
+
388
+ /*
389
+ * One sentence for the trigger's accessible name and tooltip, so the state
390
+ * hidden behind the button can be read without opening it.
391
+ */
392
+ export const getFeedOptionsSummary: GetFeedOptionsSummary = (data: {
393
+ options: FeedOptions;
394
+ eventTypeCount: number;
395
+ translate?: FeedOptionsTranslateFunction | undefined;
396
+ }): string => {
397
+ const sortOrder: string = translateFeedOptionsText({
398
+ text:
399
+ FEED_SORT_ORDER_OPTIONS.find((option: FeedSortOrderOption) => {
400
+ return option.value === data.options.sortOrder;
401
+ })?.label || "Newest first",
402
+ translate: data.translate,
403
+ });
404
+
405
+ const selectedCount: number = data.options.eventTypes.length;
406
+
407
+ if (selectedCount === 0) {
408
+ return translateFeedOptionsText({
409
+ text: FEED_OPTIONS_TEXT.summaryAllEventTypes,
410
+ values: { sortOrder },
411
+ translate: data.translate,
412
+ });
413
+ }
414
+
415
+ return translateFeedOptionsText({
416
+ text:
417
+ data.eventTypeCount === 1
418
+ ? FEED_OPTIONS_TEXT.summarySomeOfOneEventType
419
+ : FEED_OPTIONS_TEXT.summarySomeEventTypes,
420
+ values: {
421
+ sortOrder,
422
+ selected: selectedCount,
423
+ total: data.eventTypeCount,
424
+ },
425
+ translate: data.translate,
426
+ });
427
+ };