@oneuptime/common 12.0.6 → 12.0.8

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 (594) hide show
  1. package/Models/DatabaseModels/AIInsight.ts +1 -1
  2. package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
  3. package/Models/DatabaseModels/DeletedProject.ts +595 -0
  4. package/Models/DatabaseModels/Index.ts +2 -0
  5. package/Models/DatabaseModels/Monitor.ts +111 -0
  6. package/Models/DatabaseModels/Project.ts +3 -3
  7. package/Models/DatabaseModels/TelemetryEntity.ts +45 -0
  8. package/Models/DatabaseModels/TelemetryEntityRelationship.ts +26 -0
  9. package/Models/DatabaseModels/WorkflowLog.ts +38 -0
  10. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
  11. package/Server/API/FileAPI.ts +15 -2
  12. package/Server/API/MicrosoftTeamsAPI.ts +6 -1
  13. package/Server/API/ProjectAPI.ts +214 -0
  14. package/Server/API/StatusPageAPI.ts +39 -6
  15. package/Server/API/UserAPI.ts +16 -1
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.ts +50 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.ts +67 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.ts +39 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.ts +41 -0
  20. package/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.ts +17 -0
  21. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  22. package/Server/Middleware/MasterAdminAuthorization.ts +11 -6
  23. package/Server/Services/AIAgentService.ts +20 -0
  24. package/Server/Services/DashboardDomainService.ts +73 -28
  25. package/Server/Services/DatabaseService.ts +1 -0
  26. package/Server/Services/DeletedProjectService.ts +138 -0
  27. package/Server/Services/FileService.ts +61 -0
  28. package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
  29. package/Server/Services/IncidentPublicNoteService.ts +18 -0
  30. package/Server/Services/Index.ts +2 -0
  31. package/Server/Services/MonitorService.ts +311 -0
  32. package/Server/Services/ProbeService.ts +20 -0
  33. package/Server/Services/ProjectService.ts +297 -1
  34. package/Server/Services/PushNotificationService.ts +71 -0
  35. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
  36. package/Server/Services/StatusPageAnnouncementService.ts +53 -0
  37. package/Server/Services/StatusPageDomainService.ts +73 -28
  38. package/Server/Services/TeamMemberService.ts +117 -12
  39. package/Server/Services/TelemetryEntityRelationshipService.ts +3 -0
  40. package/Server/Services/TelemetryEntityService.ts +114 -1
  41. package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
  42. package/Server/Services/UserWebhookService.ts +34 -109
  43. package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
  44. package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
  45. package/Server/Types/Database/DeleteById.ts +2 -0
  46. package/Server/Types/Database/DeleteOneBy.ts +6 -0
  47. package/Server/Types/Domain.ts +41 -0
  48. package/Server/Types/Workflow/Components/API/Delete.ts +2 -1
  49. package/Server/Types/Workflow/Components/API/Get.ts +2 -1
  50. package/Server/Types/Workflow/Components/API/Patch.ts +2 -1
  51. package/Server/Types/Workflow/Components/API/Post.ts +2 -1
  52. package/Server/Types/Workflow/Components/API/Put.ts +2 -1
  53. package/Server/Types/Workflow/Components/API/Utils.ts +85 -3
  54. package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +25 -19
  55. package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +6 -5
  56. package/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.ts +32 -14
  57. package/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.ts +31 -13
  58. package/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.ts +29 -20
  59. package/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.ts +28 -21
  60. package/Server/Types/Workflow/Components/BaseModel/LogComponentError.ts +89 -0
  61. package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +208 -0
  62. package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +11 -0
  63. package/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.ts +41 -18
  64. package/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.ts +45 -19
  65. package/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts +16 -9
  66. package/Server/Types/Workflow/Components/IncomingWebhookUtils.ts +66 -0
  67. package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +15 -9
  68. package/Server/Types/Workflow/Components/Slack/SendMessageToChannel.ts +17 -0
  69. package/Server/Types/Workflow/TriggerCode.ts +12 -0
  70. package/Server/Types/Workflow/Workflow.ts +5 -0
  71. package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
  72. package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
  73. package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
  74. package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
  75. package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
  76. package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
  77. package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
  78. package/Server/Utils/DataSource/EgressGuard.ts +176 -16
  79. package/Server/Utils/DataSource/HttpFetch.ts +6 -45
  80. package/Server/Utils/Execute.ts +8 -0
  81. package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
  82. package/Server/Utils/LLM/LLMService.ts +57 -12
  83. package/Server/Utils/Monitor/MonitorAlert.ts +40 -0
  84. package/Server/Utils/Monitor/MonitorDependencySuppression.ts +192 -0
  85. package/Server/Utils/Monitor/MonitorIncident.ts +40 -0
  86. package/Server/Utils/Monitor/MonitorResource.ts +36 -0
  87. package/Server/Utils/Response.ts +142 -6
  88. package/Server/Utils/SSRFProtection.ts +273 -60
  89. package/Server/Utils/StartServer.ts +8 -0
  90. package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +689 -0
  91. package/Server/Utils/VM/VMAPI.ts +56 -8
  92. package/Server/Utils/VM/VMRunner.ts +88 -1
  93. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +555 -49
  94. package/Server/Utils/Workspace/Slack/Slack.ts +25 -2
  95. package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
  96. package/Tests/App/Dashboard/DangerZone.test.tsx +334 -0
  97. package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +539 -0
  98. package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +678 -0
  99. package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +706 -0
  100. package/Tests/App/Dashboard/DashboardVariablesModal.test.tsx +508 -0
  101. package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +574 -0
  102. package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
  103. package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
  104. package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
  105. package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
  106. package/Tests/Server/API/FileAPIAccessControl.test.ts +316 -0
  107. package/Tests/Server/API/ProjectAPI.test.ts +299 -1
  108. package/Tests/Server/API/ProjectAPIAdjustBalance.test.ts +459 -0
  109. package/Tests/Server/API/ProjectAPIAdjustBalanceBillingDisabled.test.ts +177 -0
  110. package/Tests/Server/API/UserProjectsAPI.test.ts +478 -4
  111. package/Tests/Server/Services/DatabaseServiceDeletionReason.test.ts +123 -0
  112. package/Tests/Server/Services/DeletedProjectService.test.ts +415 -0
  113. package/Tests/Server/Services/DeletedProjectServiceSelfHosted.test.ts +70 -0
  114. package/Tests/Server/Services/DomainSubdomainHooks.test.ts +94 -0
  115. package/Tests/Server/Services/FileIsPublicBooleanMigration.test.ts +244 -0
  116. package/Tests/Server/Services/FileServiceMimeType.test.ts +89 -0
  117. package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
  118. package/Tests/Server/Services/ProjectServiceAdjustBalance.test.ts +615 -0
  119. package/Tests/Server/Services/ProjectServiceDeleteAudit.test.ts +406 -0
  120. package/Tests/Server/Services/PublishTimeImageVisibility.test.ts +450 -0
  121. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
  122. package/Tests/Server/Services/TelemetryEntityManualCreate.test.ts +248 -0
  123. package/Tests/Server/Services/UserWebhookSSRF.test.ts +174 -0
  124. package/Tests/Server/Services/WebPushEndpointAllowlist.test.ts +133 -0
  125. package/Tests/Server/Services/WorkspaceProjectAuthTokenRepoint.test.ts +618 -0
  126. package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
  127. package/Tests/Server/Types/Workflow/Components/ApiComponentHeaders.test.ts +192 -0
  128. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +215 -0
  129. package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +742 -0
  130. package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +256 -0
  131. package/Tests/Server/Types/Workflow/Components/ModelArguments.test.ts +371 -0
  132. package/Tests/Server/Utils/AI/CodeAgentCommandGuard.test.ts +204 -0
  133. package/Tests/Server/Utils/AI/CodeAgentWriteLimits.test.ts +213 -0
  134. package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +52 -5
  135. package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +3 -0
  136. package/Tests/Server/Utils/AI/LLMServiceEgressGuard.test.ts +315 -0
  137. package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +3 -0
  138. package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +17 -5
  139. package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +14 -1
  140. package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +35 -0
  141. package/Tests/Server/Utils/AI/StubLLMEgressGuard.ts +25 -0
  142. package/Tests/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.test.ts +152 -0
  143. package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +62 -7
  144. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +69 -0
  145. package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
  146. package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
  147. package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
  148. package/Tests/Server/Utils/Monitor/MonitorDependencySuppression.test.ts +811 -0
  149. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +604 -0
  150. package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
  151. package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
  152. package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +322 -0
  153. package/Tests/Server/Utils/VM/VMAPISubstitution.test.ts +243 -0
  154. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
  155. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +1169 -0
  156. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +2 -0
  157. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +1605 -0
  158. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTenantResolution.test.ts +1218 -0
  159. package/Tests/Types/AI/AIChatMessageStatus.test.ts +79 -0
  160. package/Tests/Types/AI/AIInsightStatus.test.ts +40 -0
  161. package/Tests/Types/API/HostnameAuthorityParsing.test.ts +157 -0
  162. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +27 -0
  163. package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
  164. package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
  165. package/Tests/Types/DomainSubdomainValidation.test.ts +90 -0
  166. package/Tests/Types/JSONFunctions.test.ts +252 -1
  167. package/Tests/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.test.ts +61 -0
  168. package/Tests/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.test.ts +62 -0
  169. package/Tests/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.test.ts +68 -0
  170. package/Tests/Types/Monitor/SnmpMonitor/SnmpVersion.test.ts +51 -0
  171. package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +197 -0
  172. package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +140 -0
  173. package/Tests/Types/Workflow/StepTrace.test.ts +235 -0
  174. package/Tests/Types/Workflow/TemplateSyntax.test.ts +379 -0
  175. package/Tests/Types/Workflow/Templates.test.ts +403 -0
  176. package/Tests/UI/Components/404.test.tsx +1 -1
  177. package/Tests/UI/Components/Alert.test.tsx +1 -1
  178. package/Tests/UI/Components/Badge.test.tsx +1 -1
  179. package/Tests/UI/Components/BasicForm.test.tsx +39 -10
  180. package/Tests/UI/Components/Button.test.tsx +1 -1
  181. package/Tests/UI/Components/Card.test.tsx +1 -1
  182. package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +1 -1
  183. package/Tests/UI/Components/ColorViewer.test.tsx +1 -1
  184. package/Tests/UI/Components/ComponentsModal.test.tsx +7 -1
  185. package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +459 -0
  186. package/Tests/UI/Components/DictionaryAttributeFilterRow.test.tsx +477 -0
  187. package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
  188. package/Tests/UI/Components/Dropdown.test.tsx +1 -1
  189. package/Tests/UI/Components/FilePicker.test.tsx +1 -1
  190. package/Tests/UI/Components/Forms/AnchoredFieldPopupKeyboard.test.tsx +382 -0
  191. package/Tests/UI/Components/Forms/ColorPickerPicking.test.tsx +569 -0
  192. package/Tests/UI/Components/Forms/ValidationJSON.test.ts +241 -0
  193. package/Tests/UI/Components/HiddenText.test.tsx +1 -1
  194. package/Tests/UI/Components/Input.test.tsx +1 -1
  195. package/Tests/UI/Components/Loader.test.tsx +1 -1
  196. package/Tests/UI/Components/LogTimeRangePicker.test.tsx +43 -1
  197. package/Tests/UI/Components/MasterPage.test.tsx +1 -1
  198. package/Tests/UI/Components/ModalPortalDismissal.test.tsx +579 -0
  199. package/Tests/UI/Components/ModelDelete.test.tsx +214 -0
  200. package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1 -1
  201. package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +1 -1
  202. package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +1 -1
  203. package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +1 -1
  204. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1 -1
  205. package/Tests/UI/Components/NavBar.test.tsx +1 -1
  206. package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +1 -1
  207. package/Tests/UI/Components/Pagination.test.tsx +1 -1
  208. package/Tests/UI/Components/Pill.test.tsx +1 -1
  209. package/Tests/UI/Components/Probe.test.tsx +1 -1
  210. package/Tests/UI/Components/ProgressBar.test.tsx +1 -1
  211. package/Tests/UI/Components/RadioButtons.test.tsx +1 -1
  212. package/Tests/UI/Components/SideMenuItem.test.tsx +1 -1
  213. package/Tests/UI/Components/SideOver.test.tsx +500 -6
  214. package/Tests/UI/Components/Tabs.test.tsx +1 -1
  215. package/Tests/UI/Components/TelemetrySearchBar.test.tsx +1 -1
  216. package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +50 -8
  217. package/Tests/UI/Components/TextArea.test.tsx +1 -1
  218. package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +325 -0
  219. package/Tests/UI/Components/Toast.test.tsx +1 -1
  220. package/Tests/UI/Components/Toggle.test.tsx +1 -1
  221. package/Tests/UI/Components/TopSection.test.tsx +1 -1
  222. package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +1 -1
  223. package/Tests/UI/Components/Workflow/GraphLint.test.ts +821 -0
  224. package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +287 -0
  225. package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +185 -0
  226. package/Tests/UI/Components/Workflow/ModelSchema.test.ts +174 -0
  227. package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +152 -0
  228. package/Tests/UI/Components/Workflow/Utils.test.ts +192 -0
  229. package/Tests/UI/Monitor/MonitorStepCriteriaView.test.tsx +432 -0
  230. package/Tests/UI/Rum/ReplayScrubber.test.tsx +1 -1
  231. package/Tests/UI/Rum/ReplayStage.test.tsx +1 -1
  232. package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +1 -1
  233. package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
  234. package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +19 -2
  235. package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +44 -0
  236. package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +288 -5
  237. package/Tests/Utils/Dashboard/VariableUrlState.test.ts +42 -0
  238. package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +27 -0
  239. package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
  240. package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
  241. package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +514 -0
  242. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +240 -0
  243. package/Tests/Utils/Realtime.test.ts +78 -0
  244. package/Tests/Utils/Schema/AnalyticsModelSchema.test.ts +469 -0
  245. package/Tests/Utils/Schema/ModelSchema.test.ts +268 -0
  246. package/Tests/Utils/Telemetry/EntityKeyNonTelemetry.test.ts +193 -0
  247. package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
  248. package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
  249. package/Types/AI/FixPullRequestCiStatus.ts +1 -1
  250. package/Types/AI/FixVerificationStatus.ts +2 -2
  251. package/Types/API/Hostname.ts +92 -4
  252. package/Types/API/URL.ts +43 -25
  253. package/Types/Billing/BalanceAdjustmentType.ts +14 -0
  254. package/Types/Billing/ProjectBalanceType.ts +13 -0
  255. package/Types/Domain.ts +26 -0
  256. package/Types/File/MimeType.ts +11 -0
  257. package/Types/JSONFunctions.ts +15 -0
  258. package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -0
  259. package/Types/SerializableObjectDictionary.ts +133 -39
  260. package/Types/Telemetry/EntitySource.ts +40 -0
  261. package/Types/Telemetry/EntityType.ts +27 -0
  262. package/Types/Telemetry/EntityTypeGroups.ts +65 -0
  263. package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
  264. package/Types/Workflow/Component.ts +29 -0
  265. package/Types/Workflow/Components/API.ts +35 -0
  266. package/Types/Workflow/Components/BaseModel.ts +96 -28
  267. package/Types/Workflow/StepTrace.ts +181 -0
  268. package/Types/Workflow/TemplateSyntax.ts +499 -0
  269. package/Types/Workflow/Templates.ts +316 -0
  270. package/Typings/Index.d.ts +12 -0
  271. package/UI/Components/Date/CustomTimeRangeModal.tsx +278 -0
  272. package/UI/Components/Date/TimeRangePickerDropdown.tsx +250 -0
  273. package/UI/Components/Dictionary/Dictionary.tsx +23 -6
  274. package/UI/Components/Forms/Fields/ColorPicker.tsx +66 -10
  275. package/UI/Components/Forms/Fields/IconPicker.tsx +48 -10
  276. package/UI/Components/Forms/Types/Field.ts +7 -0
  277. package/UI/Components/Forms/Validation.ts +63 -1
  278. package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
  279. package/UI/Components/Input/Input.tsx +31 -3
  280. package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +11 -216
  281. package/UI/Components/Modal/ConfirmModal.tsx +10 -5
  282. package/UI/Components/Modal/Modal.tsx +64 -51
  283. package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
  284. package/UI/Components/SideOver/SideOver.tsx +195 -68
  285. package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +11 -210
  286. package/UI/Components/Workflow/ArgumentsForm.tsx +194 -7
  287. package/UI/Components/Workflow/Component.tsx +28 -26
  288. package/UI/Components/Workflow/ComponentSettingsModal.tsx +69 -8
  289. package/UI/Components/Workflow/GraphLint.ts +591 -0
  290. package/UI/Components/Workflow/ModelColumnEditor.tsx +396 -0
  291. package/UI/Components/Workflow/ModelSchema.ts +196 -0
  292. package/UI/Components/Workflow/RunForm.tsx +41 -7
  293. package/UI/Components/Workflow/RunStatusWatcher.ts +122 -0
  294. package/UI/Components/Workflow/StepTraceViewer.tsx +186 -0
  295. package/UI/Components/Workflow/Utils.ts +93 -1
  296. package/UI/Components/Workflow/Workflow.tsx +77 -4
  297. package/UI/Types/LayeredDismissal.ts +31 -0
  298. package/UI/Types/UseAnchoredFieldPopup.ts +99 -0
  299. package/UI/Utils/PageScrollLock.ts +66 -0
  300. package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
  301. package/Utils/Dashboard/VariableInterpolation.ts +19 -1
  302. package/Utils/LegacySerializedArray.ts +60 -0
  303. package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
  304. package/Utils/Monitor/NetworkDeviceRoleUtil.ts +533 -0
  305. package/Utils/Monitor/NetworkTopologyUtil.ts +45 -7
  306. package/Utils/Telemetry/EntityKey.ts +66 -0
  307. package/Utils/Telemetry/SavedViewFilters.ts +88 -0
  308. package/build/dist/Models/DatabaseModels/AIInsight.js +1 -1
  309. package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js +2 -3
  311. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/DeletedProject.js +640 -0
  313. package/build/dist/Models/DatabaseModels/DeletedProject.js.map +1 -0
  314. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  315. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/Monitor.js +106 -0
  317. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/Project.js +3 -3
  319. package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
  320. package/build/dist/Models/DatabaseModels/TelemetryEntity.js +47 -0
  321. package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -1
  322. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +27 -0
  323. package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -1
  324. package/build/dist/Models/DatabaseModels/WorkflowLog.js +39 -0
  325. package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
  326. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  327. package/build/dist/Server/API/FileAPI.js +14 -2
  328. package/build/dist/Server/API/FileAPI.js.map +1 -1
  329. package/build/dist/Server/API/MicrosoftTeamsAPI.js +6 -1
  330. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  331. package/build/dist/Server/API/ProjectAPI.js +157 -4
  332. package/build/dist/Server/API/ProjectAPI.js.map +1 -1
  333. package/build/dist/Server/API/StatusPageAPI.js +27 -3
  334. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  335. package/build/dist/Server/API/UserAPI.js +16 -1
  336. package/build/dist/Server/API/UserAPI.js.map +1 -1
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js +34 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js.map +1 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js +30 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js.map +1 -0
  341. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js +20 -0
  342. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js.map +1 -0
  343. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js +20 -0
  344. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js.map +1 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js +12 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  349. package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -6
  350. package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
  351. package/build/dist/Server/Services/AIAgentService.js +17 -0
  352. package/build/dist/Server/Services/AIAgentService.js.map +1 -1
  353. package/build/dist/Server/Services/DashboardDomainService.js +55 -18
  354. package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
  355. package/build/dist/Server/Services/DatabaseService.js +1 -0
  356. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  357. package/build/dist/Server/Services/DeletedProjectService.js +124 -0
  358. package/build/dist/Server/Services/DeletedProjectService.js.map +1 -0
  359. package/build/dist/Server/Services/FileService.js +52 -0
  360. package/build/dist/Server/Services/FileService.js.map +1 -1
  361. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +10 -1
  362. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  363. package/build/dist/Server/Services/IncidentPublicNoteService.js +10 -1
  364. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  365. package/build/dist/Server/Services/Index.js +2 -0
  366. package/build/dist/Server/Services/Index.js.map +1 -1
  367. package/build/dist/Server/Services/MonitorService.js +232 -0
  368. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  369. package/build/dist/Server/Services/ProbeService.js +17 -0
  370. package/build/dist/Server/Services/ProbeService.js.map +1 -1
  371. package/build/dist/Server/Services/ProjectService.js +228 -6
  372. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  373. package/build/dist/Server/Services/PushNotificationService.js +56 -0
  374. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  375. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +10 -1
  376. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  377. package/build/dist/Server/Services/StatusPageAnnouncementService.js +54 -0
  378. package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
  379. package/build/dist/Server/Services/StatusPageDomainService.js +55 -18
  380. package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
  381. package/build/dist/Server/Services/TeamMemberService.js +97 -6
  382. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  383. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +3 -0
  384. package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
  385. package/build/dist/Server/Services/TelemetryEntityService.js +91 -1
  386. package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
  387. package/build/dist/Server/Services/TelemetryIngestionKeyService.js +1 -0
  388. package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
  389. package/build/dist/Server/Services/UserWebhookService.js +31 -87
  390. package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
  391. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +65 -0
  392. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  393. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +23 -0
  394. package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
  395. package/build/dist/Server/Types/Domain.js +37 -0
  396. package/build/dist/Server/Types/Domain.js.map +1 -1
  397. package/build/dist/Server/Types/Workflow/Components/API/Delete.js +2 -1
  398. package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
  399. package/build/dist/Server/Types/Workflow/Components/API/Get.js +2 -1
  400. package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
  401. package/build/dist/Server/Types/Workflow/Components/API/Patch.js +2 -1
  402. package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
  403. package/build/dist/Server/Types/Workflow/Components/API/Post.js +2 -1
  404. package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
  405. package/build/dist/Server/Types/Workflow/Components/API/Put.js +2 -1
  406. package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
  407. package/build/dist/Server/Types/Workflow/Components/API/Utils.js +63 -2
  408. package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
  409. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +15 -11
  410. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
  411. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +2 -3
  412. package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
  413. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js +21 -10
  414. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js.map +1 -1
  415. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js +21 -10
  416. package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js.map +1 -1
  417. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js +18 -13
  418. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js.map +1 -1
  419. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js +18 -13
  420. package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js.map +1 -1
  421. package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js +43 -0
  422. package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js.map +1 -0
  423. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +116 -0
  424. package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -0
  425. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +7 -0
  426. package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
  427. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js +24 -13
  428. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js.map +1 -1
  429. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js +27 -13
  430. package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js.map +1 -1
  431. package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js +14 -6
  432. package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js.map +1 -1
  433. package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js +42 -0
  434. package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js.map +1 -0
  435. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +15 -6
  436. package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
  437. package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js +10 -2
  438. package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js.map +1 -1
  439. package/build/dist/Server/Types/Workflow/TriggerCode.js.map +1 -1
  440. package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
  441. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +141 -0
  442. package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -1
  443. package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
  444. package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
  445. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +6 -6
  446. package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -1
  447. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +39 -5
  448. package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
  449. package/build/dist/Server/Utils/DataSource/EgressGuard.js +94 -10
  450. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  451. package/build/dist/Server/Utils/DataSource/HttpFetch.js +1 -19
  452. package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
  453. package/build/dist/Server/Utils/Execute.js +2 -2
  454. package/build/dist/Server/Utils/Execute.js.map +1 -1
  455. package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
  456. package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
  457. package/build/dist/Server/Utils/LLM/LLMService.js +43 -12
  458. package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
  459. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -24
  460. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  461. package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js +158 -0
  462. package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js.map +1 -0
  463. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +50 -30
  464. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  465. package/build/dist/Server/Utils/Monitor/MonitorResource.js +32 -0
  466. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  467. package/build/dist/Server/Utils/Response.js +112 -5
  468. package/build/dist/Server/Utils/Response.js.map +1 -1
  469. package/build/dist/Server/Utils/SSRFProtection.js +219 -53
  470. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  471. package/build/dist/Server/Utils/StartServer.js +7 -0
  472. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  473. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +507 -0
  474. package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -0
  475. package/build/dist/Server/Utils/VM/VMAPI.js +51 -4
  476. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  477. package/build/dist/Server/Utils/VM/VMRunner.js +73 -1
  478. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  479. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +445 -43
  480. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  481. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +18 -1
  482. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  483. package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
  484. package/build/dist/Types/AI/FixPullRequestCiStatus.js +1 -1
  485. package/build/dist/Types/AI/FixVerificationStatus.js +2 -2
  486. package/build/dist/Types/API/Hostname.js +73 -4
  487. package/build/dist/Types/API/Hostname.js.map +1 -1
  488. package/build/dist/Types/API/URL.js +42 -24
  489. package/build/dist/Types/API/URL.js.map +1 -1
  490. package/build/dist/Types/Billing/BalanceAdjustmentType.js +15 -0
  491. package/build/dist/Types/Billing/BalanceAdjustmentType.js.map +1 -0
  492. package/build/dist/Types/Billing/ProjectBalanceType.js +14 -0
  493. package/build/dist/Types/Billing/ProjectBalanceType.js.map +1 -0
  494. package/build/dist/Types/Domain.js +22 -0
  495. package/build/dist/Types/Domain.js.map +1 -1
  496. package/build/dist/Types/File/MimeType.js +11 -0
  497. package/build/dist/Types/File/MimeType.js.map +1 -1
  498. package/build/dist/Types/JSONFunctions.js +14 -0
  499. package/build/dist/Types/JSONFunctions.js.map +1 -1
  500. package/build/dist/Types/SerializableObjectDictionary.js +133 -39
  501. package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
  502. package/build/dist/Types/Telemetry/EntitySource.js +39 -0
  503. package/build/dist/Types/Telemetry/EntitySource.js.map +1 -0
  504. package/build/dist/Types/Telemetry/EntityType.js +27 -0
  505. package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
  506. package/build/dist/Types/Telemetry/EntityTypeGroups.js +57 -0
  507. package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -0
  508. package/build/dist/Types/Workflow/Component.js +21 -0
  509. package/build/dist/Types/Workflow/Component.js.map +1 -1
  510. package/build/dist/Types/Workflow/Components/API.js +35 -0
  511. package/build/dist/Types/Workflow/Components/API.js.map +1 -1
  512. package/build/dist/Types/Workflow/Components/BaseModel.js +87 -28
  513. package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
  514. package/build/dist/Types/Workflow/StepTrace.js +104 -0
  515. package/build/dist/Types/Workflow/StepTrace.js.map +1 -0
  516. package/build/dist/Types/Workflow/TemplateSyntax.js +326 -0
  517. package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -0
  518. package/build/dist/Types/Workflow/Templates.js +218 -0
  519. package/build/dist/Types/Workflow/Templates.js.map +1 -0
  520. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +126 -0
  521. package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -0
  522. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +123 -0
  523. package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -0
  524. package/build/dist/UI/Components/Dictionary/Dictionary.js +22 -6
  525. package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
  526. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +52 -13
  527. package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
  528. package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -12
  529. package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
  530. package/build/dist/UI/Components/Forms/Validation.js +44 -0
  531. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  532. package/build/dist/UI/Components/GanttChart/ChartContainer.js +4 -3
  533. package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +1 -1
  534. package/build/dist/UI/Components/Input/Input.js +12 -4
  535. package/build/dist/UI/Components/Input/Input.js.map +1 -1
  536. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +5 -108
  537. package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
  538. package/build/dist/UI/Components/Modal/ConfirmModal.js +3 -1
  539. package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
  540. package/build/dist/UI/Components/Modal/Modal.js +55 -39
  541. package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
  542. package/build/dist/UI/Components/ModelDelete/ModelDelete.js +11 -6
  543. package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
  544. package/build/dist/UI/Components/SideOver/SideOver.js +105 -30
  545. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  546. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +5 -105
  547. package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
  548. package/build/dist/UI/Components/Workflow/ArgumentsForm.js +140 -11
  549. package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
  550. package/build/dist/UI/Components/Workflow/Component.js +20 -19
  551. package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
  552. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +31 -3
  553. package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
  554. package/build/dist/UI/Components/Workflow/GraphLint.js +396 -0
  555. package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -0
  556. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +225 -0
  557. package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -0
  558. package/build/dist/UI/Components/Workflow/ModelSchema.js +118 -0
  559. package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -0
  560. package/build/dist/UI/Components/Workflow/RunForm.js +22 -6
  561. package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
  562. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +76 -0
  563. package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -0
  564. package/build/dist/UI/Components/Workflow/StepTraceViewer.js +76 -0
  565. package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -0
  566. package/build/dist/UI/Components/Workflow/Utils.js +73 -1
  567. package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
  568. package/build/dist/UI/Components/Workflow/Workflow.js +51 -6
  569. package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
  570. package/build/dist/UI/Types/LayeredDismissal.js +21 -0
  571. package/build/dist/UI/Types/LayeredDismissal.js.map +1 -0
  572. package/build/dist/UI/Types/UseAnchoredFieldPopup.js +74 -1
  573. package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
  574. package/build/dist/UI/Utils/PageScrollLock.js +52 -0
  575. package/build/dist/UI/Utils/PageScrollLock.js.map +1 -0
  576. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +4 -2
  577. package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -1
  578. package/build/dist/Utils/Dashboard/VariableInterpolation.js +19 -1
  579. package/build/dist/Utils/Dashboard/VariableInterpolation.js.map +1 -1
  580. package/build/dist/Utils/LegacySerializedArray.js +51 -0
  581. package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
  582. package/build/dist/Utils/Monitor/MonitorDependencyRule.js +47 -0
  583. package/build/dist/Utils/Monitor/MonitorDependencyRule.js.map +1 -0
  584. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +386 -0
  585. package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -0
  586. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +35 -6
  587. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  588. package/build/dist/Utils/Telemetry/EntityKey.js +52 -0
  589. package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
  590. package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
  591. package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
  592. package/jest.config.json +3 -0
  593. package/package.json +1 -1
  594. package/tsconfig.json +3 -1
@@ -0,0 +1,569 @@
1
+ import BasicForm from "../../../../UI/Components/Forms/BasicForm";
2
+ import ColorPicker from "../../../../UI/Components/Forms/Fields/ColorPicker";
3
+ import Fields from "../../../../UI/Components/Forms/Types/Fields";
4
+ import FormFieldSchemaType from "../../../../UI/Components/Forms/Types/FormFieldSchemaType";
5
+ import FormValues from "../../../../UI/Components/Forms/Types/FormValues";
6
+ import Modal from "../../../../UI/Components/Modal/Modal";
7
+ import Color from "../../../../Types/Color";
8
+ import getJestMockFunction, { MockFunction } from "../../../../Tests/MockType";
9
+ import "@testing-library/jest-dom";
10
+ import {
11
+ cleanup,
12
+ fireEvent,
13
+ render,
14
+ screen,
15
+ waitFor,
16
+ } from "@testing-library/react";
17
+ import React, { ReactElement } from "react";
18
+ import {
19
+ afterAll,
20
+ afterEach,
21
+ beforeAll,
22
+ describe,
23
+ expect,
24
+ test,
25
+ } from "@jest/globals";
26
+
27
+ /*
28
+ * Issue #3143: on Settings > Labels > Create Label, choosing a colour made the
29
+ * whole modal vanish and threw the half-filled form away. Label Color is
30
+ * required, so that left no way to create a label at all.
31
+ *
32
+ * The dismissal itself was a Modal-level bug (#3133): ColorPicker portals its
33
+ * popup to document.body so the modal body cannot clip it, and React dispatches
34
+ * synthetic events through the REACT tree, so a press inside the popup still
35
+ * reached the backdrop handler — which read "not a DOM descendant of the panel"
36
+ * as "outside" and closed the dialog.
37
+ *
38
+ * ModalPortalDismissal.test.tsx states that contract for every portalling
39
+ * surface, but it presses the popup's hex box. What the bug report actually
40
+ * shows is a *drag across the saturation square*, and that is a different event
41
+ * sequence: react-color takes the press, binds mousemove and mouseup on window,
42
+ * and the click that finally bubbles into Modal arrives after the colour has
43
+ * already changed under it. These tests drive the real ChromePicker through
44
+ * that sequence, end to end, up to the value the form submits.
45
+ */
46
+
47
+ /*
48
+ * react-color reads pageX/pageY to work out where in the square the pointer
49
+ * landed, and jsdom populates neither — its handler throws before it can
50
+ * compute a colour, so nothing downstream of a press can be tested without
51
+ * this. Nothing here scrolls, so the client coordinates are the page ones.
52
+ */
53
+ const definePageCoordinates: () => void = (): void => {
54
+ ["pageX", "pageY"].forEach((property: string) => {
55
+ Object.defineProperty(MouseEvent.prototype, property, {
56
+ configurable: true,
57
+ get(this: MouseEvent): number {
58
+ return property === "pageX" ? this.clientX : this.clientY;
59
+ },
60
+ });
61
+ });
62
+ };
63
+
64
+ const deletePageCoordinates: () => void = (): void => {
65
+ Reflect.deleteProperty(MouseEvent.prototype, "pageX");
66
+ Reflect.deleteProperty(MouseEvent.prototype, "pageY");
67
+ };
68
+
69
+ /*
70
+ * The saturation square and the hue strip both measure themselves to map a
71
+ * pointer position onto a colour, and every box in jsdom is zero by zero.
72
+ */
73
+ const SATURATION_BOX_WIDTH_PX: number = 200;
74
+ const SATURATION_BOX_HEIGHT_PX: number = 120;
75
+ const HUE_STRIP_WIDTH_PX: number = 200;
76
+ const HUE_STRIP_HEIGHT_PX: number = 10;
77
+
78
+ type GiveElementABoxFunction = (
79
+ element: HTMLElement,
80
+ width: number,
81
+ height: number,
82
+ ) => void;
83
+
84
+ const giveElementABox: GiveElementABoxFunction = (
85
+ element: HTMLElement,
86
+ width: number,
87
+ height: number,
88
+ ): void => {
89
+ element.getBoundingClientRect = (): DOMRect => {
90
+ return {
91
+ bottom: height,
92
+ height,
93
+ left: 0,
94
+ right: width,
95
+ top: 0,
96
+ width,
97
+ x: 0,
98
+ y: 0,
99
+ toJSON: (): Record<string, never> => {
100
+ return {};
101
+ },
102
+ } as DOMRect;
103
+ };
104
+ };
105
+
106
+ interface PickerHarness {
107
+ onClose: MockFunction;
108
+ onChange: MockFunction;
109
+ }
110
+
111
+ type OpenPickerFunction = () => HTMLElement;
112
+
113
+ const openPicker: OpenPickerFunction = (): HTMLElement => {
114
+ fireEvent.click(screen.getByTestId("color-value"));
115
+
116
+ return screen.getByTestId("color-picker-popup");
117
+ };
118
+
119
+ /*
120
+ * The elements react-color takes the press on and measures itself against. The
121
+ * saturation one carries no class of its own — it is the parent of the
122
+ * `.saturation-white` overlay; the hue strip is `.hue-horizontal` itself.
123
+ */
124
+ type GetSurfaceFunction = (popup: HTMLElement) => HTMLElement;
125
+
126
+ const getSaturationSquare: GetSurfaceFunction = (
127
+ popup: HTMLElement,
128
+ ): HTMLElement => {
129
+ const overlay: HTMLElement | null = popup.querySelector(".saturation-white");
130
+
131
+ if (!overlay?.parentElement) {
132
+ throw new Error("ChromePicker did not render a saturation square.");
133
+ }
134
+
135
+ giveElementABox(
136
+ overlay.parentElement,
137
+ SATURATION_BOX_WIDTH_PX,
138
+ SATURATION_BOX_HEIGHT_PX,
139
+ );
140
+
141
+ return overlay.parentElement;
142
+ };
143
+
144
+ const getHueStrip: GetSurfaceFunction = (popup: HTMLElement): HTMLElement => {
145
+ const strip: HTMLElement | null = popup.querySelector(".hue-horizontal");
146
+
147
+ if (!strip) {
148
+ throw new Error("ChromePicker did not render a hue strip.");
149
+ }
150
+
151
+ giveElementABox(strip, HUE_STRIP_WIDTH_PX, HUE_STRIP_HEIGHT_PX);
152
+
153
+ return strip;
154
+ };
155
+
156
+ interface Point {
157
+ x: number;
158
+ y: number;
159
+ }
160
+
161
+ /*
162
+ * A real pointer drag, in the order a browser fires it: the press lands on the
163
+ * square, the moves and the release go to window because that is where
164
+ * react-color binds them, and the click arrives last on the element the press
165
+ * started on.
166
+ */
167
+ type DragFunction = (element: HTMLElement, from: Point, to: Point) => void;
168
+
169
+ const drag: DragFunction = (
170
+ element: HTMLElement,
171
+ from: Point,
172
+ to: Point,
173
+ ): void => {
174
+ fireEvent.mouseDown(element, { clientX: from.x, clientY: from.y });
175
+ fireEvent.mouseMove(window, { clientX: to.x, clientY: to.y });
176
+ fireEvent.mouseUp(window, { clientX: to.x, clientY: to.y });
177
+ fireEvent.click(element, { clientX: to.x, clientY: to.y });
178
+ };
179
+
180
+ type RenderPickerInModalFunction = () => PickerHarness;
181
+
182
+ const renderPickerInModal: RenderPickerInModalFunction = (): PickerHarness => {
183
+ const onClose: MockFunction = getJestMockFunction();
184
+ const onChange: MockFunction = getJestMockFunction();
185
+
186
+ render(
187
+ <Modal title="Create New Label" onClose={onClose}>
188
+ <ColorPicker
189
+ dataTestId="color-value"
190
+ placeholder="Please select color for this label."
191
+ onChange={onChange}
192
+ />
193
+ </Modal>,
194
+ );
195
+
196
+ return { onChange, onClose };
197
+ };
198
+
199
+ type GetColorFieldFunction = () => HTMLInputElement;
200
+
201
+ const getColorField: GetColorFieldFunction = (): HTMLInputElement => {
202
+ return screen.getByTestId("color-value") as HTMLInputElement;
203
+ };
204
+
205
+ describe("Picking a colour inside a modal (issue #3143)", () => {
206
+ beforeAll(() => {
207
+ definePageCoordinates();
208
+ });
209
+
210
+ afterAll(() => {
211
+ deletePageCoordinates();
212
+ });
213
+
214
+ afterEach(() => {
215
+ cleanup();
216
+ });
217
+
218
+ describe("the reported flow: dragging across the saturation square", () => {
219
+ test("keeps the modal open, keeps the popup open and reports the colour", async () => {
220
+ const harness: PickerHarness = renderPickerInModal();
221
+ const popup: HTMLElement = openPicker();
222
+ const square: HTMLElement = getSaturationSquare(popup);
223
+
224
+ // Half across, half down: full-saturation, half-brightness red.
225
+ drag(square, { x: 20, y: 20 }, { x: 100, y: 60 });
226
+
227
+ await waitFor(() => {
228
+ expect(harness.onChange).toHaveBeenCalled();
229
+ });
230
+
231
+ expect(harness.onClose).not.toHaveBeenCalled();
232
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
233
+ expect(screen.getByTestId("color-picker-popup")).toBeInTheDocument();
234
+
235
+ const picked: Color = harness.onChange.mock.calls[
236
+ harness.onChange.mock.calls.length - 1
237
+ ]![0] as Color;
238
+
239
+ expect(picked).toBeInstanceOf(Color);
240
+ expect(picked.toString()).toMatch(/^#[0-9a-f]{6}$/i);
241
+ expect(getColorField().value).toEqual(picked.toString());
242
+ });
243
+
244
+ test("the press does not arm the backdrop, so the next click is harmless", async () => {
245
+ const harness: PickerHarness = renderPickerInModal();
246
+ const popup: HTMLElement = openPicker();
247
+ const square: HTMLElement = getSaturationSquare(popup);
248
+
249
+ drag(square, { x: 20, y: 20 }, { x: 100, y: 60 });
250
+
251
+ /*
252
+ * Modal remembers where a press started so that selecting text and
253
+ * releasing past the panel edge is not a dismissal. A press that began in
254
+ * the portalled popup must not leave that memory set to "outside".
255
+ */
256
+ fireEvent.click(screen.getByTestId("modal-title"));
257
+
258
+ expect(harness.onClose).not.toHaveBeenCalled();
259
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
260
+ });
261
+
262
+ test("a drag that leaves the popup and releases over the backdrop keeps the modal", async () => {
263
+ const harness: PickerHarness = renderPickerInModal();
264
+ const popup: HTMLElement = openPicker();
265
+ const square: HTMLElement = getSaturationSquare(popup);
266
+ const backdropLayer: HTMLElement =
267
+ screen.getByTestId("modal").parentElement!;
268
+
269
+ /*
270
+ * Overshooting a 200px-wide square is the normal way to reach full
271
+ * saturation. react-color clamps the coordinates; the release lands on
272
+ * the backdrop, and the browser then fires the click on the nearest
273
+ * common ancestor of press and release, which is the body.
274
+ */
275
+ fireEvent.mouseDown(square, { clientX: 100, clientY: 60 });
276
+ fireEvent.mouseMove(window, { clientX: 900, clientY: 900 });
277
+ fireEvent.mouseUp(backdropLayer, { clientX: 900, clientY: 900 });
278
+ fireEvent.click(document.body, { clientX: 900, clientY: 900 });
279
+
280
+ await waitFor(() => {
281
+ expect(harness.onChange).toHaveBeenCalled();
282
+ });
283
+
284
+ expect(harness.onClose).not.toHaveBeenCalled();
285
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
286
+ });
287
+ });
288
+
289
+ describe("the other two ways to pick a colour", () => {
290
+ test("dragging the hue strip keeps the modal open and changes the colour", async () => {
291
+ const harness: PickerHarness = renderPickerInModal();
292
+ const popup: HTMLElement = openPicker();
293
+ const square: HTMLElement = getSaturationSquare(popup);
294
+
295
+ // Give it a saturated colour first, so a hue change is visible in the hex.
296
+ drag(square, { x: 200, y: 0 }, { x: 200, y: 0 });
297
+
298
+ await waitFor(() => {
299
+ expect(harness.onChange).toHaveBeenCalled();
300
+ });
301
+
302
+ const beforeHueChange: string = getColorField().value;
303
+ const hueStrip: HTMLElement = getHueStrip(popup);
304
+
305
+ drag(hueStrip, { x: 10, y: 5 }, { x: 120, y: 5 });
306
+
307
+ await waitFor(() => {
308
+ expect(getColorField().value).not.toEqual(beforeHueChange);
309
+ });
310
+
311
+ expect(harness.onClose).not.toHaveBeenCalled();
312
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
313
+ });
314
+
315
+ test("typing a hex into the popup keeps the modal open and reports the colour", async () => {
316
+ const harness: PickerHarness = renderPickerInModal();
317
+ const popup: HTMLElement = openPicker();
318
+ const hexBox: HTMLInputElement = popup.querySelector(
319
+ "input",
320
+ ) as HTMLInputElement;
321
+
322
+ fireEvent.mouseDown(hexBox);
323
+ fireEvent.click(hexBox);
324
+ fireEvent.change(hexBox, { target: { value: "#32a852" } });
325
+
326
+ await waitFor(() => {
327
+ expect(harness.onChange).toHaveBeenCalledWith(new Color("#32a852"));
328
+ });
329
+
330
+ expect(harness.onClose).not.toHaveBeenCalled();
331
+ expect(getColorField().value).toEqual("#32a852");
332
+ });
333
+ });
334
+
335
+ describe("the value the form gets is the value on screen", () => {
336
+ test("a picked colour reaches onChange in the same tick the field shows it", () => {
337
+ const harness: PickerHarness = renderPickerInModal();
338
+ const popup: HTMLElement = openPicker();
339
+ const square: HTMLElement = getSaturationSquare(popup);
340
+
341
+ /*
342
+ * The picker used to paint the swatch from react-color's onChange and
343
+ * feed the form from onChangeComplete, which is debounced by 100ms — so
344
+ * for that window the field showed a colour the form did not hold. No
345
+ * waitFor here: that the two agree immediately is the point of the test.
346
+ */
347
+ fireEvent.mouseDown(square, { clientX: 100, clientY: 60 });
348
+
349
+ expect(harness.onChange).toHaveBeenCalled();
350
+
351
+ const reported: Color = harness.onChange.mock.calls[
352
+ harness.onChange.mock.calls.length - 1
353
+ ]![0] as Color;
354
+
355
+ expect(getColorField().value).toEqual(reported.toString());
356
+ });
357
+
358
+ test("there is no alpha channel to produce a colour the column cannot hold", async () => {
359
+ const harness: PickerHarness = renderPickerInModal();
360
+ const popup: HTMLElement = openPicker();
361
+
362
+ /*
363
+ * react-color reports a fully transparent colour as the literal string
364
+ * "transparent" — eleven characters, where Label.color holds ten, and
365
+ * Color validates nothing on the way through. Dropping the alpha slider
366
+ * is what stops the field producing a value that cannot be saved.
367
+ */
368
+ expect(popup.querySelector(".alpha-picker")).toBeNull();
369
+
370
+ const square: HTMLElement = getSaturationSquare(popup);
371
+
372
+ // The corner that is #000000, the only colour react-color calls transparent.
373
+ drag(square, { x: 0, y: 120 }, { x: 0, y: 120 });
374
+
375
+ await waitFor(() => {
376
+ expect(harness.onChange).toHaveBeenCalled();
377
+ });
378
+
379
+ harness.onChange.mock.calls.forEach((call: Array<unknown>) => {
380
+ expect((call[0] as Color).toString()).toMatch(/^#[0-9a-f]{6}$/i);
381
+ });
382
+ });
383
+ });
384
+
385
+ describe("the required error is reachable, not just visible", () => {
386
+ test("the field points at its own message and is marked invalid", () => {
387
+ render(
388
+ <ColorPicker
389
+ dataTestId="color-value"
390
+ placeholder="Please select color for this label."
391
+ error="Label Color is required."
392
+ onChange={getJestMockFunction()}
393
+ />,
394
+ );
395
+
396
+ const field: HTMLInputElement = getColorField();
397
+ const message: HTMLElement = screen.getByTestId("error-message");
398
+
399
+ expect(field).toHaveAttribute("aria-invalid", "true");
400
+ expect(field.getAttribute("aria-describedby")).toEqual(message.id);
401
+ expect(message.id).toBeTruthy();
402
+ expect(message).toHaveAttribute("role", "alert");
403
+ expect(message).toHaveTextContent("Label Color is required.");
404
+ });
405
+
406
+ test("a field with no error advertises neither", () => {
407
+ renderPickerInModal();
408
+
409
+ const field: HTMLInputElement = getColorField();
410
+
411
+ expect(field).not.toHaveAttribute("aria-invalid");
412
+ expect(field).not.toHaveAttribute("aria-describedby");
413
+ });
414
+ });
415
+
416
+ describe("the modal is still dismissable the ordinary ways", () => {
417
+ test("a press that starts and ends on the backdrop still closes it", () => {
418
+ const harness: PickerHarness = renderPickerInModal();
419
+ const backdropLayer: HTMLElement =
420
+ screen.getByTestId("modal").parentElement!;
421
+
422
+ fireEvent.mouseDown(backdropLayer);
423
+ fireEvent.mouseUp(backdropLayer);
424
+ fireEvent.click(backdropLayer);
425
+
426
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
427
+ });
428
+
429
+ test("with the picker open, the first backdrop press only puts the picker away", () => {
430
+ const harness: PickerHarness = renderPickerInModal();
431
+ const backdropLayer: HTMLElement =
432
+ screen.getByTestId("modal").parentElement!;
433
+
434
+ openPicker();
435
+
436
+ fireEvent.mouseDown(backdropLayer);
437
+ fireEvent.mouseUp(backdropLayer);
438
+ fireEvent.click(backdropLayer);
439
+
440
+ expect(screen.queryByTestId("color-picker-popup")).toBeNull();
441
+ expect(harness.onClose).not.toHaveBeenCalled();
442
+
443
+ // The picker gone, the next press dismisses the dialog as usual.
444
+ fireEvent.mouseDown(backdropLayer);
445
+ fireEvent.mouseUp(backdropLayer);
446
+ fireEvent.click(backdropLayer);
447
+
448
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
449
+ });
450
+
451
+ test("the close button still works after a colour has been dragged out", async () => {
452
+ const harness: PickerHarness = renderPickerInModal();
453
+ const popup: HTMLElement = openPicker();
454
+ const square: HTMLElement = getSaturationSquare(popup);
455
+
456
+ drag(square, { x: 20, y: 20 }, { x: 100, y: 60 });
457
+
458
+ await waitFor(() => {
459
+ expect(harness.onChange).toHaveBeenCalled();
460
+ });
461
+
462
+ fireEvent.click(screen.getByTestId("close-button"));
463
+
464
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
465
+ });
466
+
467
+ test("Escape dismisses the popup first and the modal second", async () => {
468
+ const harness: PickerHarness = renderPickerInModal();
469
+ const popup: HTMLElement = openPicker();
470
+
471
+ fireEvent.keyDown(popup, { key: "Escape" });
472
+
473
+ expect(screen.queryByTestId("color-picker-popup")).toBeNull();
474
+ expect(harness.onClose).not.toHaveBeenCalled();
475
+
476
+ fireEvent.keyDown(getColorField(), { key: "Escape" });
477
+
478
+ expect(harness.onClose).toHaveBeenCalledTimes(1);
479
+ });
480
+ });
481
+
482
+ /*
483
+ * The report is about a form, not a component: the point of picking a colour
484
+ * is that "Label Color is required." goes away and the value reaches submit.
485
+ */
486
+ describe("through the Label form the bug was reported on", () => {
487
+ const LABEL_FIELDS: Fields<FormValues<Record<string, unknown>>> = [
488
+ {
489
+ field: { name: true },
490
+ title: "Name",
491
+ fieldType: FormFieldSchemaType.Text,
492
+ required: true,
493
+ dataTestId: "name",
494
+ },
495
+ {
496
+ field: { color: true },
497
+ title: "Label Color",
498
+ fieldType: FormFieldSchemaType.Color,
499
+ required: true,
500
+ placeholder: "Please select color for this label.",
501
+ dataTestId: "color-value",
502
+ },
503
+ ];
504
+
505
+ type RenderLabelFormFunction = (onSubmit: MockFunction) => ReactElement;
506
+
507
+ const renderLabelForm: RenderLabelFormFunction = (
508
+ onSubmit: MockFunction,
509
+ ): ReactElement => {
510
+ return (
511
+ <Modal title="Create New Label" onClose={getJestMockFunction()}>
512
+ <BasicForm
513
+ id="create-label"
514
+ fields={LABEL_FIELDS}
515
+ onSubmit={onSubmit}
516
+ submitButtonText="Create Label"
517
+ />
518
+ </Modal>
519
+ );
520
+ };
521
+
522
+ test("picking a colour clears the required error and submits the value", async () => {
523
+ const onSubmit: MockFunction = getJestMockFunction();
524
+
525
+ render(renderLabelForm(onSubmit));
526
+
527
+ fireEvent.change(screen.getByTestId("name"), {
528
+ target: { value: "WB Unit-BB" },
529
+ });
530
+
531
+ // The state the report ends in: blocked, with nowhere to go.
532
+ fireEvent.click(screen.getByRole("button", { name: /create label/i }));
533
+
534
+ await waitFor(() => {
535
+ expect(
536
+ screen.getByText("Label Color is required."),
537
+ ).toBeInTheDocument();
538
+ });
539
+
540
+ expect(onSubmit).not.toHaveBeenCalled();
541
+
542
+ const popup: HTMLElement = openPicker();
543
+ const square: HTMLElement = getSaturationSquare(popup);
544
+
545
+ drag(square, { x: 20, y: 20 }, { x: 100, y: 60 });
546
+
547
+ await waitFor(() => {
548
+ expect(screen.queryByText("Label Color is required.")).toBeNull();
549
+ });
550
+
551
+ expect(screen.getByTestId("modal")).toBeInTheDocument();
552
+
553
+ fireEvent.click(screen.getByRole("button", { name: /create label/i }));
554
+
555
+ await waitFor(() => {
556
+ expect(onSubmit).toHaveBeenCalledTimes(1);
557
+ });
558
+
559
+ const submitted: Record<string, unknown> = onSubmit.mock
560
+ .calls[0]![0] as Record<string, unknown>;
561
+
562
+ expect(submitted["name"]).toEqual("WB Unit-BB");
563
+ expect(submitted["color"]).toBeInstanceOf(Color);
564
+ expect((submitted["color"] as Color).toString()).toMatch(
565
+ /^#[0-9a-f]{6}$/i,
566
+ );
567
+ });
568
+ });
569
+ });