@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
@@ -36,9 +36,10 @@ const ChartContainer: FunctionComponent<ComponentProps> = (
36
36
  /*
37
37
  * `isolate` creates a new stacking context so the chart's internal
38
38
  * z-indexes (e.g. a highlighted/matched bar uses z-30, see Bar/Index.tsx)
39
- * stay trapped inside the chart. Without it those bars paint above
40
- * page-level overlays like the span-details SideOver (z-10), making a
41
- * matched span "show above" the sidebar.
39
+ * stay trapped inside the chart. Without it those bars compete directly
40
+ * with page-level overlays such as the span-details SideOver (z-30, and
41
+ * portalled to the end of <body>), and a matched span would "show above"
42
+ * the sidebar.
42
43
  */
43
44
  <div ref={divRef} className={"w-full"} style={{ isolation: "isolate" }}>
44
45
  {props.children}
@@ -25,7 +25,20 @@ export interface ComponentProps {
25
25
  initialValue?: undefined | string | Date;
26
26
  id?: string | undefined;
27
27
  ariaLabelledby?: string | undefined;
28
+ // Set together by fields that open a popup, so the state is on the focusable element.
29
+ ariaHasPopup?: "dialog" | "listbox" | "menu" | "grid" | "tree" | undefined;
30
+ ariaExpanded?: boolean | undefined;
31
+ ariaControls?: string | undefined;
32
+ /*
33
+ * For fields that render their own error text - a picker whose message sits
34
+ * below the whole control rather than below this input.
35
+ */
36
+ ariaDescribedby?: string | undefined;
37
+ ariaInvalid?: boolean | undefined;
28
38
  onClick?: undefined | (() => void);
39
+ onKeyDown?:
40
+ | undefined
41
+ | ((event: React.KeyboardEvent<HTMLInputElement>) => void);
29
42
  placeholder?: undefined | string;
30
43
  className?: undefined | string;
31
44
  onChange?: undefined | ((value: string) => void);
@@ -164,8 +177,13 @@ const Input: FunctionComponent<ComponentProps> = (
164
177
  spellCheck={!props.disableSpellCheck}
165
178
  autoComplete={props.autoComplete}
166
179
  aria-labelledby={props.ariaLabelledby}
167
- aria-invalid={props.error ? "true" : undefined}
168
- aria-describedby={props.error ? "input-error-message" : undefined}
180
+ aria-haspopup={props.ariaHasPopup}
181
+ aria-expanded={props.ariaExpanded}
182
+ aria-controls={props.ariaControls}
183
+ aria-invalid={props.error || props.ariaInvalid ? "true" : undefined}
184
+ aria-describedby={
185
+ props.error ? "input-error-message" : props.ariaDescribedby
186
+ }
169
187
  onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
170
188
  const value: string | Date = e.target.value;
171
189
 
@@ -194,8 +212,18 @@ const Input: FunctionComponent<ComponentProps> = (
194
212
  }}
195
213
  tabIndex={props.tabIndex}
196
214
  onKeyDown={
197
- props.onEnterPress
215
+ props.onEnterPress || props.onKeyDown
198
216
  ? (event: React.KeyboardEvent<HTMLInputElement>) => {
217
+ props.onKeyDown?.(event);
218
+
219
+ /*
220
+ * A handler that claimed the key - a picker opening its popup
221
+ * on Enter, say - has already decided what it means.
222
+ */
223
+ if (event.defaultPrevented) {
224
+ return;
225
+ }
226
+
199
227
  if (event.key === "Enter") {
200
228
  props.onEnterPress?.();
201
229
  }
@@ -1,233 +1,28 @@
1
- import React, {
2
- FunctionComponent,
3
- ReactElement,
4
- useState,
5
- useRef,
6
- useEffect,
7
- useCallback,
8
- } from "react";
9
- import Icon from "../../Icon/Icon";
10
- import IconProp from "../../../../Types/Icon/IconProp";
1
+ import React, { FunctionComponent, ReactElement } from "react";
11
2
  import RangeStartAndEndDateTime from "../../../../Types/Time/RangeStartAndEndDateTime";
12
- import TimeRange from "../../../../Types/Time/TimeRange";
13
- import InBetween from "../../../../Types/BaseDatabase/InBetween";
14
- import StartAndEndDate, {
15
- StartAndEndDateType,
16
- } from "../../Date/StartAndEndDate";
17
- import {
18
- DropdownHorizontalAlignment,
19
- getDropdownAlignmentClassName,
20
- useDropdownHorizontalAlignment,
21
- } from "../../../Utils/DropdownAlignment";
3
+ import TimeRangePickerDropdown from "../../Date/TimeRangePickerDropdown";
22
4
 
23
5
  export interface LogTimeRangePickerProps {
24
6
  value: RangeStartAndEndDateTime;
25
7
  onChange: (value: RangeStartAndEndDateTime) => void;
26
8
  }
27
9
 
28
- // Matches the Tailwind `w-72` on the dropdown below (18rem).
10
+ // Matches the Tailwind `w-72` on the rendered dropdown (18rem).
29
11
  export const LOG_TIME_RANGE_DROPDOWN_WIDTH_IN_PX: number = 288;
30
12
 
31
- // Preset options to show in the dropdown (ordered for log investigation use)
32
- const PRESET_OPTIONS: Array<{ range: TimeRange; label: string }> = [
33
- { range: TimeRange.PAST_FIVE_MINS, label: "Past 5 Minutes" },
34
- { range: TimeRange.PAST_FIFTEEN_MINS, label: "Past 15 Minutes" },
35
- { range: TimeRange.PAST_THIRTY_MINS, label: "Past 30 Minutes" },
36
- { range: TimeRange.PAST_ONE_HOUR, label: "Past 1 Hour" },
37
- { range: TimeRange.PAST_TWO_HOURS, label: "Past 2 Hours" },
38
- { range: TimeRange.PAST_THREE_HOURS, label: "Past 3 Hours" },
39
- { range: TimeRange.PAST_ONE_DAY, label: "Past 1 Day" },
40
- { range: TimeRange.PAST_TWO_DAYS, label: "Past 2 Days" },
41
- { range: TimeRange.PAST_ONE_WEEK, label: "Past 1 Week" },
42
- { range: TimeRange.PAST_TWO_WEEKS, label: "Past 2 Weeks" },
43
- { range: TimeRange.PAST_ONE_MONTH, label: "Past 1 Month" },
44
- { range: TimeRange.PAST_THREE_MONTHS, label: "Past 3 Months" },
45
- ];
46
-
47
- function formatDateShort(date: Date): string {
48
- const month: string = date.toLocaleString("en-US", { month: "short" });
49
- const day: number = date.getDate();
50
- const hours: string = date.getHours().toString().padStart(2, "0");
51
- const minutes: string = date.getMinutes().toString().padStart(2, "0");
52
- return `${month} ${day}, ${hours}:${minutes}`;
53
- }
54
-
55
- function getButtonLabel(value: RangeStartAndEndDateTime): string {
56
- if (value.range === TimeRange.CUSTOM && value.startAndEndDate) {
57
- const start: string = formatDateShort(value.startAndEndDate.startValue);
58
- const end: string = formatDateShort(value.startAndEndDate.endValue);
59
- return `${start} – ${end}`;
60
- }
61
-
62
- const preset: { range: TimeRange; label: string } | undefined =
63
- PRESET_OPTIONS.find((opt: { range: TimeRange; label: string }) => {
64
- return opt.range === value.range;
65
- });
66
- return preset ? preset.label : value.range;
67
- }
13
+ export const LOG_TIME_RANGE_PICKER_TEST_ID_PREFIX: string =
14
+ "log-time-range-picker";
68
15
 
69
16
  const LogTimeRangePicker: FunctionComponent<LogTimeRangePickerProps> = (
70
17
  props: LogTimeRangePickerProps,
71
18
  ): ReactElement => {
72
- const [isOpen, setIsOpen] = useState<boolean>(false);
73
- const [showCustom, setShowCustom] = useState<boolean>(
74
- props.value.range === TimeRange.CUSTOM,
75
- );
76
- const containerRef: React.RefObject<HTMLDivElement> = useRef<HTMLDivElement>(
77
- null!,
78
- );
79
- const buttonRef: React.RefObject<HTMLButtonElement> =
80
- useRef<HTMLButtonElement>(null!);
81
- const dropdownRef: React.RefObject<HTMLDivElement> = useRef<HTMLDivElement>(
82
- null!,
83
- );
84
-
85
- const alignment: DropdownHorizontalAlignment = useDropdownHorizontalAlignment(
86
- {
87
- isOpen: isOpen,
88
- anchorRef: buttonRef,
89
- dropdownRef: dropdownRef,
90
- dropdownWidthInPx: LOG_TIME_RANGE_DROPDOWN_WIDTH_IN_PX,
91
- },
92
- );
93
-
94
- // Close on click outside
95
- useEffect(() => {
96
- const handleClickOutside: (e: MouseEvent) => void = (
97
- e: MouseEvent,
98
- ): void => {
99
- if (
100
- containerRef.current &&
101
- !containerRef.current.contains(e.target as Node)
102
- ) {
103
- setIsOpen(false);
104
- }
105
- };
106
-
107
- document.addEventListener("mousedown", handleClickOutside);
108
- return () => {
109
- document.removeEventListener("mousedown", handleClickOutside);
110
- };
111
- }, []);
112
-
113
- // Sync showCustom when value changes externally (e.g., histogram drag)
114
- useEffect(() => {
115
- setShowCustom(props.value.range === TimeRange.CUSTOM);
116
- }, [props.value.range]);
117
-
118
- const handlePresetSelect: (range: TimeRange) => void = useCallback(
119
- (range: TimeRange): void => {
120
- props.onChange({ range });
121
- setShowCustom(false);
122
- setIsOpen(false);
123
- },
124
- [props],
125
- );
126
-
127
- const handleCustomDateChange: (dateRange: InBetween<Date> | null) => void =
128
- useCallback(
129
- (dateRange: InBetween<Date> | null): void => {
130
- if (dateRange) {
131
- props.onChange({
132
- range: TimeRange.CUSTOM,
133
- startAndEndDate: dateRange,
134
- });
135
- }
136
- },
137
- [props],
138
- );
139
-
140
- const buttonLabel: string = getButtonLabel(props.value);
141
-
142
19
  return (
143
- <div ref={containerRef} className="relative">
144
- <button
145
- ref={buttonRef}
146
- type="button"
147
- data-testid="log-time-range-picker-button"
148
- aria-haspopup="true"
149
- aria-expanded={isOpen}
150
- className={`inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium shadow-sm transition-colors ${
151
- isOpen
152
- ? "border-indigo-300 bg-indigo-50 text-indigo-700"
153
- : "border-gray-200 bg-white text-gray-700 hover:border-gray-300 hover:bg-gray-50"
154
- }`}
155
- onClick={() => {
156
- setIsOpen(!isOpen);
157
- }}
158
- >
159
- <Icon icon={IconProp.Clock} className="h-3.5 w-3.5" />
160
- <span>{buttonLabel}</span>
161
- <Icon
162
- icon={IconProp.ChevronDown}
163
- className={`h-3 w-3 transition-transform ${isOpen ? "rotate-180" : ""}`}
164
- />
165
- </button>
166
-
167
- {isOpen && (
168
- <div
169
- ref={dropdownRef}
170
- data-testid="log-time-range-picker-dropdown"
171
- data-align={alignment}
172
- className={`absolute ${getDropdownAlignmentClassName(
173
- alignment,
174
- )} top-full z-50 mt-1 w-72 max-w-[calc(100vw-1rem)] rounded-lg border border-gray-200 bg-white shadow-lg`}
175
- >
176
- {/* Preset options */}
177
- <div className="max-h-64 overflow-y-auto py-1">
178
- {PRESET_OPTIONS.map(
179
- (option: { range: TimeRange; label: string }) => {
180
- const isActive: boolean = props.value.range === option.range;
181
-
182
- return (
183
- <button
184
- key={option.range}
185
- type="button"
186
- className={`flex w-full items-center px-3 py-1.5 text-left text-sm transition-colors ${
187
- isActive
188
- ? "bg-indigo-50 font-medium text-indigo-700"
189
- : "text-gray-700 hover:bg-gray-50"
190
- }`}
191
- onClick={() => {
192
- handlePresetSelect(option.range);
193
- }}
194
- >
195
- {option.label}
196
- </button>
197
- );
198
- },
199
- )}
200
-
201
- {/* Custom option */}
202
- <button
203
- type="button"
204
- className={`flex w-full items-center px-3 py-1.5 text-left text-sm transition-colors ${
205
- props.value.range === TimeRange.CUSTOM
206
- ? "bg-indigo-50 font-medium text-indigo-700"
207
- : "text-gray-700 hover:bg-gray-50"
208
- }`}
209
- onClick={() => {
210
- setShowCustom(true);
211
- }}
212
- >
213
- Custom Range...
214
- </button>
215
- </div>
216
-
217
- {/* Custom date inputs */}
218
- {showCustom && (
219
- <div className="border-t border-gray-100 p-3">
220
- <StartAndEndDate
221
- type={StartAndEndDateType.DateTime}
222
- value={props.value.startAndEndDate}
223
- hideTimeButtons={true}
224
- onValueChanged={handleCustomDateChange}
225
- />
226
- </div>
227
- )}
228
- </div>
229
- )}
230
- </div>
20
+ <TimeRangePickerDropdown
21
+ value={props.value}
22
+ onChange={props.onChange}
23
+ dataTestIdPrefix={LOG_TIME_RANGE_PICKER_TEST_ID_PREFIX}
24
+ dropdownWidthInPx={LOG_TIME_RANGE_DROPDOWN_WIDTH_IN_PX}
25
+ />
231
26
  );
232
27
  };
233
28
 
@@ -15,6 +15,8 @@ export interface ComponentProps {
15
15
  isLoading?: boolean;
16
16
  error?: string | undefined;
17
17
  disableSubmitButton?: boolean | undefined;
18
+ // Rendered under the description - for confirmations that also ask something.
19
+ children?: ReactElement | undefined;
18
20
  }
19
21
 
20
22
  const ConfirmModal: FunctionComponent<ComponentProps> = (
@@ -51,11 +53,14 @@ const ConfirmModal: FunctionComponent<ComponentProps> = (
51
53
  * a long confirmation two nested scrollbars, and the inner one clipped
52
54
  * the text well short of the space the modal had spare.
53
55
  */}
54
- <div
55
- data-testid="confirm-modal-description"
56
- className="whitespace-pre-wrap break-words text-sm leading-6 text-gray-600"
57
- >
58
- {translatedDescription}
56
+ <div>
57
+ <div
58
+ data-testid="confirm-modal-description"
59
+ className="whitespace-pre-wrap break-words text-sm leading-6 text-gray-600"
60
+ >
61
+ {translatedDescription}
62
+ </div>
63
+ {props.children ? <div className="mt-4">{props.children}</div> : <></>}
59
64
  </div>
60
65
  </Modal>
61
66
  );
@@ -7,6 +7,8 @@ import ModalFooter from "./ModalFooter";
7
7
  import { VeryLightGray } from "../../../Types/BrandColors";
8
8
  import IconProp from "../../../Types/Icon/IconProp";
9
9
  import useTranslateValue from "../../Utils/Translation";
10
+ import { wasPressConsumedByAnAnchoredPopup } from "../../Types/LayeredDismissal";
11
+ import { lockPageScroll, unlockPageScroll } from "../../Utils/PageScrollLock";
10
12
  import React, {
11
13
  FunctionComponent,
12
14
  ReactElement,
@@ -23,52 +25,6 @@ export enum ModalWidth {
23
25
  Large,
24
26
  }
25
27
 
26
- /*
27
- * The page behind a modal must not scroll, and nested modals share a single
28
- * lock: a counter, rather than a boolean, is what stops the inner modal from
29
- * handing scrolling back while its parent is still open.
30
- */
31
- let openModalCount: number = 0;
32
- let bodyOverflowBeforeLock: string = "";
33
- let bodyPaddingRightBeforeLock: string = "";
34
-
35
- type PageScrollLockFunction = () => void;
36
-
37
- const lockPageScroll: PageScrollLockFunction = (): void => {
38
- openModalCount++;
39
-
40
- if (openModalCount > 1 || typeof document === "undefined") {
41
- return;
42
- }
43
-
44
- bodyOverflowBeforeLock = document.body.style.overflow;
45
- bodyPaddingRightBeforeLock = document.body.style.paddingRight;
46
-
47
- /*
48
- * Hiding the scrollbar reclaims its width, so the page underneath would
49
- * jump sideways by exactly that much. Pad it back to hold everything still.
50
- */
51
- const scrollbarWidth: number =
52
- window.innerWidth - document.documentElement.clientWidth;
53
-
54
- if (scrollbarWidth > 0) {
55
- document.body.style.paddingRight = `${scrollbarWidth}px`;
56
- }
57
-
58
- document.body.style.overflow = "hidden";
59
- };
60
-
61
- const unlockPageScroll: PageScrollLockFunction = (): void => {
62
- openModalCount = Math.max(0, openModalCount - 1);
63
-
64
- if (openModalCount > 0 || typeof document === "undefined") {
65
- return;
66
- }
67
-
68
- document.body.style.overflow = bodyOverflowBeforeLock;
69
- document.body.style.paddingRight = bodyPaddingRightBeforeLock;
70
- };
71
-
72
28
  export interface ComponentProps {
73
29
  title: string;
74
30
  description?: string | undefined;
@@ -123,6 +79,8 @@ const Modal: FunctionComponent<ComponentProps> = (
123
79
  >(props.onClose);
124
80
  const backdropPressStartedOutsideRef: React.MutableRefObject<boolean> =
125
81
  useRef<boolean>(false);
82
+ const backdropPressEndedInsideRef: React.MutableRefObject<boolean> =
83
+ useRef<boolean>(false);
126
84
  const titleId: string = useId();
127
85
  const descriptionId: string = useId();
128
86
 
@@ -346,31 +304,85 @@ const Modal: FunctionComponent<ComponentProps> = (
346
304
  ): boolean => {
347
305
  const modal: HTMLDivElement | null = modalRef.current;
348
306
 
349
- return modal !== null && !modal.contains(event.target as Node);
307
+ if (modal === null) {
308
+ return false;
309
+ }
310
+
311
+ const target: Node = event.target as Node;
312
+
313
+ /*
314
+ * Dropdown menus inside the body (AutocompleteTextInput, OperatorSelector,
315
+ * ColorPicker, IconPicker, react-select) portal themselves to document.body
316
+ * so a scroll container cannot clip them. React dispatches events through
317
+ * the *React* tree rather than the DOM tree, so picking one of those
318
+ * options still bubbles into this handler even though the pointer never
319
+ * touched the backdrop — and because the option is not a DOM descendant of
320
+ * the panel, the containment check below read it as a click outside and
321
+ * dismissed the dialog, discarding whatever the user had filled in.
322
+ *
323
+ * A press only counts as a backdrop press when it physically landed inside
324
+ * the backdrop element this handler is attached to. That is a DOM question,
325
+ * and `contains` is true of the element itself, so a press directly on this
326
+ * layer or on the flex box it centres the panel in still dismisses.
327
+ */
328
+ if (!event.currentTarget.contains(target)) {
329
+ return false;
330
+ }
331
+
332
+ return !modal.contains(target);
350
333
  };
351
334
 
352
335
  const onBackdropMouseDown: BackdropPressHandler = (
353
336
  event: React.MouseEvent<HTMLDivElement>,
354
337
  ): void => {
338
+ backdropPressEndedInsideRef.current = false;
339
+
340
+ /*
341
+ * A press that a portalled popup has already spent on closing itself is
342
+ * not a dismissal of this dialog. Without this, clicking the backdrop to
343
+ * put away an open colour picker closed the picker and the form behind it
344
+ * in one go.
345
+ */
346
+ if (wasPressConsumedByAnAnchoredPopup(event.nativeEvent)) {
347
+ backdropPressStartedOutsideRef.current = false;
348
+ return;
349
+ }
350
+
355
351
  backdropPressStartedOutsideRef.current = isEventOutsideModal(event);
356
352
  };
357
353
 
354
+ const onBackdropMouseUp: BackdropPressHandler = (
355
+ event: React.MouseEvent<HTMLDivElement>,
356
+ ): void => {
357
+ /*
358
+ * The click that follows is reported against the nearest common ancestor
359
+ * of press and release — this very layer — so by the time it arrives the
360
+ * two ends are indistinguishable. Where the release landed has to be
361
+ * recorded while it is still known.
362
+ */
363
+ backdropPressEndedInsideRef.current = !isEventOutsideModal(event);
364
+ };
365
+
358
366
  const onBackdropClick: BackdropPressHandler = (
359
367
  event: React.MouseEvent<HTMLDivElement>,
360
368
  ): void => {
361
369
  /*
362
- * Both ends of the click have to land on the backdrop. Selecting text in
363
- * the body and releasing the mouse past the edge of the panel is a drag,
364
- * not a dismissal, and it used to be the fastest way to lose a filled-in
365
- * form.
370
+ * Both ends of the click have to land on the backdrop. A press that
371
+ * wandered across the edge of the panel in either direction is a drag
372
+ * selecting text in the body and releasing outside, or pressing outside and
373
+ * releasing on the panel — and either used to be the fastest way to lose a
374
+ * filled-in form.
366
375
  */
367
376
  const pressStartedOutside: boolean = backdropPressStartedOutsideRef.current;
377
+ const pressEndedInside: boolean = backdropPressEndedInsideRef.current;
368
378
  backdropPressStartedOutsideRef.current = false;
379
+ backdropPressEndedInsideRef.current = false;
369
380
 
370
381
  if (
371
382
  props.disableCloseOnBackdropClick ||
372
383
  !props.onClose ||
373
384
  !pressStartedOutside ||
385
+ pressEndedInside ||
374
386
  !isEventOutsideModal(event) ||
375
387
  !isTopmostDialog()
376
388
  ) {
@@ -411,6 +423,7 @@ const Modal: FunctionComponent<ComponentProps> = (
411
423
  <div
412
424
  className="fixed inset-0 z-50 overflow-y-auto"
413
425
  onMouseDown={onBackdropMouseDown}
426
+ onMouseUp={onBackdropMouseUp}
414
427
  onClick={onBackdropClick}
415
428
  >
416
429
  <div className="flex min-h-full items-end justify-center p-0 text-center sm:items-center sm:p-6">
@@ -14,6 +14,17 @@ export interface ComponentProps<TBaseModel extends BaseModel> {
14
14
  modelId: ObjectID;
15
15
  modelAPI?: typeof ModelAPI | undefined;
16
16
  onDeleteSuccess: () => void;
17
+ /*
18
+ * Extra content for the confirmation modal - a field to fill in before
19
+ * confirming, for example. State for it belongs to the caller.
20
+ */
21
+ confirmationContent?: ReactElement | undefined;
22
+ /*
23
+ * Replaces the delete request itself, for models whose delete needs more
24
+ * than an id (see confirmationContent). Throwing surfaces the error in the
25
+ * same dialog the default request uses.
26
+ */
27
+ onDelete?: (() => Promise<void>) | undefined;
17
28
  }
18
29
 
19
30
  const ModelDelete: <TBaseModel extends BaseModel>(
@@ -30,12 +41,16 @@ const ModelDelete: <TBaseModel extends BaseModel>(
30
41
  const deleteItem: PromiseVoidFunction = async (): Promise<void> => {
31
42
  setIsLoading(true);
32
43
  try {
33
- const modelAPI: typeof ModelAPI = props.modelAPI || ModelAPI;
44
+ if (props.onDelete) {
45
+ await props.onDelete();
46
+ } else {
47
+ const modelAPI: typeof ModelAPI = props.modelAPI || ModelAPI;
34
48
 
35
- await modelAPI.deleteItem<TBaseModel>({
36
- modelType: props.modelType,
37
- id: props.modelId,
38
- });
49
+ await modelAPI.deleteItem<TBaseModel>({
50
+ modelType: props.modelType,
51
+ id: props.modelId,
52
+ });
53
+ }
39
54
  props.onDeleteSuccess?.();
40
55
  } catch (err) {
41
56
  setError(API.getFriendlyMessage(err));
@@ -76,7 +91,9 @@ const ModelDelete: <TBaseModel extends BaseModel>(
76
91
  }}
77
92
  submitButtonText={`Delete ${model.singularName}`}
78
93
  submitButtonType={ButtonStyleType.DANGER}
79
- />
94
+ >
95
+ {props.confirmationContent}
96
+ </ConfirmModal>
80
97
  ) : (
81
98
  <></>
82
99
  )}