@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.
- package/Models/DatabaseModels/AIInsight.ts +1 -1
- package/Models/DatabaseModels/DatabaseBaseModel/FileModel.ts +2 -3
- package/Models/DatabaseModels/DeletedProject.ts +595 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/Monitor.ts +111 -0
- package/Models/DatabaseModels/Project.ts +3 -3
- package/Models/DatabaseModels/TelemetryEntity.ts +45 -0
- package/Models/DatabaseModels/TelemetryEntityRelationship.ts +26 -0
- package/Models/DatabaseModels/WorkflowLog.ts +38 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -1
- package/Server/API/FileAPI.ts +15 -2
- package/Server/API/MicrosoftTeamsAPI.ts +6 -1
- package/Server/API/ProjectAPI.ts +214 -0
- package/Server/API/StatusPageAPI.ts +39 -6
- package/Server/API/UserAPI.ts +16 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.ts +50 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.ts +67 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.ts +39 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.ts +41 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +11 -6
- package/Server/Services/AIAgentService.ts +20 -0
- package/Server/Services/DashboardDomainService.ts +73 -28
- package/Server/Services/DatabaseService.ts +1 -0
- package/Server/Services/DeletedProjectService.ts +138 -0
- package/Server/Services/FileService.ts +61 -0
- package/Server/Services/IncidentEpisodePublicNoteService.ts +18 -0
- package/Server/Services/IncidentPublicNoteService.ts +18 -0
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/MonitorService.ts +311 -0
- package/Server/Services/ProbeService.ts +20 -0
- package/Server/Services/ProjectService.ts +297 -1
- package/Server/Services/PushNotificationService.ts +71 -0
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +18 -0
- package/Server/Services/StatusPageAnnouncementService.ts +53 -0
- package/Server/Services/StatusPageDomainService.ts +73 -28
- package/Server/Services/TeamMemberService.ts +117 -12
- package/Server/Services/TelemetryEntityRelationshipService.ts +3 -0
- package/Server/Services/TelemetryEntityService.ts +114 -1
- package/Server/Services/TelemetryIngestionKeyService.ts +1 -0
- package/Server/Services/UserWebhookService.ts +34 -109
- package/Server/Services/WorkspaceNotificationRuleService.ts +69 -0
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +37 -1
- package/Server/Types/Database/DeleteById.ts +2 -0
- package/Server/Types/Database/DeleteOneBy.ts +6 -0
- package/Server/Types/Domain.ts +41 -0
- package/Server/Types/Workflow/Components/API/Delete.ts +2 -1
- package/Server/Types/Workflow/Components/API/Get.ts +2 -1
- package/Server/Types/Workflow/Components/API/Patch.ts +2 -1
- package/Server/Types/Workflow/Components/API/Post.ts +2 -1
- package/Server/Types/Workflow/Components/API/Put.ts +2 -1
- package/Server/Types/Workflow/Components/API/Utils.ts +85 -3
- package/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.ts +25 -19
- package/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.ts +6 -5
- package/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.ts +32 -14
- package/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.ts +31 -13
- package/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.ts +29 -20
- package/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.ts +28 -21
- package/Server/Types/Workflow/Components/BaseModel/LogComponentError.ts +89 -0
- package/Server/Types/Workflow/Components/BaseModel/ModelArguments.ts +208 -0
- package/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.ts +11 -0
- package/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.ts +41 -18
- package/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.ts +45 -19
- package/Server/Types/Workflow/Components/Discord/SendMessageToChannel.ts +16 -9
- package/Server/Types/Workflow/Components/IncomingWebhookUtils.ts +66 -0
- package/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.ts +15 -9
- package/Server/Types/Workflow/Components/Slack/SendMessageToChannel.ts +17 -0
- package/Server/Types/Workflow/TriggerCode.ts +12 -0
- package/Server/Types/Workflow/Workflow.ts +5 -0
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.ts +171 -0
- package/Server/Utils/AI/SRE/FixFromIncidentTaskTrigger.ts +3 -3
- package/Server/Utils/AI/SRE/Insights/FixRouting.ts +3 -2
- package/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.ts +1 -1
- package/Server/Utils/AI/Toolbox/CodeWriteTools.ts +6 -6
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +43 -5
- package/Server/Utils/DataSource/EgressGuard.ts +176 -16
- package/Server/Utils/DataSource/HttpFetch.ts +6 -45
- package/Server/Utils/Execute.ts +8 -0
- package/Server/Utils/InlineImageAccessTokenSync.ts +23 -0
- package/Server/Utils/LLM/LLMService.ts +57 -12
- package/Server/Utils/Monitor/MonitorAlert.ts +40 -0
- package/Server/Utils/Monitor/MonitorDependencySuppression.ts +192 -0
- package/Server/Utils/Monitor/MonitorIncident.ts +40 -0
- package/Server/Utils/Monitor/MonitorResource.ts +36 -0
- package/Server/Utils/Response.ts +142 -6
- package/Server/Utils/SSRFProtection.ts +273 -60
- package/Server/Utils/StartServer.ts +8 -0
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +689 -0
- package/Server/Utils/VM/VMAPI.ts +56 -8
- package/Server/Utils/VM/VMRunner.ts +88 -1
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +555 -49
- package/Server/Utils/Workspace/Slack/Slack.ts +25 -2
- package/Server/Utils/Workspace/WorkspaceBase.ts +6 -0
- package/Tests/App/Dashboard/DangerZone.test.tsx +334 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +539 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +678 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +706 -0
- package/Tests/App/Dashboard/DashboardVariablesModal.test.tsx +508 -0
- package/Tests/App/Dashboard/MonitorCriteriaAttributeFilter.test.tsx +574 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +470 -0
- package/Tests/App/StatusPage/StatusPageDetailPagesNotFound.test.tsx +308 -0
- package/Tests/Models/DatabaseModels/DeletedProjectModel.test.ts +251 -0
- package/Tests/Models/DatabaseModels/SavedViewJSONColumnTuples.test.ts +115 -0
- package/Tests/Server/API/FileAPIAccessControl.test.ts +316 -0
- package/Tests/Server/API/ProjectAPI.test.ts +299 -1
- package/Tests/Server/API/ProjectAPIAdjustBalance.test.ts +459 -0
- package/Tests/Server/API/ProjectAPIAdjustBalanceBillingDisabled.test.ts +177 -0
- package/Tests/Server/API/UserProjectsAPI.test.ts +478 -4
- package/Tests/Server/Services/DatabaseServiceDeletionReason.test.ts +123 -0
- package/Tests/Server/Services/DeletedProjectService.test.ts +415 -0
- package/Tests/Server/Services/DeletedProjectServiceSelfHosted.test.ts +70 -0
- package/Tests/Server/Services/DomainSubdomainHooks.test.ts +94 -0
- package/Tests/Server/Services/FileIsPublicBooleanMigration.test.ts +244 -0
- package/Tests/Server/Services/FileServiceMimeType.test.ts +89 -0
- package/Tests/Server/Services/MonitorServiceDependencyValidation.test.ts +702 -0
- package/Tests/Server/Services/ProjectServiceAdjustBalance.test.ts +615 -0
- package/Tests/Server/Services/ProjectServiceDeleteAudit.test.ts +406 -0
- package/Tests/Server/Services/PublishTimeImageVisibility.test.ts +450 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +669 -0
- package/Tests/Server/Services/TelemetryEntityManualCreate.test.ts +248 -0
- package/Tests/Server/Services/UserWebhookSSRF.test.ts +174 -0
- package/Tests/Server/Services/WebPushEndpointAllowlist.test.ts +133 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenRepoint.test.ts +618 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentErrorPort.test.ts +26 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentHeaders.test.ts +192 -0
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +215 -0
- package/Tests/Server/Types/Workflow/Components/BaseModelDatabaseComponents.test.ts +742 -0
- package/Tests/Server/Types/Workflow/Components/ChatWebhookComponents.test.ts +256 -0
- package/Tests/Server/Types/Workflow/Components/ModelArguments.test.ts +371 -0
- package/Tests/Server/Utils/AI/CodeAgentCommandGuard.test.ts +204 -0
- package/Tests/Server/Utils/AI/CodeAgentWriteLimits.test.ts +213 -0
- package/Tests/Server/Utils/AI/CodeWriteTools.test.ts +52 -5
- package/Tests/Server/Utils/AI/LLMServiceBaseUrl.test.ts +3 -0
- package/Tests/Server/Utils/AI/LLMServiceEgressGuard.test.ts +315 -0
- package/Tests/Server/Utils/AI/LLMServiceModelCompatibility.test.ts +3 -0
- package/Tests/Server/Utils/AI/LLMServiceRequestPolicy.test.ts +17 -5
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +14 -1
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +35 -0
- package/Tests/Server/Utils/AI/StubLLMEgressGuard.ts +25 -0
- package/Tests/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.test.ts +152 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +62 -7
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +69 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +330 -0
- package/Tests/Server/Utils/GitHubCreatePullRequestWithToken.test.ts +393 -0
- package/Tests/Server/Utils/InlineImageAccessTokenSync.test.ts +202 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppression.test.ts +811 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +604 -0
- package/Tests/Server/Utils/ResponseSendFileResponse.test.ts +192 -0
- package/Tests/Server/Utils/SSRFProtectionBypasses.test.ts +406 -0
- package/Tests/Server/Utils/Telemetry/InventoryEntityRegistry.test.ts +322 -0
- package/Tests/Server/Utils/VM/VMAPISubstitution.test.ts +243 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +1169 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelsList.test.ts +2 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +1605 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsTenantResolution.test.ts +1218 -0
- package/Tests/Types/AI/AIChatMessageStatus.test.ts +79 -0
- package/Tests/Types/AI/AIInsightStatus.test.ts +40 -0
- package/Tests/Types/API/HostnameAuthorityParsing.test.ts +157 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +27 -0
- package/Tests/Types/DataSource/DataSourceLimits.test.ts +71 -0
- package/Tests/Types/DataSource/DataSourceType.test.ts +181 -0
- package/Tests/Types/DomainSubdomainValidation.test.ts +90 -0
- package/Tests/Types/JSONFunctions.test.ts +252 -1
- package/Tests/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.test.ts +61 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.test.ts +62 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.test.ts +68 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpVersion.test.ts +51 -0
- package/Tests/Types/SerializableObjectDictionaryImportCycle.test.ts +197 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +140 -0
- package/Tests/Types/Workflow/StepTrace.test.ts +235 -0
- package/Tests/Types/Workflow/TemplateSyntax.test.ts +379 -0
- package/Tests/Types/Workflow/Templates.test.ts +403 -0
- package/Tests/UI/Components/404.test.tsx +1 -1
- package/Tests/UI/Components/Alert.test.tsx +1 -1
- package/Tests/UI/Components/Badge.test.tsx +1 -1
- package/Tests/UI/Components/BasicForm.test.tsx +39 -10
- package/Tests/UI/Components/Button.test.tsx +1 -1
- package/Tests/UI/Components/Card.test.tsx +1 -1
- package/Tests/UI/Components/Charts/AxisTickColor.test.tsx +1 -1
- package/Tests/UI/Components/ColorViewer.test.tsx +1 -1
- package/Tests/UI/Components/ComponentsModal.test.tsx +7 -1
- package/Tests/UI/Components/CustomTimeRangeModal.test.tsx +459 -0
- package/Tests/UI/Components/DictionaryAttributeFilterRow.test.tsx +477 -0
- package/Tests/UI/Components/DictionaryOfStrings.test.tsx +1 -1
- package/Tests/UI/Components/Dropdown.test.tsx +1 -1
- package/Tests/UI/Components/FilePicker.test.tsx +1 -1
- package/Tests/UI/Components/Forms/AnchoredFieldPopupKeyboard.test.tsx +382 -0
- package/Tests/UI/Components/Forms/ColorPickerPicking.test.tsx +569 -0
- package/Tests/UI/Components/Forms/ValidationJSON.test.ts +241 -0
- package/Tests/UI/Components/HiddenText.test.tsx +1 -1
- package/Tests/UI/Components/Input.test.tsx +1 -1
- package/Tests/UI/Components/Loader.test.tsx +1 -1
- package/Tests/UI/Components/LogTimeRangePicker.test.tsx +43 -1
- package/Tests/UI/Components/MasterPage.test.tsx +1 -1
- package/Tests/UI/Components/ModalPortalDismissal.test.tsx +579 -0
- package/Tests/UI/Components/ModelDelete.test.tsx +214 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkSelectAll.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableSearchLabels.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +1 -1
- package/Tests/UI/Components/NavBar.test.tsx +1 -1
- package/Tests/UI/Components/OperatorSelectorKeyboard.test.tsx +1 -1
- package/Tests/UI/Components/Pagination.test.tsx +1 -1
- package/Tests/UI/Components/Pill.test.tsx +1 -1
- package/Tests/UI/Components/Probe.test.tsx +1 -1
- package/Tests/UI/Components/ProgressBar.test.tsx +1 -1
- package/Tests/UI/Components/RadioButtons.test.tsx +1 -1
- package/Tests/UI/Components/SideMenuItem.test.tsx +1 -1
- package/Tests/UI/Components/SideOver.test.tsx +500 -6
- package/Tests/UI/Components/Tabs.test.tsx +1 -1
- package/Tests/UI/Components/TelemetrySearchBar.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryTimeRangePicker.test.tsx +50 -8
- package/Tests/UI/Components/TextArea.test.tsx +1 -1
- package/Tests/UI/Components/TimeRangePickerDropdown.test.tsx +325 -0
- package/Tests/UI/Components/Toast.test.tsx +1 -1
- package/Tests/UI/Components/Toggle.test.tsx +1 -1
- package/Tests/UI/Components/TopSection.test.tsx +1 -1
- package/Tests/UI/Components/UseLiveLogsRefresh.test.tsx +1 -1
- package/Tests/UI/Components/Workflow/GraphLint.test.ts +821 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.test.ts +287 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditorServerContract.test.ts +185 -0
- package/Tests/UI/Components/Workflow/ModelSchema.test.ts +174 -0
- package/Tests/UI/Components/Workflow/RunStatusWatcher.test.ts +152 -0
- package/Tests/UI/Components/Workflow/Utils.test.ts +192 -0
- package/Tests/UI/Monitor/MonitorStepCriteriaView.test.tsx +432 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +1 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +1 -1
- package/Tests/UI/Telemetry/TelemetrySnapshotWindowAlert.test.tsx +1 -1
- package/Tests/UI/Utils/LocalStorageArrayRoundTrip.test.ts +72 -0
- package/Tests/Utils/Dashboard/HtmlWidgetDocument.test.ts +19 -2
- package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +44 -0
- package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +288 -5
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +42 -0
- package/Tests/Utils/DataSource/DataSourceQueryText.test.ts +27 -0
- package/Tests/Utils/LegacySerializedArray.test.ts +139 -0
- package/Tests/Utils/Monitor/MonitorDependencyRule.test.ts +190 -0
- package/Tests/Utils/Monitor/NetworkDeviceRoleUtil.test.ts +514 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +240 -0
- package/Tests/Utils/Realtime.test.ts +78 -0
- package/Tests/Utils/Schema/AnalyticsModelSchema.test.ts +469 -0
- package/Tests/Utils/Schema/ModelSchema.test.ts +268 -0
- package/Tests/Utils/Telemetry/EntityKeyNonTelemetry.test.ts +193 -0
- package/Tests/Utils/Telemetry/SavedViewFilters.test.ts +246 -0
- package/Tests/__mocks__/i18next-browser-languagedetector.js +21 -0
- package/Types/AI/FixPullRequestCiStatus.ts +1 -1
- package/Types/AI/FixVerificationStatus.ts +2 -2
- package/Types/API/Hostname.ts +92 -4
- package/Types/API/URL.ts +43 -25
- package/Types/Billing/BalanceAdjustmentType.ts +14 -0
- package/Types/Billing/ProjectBalanceType.ts +13 -0
- package/Types/Domain.ts +26 -0
- package/Types/File/MimeType.ts +11 -0
- package/Types/JSONFunctions.ts +15 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -0
- package/Types/SerializableObjectDictionary.ts +133 -39
- package/Types/Telemetry/EntitySource.ts +40 -0
- package/Types/Telemetry/EntityType.ts +27 -0
- package/Types/Telemetry/EntityTypeGroups.ts +65 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +9 -1
- package/Types/Workflow/Component.ts +29 -0
- package/Types/Workflow/Components/API.ts +35 -0
- package/Types/Workflow/Components/BaseModel.ts +96 -28
- package/Types/Workflow/StepTrace.ts +181 -0
- package/Types/Workflow/TemplateSyntax.ts +499 -0
- package/Types/Workflow/Templates.ts +316 -0
- package/Typings/Index.d.ts +12 -0
- package/UI/Components/Date/CustomTimeRangeModal.tsx +278 -0
- package/UI/Components/Date/TimeRangePickerDropdown.tsx +250 -0
- package/UI/Components/Dictionary/Dictionary.tsx +23 -6
- package/UI/Components/Forms/Fields/ColorPicker.tsx +66 -10
- package/UI/Components/Forms/Fields/IconPicker.tsx +48 -10
- package/UI/Components/Forms/Types/Field.ts +7 -0
- package/UI/Components/Forms/Validation.ts +63 -1
- package/UI/Components/GanttChart/ChartContainer.tsx +4 -3
- package/UI/Components/Input/Input.tsx +31 -3
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +11 -216
- package/UI/Components/Modal/ConfirmModal.tsx +10 -5
- package/UI/Components/Modal/Modal.tsx +64 -51
- package/UI/Components/ModelDelete/ModelDelete.tsx +23 -6
- package/UI/Components/SideOver/SideOver.tsx +195 -68
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +11 -210
- package/UI/Components/Workflow/ArgumentsForm.tsx +194 -7
- package/UI/Components/Workflow/Component.tsx +28 -26
- package/UI/Components/Workflow/ComponentSettingsModal.tsx +69 -8
- package/UI/Components/Workflow/GraphLint.ts +591 -0
- package/UI/Components/Workflow/ModelColumnEditor.tsx +396 -0
- package/UI/Components/Workflow/ModelSchema.ts +196 -0
- package/UI/Components/Workflow/RunForm.tsx +41 -7
- package/UI/Components/Workflow/RunStatusWatcher.ts +122 -0
- package/UI/Components/Workflow/StepTraceViewer.tsx +186 -0
- package/UI/Components/Workflow/Utils.ts +93 -1
- package/UI/Components/Workflow/Workflow.tsx +77 -4
- package/UI/Types/LayeredDismissal.ts +31 -0
- package/UI/Types/UseAnchoredFieldPopup.ts +99 -0
- package/UI/Utils/PageScrollLock.ts +66 -0
- package/Utils/Dashboard/HtmlWidgetDocument.ts +4 -2
- package/Utils/Dashboard/VariableInterpolation.ts +19 -1
- package/Utils/LegacySerializedArray.ts +60 -0
- package/Utils/Monitor/MonitorDependencyRule.ts +88 -0
- package/Utils/Monitor/NetworkDeviceRoleUtil.ts +533 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +45 -7
- package/Utils/Telemetry/EntityKey.ts +66 -0
- package/Utils/Telemetry/SavedViewFilters.ts +88 -0
- package/build/dist/Models/DatabaseModels/AIInsight.js +1 -1
- package/build/dist/Models/DatabaseModels/AIInsight.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js +2 -3
- package/build/dist/Models/DatabaseModels/DatabaseBaseModel/FileModel.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DeletedProject.js +640 -0
- package/build/dist/Models/DatabaseModels/DeletedProject.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +106 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +3 -3
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js +47 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +27 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkflowLog.js +39 -0
- package/build/dist/Models/DatabaseModels/WorkflowLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/FileAPI.js +14 -2
- package/build/dist/Server/API/FileAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +6 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectAPI.js +157 -4
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +27 -3
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/UserAPI.js +16 -1
- package/build/dist/Server/API/UserAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786446545142-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js +30 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786449497966-AddMonitorDependency.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786461136170-AddDeletedProjectTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786551733814-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1786559879134-AddWorkflowLogStepTrace.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -6
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIAgentService.js +17 -0
- package/build/dist/Server/Services/AIAgentService.js.map +1 -1
- package/build/dist/Server/Services/DashboardDomainService.js +55 -18
- package/build/dist/Server/Services/DashboardDomainService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +1 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DeletedProjectService.js +124 -0
- package/build/dist/Server/Services/DeletedProjectService.js.map +1 -0
- package/build/dist/Server/Services/FileService.js +52 -0
- package/build/dist/Server/Services/FileService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +10 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +10 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +232 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/ProbeService.js +17 -0
- package/build/dist/Server/Services/ProbeService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +228 -6
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/PushNotificationService.js +56 -0
- package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +10 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +54 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageDomainService.js +55 -18
- package/build/dist/Server/Services/StatusPageDomainService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +97 -6
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +3 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityService.js +91 -1
- package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +1 -0
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/UserWebhookService.js +31 -87
- package/build/dist/Server/Services/UserWebhookService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +65 -0
- package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +23 -0
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Types/Domain.js +37 -0
- package/build/dist/Server/Types/Domain.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Delete.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Get.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Patch.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Post.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js +2 -1
- package/build/dist/Server/Types/Workflow/Components/API/Put.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js +63 -2
- package/build/dist/Server/Types/Workflow/Components/API/Utils.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js +15 -11
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js +2 -3
- package/build/dist/Server/Types/Workflow/Components/BaseModel/CreateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js +21 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js +21 -10
- package/build/dist/Server/Types/Workflow/Components/BaseModel/DeleteOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js +18 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js +18 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/FindOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js +43 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/LogComponentError.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js +116 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/ModelArguments.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js +7 -0
- package/build/dist/Server/Types/Workflow/Components/BaseModel/OnTriggerBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js +24 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateManyBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js +27 -13
- package/build/dist/Server/Types/Workflow/Components/BaseModel/UpdateOneBaseModel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js +14 -6
- package/build/dist/Server/Types/Workflow/Components/Discord/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js +42 -0
- package/build/dist/Server/Types/Workflow/Components/IncomingWebhookUtils.js.map +1 -0
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js +15 -6
- package/build/dist/Server/Types/Workflow/Components/MicrosoftTeams/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js +10 -2
- package/build/dist/Server/Types/Workflow/Components/Slack/SendMessageToChannel.js.map +1 -1
- package/build/dist/Server/Types/Workflow/TriggerCode.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js +141 -0
- package/build/dist/Server/Utils/AI/CodeFix/CodeAgentWorkspaceGuard.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/FixRouting.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/TelemetryImprovementTaskTrigger.js +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js +6 -6
- package/build/dist/Server/Utils/AI/Toolbox/CodeWriteTools.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js +39 -5
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +94 -10
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +1 -19
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/Execute.js +2 -2
- package/build/dist/Server/Utils/Execute.js.map +1 -1
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js +13 -0
- package/build/dist/Server/Utils/InlineImageAccessTokenSync.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +43 -12
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +44 -24
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js +158 -0
- package/build/dist/Server/Utils/Monitor/MonitorDependencySuppression.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +50 -30
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +112 -5
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +219 -53
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +7 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +507 -0
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js +51 -4
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +73 -1
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +445 -43
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +18 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/WorkspaceBase.js.map +1 -1
- package/build/dist/Types/AI/FixPullRequestCiStatus.js +1 -1
- package/build/dist/Types/AI/FixVerificationStatus.js +2 -2
- package/build/dist/Types/API/Hostname.js +73 -4
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/API/URL.js +42 -24
- package/build/dist/Types/API/URL.js.map +1 -1
- package/build/dist/Types/Billing/BalanceAdjustmentType.js +15 -0
- package/build/dist/Types/Billing/BalanceAdjustmentType.js.map +1 -0
- package/build/dist/Types/Billing/ProjectBalanceType.js +14 -0
- package/build/dist/Types/Billing/ProjectBalanceType.js.map +1 -0
- package/build/dist/Types/Domain.js +22 -0
- package/build/dist/Types/Domain.js.map +1 -1
- package/build/dist/Types/File/MimeType.js +11 -0
- package/build/dist/Types/File/MimeType.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +14 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/SerializableObjectDictionary.js +133 -39
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/Telemetry/EntitySource.js +39 -0
- package/build/dist/Types/Telemetry/EntitySource.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +27 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityTypeGroups.js +57 -0
- package/build/dist/Types/Telemetry/EntityTypeGroups.js.map +1 -0
- package/build/dist/Types/Workflow/Component.js +21 -0
- package/build/dist/Types/Workflow/Component.js.map +1 -1
- package/build/dist/Types/Workflow/Components/API.js +35 -0
- package/build/dist/Types/Workflow/Components/API.js.map +1 -1
- package/build/dist/Types/Workflow/Components/BaseModel.js +87 -28
- package/build/dist/Types/Workflow/Components/BaseModel.js.map +1 -1
- package/build/dist/Types/Workflow/StepTrace.js +104 -0
- package/build/dist/Types/Workflow/StepTrace.js.map +1 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js +326 -0
- package/build/dist/Types/Workflow/TemplateSyntax.js.map +1 -0
- package/build/dist/Types/Workflow/Templates.js +218 -0
- package/build/dist/Types/Workflow/Templates.js.map +1 -0
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js +126 -0
- package/build/dist/UI/Components/Date/CustomTimeRangeModal.js.map +1 -0
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js +123 -0
- package/build/dist/UI/Components/Date/TimeRangePickerDropdown.js.map +1 -0
- package/build/dist/UI/Components/Dictionary/Dictionary.js +22 -6
- package/build/dist/UI/Components/Dictionary/Dictionary.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +52 -13
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js +28 -12
- package/build/dist/UI/Components/Forms/Fields/IconPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +44 -0
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +4 -3
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +12 -4
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +5 -108
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js +3 -1
- package/build/dist/UI/Components/Modal/ConfirmModal.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +55 -39
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js +11 -6
- package/build/dist/UI/Components/ModelDelete/ModelDelete.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +105 -30
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +5 -105
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js +140 -11
- package/build/dist/UI/Components/Workflow/ArgumentsForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Component.js +20 -19
- package/build/dist/UI/Components/Workflow/Component.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js +31 -3
- package/build/dist/UI/Components/Workflow/ComponentSettingsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/GraphLint.js +396 -0
- package/build/dist/UI/Components/Workflow/GraphLint.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js +225 -0
- package/build/dist/UI/Components/Workflow/ModelColumnEditor.js.map +1 -0
- package/build/dist/UI/Components/Workflow/ModelSchema.js +118 -0
- package/build/dist/UI/Components/Workflow/ModelSchema.js.map +1 -0
- package/build/dist/UI/Components/Workflow/RunForm.js +22 -6
- package/build/dist/UI/Components/Workflow/RunForm.js.map +1 -1
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js +76 -0
- package/build/dist/UI/Components/Workflow/RunStatusWatcher.js.map +1 -0
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +76 -0
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -0
- package/build/dist/UI/Components/Workflow/Utils.js +73 -1
- package/build/dist/UI/Components/Workflow/Utils.js.map +1 -1
- package/build/dist/UI/Components/Workflow/Workflow.js +51 -6
- package/build/dist/UI/Components/Workflow/Workflow.js.map +1 -1
- package/build/dist/UI/Types/LayeredDismissal.js +21 -0
- package/build/dist/UI/Types/LayeredDismissal.js.map +1 -0
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js +74 -1
- package/build/dist/UI/Types/UseAnchoredFieldPopup.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +52 -0
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -0
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js +4 -2
- package/build/dist/Utils/Dashboard/HtmlWidgetDocument.js.map +1 -1
- package/build/dist/Utils/Dashboard/VariableInterpolation.js +19 -1
- package/build/dist/Utils/Dashboard/VariableInterpolation.js.map +1 -1
- package/build/dist/Utils/LegacySerializedArray.js +51 -0
- package/build/dist/Utils/LegacySerializedArray.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDependencyRule.js +47 -0
- package/build/dist/Utils/Monitor/MonitorDependencyRule.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +386 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +35 -6
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityKey.js +52 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/SavedViewFilters.js +52 -0
- package/build/dist/Utils/Telemetry/SavedViewFilters.js.map +1 -0
- package/jest.config.json +3 -0
- package/package.json +1 -1
- package/tsconfig.json +3 -1
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
import AutocompleteTextInput from "../../../UI/Components/AutocompleteTextInput/AutocompleteTextInput";
|
|
2
|
+
import Dropdown, {
|
|
3
|
+
DropdownOption,
|
|
4
|
+
DropdownValue,
|
|
5
|
+
} from "../../../UI/Components/Dropdown/Dropdown";
|
|
6
|
+
import OperatorSelector from "../../../UI/Components/Filters/OperatorSelector";
|
|
7
|
+
import FilterOperator from "../../../UI/Components/Filters/Types/FilterOperator";
|
|
8
|
+
import ColorPicker from "../../../UI/Components/Forms/Fields/ColorPicker";
|
|
9
|
+
import IconPicker from "../../../UI/Components/Forms/Fields/IconPicker";
|
|
10
|
+
import Modal from "../../../UI/Components/Modal/Modal";
|
|
11
|
+
import IconProp from "../../../Types/Icon/IconProp";
|
|
12
|
+
/*
|
|
13
|
+
* The main entry, not "/extend-expect": the latter no longer ships type
|
|
14
|
+
* declarations, so every jest-dom matcher in this file fails to typecheck and
|
|
15
|
+
* the whole suite is skipped before a single assertion runs.
|
|
16
|
+
*/
|
|
17
|
+
import "@testing-library/jest-dom";
|
|
18
|
+
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
|
|
19
|
+
import React, { ReactElement } from "react";
|
|
20
|
+
import { createPortal } from "react-dom";
|
|
21
|
+
import { afterEach, describe, expect, jest, test } from "@jest/globals";
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* The reported bug (issue #3133): in the "Dashboard Variables" modal, clicking
|
|
25
|
+
* a suggested Attribute Key closed the whole modal and dropped the half-filled
|
|
26
|
+
* variable on the floor.
|
|
27
|
+
*
|
|
28
|
+
* The cause is not in the autocomplete. Every dropdown in this codebase portals
|
|
29
|
+
* its menu to document.body so a scroll container cannot clip it, and React
|
|
30
|
+
* dispatches synthetic events through the REACT tree rather than the DOM tree.
|
|
31
|
+
* So a click on a portalled option still bubbles into Modal's backdrop handler
|
|
32
|
+
* — which decided "outside" by asking whether the panel DOM-contains the event
|
|
33
|
+
* target. A portalled option never is, so every such pick read as a backdrop
|
|
34
|
+
* click and dismissed the dialog.
|
|
35
|
+
*
|
|
36
|
+
* That makes this a Modal-level contract rather than a per-dropdown quirk, and
|
|
37
|
+
* these tests state it once for each portalling surface that can appear in a
|
|
38
|
+
* modal body. Crucially they fire mousedown *and* click: Modal only dismisses
|
|
39
|
+
* on a press that both starts and ends outside, so a click-only test passes
|
|
40
|
+
* even with the bug fully present — which is exactly why it went unnoticed.
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
const SUGGESTIONS: Array<string> = [
|
|
44
|
+
"k8s.cluster.name",
|
|
45
|
+
"k8s.namespace.name",
|
|
46
|
+
"service.name",
|
|
47
|
+
];
|
|
48
|
+
|
|
49
|
+
const TEXT_OPERATORS: Array<FilterOperator> = [
|
|
50
|
+
FilterOperator.Contains,
|
|
51
|
+
FilterOperator.EqualTo,
|
|
52
|
+
FilterOperator.StartsWith,
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
const DROPDOWN_OPTIONS: Array<DropdownOption> = [
|
|
56
|
+
{ value: "production", label: "Production" },
|
|
57
|
+
{ value: "staging", label: "Staging" },
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* The layer a user actually presses is the one the panel is centred in — the
|
|
62
|
+
* tinted sheet behind it is aria-hidden and inert.
|
|
63
|
+
*/
|
|
64
|
+
type GetBackdropLayerFunction = () => HTMLElement;
|
|
65
|
+
|
|
66
|
+
const getBackdropLayer: GetBackdropLayerFunction = (): HTMLElement => {
|
|
67
|
+
return screen.getByTestId("modal").parentElement!;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/*
|
|
71
|
+
* A real pointer press is mousedown-then-click. Modal tracks both ends, so
|
|
72
|
+
* anything that only fires `click` cannot observe this bug at all.
|
|
73
|
+
*/
|
|
74
|
+
type PressFunction = (element: HTMLElement) => void;
|
|
75
|
+
|
|
76
|
+
const press: PressFunction = (element: HTMLElement): void => {
|
|
77
|
+
fireEvent.mouseDown(element);
|
|
78
|
+
fireEvent.mouseUp(element);
|
|
79
|
+
fireEvent.click(element);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/*
|
|
83
|
+
* A press that begins on one element and ends on another. The browser reports
|
|
84
|
+
* the click against the nearest common ancestor of the two, which for anything
|
|
85
|
+
* inside the dialog is the backdrop layer itself — so the click alone cannot
|
|
86
|
+
* tell a drag from a dismissal, and the modal has to watch both ends.
|
|
87
|
+
*/
|
|
88
|
+
type DragPressFunction = (from: HTMLElement, to: HTMLElement) => void;
|
|
89
|
+
|
|
90
|
+
const dragPress: DragPressFunction = (
|
|
91
|
+
from: HTMLElement,
|
|
92
|
+
to: HTMLElement,
|
|
93
|
+
): void => {
|
|
94
|
+
fireEvent.mouseDown(from);
|
|
95
|
+
fireEvent.mouseUp(to);
|
|
96
|
+
fireEvent.click(getBackdropLayer().parentElement!);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
interface PortalHarness {
|
|
100
|
+
onClose: () => void;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
type RenderInModalFunction = (children: ReactElement) => PortalHarness;
|
|
104
|
+
|
|
105
|
+
const renderInModal: RenderInModalFunction = (
|
|
106
|
+
children: ReactElement,
|
|
107
|
+
): PortalHarness => {
|
|
108
|
+
const onClose: () => void = jest.fn();
|
|
109
|
+
|
|
110
|
+
render(
|
|
111
|
+
<Modal title="Dashboard Variables" onClose={onClose}>
|
|
112
|
+
{children}
|
|
113
|
+
</Modal>,
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
return { onClose: onClose };
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
describe("Modal dismissal and portalled dropdown menus", () => {
|
|
120
|
+
afterEach(() => {
|
|
121
|
+
cleanup();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe("the contract: a portalled pick is not a backdrop press", () => {
|
|
125
|
+
/*
|
|
126
|
+
* States the rule in isolation, with no real dropdown involved: any child
|
|
127
|
+
* a modal body portals out of the panel keeps its clicks to itself. Every
|
|
128
|
+
* component test below is a specific instance of this one.
|
|
129
|
+
*/
|
|
130
|
+
test("clicking any child portalled to document.body leaves the modal open", () => {
|
|
131
|
+
const onClose: () => void = jest.fn();
|
|
132
|
+
const onPick: () => void = jest.fn();
|
|
133
|
+
|
|
134
|
+
render(
|
|
135
|
+
<Modal title="Dashboard Variables" onClose={onClose}>
|
|
136
|
+
<div>
|
|
137
|
+
{createPortal(
|
|
138
|
+
<button
|
|
139
|
+
type="button"
|
|
140
|
+
data-testid="portalled-option"
|
|
141
|
+
onClick={onPick}
|
|
142
|
+
>
|
|
143
|
+
pick me
|
|
144
|
+
</button>,
|
|
145
|
+
document.body,
|
|
146
|
+
)}
|
|
147
|
+
</div>
|
|
148
|
+
</Modal>,
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
const option: HTMLElement = screen.getByTestId("portalled-option");
|
|
152
|
+
|
|
153
|
+
// Premise of the bug: the option is genuinely outside the panel's DOM.
|
|
154
|
+
expect(screen.getByTestId("modal").contains(option)).toBe(false);
|
|
155
|
+
expect(option.parentElement).toBe(document.body);
|
|
156
|
+
|
|
157
|
+
press(option);
|
|
158
|
+
|
|
159
|
+
expect(onPick).toHaveBeenCalledTimes(1);
|
|
160
|
+
expect(onClose).not.toHaveBeenCalled();
|
|
161
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test("a portalled press does not arm the next backdrop click", () => {
|
|
165
|
+
const onClose: () => void = jest.fn();
|
|
166
|
+
|
|
167
|
+
render(
|
|
168
|
+
<Modal title="Dashboard Variables" onClose={onClose}>
|
|
169
|
+
<div>
|
|
170
|
+
{createPortal(
|
|
171
|
+
<button type="button" data-testid="portalled-option">
|
|
172
|
+
pick me
|
|
173
|
+
</button>,
|
|
174
|
+
document.body,
|
|
175
|
+
)}
|
|
176
|
+
</div>
|
|
177
|
+
</Modal>,
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
/*
|
|
181
|
+
* Modal remembers where a press started so a drag out of the panel is not
|
|
182
|
+
* a dismissal. A portalled mousedown must not leave that memory set to
|
|
183
|
+
* "outside", or the user's very next click anywhere would close the
|
|
184
|
+
* dialog.
|
|
185
|
+
*/
|
|
186
|
+
fireEvent.mouseDown(screen.getByTestId("portalled-option"));
|
|
187
|
+
fireEvent.click(screen.getByTestId("modal-title"));
|
|
188
|
+
|
|
189
|
+
expect(onClose).not.toHaveBeenCalled();
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
describe("AutocompleteTextInput — the surface in the reported bug", () => {
|
|
194
|
+
test("picking a suggestion sets the value and keeps the modal open", () => {
|
|
195
|
+
const onChange: (value: string) => void = jest.fn();
|
|
196
|
+
const harness: PortalHarness = renderInModal(
|
|
197
|
+
<AutocompleteTextInput
|
|
198
|
+
dataTestId="attribute-key"
|
|
199
|
+
suggestions={SUGGESTIONS}
|
|
200
|
+
onChange={onChange}
|
|
201
|
+
/>,
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
fireEvent.focus(screen.getByTestId("attribute-key"));
|
|
205
|
+
|
|
206
|
+
const option: HTMLElement = screen.getAllByRole("option")[1]!;
|
|
207
|
+
|
|
208
|
+
expect(screen.getByTestId("modal").contains(option)).toBe(false);
|
|
209
|
+
|
|
210
|
+
press(option);
|
|
211
|
+
|
|
212
|
+
// Both halves of the report: the value lands *and* the dialog survives.
|
|
213
|
+
expect(onChange).toHaveBeenCalledWith("k8s.namespace.name");
|
|
214
|
+
expect(screen.getByTestId("attribute-key")).toHaveValue(
|
|
215
|
+
"k8s.namespace.name",
|
|
216
|
+
);
|
|
217
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
218
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test("picking several suggestions in a row never closes the modal", () => {
|
|
222
|
+
const values: Array<string> = [];
|
|
223
|
+
const harness: PortalHarness = renderInModal(
|
|
224
|
+
<AutocompleteTextInput
|
|
225
|
+
dataTestId="attribute-key"
|
|
226
|
+
suggestions={SUGGESTIONS}
|
|
227
|
+
onChange={(value: string) => {
|
|
228
|
+
values.push(value);
|
|
229
|
+
}}
|
|
230
|
+
/>,
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
/*
|
|
234
|
+
* A user correcting themselves: pick, retype to search again, pick a
|
|
235
|
+
* different one. Retyping is what reopens the menu and widens the list
|
|
236
|
+
* back out, since a picked value filters the suggestions down to itself.
|
|
237
|
+
*/
|
|
238
|
+
const input: HTMLElement = screen.getByTestId("attribute-key");
|
|
239
|
+
|
|
240
|
+
fireEvent.focus(input);
|
|
241
|
+
press(screen.getAllByRole("option")[0]!);
|
|
242
|
+
|
|
243
|
+
fireEvent.change(input, { target: { value: "service" } });
|
|
244
|
+
press(screen.getAllByRole("option")[0]!);
|
|
245
|
+
|
|
246
|
+
fireEvent.change(input, { target: { value: "k8s.n" } });
|
|
247
|
+
press(screen.getAllByRole("option")[0]!);
|
|
248
|
+
|
|
249
|
+
expect(values).toEqual([
|
|
250
|
+
"k8s.cluster.name",
|
|
251
|
+
"service",
|
|
252
|
+
"service.name",
|
|
253
|
+
"k8s.n",
|
|
254
|
+
"k8s.namespace.name",
|
|
255
|
+
]);
|
|
256
|
+
expect(input).toHaveValue("k8s.namespace.name");
|
|
257
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
258
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
test("the menu closes on pick without taking the dialog with it", () => {
|
|
262
|
+
renderInModal(
|
|
263
|
+
<AutocompleteTextInput
|
|
264
|
+
dataTestId="attribute-key"
|
|
265
|
+
suggestions={SUGGESTIONS}
|
|
266
|
+
/>,
|
|
267
|
+
);
|
|
268
|
+
|
|
269
|
+
fireEvent.focus(screen.getByTestId("attribute-key"));
|
|
270
|
+
press(screen.getAllByRole("option")[0]!);
|
|
271
|
+
|
|
272
|
+
expect(screen.queryByTestId("attribute-key-suggestions")).toBeNull();
|
|
273
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test("picking the loading row's replacement after suggestions arrive still keeps the modal", () => {
|
|
277
|
+
const onChange: (value: string) => void = jest.fn();
|
|
278
|
+
const onClose: () => void = jest.fn();
|
|
279
|
+
|
|
280
|
+
const { rerender } = render(
|
|
281
|
+
<Modal title="Dashboard Variables" onClose={onClose}>
|
|
282
|
+
<AutocompleteTextInput
|
|
283
|
+
dataTestId="attribute-key"
|
|
284
|
+
suggestions={[]}
|
|
285
|
+
isLoadingSuggestions={true}
|
|
286
|
+
loadingMessage="Loading attributes..."
|
|
287
|
+
onChange={onChange}
|
|
288
|
+
/>
|
|
289
|
+
</Modal>,
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
fireEvent.focus(screen.getByTestId("attribute-key"));
|
|
293
|
+
expect(screen.getByTestId("attribute-key-suggestions")).toHaveTextContent(
|
|
294
|
+
"Loading attributes...",
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// Suggestions land asynchronously in the real dashboard.
|
|
298
|
+
rerender(
|
|
299
|
+
<Modal title="Dashboard Variables" onClose={onClose}>
|
|
300
|
+
<AutocompleteTextInput
|
|
301
|
+
dataTestId="attribute-key"
|
|
302
|
+
suggestions={SUGGESTIONS}
|
|
303
|
+
isLoadingSuggestions={false}
|
|
304
|
+
onChange={onChange}
|
|
305
|
+
/>
|
|
306
|
+
</Modal>,
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
press(screen.getAllByRole("option")[0]!);
|
|
310
|
+
|
|
311
|
+
expect(onChange).toHaveBeenCalledWith("k8s.cluster.name");
|
|
312
|
+
expect(onClose).not.toHaveBeenCalled();
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
describe("OperatorSelector", () => {
|
|
317
|
+
test("picking an operator keeps the modal open", () => {
|
|
318
|
+
const onChange: (value: FilterOperator) => void = jest.fn();
|
|
319
|
+
const harness: PortalHarness = renderInModal(
|
|
320
|
+
<OperatorSelector
|
|
321
|
+
value={FilterOperator.Contains}
|
|
322
|
+
options={TEXT_OPERATORS}
|
|
323
|
+
onChange={onChange}
|
|
324
|
+
/>,
|
|
325
|
+
);
|
|
326
|
+
|
|
327
|
+
fireEvent.click(screen.getByRole("button", { name: /contains/i }));
|
|
328
|
+
|
|
329
|
+
const option: HTMLElement = screen.getByRole("option", {
|
|
330
|
+
name: "starts with",
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
expect(screen.getByTestId("modal").contains(option)).toBe(false);
|
|
334
|
+
|
|
335
|
+
press(option);
|
|
336
|
+
|
|
337
|
+
expect(onChange).toHaveBeenCalledWith(FilterOperator.StartsWith);
|
|
338
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
339
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
/*
|
|
344
|
+
* ColorPicker and IconPicker share UseAnchoredFieldPopup, whose own
|
|
345
|
+
* outside-click guard is a native capture-phase document listener — it never
|
|
346
|
+
* touches React propagation, so both were as exposed as the autocomplete.
|
|
347
|
+
* They reach a modal through FormField's Color and Icon schema types, which
|
|
348
|
+
* is to say through every ModelFormModal that edits a label or an incident
|
|
349
|
+
* role: picking a colour used to throw the whole form away.
|
|
350
|
+
*/
|
|
351
|
+
describe("ColorPicker", () => {
|
|
352
|
+
test("pressing inside the colour popup keeps the modal open", () => {
|
|
353
|
+
const harness: PortalHarness = renderInModal(
|
|
354
|
+
<ColorPicker
|
|
355
|
+
dataTestId="color-value"
|
|
356
|
+
placeholder="Pick a color"
|
|
357
|
+
onChange={jest.fn()}
|
|
358
|
+
/>,
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
fireEvent.click(screen.getByTestId("color-value"));
|
|
362
|
+
|
|
363
|
+
const popup: HTMLElement = screen.getByTestId("color-picker-popup");
|
|
364
|
+
|
|
365
|
+
expect(screen.getByTestId("modal").contains(popup)).toBe(false);
|
|
366
|
+
|
|
367
|
+
// The hex field: the part of the popup a user is most likely to press.
|
|
368
|
+
press(popup.querySelector("input") as HTMLElement);
|
|
369
|
+
|
|
370
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
371
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
372
|
+
expect(screen.getByTestId("color-picker-popup")).toBeInTheDocument();
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
describe("IconPicker", () => {
|
|
377
|
+
test("picking an icon keeps the modal open", () => {
|
|
378
|
+
const onChange: (value: IconProp | null) => void = jest.fn();
|
|
379
|
+
const harness: PortalHarness = renderInModal(
|
|
380
|
+
<IconPicker
|
|
381
|
+
dataTestId="icon-value"
|
|
382
|
+
placeholder="No icon"
|
|
383
|
+
onChange={onChange}
|
|
384
|
+
/>,
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
fireEvent.click(screen.getByTestId("icon-value"));
|
|
388
|
+
|
|
389
|
+
const popup: HTMLElement = screen.getByTestId("icon-picker-popup");
|
|
390
|
+
const iconCell: HTMLElement = popup.querySelector(
|
|
391
|
+
`[title="${IconProp.Alert}"]`,
|
|
392
|
+
) as HTMLElement;
|
|
393
|
+
|
|
394
|
+
expect(screen.getByTestId("modal").contains(popup)).toBe(false);
|
|
395
|
+
expect(iconCell).not.toBeNull();
|
|
396
|
+
|
|
397
|
+
press(iconCell);
|
|
398
|
+
|
|
399
|
+
expect(onChange).toHaveBeenLastCalledWith(IconProp.Alert);
|
|
400
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
401
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
402
|
+
});
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
describe("Dropdown (react-select portalled menu)", () => {
|
|
406
|
+
test("picking an option keeps the modal open", () => {
|
|
407
|
+
const onChange: (
|
|
408
|
+
value: DropdownValue | Array<DropdownValue> | null,
|
|
409
|
+
) => void = jest.fn();
|
|
410
|
+
const harness: PortalHarness = renderInModal(
|
|
411
|
+
<Dropdown
|
|
412
|
+
options={DROPDOWN_OPTIONS}
|
|
413
|
+
onChange={onChange}
|
|
414
|
+
placeholder="Select an environment"
|
|
415
|
+
/>,
|
|
416
|
+
);
|
|
417
|
+
|
|
418
|
+
fireEvent.keyDown(screen.getByRole("combobox"), { key: "ArrowDown" });
|
|
419
|
+
|
|
420
|
+
const option: HTMLElement = screen.getByText("Staging");
|
|
421
|
+
|
|
422
|
+
/*
|
|
423
|
+
* react-select is configured with menuPortalTarget={document.body}, so
|
|
424
|
+
* its option is outside the panel exactly like the hand-rolled menus.
|
|
425
|
+
*
|
|
426
|
+
* This one was never broken: react-select's own `onMenuMouseDown` calls
|
|
427
|
+
* stopPropagation, so the press never armed Modal's backdrop tracking.
|
|
428
|
+
* That immunity is incidental to a third-party implementation detail
|
|
429
|
+
* rather than something this codebase decided, which is precisely why it
|
|
430
|
+
* is worth pinning — a react-select upgrade that drops it would otherwise
|
|
431
|
+
* reintroduce the bug on every dropdown in every modal, silently.
|
|
432
|
+
*/
|
|
433
|
+
expect(screen.getByTestId("modal").contains(option)).toBe(false);
|
|
434
|
+
|
|
435
|
+
press(option);
|
|
436
|
+
|
|
437
|
+
expect(onChange).toHaveBeenCalledWith("staging");
|
|
438
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
439
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
describe("genuine backdrop dismissal still works", () => {
|
|
444
|
+
/*
|
|
445
|
+
* The fix narrows what counts as a backdrop press, so the far more common
|
|
446
|
+
* behaviour it sits next to has to be pinned down just as hard — a fix that
|
|
447
|
+
* made modals undismissable would be a worse bug than the one it replaced.
|
|
448
|
+
*/
|
|
449
|
+
test("a press that starts and ends on the backdrop closes the modal", () => {
|
|
450
|
+
const harness: PortalHarness = renderInModal(<div>Modal content</div>);
|
|
451
|
+
|
|
452
|
+
press(getBackdropLayer());
|
|
453
|
+
|
|
454
|
+
expect(harness.onClose).toHaveBeenCalledTimes(1);
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
test("a press on the scroll layer that holds the backdrop closes the modal", () => {
|
|
458
|
+
const harness: PortalHarness = renderInModal(<div>Modal content</div>);
|
|
459
|
+
|
|
460
|
+
// The 'fixed inset-0 overflow-y-auto' layer the handlers are bound to.
|
|
461
|
+
press(getBackdropLayer().parentElement!);
|
|
462
|
+
|
|
463
|
+
expect(harness.onClose).toHaveBeenCalledTimes(1);
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
test("a press inside the panel does not close the modal", () => {
|
|
467
|
+
const harness: PortalHarness = renderInModal(<div>Modal content</div>);
|
|
468
|
+
|
|
469
|
+
press(screen.getByText("Modal content"));
|
|
470
|
+
|
|
471
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
test("backdrop dismissal still works after a portalled pick", () => {
|
|
475
|
+
const harness: PortalHarness = renderInModal(
|
|
476
|
+
<AutocompleteTextInput
|
|
477
|
+
dataTestId="attribute-key"
|
|
478
|
+
suggestions={SUGGESTIONS}
|
|
479
|
+
/>,
|
|
480
|
+
);
|
|
481
|
+
|
|
482
|
+
fireEvent.focus(screen.getByTestId("attribute-key"));
|
|
483
|
+
press(screen.getAllByRole("option")[0]!);
|
|
484
|
+
|
|
485
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
486
|
+
|
|
487
|
+
// The dialog is still dismissable the ordinary way.
|
|
488
|
+
press(getBackdropLayer());
|
|
489
|
+
|
|
490
|
+
expect(harness.onClose).toHaveBeenCalledTimes(1);
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
test("a press that starts on the backdrop and ends on the panel is a drag, not a dismissal", () => {
|
|
494
|
+
const harness: PortalHarness = renderInModal(<div>Modal content</div>);
|
|
495
|
+
|
|
496
|
+
/*
|
|
497
|
+
* Pressing outside and releasing inside — reaching for the backdrop,
|
|
498
|
+
* changing your mind, letting go over the form. The click lands on the
|
|
499
|
+
* backdrop layer either way, so before the modal tracked the release this
|
|
500
|
+
* discarded whatever had been typed.
|
|
501
|
+
*/
|
|
502
|
+
dragPress(getBackdropLayer(), screen.getByText("Modal content"));
|
|
503
|
+
|
|
504
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
505
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
test("a press that starts on the panel and ends on the backdrop is a drag too", () => {
|
|
509
|
+
const harness: PortalHarness = renderInModal(<div>Modal content</div>);
|
|
510
|
+
|
|
511
|
+
// Selecting text in the body and releasing past the panel edge.
|
|
512
|
+
dragPress(screen.getByText("Modal content"), getBackdropLayer());
|
|
513
|
+
|
|
514
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
test("a release on a portalled menu does not dismiss the dialog either", () => {
|
|
518
|
+
const harness: PortalHarness = renderInModal(
|
|
519
|
+
<div>
|
|
520
|
+
{createPortal(
|
|
521
|
+
<button type="button" data-testid="portalled-option">
|
|
522
|
+
pick me
|
|
523
|
+
</button>,
|
|
524
|
+
document.body,
|
|
525
|
+
)}
|
|
526
|
+
</div>,
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
dragPress(getBackdropLayer(), screen.getByTestId("portalled-option"));
|
|
530
|
+
|
|
531
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
532
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
test("dismissing an open picker leaves the modal behind it standing", () => {
|
|
536
|
+
const harness: PortalHarness = renderInModal(
|
|
537
|
+
<ColorPicker
|
|
538
|
+
dataTestId="color-value"
|
|
539
|
+
placeholder="Pick a color"
|
|
540
|
+
onChange={jest.fn()}
|
|
541
|
+
/>,
|
|
542
|
+
);
|
|
543
|
+
|
|
544
|
+
fireEvent.click(screen.getByTestId("color-value"));
|
|
545
|
+
expect(screen.getByTestId("color-picker-popup")).toBeInTheDocument();
|
|
546
|
+
|
|
547
|
+
/*
|
|
548
|
+
* The popup covers a good part of the backdrop, so "click off it to put
|
|
549
|
+
* it away" is the obvious gesture — and one press used to close the
|
|
550
|
+
* picker and the form behind it together. Dismissal belongs to the
|
|
551
|
+
* topmost layer that is open.
|
|
552
|
+
*/
|
|
553
|
+
press(getBackdropLayer());
|
|
554
|
+
|
|
555
|
+
expect(screen.queryByTestId("color-picker-popup")).toBeNull();
|
|
556
|
+
expect(harness.onClose).not.toHaveBeenCalled();
|
|
557
|
+
expect(screen.getByTestId("modal")).toBeInTheDocument();
|
|
558
|
+
|
|
559
|
+
// With the picker gone, the very next backdrop press dismisses as usual.
|
|
560
|
+
press(getBackdropLayer());
|
|
561
|
+
|
|
562
|
+
expect(harness.onClose).toHaveBeenCalledTimes(1);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
test("the close button still closes a modal holding a portalled menu", () => {
|
|
566
|
+
const harness: PortalHarness = renderInModal(
|
|
567
|
+
<AutocompleteTextInput
|
|
568
|
+
dataTestId="attribute-key"
|
|
569
|
+
suggestions={SUGGESTIONS}
|
|
570
|
+
/>,
|
|
571
|
+
);
|
|
572
|
+
|
|
573
|
+
fireEvent.focus(screen.getByTestId("attribute-key"));
|
|
574
|
+
fireEvent.click(screen.getByTestId("close-button"));
|
|
575
|
+
|
|
576
|
+
expect(harness.onClose).toHaveBeenCalledTimes(1);
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
});
|