@oneuptime/common 12.0.22 → 12.0.24

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 (345) hide show
  1. package/Models/DatabaseModels/DetectionRule.ts +55 -0
  2. package/Models/DatabaseModels/Index.ts +2 -0
  3. package/Models/DatabaseModels/NetworkDevice.ts +44 -0
  4. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +584 -0
  5. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +105 -0
  6. package/Models/DatabaseModels/Project.ts +68 -0
  7. package/Models/DatabaseModels/User.ts +68 -0
  8. package/Server/API/TelemetryAPI.ts +29 -0
  9. package/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.ts +60 -0
  10. package/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.ts +26 -0
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.ts +26 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.ts +28 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.ts +49 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.ts +33 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
  16. package/Server/Middleware/GzipRequestBody.ts +311 -0
  17. package/Server/Middleware/MultipartFormData.ts +87 -3
  18. package/Server/Services/DetectionRuleService.ts +73 -6
  19. package/Server/Services/Index.ts +207 -0
  20. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +917 -0
  21. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +181 -0
  22. package/Server/Services/NetworkDeviceDiscoveryScanService.ts +59 -0
  23. package/Server/Services/NetworkDeviceService.ts +148 -0
  24. package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +65 -0
  25. package/Server/Services/OnCallDutyPolicyFeedService.ts +1 -1
  26. package/Server/Services/ProjectService.ts +29 -19
  27. package/Server/Services/SecurityEventService.ts +90 -13
  28. package/Server/Services/StatusPageResourceService.ts +223 -0
  29. package/Server/Services/TelemetryAttributeService.ts +17 -0
  30. package/Server/Services/UserService.ts +4 -6
  31. package/Server/Types/Markdown.ts +161 -67
  32. package/Server/Utils/AI/Toolbox/OnCallTools.ts +12 -4
  33. package/Server/Utils/AnalyticsDatabase/Statement.ts +13 -1
  34. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +297 -6
  35. package/Server/Utils/Attribution.ts +4 -0
  36. package/Server/Utils/Marketing/MarketingEventUtil.ts +45 -7
  37. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +39 -1
  38. package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +55 -3
  39. package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +21 -0
  40. package/Server/Utils/StartServer.ts +12 -32
  41. package/Server/Utils/Telemetry/LlmCostBudgetEvaluator.ts +101 -4
  42. package/Server/Utils/Telemetry/LlmMetricSpend.ts +130 -0
  43. package/Server/Views/Partials/AnalyticsConsent.ejs +159 -102
  44. package/Server/Views/Partials/Head.ejs +2 -1
  45. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +776 -38
  46. package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +359 -0
  47. package/Tests/App/Dashboard/CorrelateGraph.test.tsx +865 -0
  48. package/Tests/App/Dashboard/CorrelationGraph.test.ts +346 -0
  49. package/Tests/App/Dashboard/CriteriaFilterConditionDropdown.test.tsx +256 -0
  50. package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +738 -0
  51. package/Tests/App/Dashboard/CriteriaFilterMonitorTypeChange.test.ts +1122 -0
  52. package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +283 -0
  53. package/Tests/App/Dashboard/ExternalStatusPageCriteriaFilter.test.ts +407 -0
  54. package/Tests/App/Dashboard/MetricSeriesInvestigateMenu.test.tsx +5 -14
  55. package/Tests/App/Dashboard/MonitorCriteriaActionToggles.test.tsx +426 -0
  56. package/Tests/App/Dashboard/MonitorStepsCriteriaAlignmentWiring.test.tsx +352 -0
  57. package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +278 -0
  58. package/Tests/App/Dashboard/OnCallLayerShiftPreviewOverrides.test.ts +237 -0
  59. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +2 -2
  60. package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +460 -0
  61. package/Tests/App/Dashboard/SecurityEventAttributeUtil.test.ts +171 -0
  62. package/Tests/App/Dashboard/SecurityEventCorrelation.test.ts +857 -0
  63. package/Tests/App/Dashboard/SecurityEventDetailObservables.test.tsx +194 -0
  64. package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +124 -0
  65. package/Tests/App/Dashboard/SecurityEventsMonitorStepForm.test.tsx +79 -19
  66. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +382 -0
  67. package/Tests/App/StatusPage/BulkAddStatusPageMonitors.test.ts +216 -0
  68. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +590 -11
  69. package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +757 -0
  70. package/Tests/Models/DiscoveryScanNameColumn.test.ts +293 -0
  71. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +564 -0
  72. package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +120 -4
  73. package/Tests/Server/Middleware/GzipRequestBody.test.ts +725 -0
  74. package/Tests/Server/Middleware/MultipartFormData.test.ts +298 -0
  75. package/Tests/Server/Services/AddDetectionRuleDistinctCountColumnsMigration.test.ts +311 -0
  76. package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +205 -0
  77. package/Tests/Server/Services/DetectionRuleService.test.ts +134 -2
  78. package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +7 -1
  79. package/Tests/Server/Services/FeedRetentionConsistency.test.ts +131 -0
  80. package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +933 -0
  81. package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +194 -0
  82. package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +800 -0
  83. package/Tests/Server/Services/OnCallScheduleAttachRosterRefresh.test.ts +244 -0
  84. package/Tests/Server/Services/SecurityEventService.test.ts +376 -0
  85. package/Tests/Server/Services/StatusPageResourceDuplicates.test.ts +703 -0
  86. package/Tests/Server/Services/TelemetryAttributeServiceSecurityEvent.test.ts +256 -0
  87. package/Tests/Server/Types/Workflow/Components/ComponentRegistryParity.test.ts +417 -0
  88. package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorWhereOperators.test.ts +677 -0
  89. package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +43 -0
  90. package/Tests/Server/Utils/Monitor/Criteria/ProfileMonitorCriteria.test.ts +15 -11
  91. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +97 -1
  92. package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +369 -8
  93. package/Tests/Server/Utils/SecurityEvent/SigmaClickhouseCompiler.test.ts +35 -0
  94. package/Tests/Server/Utils/Telemetry/LlmCostBudgetEvaluator.test.ts +368 -4
  95. package/Tests/Server/Utils/Telemetry/LlmMetricSpend.test.ts +245 -0
  96. package/Tests/Server/Views/AnalyticsConsentPartial.test.ts +48 -5
  97. package/Tests/Types/Code/YamlSyntax.test.ts +396 -0
  98. package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +957 -0
  99. package/Tests/Types/Monitor/MonitorCriteriaActionValidation.test.ts +598 -0
  100. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +49 -0
  101. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +6 -6
  102. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.test.ts +4 -4
  103. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +4 -3
  104. package/Tests/Types/Telemetry/LlmMetricConventions.test.ts +193 -0
  105. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +0 -12
  106. package/Tests/UI/Components/CardModelDetailEdit.test.tsx +1 -17
  107. package/Tests/UI/Components/CodeEditor.test.tsx +474 -10
  108. package/Tests/UI/Components/Detail/YamlField.test.tsx +105 -0
  109. package/Tests/UI/Components/EntityDropdownLabelsBulkAdd.test.tsx +319 -0
  110. package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +231 -0
  111. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +1 -0
  112. package/Tests/UI/Components/Forms/ValidationYAML.test.ts +234 -0
  113. package/Tests/UI/Components/ModelTable/AttributeColumns.test.tsx +573 -0
  114. package/Tests/UI/Components/ModelTable/BaseModelTableAttributeColumns.test.tsx +824 -0
  115. package/Tests/UI/Components/ModelTable/ColumnCustomizationModalAddableColumns.test.tsx +707 -0
  116. package/Tests/UI/Components/SideOver.test.tsx +1 -1
  117. package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +294 -0
  118. package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +436 -0
  119. package/Tests/UI/Components/TableBulkCsvExport.test.tsx +6 -2
  120. package/Tests/UI/Components/Toggle.test.tsx +25 -0
  121. package/Tests/UI/Components/YamlEditor.test.tsx +847 -0
  122. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +252 -0
  123. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +516 -0
  124. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +272 -0
  125. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +221 -0
  126. package/Tests/Utils/NetworkDiscovery/ScanNameUtil.test.ts +312 -0
  127. package/Tests/Utils/NetworkDiscovery/ScanTargetUtil.test.ts +164 -0
  128. package/Tests/Utils/StatusPage/ResourceExplorer.test.ts +468 -0
  129. package/Tests/Utils/Telemetry/LlmMetricQuery.test.ts +472 -0
  130. package/Types/Code/YamlSyntax.ts +396 -0
  131. package/Types/Exception/ExceptionCode.ts +1 -0
  132. package/Types/Exception/PayloadTooLargeException.ts +8 -0
  133. package/Types/Marketing/Attribution.ts +10 -0
  134. package/Types/Marketing/MarketingEvent.ts +4 -0
  135. package/Types/Monitor/MonitorCriteriaInstance.ts +116 -56
  136. package/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.ts +2 -1
  137. package/Types/NetworkAutomation/RuleRunResult.ts +84 -0
  138. package/Types/Permission.ts +47 -0
  139. package/Types/SecurityEvent/DetectionFindingConstants.ts +11 -0
  140. package/Types/Telemetry/LlmMetricConventions.ts +124 -0
  141. package/UI/Components/AutocompleteTextInput/AutocompleteTextInput.tsx +3 -0
  142. package/UI/Components/BulkUpdate/BulkUpdateForm.tsx +10 -1
  143. package/UI/Components/CodeEditor/CodeEditor.tsx +241 -79
  144. package/UI/Components/CodeEditor/YamlEditor.tsx +369 -0
  145. package/UI/Components/Detail/Detail.tsx +10 -0
  146. package/UI/Components/EntityDropdown/EntityDropdown.tsx +33 -0
  147. package/UI/Components/Forms/Fields/FormField.tsx +31 -0
  148. package/UI/Components/Forms/Types/Field.ts +8 -0
  149. package/UI/Components/Forms/Types/FormFieldSchemaType.ts +1 -0
  150. package/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.ts +2 -0
  151. package/UI/Components/Forms/Validation.ts +46 -0
  152. package/UI/Components/Input/Input.tsx +3 -0
  153. package/UI/Components/ModelTable/AttributeColumns.tsx +321 -0
  154. package/UI/Components/ModelTable/BaseModelTable.tsx +263 -14
  155. package/UI/Components/ModelTable/Column.ts +8 -0
  156. package/UI/Components/ModelTable/ColumnCustomizationModal.tsx +310 -0
  157. package/UI/Components/ModelTable/ColumnPreference.ts +13 -1
  158. package/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.tsx +2 -2
  159. package/UI/Components/SideOver/SideOver.tsx +5 -5
  160. package/UI/Components/StatusPage/ResourceGrid.tsx +82 -2
  161. package/UI/Components/StatusPage/ResourceList.tsx +197 -38
  162. package/UI/Components/Toggle/Toggle.tsx +9 -1
  163. package/UI/Components/Types/FieldType.ts +1 -0
  164. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +73 -1
  165. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +257 -0
  166. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +183 -0
  167. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +95 -0
  168. package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +66 -0
  169. package/Utils/NetworkDiscovery/ScanNameUtil.ts +181 -0
  170. package/Utils/NetworkDiscovery/ScanTargetUtil.ts +82 -0
  171. package/Utils/StatusPage/ResourceExplorer.ts +258 -0
  172. package/Utils/Telemetry/LlmMetricQuery.ts +204 -0
  173. package/build/dist/Models/DatabaseModels/DetectionRule.js +57 -0
  174. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  175. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  176. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  177. package/build/dist/Models/DatabaseModels/NetworkDevice.js +45 -0
  178. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  179. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +609 -0
  180. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -0
  181. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +97 -0
  182. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  183. package/build/dist/Models/DatabaseModels/Project.js +76 -0
  184. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  185. package/build/dist/Models/DatabaseModels/User.js +76 -0
  186. package/build/dist/Models/DatabaseModels/User.js.map +1 -1
  187. package/build/dist/Server/API/TelemetryAPI.js +17 -0
  188. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  189. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.js +35 -0
  190. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789100000000-AddNetworkDeviceAutoImportRule.js.map +1 -0
  191. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.js +19 -0
  192. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789200000000-AddSysObjectIdPatternToAutoImportRule.js.map +1 -0
  193. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.js +19 -0
  194. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789300000000-AddAutoApplyVendorHealthTemplate.js.map +1 -0
  195. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js +21 -0
  196. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789400000000-AddNameToNetworkDeviceDiscoveryScan.js.map +1 -0
  197. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js +42 -0
  198. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789500000000-AddCampaignUtmFields.js.map +1 -0
  199. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js +22 -0
  200. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789512000000-AddDetectionRuleDistinctCountColumns.js.map +1 -0
  201. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
  202. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  203. package/build/dist/Server/Middleware/GzipRequestBody.js +224 -0
  204. package/build/dist/Server/Middleware/GzipRequestBody.js.map +1 -0
  205. package/build/dist/Server/Middleware/MultipartFormData.js +71 -2
  206. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  207. package/build/dist/Server/Services/DetectionRuleService.js +49 -4
  208. package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
  209. package/build/dist/Server/Services/Index.js +206 -0
  210. package/build/dist/Server/Services/Index.js.map +1 -1
  211. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +711 -0
  212. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -0
  213. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +155 -0
  214. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -0
  215. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +50 -0
  216. package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
  217. package/build/dist/Server/Services/NetworkDeviceService.js +124 -0
  218. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  219. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +68 -13
  220. package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
  221. package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js +1 -1
  222. package/build/dist/Server/Services/OnCallDutyPolicyFeedService.js.map +1 -1
  223. package/build/dist/Server/Services/ProjectService.js +25 -45
  224. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  225. package/build/dist/Server/Services/SecurityEventService.js +57 -5
  226. package/build/dist/Server/Services/SecurityEventService.js.map +1 -1
  227. package/build/dist/Server/Services/StatusPageResourceService.js +140 -0
  228. package/build/dist/Server/Services/StatusPageResourceService.js.map +1 -1
  229. package/build/dist/Server/Services/TelemetryAttributeService.js +17 -0
  230. package/build/dist/Server/Services/TelemetryAttributeService.js.map +1 -1
  231. package/build/dist/Server/Services/UserService.js +2 -12
  232. package/build/dist/Server/Services/UserService.js.map +1 -1
  233. package/build/dist/Server/Types/Markdown.js +147 -61
  234. package/build/dist/Server/Types/Markdown.js.map +1 -1
  235. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js +12 -4
  236. package/build/dist/Server/Utils/AI/Toolbox/OnCallTools.js.map +1 -1
  237. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +12 -1
  238. package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
  239. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +246 -9
  240. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  241. package/build/dist/Server/Utils/Attribution.js.map +1 -1
  242. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +27 -7
  243. package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -1
  244. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +26 -0
  245. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  246. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +42 -7
  247. package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
  248. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +18 -0
  249. package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
  250. package/build/dist/Server/Utils/StartServer.js +12 -21
  251. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  252. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js +76 -5
  253. package/build/dist/Server/Utils/Telemetry/LlmCostBudgetEvaluator.js.map +1 -1
  254. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js +102 -0
  255. package/build/dist/Server/Utils/Telemetry/LlmMetricSpend.js.map +1 -0
  256. package/build/dist/Types/Code/YamlSyntax.js +212 -0
  257. package/build/dist/Types/Code/YamlSyntax.js.map +1 -0
  258. package/build/dist/Types/Exception/ExceptionCode.js +1 -0
  259. package/build/dist/Types/Exception/ExceptionCode.js.map +1 -1
  260. package/build/dist/Types/Exception/PayloadTooLargeException.js +8 -0
  261. package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -0
  262. package/build/dist/Types/Marketing/Attribution.js +10 -0
  263. package/build/dist/Types/Marketing/Attribution.js.map +1 -1
  264. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +112 -51
  265. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  266. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js +2 -1
  267. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationSeverityMapper.js.map +1 -1
  268. package/build/dist/Types/NetworkAutomation/RuleRunResult.js +24 -0
  269. package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
  270. package/build/dist/Types/Permission.js +41 -0
  271. package/build/dist/Types/Permission.js.map +1 -1
  272. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +9 -0
  273. package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
  274. package/build/dist/Types/Telemetry/LlmMetricConventions.js +98 -0
  275. package/build/dist/Types/Telemetry/LlmMetricConventions.js.map +1 -0
  276. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js +1 -1
  277. package/build/dist/UI/Components/AutocompleteTextInput/AutocompleteTextInput.js.map +1 -1
  278. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js +5 -2
  279. package/build/dist/UI/Components/BulkUpdate/BulkUpdateForm.js.map +1 -1
  280. package/build/dist/UI/Components/CodeEditor/CodeEditor.js +206 -76
  281. package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
  282. package/build/dist/UI/Components/CodeEditor/YamlEditor.js +201 -0
  283. package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -0
  284. package/build/dist/UI/Components/Detail/Detail.js +9 -0
  285. package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
  286. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +16 -1
  287. package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
  288. package/build/dist/UI/Components/Forms/Fields/FormField.js +14 -1
  289. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  290. package/build/dist/UI/Components/Forms/Types/Field.js.map +1 -1
  291. package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js +1 -0
  292. package/build/dist/UI/Components/Forms/Types/FormFieldSchemaType.js.map +1 -1
  293. package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js +2 -0
  294. package/build/dist/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.js.map +1 -1
  295. package/build/dist/UI/Components/Forms/Validation.js +27 -0
  296. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  297. package/build/dist/UI/Components/Input/Input.js +1 -1
  298. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  299. package/build/dist/UI/Components/ModelTable/AttributeColumns.js +159 -0
  300. package/build/dist/UI/Components/ModelTable/AttributeColumns.js.map +1 -0
  301. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +179 -17
  302. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  303. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js +133 -2
  304. package/build/dist/UI/Components/ModelTable/ColumnCustomizationModal.js.map +1 -1
  305. package/build/dist/UI/Components/ModelTable/ColumnPreference.js +7 -1
  306. package/build/dist/UI/Components/ModelTable/ColumnPreference.js.map +1 -1
  307. package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesModal.js +2 -2
  308. package/build/dist/UI/Components/SideOver/SideOver.js +5 -5
  309. package/build/dist/UI/Components/StatusPage/ResourceGrid.js +28 -2
  310. package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
  311. package/build/dist/UI/Components/StatusPage/ResourceList.js +87 -20
  312. package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
  313. package/build/dist/UI/Components/Toggle/Toggle.js +9 -1
  314. package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
  315. package/build/dist/UI/Components/Types/FieldType.js +1 -0
  316. package/build/dist/UI/Components/Types/FieldType.js.map +1 -1
  317. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +37 -1
  318. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
  319. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +149 -0
  320. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -0
  321. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +121 -0
  322. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -0
  323. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +75 -0
  324. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -0
  325. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +59 -0
  326. package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -0
  327. package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js +120 -0
  328. package/build/dist/Utils/NetworkDiscovery/ScanNameUtil.js.map +1 -0
  329. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js +60 -0
  330. package/build/dist/Utils/NetworkDiscovery/ScanTargetUtil.js.map +1 -1
  331. package/build/dist/Utils/StatusPage/ResourceExplorer.js +171 -0
  332. package/build/dist/Utils/StatusPage/ResourceExplorer.js.map +1 -1
  333. package/build/dist/Utils/Telemetry/LlmMetricQuery.js +119 -0
  334. package/build/dist/Utils/Telemetry/LlmMetricQuery.js.map +1 -0
  335. package/jest.config.json +2 -0
  336. package/package.json +1 -1
  337. package/tsconfig.json +2 -1
  338. package/Tests/UI/Components/Toast.test.tsx +0 -197
  339. package/Tests/UI/Components/ToastStacking.test.tsx +0 -198
  340. package/UI/Components/Toast/Toast.tsx +0 -189
  341. package/UI/Components/Toast/ToastInit.tsx +0 -110
  342. package/build/dist/UI/Components/Toast/Toast.js +0 -123
  343. package/build/dist/UI/Components/Toast/Toast.js.map +0 -1
  344. package/build/dist/UI/Components/Toast/ToastInit.js +0 -53
  345. package/build/dist/UI/Components/Toast/ToastInit.js.map +0 -1
@@ -1,198 +0,0 @@
1
- import ToastLayout, {
2
- ShowToastNotification,
3
- } from "../../../UI/Components/Toast/ToastInit";
4
- import { ToastType } from "../../../UI/Components/Toast/Toast";
5
- import "@testing-library/jest-dom";
6
- import {
7
- act,
8
- cleanup,
9
- fireEvent,
10
- render,
11
- screen,
12
- waitFor,
13
- } from "@testing-library/react";
14
- import React from "react";
15
- import { afterEach, describe, expect, jest, test } from "@jest/globals";
16
-
17
- /*
18
- * ToastInit used to render every toast as its own fixed strip at top-0 (the
19
- * index prop that was supposed to offset them was never passed), so stacked
20
- * toasts painted on top of each other and only the last one was readable.
21
- * The contract pinned here: ONE fixed region, cards stacked in a flex column
22
- * in insertion order.
23
- */
24
-
25
- type ShowToastFunction = (title: string, onClose?: () => void) => void;
26
-
27
- const showToast: ShowToastFunction = (
28
- title: string,
29
- onClose?: () => void,
30
- ): void => {
31
- act(() => {
32
- ShowToastNotification({
33
- title,
34
- description: `${title} description`,
35
- type: ToastType.SUCCESS,
36
- onClose,
37
- });
38
- });
39
- };
40
-
41
- describe("Toast stacking", () => {
42
- afterEach(() => {
43
- cleanup();
44
- jest.clearAllMocks();
45
- });
46
-
47
- test("renders one fixed region that keeps its slot in the z-index ladder", () => {
48
- render(<ToastLayout />);
49
-
50
- const region: HTMLElement = screen.getByTestId("toast-region");
51
-
52
- /*
53
- * z-40 is deliberate: above SideOver (z-30), below Modal (z-50). The
54
- * region itself takes no pointer events; only the cards inside do.
55
- */
56
- expect(region).toHaveClass(
57
- "pointer-events-none",
58
- "fixed",
59
- "z-40",
60
- "top-0",
61
- "left-0",
62
- "right-0",
63
- );
64
- expect(region).toHaveClass("sm:items-start", "sm:p-6");
65
- expect(region).toHaveAttribute("aria-live", "assertive");
66
- });
67
-
68
- test("stacks multiple toasts in one region, in insertion order", () => {
69
- render(<ToastLayout />);
70
-
71
- showToast("First");
72
- showToast("Second");
73
- showToast("Third");
74
-
75
- const toasts: Array<HTMLElement> = screen.getAllByTestId("toast");
76
-
77
- expect(toasts).toHaveLength(3);
78
-
79
- // All three cards live inside the ONE region, not three fixed strips.
80
- const region: HTMLElement = screen.getByTestId("toast-region");
81
-
82
- for (const toast of toasts) {
83
- expect(region).toContainElement(toast);
84
- expect(toast).not.toHaveClass("fixed");
85
- }
86
-
87
- // The stack is a flex column with a gap, so cards never overlap.
88
- const stack: HTMLElement = toasts[0]?.parentElement as HTMLElement;
89
-
90
- expect(stack).toHaveClass("flex", "flex-col", "gap-4");
91
- expect(toasts[1]?.parentElement).toBe(stack);
92
- expect(toasts[2]?.parentElement).toBe(stack);
93
-
94
- const titles: Array<string | null> = screen
95
- .getAllByTestId("title")
96
- .map((title: HTMLElement) => {
97
- return title.textContent;
98
- });
99
-
100
- expect(titles).toEqual(["First", "Second", "Third"]);
101
- });
102
-
103
- test("dismissing one toast removes only that toast and calls its onClose", async () => {
104
- const onCloseFirst: () => void = jest.fn();
105
-
106
- render(<ToastLayout />);
107
-
108
- showToast("First", onCloseFirst);
109
- showToast("Second");
110
-
111
- const closeButtons: Array<HTMLElement> =
112
- screen.getAllByTestId("close-button");
113
-
114
- expect(closeButtons).toHaveLength(2);
115
-
116
- fireEvent.click(closeButtons[0] as HTMLElement);
117
-
118
- /*
119
- * The exit fade delays the unmount, so removal is awaited rather than
120
- * asserted synchronously.
121
- */
122
- await waitFor(() => {
123
- expect(screen.getAllByTestId("toast")).toHaveLength(1);
124
- });
125
-
126
- expect(onCloseFirst).toHaveBeenCalledTimes(1);
127
- expect(screen.getByTestId("title")).toHaveTextContent("Second");
128
- });
129
-
130
- test("a toast dispatched after a dismissal still stacks below the survivors", async () => {
131
- render(<ToastLayout />);
132
-
133
- showToast("First");
134
- showToast("Second");
135
-
136
- fireEvent.click(screen.getAllByTestId("close-button")[0] as HTMLElement);
137
-
138
- await waitFor(() => {
139
- expect(screen.getAllByTestId("toast")).toHaveLength(1);
140
- });
141
-
142
- showToast("Third");
143
-
144
- const titles: Array<string | null> = screen
145
- .getAllByTestId("title")
146
- .map((title: HTMLElement) => {
147
- return title.textContent;
148
- });
149
-
150
- expect(titles).toEqual(["Second", "Third"]);
151
- });
152
-
153
- /*
154
- * Regression: dispatching a toast re-renders the whole stack, and the
155
- * layout used to hand every card a freshly created onClose on each render.
156
- * A dismissed card mid-exit-fade saw the new prop, cleared its unmount
157
- * timer, and re-armed it — so a burst of toasts could keep an invisible
158
- * pointer-events-auto card alive indefinitely, intercepting clicks.
159
- */
160
- test("a toast dispatched during another toast's exit fade does not restart its unmount timer", () => {
161
- jest.useFakeTimers();
162
-
163
- try {
164
- const onCloseFirst: () => void = jest.fn();
165
-
166
- render(<ToastLayout />);
167
-
168
- showToast("First", onCloseFirst);
169
-
170
- fireEvent.click(screen.getByTestId("close-button"));
171
-
172
- // 100ms into the 150ms exit fade a second toast re-renders the stack.
173
- act(() => {
174
- jest.advanceTimersByTime(100);
175
- });
176
- showToast("Second");
177
-
178
- expect(screen.getAllByTestId("toast")).toHaveLength(2);
179
-
180
- // The ORIGINAL 150ms deadline holds: 50ms later the first card is gone.
181
- act(() => {
182
- jest.advanceTimersByTime(50);
183
- });
184
-
185
- expect(onCloseFirst).toHaveBeenCalledTimes(1);
186
-
187
- const titles: Array<string | null> = screen
188
- .getAllByTestId("title")
189
- .map((title: HTMLElement) => {
190
- return title.textContent;
191
- });
192
-
193
- expect(titles).toEqual(["Second"]);
194
- } finally {
195
- jest.useRealTimers();
196
- }
197
- });
198
- });
@@ -1,189 +0,0 @@
1
- import React, {
2
- FunctionComponent,
3
- ReactElement,
4
- useEffect,
5
- useRef,
6
- useState,
7
- } from "react";
8
- import Icon from "../Icon/Icon";
9
- import IconProp from "../../../Types/Icon/IconProp";
10
- import useTranslateValue from "../../Utils/Translation";
11
-
12
- export enum ToastType {
13
- DANGER,
14
- SUCCESS,
15
- INFO,
16
- WARNING,
17
- NORMAL,
18
- }
19
-
20
- export interface ComponentProps {
21
- title: string;
22
- description: string;
23
- onClose?: undefined | (() => void);
24
- type?: undefined | ToastType;
25
- icon?: IconProp | undefined;
26
- }
27
-
28
- /* How long the exit fade runs before the toast actually unmounts. */
29
- const EXIT_DURATION_IN_MS: number = 150;
30
-
31
- const Component: FunctionComponent<ComponentProps> = (
32
- props: ComponentProps,
33
- ): ReactElement => {
34
- const { translateString } = useTranslateValue();
35
- const [show, setShow] = useState<boolean>(true);
36
-
37
- /*
38
- * The toast is mounted in its closed state (faded, nudged down) and flipped
39
- * open one frame later so the browser has something to transition from —
40
- * the same pattern Modal uses for its entrance.
41
- */
42
- const [hasEntered, setHasEntered] = useState<boolean>(false);
43
-
44
- /*
45
- * Dismissal fades the card out first and only unmounts (and notifies the
46
- * owner) once the fade has finished, so the toast never blinks away.
47
- */
48
- const [isLeaving, setIsLeaving] = useState<boolean>(false);
49
-
50
- useEffect(() => {
51
- const open: () => void = (): void => {
52
- setHasEntered(true);
53
- };
54
-
55
- const frame: number = requestAnimationFrame(open);
56
-
57
- /*
58
- * A hidden or throttled tab never runs an animation frame; the timer
59
- * skips the transition rather than leaving the toast at zero opacity.
60
- */
61
- const fallbackTimer: ReturnType<typeof setTimeout> = setTimeout(open, 80);
62
-
63
- return () => {
64
- cancelAnimationFrame(frame);
65
- clearTimeout(fallbackTimer);
66
- };
67
- }, []);
68
-
69
- /*
70
- * The latest onClose lives in a ref so the exit effect can depend on
71
- * isLeaving alone. Owners may recreate onClose every render, and a dep on
72
- * it would restart the unmount timer whenever a sibling toast re-renders
73
- * the stack mid-exit — leaving an invisible pointer-events-auto card
74
- * intercepting clicks past its original deadline.
75
- */
76
- const onCloseRef: React.MutableRefObject<(() => void) | undefined> = useRef<
77
- (() => void) | undefined
78
- >(props.onClose);
79
- onCloseRef.current = props.onClose;
80
-
81
- useEffect(() => {
82
- if (!isLeaving) {
83
- return undefined;
84
- }
85
-
86
- const exitTimer: ReturnType<typeof setTimeout> = setTimeout(() => {
87
- setShow(false);
88
- if (onCloseRef.current) {
89
- onCloseRef.current();
90
- }
91
- }, EXIT_DURATION_IN_MS);
92
-
93
- return () => {
94
- clearTimeout(exitTimer);
95
- };
96
- }, [isLeaving]);
97
-
98
- let typeCssClass: string = "text-gray-400";
99
- let iconType: IconProp = IconProp.Info;
100
-
101
- if (props.type === ToastType.NORMAL) {
102
- typeCssClass = "text-gray-400";
103
- iconType = IconProp.Info;
104
- }
105
- if (props.type === ToastType.DANGER) {
106
- typeCssClass = "text-red-400";
107
- iconType = IconProp.Error;
108
- }
109
- if (props.type === ToastType.WARNING) {
110
- typeCssClass = "text-yellow-400";
111
- iconType = IconProp.Alert;
112
- }
113
- if (props.type === ToastType.SUCCESS) {
114
- typeCssClass = "text-green-400";
115
- iconType = IconProp.CheckCircle;
116
- }
117
- if (props.type === ToastType.INFO) {
118
- typeCssClass = "text-blue-400";
119
- iconType = IconProp.Info;
120
- }
121
-
122
- if (props.icon) {
123
- iconType = props.icon;
124
- }
125
-
126
- /*
127
- * Settled state carries no transform class at all — leaving a translate on
128
- * the card would make it the containing block for position:fixed
129
- * descendants (the Modal invariant).
130
- */
131
- let motionClassName: string = "translate-y-2 opacity-0";
132
-
133
- if (isLeaving) {
134
- motionClassName = "opacity-0";
135
- } else if (hasEntered) {
136
- motionClassName = "opacity-100";
137
- }
138
-
139
- if (show) {
140
- return (
141
- <div
142
- data-testid="toast"
143
- className={`pointer-events-auto w-full max-w-sm overflow-hidden rounded-lg bg-white shadow-lg ring-1 ring-black ring-opacity-5 transition duration-150 ease-out motion-reduce:transition-none ${motionClassName}`}
144
- >
145
- <div className="p-4">
146
- <div className="flex items-start">
147
- <div className="flex-shrink-0">
148
- <Icon
149
- className={`h-6 w-6 ${typeCssClass}`}
150
- data-testid="toast-icon"
151
- icon={iconType}
152
- />
153
- </div>
154
- <div className="ml-3 w-0 flex-1 pt-0.5">
155
- <p
156
- data-testid="title"
157
- className="text-sm font-medium text-gray-900"
158
- >
159
- {translateString(props.title)}
160
- </p>
161
- <p
162
- data-testid="description"
163
- className="mt-1 text-sm text-gray-500"
164
- >
165
- {translateString(props.description)}
166
- </p>
167
- </div>
168
- <div className="ml-4 flex flex-shrink-0">
169
- <button
170
- onClick={() => {
171
- setIsLeaving(true);
172
- }}
173
- data-testid="close-button"
174
- type="button"
175
- className="inline-flex rounded-md bg-white text-gray-400 transition-colors duration-150 ease-out hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
176
- >
177
- <span className="sr-only">Close</span>
178
- <Icon className={`h-5 w-5`} icon={IconProp.Close} />
179
- </button>
180
- </div>
181
- </div>
182
- </div>
183
- </div>
184
- );
185
- }
186
- return <></>;
187
- };
188
-
189
- export default Component;
@@ -1,110 +0,0 @@
1
- import React, {
2
- FunctionComponent,
3
- ReactElement,
4
- useEffect,
5
- useRef,
6
- } from "react";
7
- import Toast, { ComponentProps as ToastComponentProps } from "./Toast";
8
- import GlobalEvents from "../../Utils/GlobalEvents";
9
-
10
- type ShowToastNotificationFunction = (toast: ToastComponentProps) => void;
11
-
12
- export const ShowToastNotification: ShowToastNotificationFunction = (
13
- toast: ToastComponentProps,
14
- ): void => {
15
- GlobalEvents.dispatchEvent("toast", toast as any);
16
- };
17
-
18
- /*
19
- * Each queued toast gets a stable id so removals key correctly — keying by
20
- * array index would re-key (and so re-mount and re-animate) every toast below
21
- * the one that was dismissed.
22
- */
23
- interface ToastEntry {
24
- id: number;
25
- toast: ToastComponentProps;
26
- /*
27
- * Built once at dispatch and stable for the toast's lifetime: recreating
28
- * onClose per render would hand every Toast a fresh prop on each stack
29
- * re-render, which used to restart the exit-unmount timer of any toast
30
- * mid-fade.
31
- */
32
- onClose: () => void;
33
- }
34
-
35
- const ToastLayout: FunctionComponent = (): ReactElement => {
36
- const [currentToasts, setCurrentToasts] = React.useState<Array<ToastEntry>>(
37
- [],
38
- );
39
- const nextToastIdRef: React.MutableRefObject<number> = useRef<number>(0);
40
-
41
- useEffect(() => {
42
- const addToastNotification: (event: CustomEvent) => void = (
43
- event: CustomEvent,
44
- ): void => {
45
- const toast: ToastComponentProps = event.detail;
46
- const id: number = nextToastIdRef.current;
47
- nextToastIdRef.current += 1;
48
-
49
- // setCurrentToasts is stable, so this closure never goes stale.
50
- const onClose: () => void = (): void => {
51
- if (toast.onClose) {
52
- toast.onClose();
53
- }
54
-
55
- setCurrentToasts((toasts: Array<ToastEntry>) => {
56
- return toasts.filter((candidate: ToastEntry) => {
57
- return candidate.id !== id;
58
- });
59
- });
60
- };
61
-
62
- /*
63
- * Functional update: this listener is registered once, so reading
64
- * currentToasts from its closure would always see the mount-time empty
65
- * array and every new toast would clobber the ones before it.
66
- */
67
- setCurrentToasts((toasts: Array<ToastEntry>) => {
68
- return [...toasts, { id, toast, onClose }];
69
- });
70
- };
71
-
72
- GlobalEvents.addEventListener("toast", addToastNotification);
73
-
74
- return () => {
75
- GlobalEvents.removeEventListener("toast", addToastNotification);
76
- };
77
- }, []);
78
-
79
- /*
80
- * ONE fixed container for every toast. Each toast used to render its own
81
- * fixed strip at top-0 (the index prop that offset them was never passed),
82
- * so stacked toasts painted on top of each other. A single region stacking
83
- * cards with flex-col gap makes the order self-evident and keeps the
84
- * z-index ladder in exactly one place (Toast z-40, under Modal z-50).
85
- */
86
- return (
87
- <div
88
- data-testid="toast-region"
89
- aria-live="assertive"
90
- className="pointer-events-none fixed z-40 top-0 left-0 right-0 flex items-end px-4 py-6 sm:items-start sm:p-6"
91
- >
92
- <div className="flex w-full flex-col items-center gap-4 sm:items-end">
93
- {currentToasts.map((entry: ToastEntry) => {
94
- return (
95
- <Toast
96
- key={entry.id}
97
- title={entry.toast.title}
98
- description={entry.toast.description}
99
- type={entry.toast.type}
100
- icon={entry.toast.icon}
101
- onClose={entry.onClose}
102
- />
103
- );
104
- })}
105
- </div>
106
- </div>
107
- );
108
- };
109
-
110
- export default ToastLayout;
@@ -1,123 +0,0 @@
1
- import React, { useEffect, useRef, useState, } from "react";
2
- import Icon from "../Icon/Icon";
3
- import IconProp from "../../../Types/Icon/IconProp";
4
- import useTranslateValue from "../../Utils/Translation";
5
- export var ToastType;
6
- (function (ToastType) {
7
- ToastType[ToastType["DANGER"] = 0] = "DANGER";
8
- ToastType[ToastType["SUCCESS"] = 1] = "SUCCESS";
9
- ToastType[ToastType["INFO"] = 2] = "INFO";
10
- ToastType[ToastType["WARNING"] = 3] = "WARNING";
11
- ToastType[ToastType["NORMAL"] = 4] = "NORMAL";
12
- })(ToastType || (ToastType = {}));
13
- /* How long the exit fade runs before the toast actually unmounts. */
14
- const EXIT_DURATION_IN_MS = 150;
15
- const Component = (props) => {
16
- const { translateString } = useTranslateValue();
17
- const [show, setShow] = useState(true);
18
- /*
19
- * The toast is mounted in its closed state (faded, nudged down) and flipped
20
- * open one frame later so the browser has something to transition from —
21
- * the same pattern Modal uses for its entrance.
22
- */
23
- const [hasEntered, setHasEntered] = useState(false);
24
- /*
25
- * Dismissal fades the card out first and only unmounts (and notifies the
26
- * owner) once the fade has finished, so the toast never blinks away.
27
- */
28
- const [isLeaving, setIsLeaving] = useState(false);
29
- useEffect(() => {
30
- const open = () => {
31
- setHasEntered(true);
32
- };
33
- const frame = requestAnimationFrame(open);
34
- /*
35
- * A hidden or throttled tab never runs an animation frame; the timer
36
- * skips the transition rather than leaving the toast at zero opacity.
37
- */
38
- const fallbackTimer = setTimeout(open, 80);
39
- return () => {
40
- cancelAnimationFrame(frame);
41
- clearTimeout(fallbackTimer);
42
- };
43
- }, []);
44
- /*
45
- * The latest onClose lives in a ref so the exit effect can depend on
46
- * isLeaving alone. Owners may recreate onClose every render, and a dep on
47
- * it would restart the unmount timer whenever a sibling toast re-renders
48
- * the stack mid-exit — leaving an invisible pointer-events-auto card
49
- * intercepting clicks past its original deadline.
50
- */
51
- const onCloseRef = useRef(props.onClose);
52
- onCloseRef.current = props.onClose;
53
- useEffect(() => {
54
- if (!isLeaving) {
55
- return undefined;
56
- }
57
- const exitTimer = setTimeout(() => {
58
- setShow(false);
59
- if (onCloseRef.current) {
60
- onCloseRef.current();
61
- }
62
- }, EXIT_DURATION_IN_MS);
63
- return () => {
64
- clearTimeout(exitTimer);
65
- };
66
- }, [isLeaving]);
67
- let typeCssClass = "text-gray-400";
68
- let iconType = IconProp.Info;
69
- if (props.type === ToastType.NORMAL) {
70
- typeCssClass = "text-gray-400";
71
- iconType = IconProp.Info;
72
- }
73
- if (props.type === ToastType.DANGER) {
74
- typeCssClass = "text-red-400";
75
- iconType = IconProp.Error;
76
- }
77
- if (props.type === ToastType.WARNING) {
78
- typeCssClass = "text-yellow-400";
79
- iconType = IconProp.Alert;
80
- }
81
- if (props.type === ToastType.SUCCESS) {
82
- typeCssClass = "text-green-400";
83
- iconType = IconProp.CheckCircle;
84
- }
85
- if (props.type === ToastType.INFO) {
86
- typeCssClass = "text-blue-400";
87
- iconType = IconProp.Info;
88
- }
89
- if (props.icon) {
90
- iconType = props.icon;
91
- }
92
- /*
93
- * Settled state carries no transform class at all — leaving a translate on
94
- * the card would make it the containing block for position:fixed
95
- * descendants (the Modal invariant).
96
- */
97
- let motionClassName = "translate-y-2 opacity-0";
98
- if (isLeaving) {
99
- motionClassName = "opacity-0";
100
- }
101
- else if (hasEntered) {
102
- motionClassName = "opacity-100";
103
- }
104
- if (show) {
105
- return (React.createElement("div", { "data-testid": "toast", className: `pointer-events-auto w-full max-w-sm overflow-hidden rounded-lg bg-white shadow-lg ring-1 ring-black ring-opacity-5 transition duration-150 ease-out motion-reduce:transition-none ${motionClassName}` },
106
- React.createElement("div", { className: "p-4" },
107
- React.createElement("div", { className: "flex items-start" },
108
- React.createElement("div", { className: "flex-shrink-0" },
109
- React.createElement(Icon, { className: `h-6 w-6 ${typeCssClass}`, "data-testid": "toast-icon", icon: iconType })),
110
- React.createElement("div", { className: "ml-3 w-0 flex-1 pt-0.5" },
111
- React.createElement("p", { "data-testid": "title", className: "text-sm font-medium text-gray-900" }, translateString(props.title)),
112
- React.createElement("p", { "data-testid": "description", className: "mt-1 text-sm text-gray-500" }, translateString(props.description))),
113
- React.createElement("div", { className: "ml-4 flex flex-shrink-0" },
114
- React.createElement("button", { onClick: () => {
115
- setIsLeaving(true);
116
- }, "data-testid": "close-button", type: "button", className: "inline-flex rounded-md bg-white text-gray-400 transition-colors duration-150 ease-out hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2" },
117
- React.createElement("span", { className: "sr-only" }, "Close"),
118
- React.createElement(Icon, { className: `h-5 w-5`, icon: IconProp.Close })))))));
119
- }
120
- return React.createElement(React.Fragment, null);
121
- };
122
- export default Component;
123
- //# sourceMappingURL=Toast.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Toast.js","sourceRoot":"","sources":["../../../../../UI/Components/Toast/Toast.tsx"],"names":[],"mappings":"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"}
@@ -1,53 +0,0 @@
1
- import React, { useEffect, useRef, } from "react";
2
- import Toast from "./Toast";
3
- import GlobalEvents from "../../Utils/GlobalEvents";
4
- export const ShowToastNotification = (toast) => {
5
- GlobalEvents.dispatchEvent("toast", toast);
6
- };
7
- const ToastLayout = () => {
8
- const [currentToasts, setCurrentToasts] = React.useState([]);
9
- const nextToastIdRef = useRef(0);
10
- useEffect(() => {
11
- const addToastNotification = (event) => {
12
- const toast = event.detail;
13
- const id = nextToastIdRef.current;
14
- nextToastIdRef.current += 1;
15
- // setCurrentToasts is stable, so this closure never goes stale.
16
- const onClose = () => {
17
- if (toast.onClose) {
18
- toast.onClose();
19
- }
20
- setCurrentToasts((toasts) => {
21
- return toasts.filter((candidate) => {
22
- return candidate.id !== id;
23
- });
24
- });
25
- };
26
- /*
27
- * Functional update: this listener is registered once, so reading
28
- * currentToasts from its closure would always see the mount-time empty
29
- * array and every new toast would clobber the ones before it.
30
- */
31
- setCurrentToasts((toasts) => {
32
- return [...toasts, { id, toast, onClose }];
33
- });
34
- };
35
- GlobalEvents.addEventListener("toast", addToastNotification);
36
- return () => {
37
- GlobalEvents.removeEventListener("toast", addToastNotification);
38
- };
39
- }, []);
40
- /*
41
- * ONE fixed container for every toast. Each toast used to render its own
42
- * fixed strip at top-0 (the index prop that offset them was never passed),
43
- * so stacked toasts painted on top of each other. A single region stacking
44
- * cards with flex-col gap makes the order self-evident and keeps the
45
- * z-index ladder in exactly one place (Toast z-40, under Modal z-50).
46
- */
47
- return (React.createElement("div", { "data-testid": "toast-region", "aria-live": "assertive", className: "pointer-events-none fixed z-40 top-0 left-0 right-0 flex items-end px-4 py-6 sm:items-start sm:p-6" },
48
- React.createElement("div", { className: "flex w-full flex-col items-center gap-4 sm:items-end" }, currentToasts.map((entry) => {
49
- return (React.createElement(Toast, { key: entry.id, title: entry.toast.title, description: entry.toast.description, type: entry.toast.type, icon: entry.toast.icon, onClose: entry.onClose }));
50
- }))));
51
- };
52
- export default ToastLayout;
53
- //# sourceMappingURL=ToastInit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToastInit.js","sourceRoot":"","sources":["../../../../../UI/Components/Toast/ToastInit.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAGZ,SAAS,EACT,MAAM,GACP,MAAM,OAAO,CAAC;AACf,OAAO,KAAgD,MAAM,SAAS,CAAC;AACvE,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAIpD,MAAM,CAAC,MAAM,qBAAqB,GAAkC,CAClE,KAA0B,EACpB,EAAE;IACR,YAAY,CAAC,aAAa,CAAC,OAAO,EAAE,KAAY,CAAC,CAAC;AACpD,CAAC,CAAC;AAmBF,MAAM,WAAW,GAAsB,GAAiB,EAAE;IACxD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CACtD,EAAE,CACH,CAAC;IACF,MAAM,cAAc,GAAmC,MAAM,CAAS,CAAC,CAAC,CAAC;IAEzE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,oBAAoB,GAAiC,CACzD,KAAkB,EACZ,EAAE;YACR,MAAM,KAAK,GAAwB,KAAK,CAAC,MAAM,CAAC;YAChD,MAAM,EAAE,GAAW,cAAc,CAAC,OAAO,CAAC;YAC1C,cAAc,CAAC,OAAO,IAAI,CAAC,CAAC;YAE5B,gEAAgE;YAChE,MAAM,OAAO,GAAe,GAAS,EAAE;gBACrC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;oBAClB,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,CAAC;gBAED,gBAAgB,CAAC,CAAC,MAAyB,EAAE,EAAE;oBAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,SAAqB,EAAE,EAAE;wBAC7C,OAAO,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;oBAC7B,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC;YAEF;;;;eAIG;YACH,gBAAgB,CAAC,CAAC,MAAyB,EAAE,EAAE;gBAC7C,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAE7D,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP;;;;;;OAMG;IACH,OAAO,CACL,4CACc,cAAc,eAChB,WAAW,EACrB,SAAS,EAAC,oGAAoG;QAE9G,6BAAK,SAAS,EAAC,sDAAsD,IAClE,aAAa,CAAC,GAAG,CAAC,CAAC,KAAiB,EAAE,EAAE;YACvC,OAAO,CACL,oBAAC,KAAK,IACJ,GAAG,EAAE,KAAK,CAAC,EAAE,EACb,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EACxB,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,EACpC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EACtB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EACtB,OAAO,EAAE,KAAK,CAAC,OAAO,GACtB,CACH,CAAC;QACJ,CAAC,CAAC,CACE,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC"}