@oneuptime/common 13.0.4 → 13.0.5
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/Index.ts +4 -0
- package/Models/DatabaseModels/RumApplication.ts +1 -1
- package/Models/DatabaseModels/SecurityEventConnection.ts +457 -0
- package/Models/DatabaseModels/SecurityEventConnectionRun.ts +263 -0
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +2 -2
- package/Server/API/AIInvestigationAPI.ts +484 -24
- package/Server/API/GoogleSecOpsConnectionAPI.ts +249 -8
- package/Server/API/SecurityEventConnectionAPI.ts +250 -0
- package/Server/API/TelemetryAPI.ts +402 -265
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/TelemetryIngest.ts +101 -6
- package/Server/Services/ExceptionAggregationService.ts +7 -16
- package/Server/Services/GoogleSecOpsConnectionService.ts +15 -0
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/InventoryItemService.ts +28 -0
- package/Server/Services/LogAggregationService.ts +17 -23
- package/Server/Services/MetricAggregationService.ts +4 -14
- package/Server/Services/SecurityEventConnectionRunService.ts +10 -0
- package/Server/Services/SecurityEventConnectionService.ts +538 -0
- package/Server/Services/TraceAggregationService.ts +77 -28
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +13 -1
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +15 -1
- package/Server/Utils/AI/SRE/InvestigationEvidence.ts +658 -0
- package/Server/Utils/AI/SRE/InvestigationReferences.ts +324 -0
- package/Server/Utils/AI/Toolbox/Index.ts +38 -0
- package/Server/Utils/AI/Toolbox/TimelineTools.ts +9 -2
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +80 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +5 -3
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.ts +1108 -0
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.ts +732 -0
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +495 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.ts +689 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.ts +767 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.ts +571 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.ts +827 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.ts +610 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.ts +549 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.ts +830 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.ts +684 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.ts +487 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.ts +778 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +1002 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.ts +556 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +275 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +53 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.ts +709 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.ts +596 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +191 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +353 -65
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.ts +777 -0
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +747 -148
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +48 -2
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +81 -0
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +741 -40
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +8 -0
- package/Server/Utils/Telemetry/KubernetesResourceAttributes.ts +108 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +174 -93
- package/Server/Utils/Telemetry/ResourceFacetPlanner.ts +251 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +248 -413
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +668 -0
- package/Server/Utils/Telemetry/TraceContextPropagation.ts +348 -0
- package/Server/Utils/Telemetry.ts +18 -0
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +413 -0
- package/Tests/App/Dashboard/AIRootCauseFeedItem.test.tsx +285 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +242 -0
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +601 -15
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +835 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +41 -0
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +604 -0
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +738 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +153 -6
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +165 -0
- package/Tests/App/Dashboard/EpisodeChangeState.test.tsx +1069 -0
- package/Tests/App/Dashboard/EpisodeMembersCard.test.tsx +772 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +2354 -0
- package/Tests/App/Dashboard/EventOverviewSkeleton.test.tsx +210 -0
- package/Tests/App/Dashboard/EventStatBar.test.tsx +392 -0
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +247 -0
- package/Tests/App/Dashboard/ExceptionAIAssistance.test.tsx +606 -0
- package/Tests/App/Dashboard/ExceptionBreadcrumbTimeline.test.tsx +273 -0
- package/Tests/App/Dashboard/ExceptionDetailSideMenu.test.tsx +176 -0
- package/Tests/App/Dashboard/ExceptionOverviewCards.test.tsx +366 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +371 -0
- package/Tests/App/Dashboard/ExceptionStackFrameViewer.test.tsx +440 -0
- package/Tests/App/Dashboard/ExceptionSummary.test.tsx +381 -0
- package/Tests/App/Dashboard/ExceptionTriage.test.tsx +306 -0
- package/Tests/App/Dashboard/ExceptionsResourceFacets.test.tsx +604 -0
- package/Tests/App/Dashboard/ExceptionsViewerEntityChips.test.tsx +706 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +32 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionForm.test.tsx +838 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +18 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +297 -20
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +618 -13
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +254 -207
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +303 -135
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +1251 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +303 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +876 -8
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +35 -0
- package/Tests/App/Dashboard/InvestigationReferenceLink.test.tsx +177 -0
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +1295 -0
- package/Tests/App/Dashboard/KubernetesImageReferenceView.test.tsx +114 -0
- package/Tests/App/Dashboard/KubernetesLogsTabChips.test.tsx +285 -0
- package/Tests/App/Dashboard/LogsEntityChipNames.test.tsx +316 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +361 -0
- package/Tests/App/Dashboard/ProfileTableEntityNames.test.tsx +432 -0
- package/Tests/App/Dashboard/ProfileViewEntityName.test.tsx +250 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/ResourceLogsTabsBareLayout.test.tsx +700 -0
- package/Tests/App/Dashboard/ResourcePageEntityNameProps.test.tsx +803 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +11 -1
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeState.test.tsx +1026 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +436 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +1195 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1022 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +905 -0
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +247 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +375 -274
- package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +410 -0
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +774 -0
- package/Tests/App/Dashboard/TopErrorsPanelResourceNames.test.tsx +316 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +30 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +88 -24
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +1590 -0
- package/Tests/App/Dashboard/TraceWaterfall.test.tsx +488 -0
- package/Tests/App/Dashboard/TracesAnalyticsSeriesLabels.test.tsx +367 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +585 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +613 -0
- package/Tests/App/Dashboard/UseServiceNames.test.tsx +359 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +7 -0
- package/Tests/Models/InventoryItemNaming.test.ts +132 -16
- package/Tests/Models/SecurityDomainAccessControl.test.ts +61 -17
- package/Tests/Server/API/AIInvestigationAPI.test.ts +611 -2
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +1098 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +409 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +856 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +528 -1
- package/Tests/Server/API/TelemetryFacetsAPI.test.ts +810 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +240 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +229 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +66 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +1233 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +53 -0
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +218 -0
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +155 -1
- package/Tests/Server/Services/TraceAggregationExceptionScope.test.ts +142 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +85 -24
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +33 -0
- package/Tests/Server/Utils/AI/InvestigationEvidence.test.ts +1395 -0
- package/Tests/Server/Utils/AI/InvestigationReferences.test.ts +616 -0
- package/Tests/Server/Utils/AI/TimelineTools.test.ts +119 -0
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +151 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +65 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorExceptionScope.test.ts +224 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +55 -2
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.test.ts +1240 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.test.ts +1853 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +1129 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.test.ts +1066 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.test.ts +1568 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.test.ts +930 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.test.ts +1409 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.test.ts +763 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.test.ts +1296 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.test.ts +1102 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.test.ts +1174 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.test.ts +1032 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.test.ts +1558 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +3041 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +1168 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +906 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.test.ts +1068 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.test.ts +1004 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.test.ts +784 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +113 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +5 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +93 -13
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +23 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +25 -3
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +22 -8
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +82 -16
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSearchDetections.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsThreePassPoller.test.ts +1577 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +41 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1453 -18
- package/Tests/Server/Utils/Telemetry/KubernetesResourceAttributes.test.ts +162 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +460 -13
- package/Tests/Server/Utils/Telemetry/ResourceFacetPlanner.test.ts +678 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +348 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +525 -0
- package/Tests/Server/Utils/Telemetry/TraceContextPropagation.test.ts +420 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +73 -0
- package/Tests/Types/Rum/SessionReplayTransportContracts.test.ts +95 -0
- package/Tests/Types/SecurityEvent/Connectors/ConnectorDiagnostics.test.ts +82 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +314 -0
- package/Tests/Types/Telemetry/ExceptionSpanScope.test.ts +89 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +96 -0
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +304 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +357 -0
- package/Tests/UI/Components/Card.test.tsx +312 -1
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +253 -0
- package/Tests/UI/Components/CardModelDetailRefresher.test.tsx +342 -0
- package/Tests/UI/Components/Checkbox.test.tsx +79 -0
- package/Tests/UI/Components/CopyTextButton.test.tsx +142 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +621 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +60 -0
- package/Tests/UI/Components/FacetSections.test.tsx +581 -0
- package/Tests/UI/Components/FacetSidebarControls.test.tsx +812 -0
- package/Tests/UI/Components/FacetVisibility.test.ts +429 -0
- package/Tests/UI/Components/LockedFilterActions.test.tsx +396 -0
- package/Tests/UI/Components/LockedFilterChip.test.tsx +651 -0
- package/Tests/UI/Components/LogsEntityNames.test.ts +1769 -0
- package/Tests/UI/Components/LogsEntityNamesComponents.test.tsx +696 -0
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +600 -0
- package/Tests/UI/Components/LogsViewerEntityNames.test.tsx +713 -0
- package/Tests/UI/Components/MarkdownInlineReferences.test.tsx +2079 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +446 -0
- package/Tests/UI/Components/ModelDetailRefetch.test.tsx +397 -0
- package/Tests/UI/Components/ModelListRefetch.test.tsx +233 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +409 -0
- package/Tests/UI/Components/PaginationIntegration.test.tsx +25 -0
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +172 -0
- package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +32 -14
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +44 -1
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +304 -0
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +718 -0
- package/Tests/UI/Monitor/EvaluationLogList.test.tsx +303 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +55 -1
- package/Tests/UI/Rum/FidelityNotices.test.ts +22 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +120 -136
- package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +988 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +32 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +709 -12
- package/Tests/UI/Rum/ReplayHeader.test.tsx +50 -1
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +67 -10
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +41 -12
- package/Tests/UI/Rum/ReplayStage.test.tsx +663 -1
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +173 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +189 -2
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +91 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +1 -1
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +585 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +844 -51
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +29 -1
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +288 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +31 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +6 -0
- package/Tests/UI/Utils/Clipboard.test.ts +154 -0
- package/Tests/UI/Utils/Navigation.test.ts +24 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +2205 -0
- package/Tests/UI/Utils/Telemetry/UseTelemetryEntityNames.test.tsx +844 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +2430 -0
- package/Tests/Utils/APIOutgoingRequestTracer.test.ts +137 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +40 -0
- package/Tests/Utils/Rum/SessionReplayRecordingEnded.test.ts +619 -0
- package/Tests/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.test.ts +631 -0
- package/Tests/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.test.ts +479 -0
- package/Tests/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.test.ts +507 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.test.ts +686 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.test.ts +474 -0
- package/Tests/Utils/SecurityEvent/Connectors/OktaNormalizer.test.ts +736 -0
- package/Tests/Utils/SecurityEvent/Connectors/SplunkNormalizer.test.ts +407 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +129 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +57 -1
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +36 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +600 -0
- package/Tests/Utils/Telemetry/NetworkHost.test.ts +48 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +154 -0
- package/Tests/Utils/Traces/CriticalPath.test.ts +25 -0
- package/Types/AI/AIChatTypes.ts +8 -0
- package/Types/AI/InvestigationEvidence.ts +96 -0
- package/Types/Monitor/MonitorEvaluationSummary.ts +5 -0
- package/Types/Permission.ts +2 -2
- package/Types/Rum/SessionReplay.ts +109 -0
- package/Types/Rum/SessionReplayApi.ts +31 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +111 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +87 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +492 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +41 -0
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -1
- package/Types/SecurityEvent/GoogleSecOpsRegion.ts +34 -0
- package/Types/Telemetry/EntityType.ts +14 -0
- package/Types/Telemetry/ExceptionSpanScope.ts +83 -0
- package/Types/Telemetry/LockedFilterDetail.ts +46 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +17 -10
- package/Types/Telemetry/ResourceFacetCatalog.ts +171 -0
- package/UI/Components/Card/Card.tsx +118 -83
- package/UI/Components/Checkbox/Checkbox.tsx +8 -5
- package/UI/Components/CopyTextButton/CopyTextButton.tsx +7 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +4 -1
- package/UI/Components/Detail/Detail.tsx +137 -22
- package/UI/Components/ErrorBoundary.tsx +38 -0
- package/UI/Components/LogsViewer/LogsEntityNames.ts +912 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +156 -77
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +28 -11
- package/UI/Components/LogsViewer/components/FacetSection.tsx +66 -79
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +17 -2
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +45 -5
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +100 -19
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +156 -39
- package/UI/Components/LogsViewer/components/LogsTable.tsx +30 -8
- package/UI/Components/LogsViewer/types.ts +6 -0
- package/UI/Components/Markdown.tsx/InlineReferences.tsx +628 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +385 -312
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +50 -22
- package/UI/Components/ModelDetail/CardModelDetail.tsx +15 -0
- package/UI/Components/ModelDetail/ModelDetail.tsx +64 -19
- package/UI/Components/ModelList/ModelList.tsx +33 -8
- package/UI/Components/Page/ModelPage.tsx +119 -54
- package/UI/Components/Table/Table.tsx +8 -0
- package/UI/Components/Table/TableRow.tsx +13 -5
- package/UI/Components/TelemetryViewer/FacetVisibility.ts +229 -0
- package/UI/Components/TelemetryViewer/ResourceFacetConfigs.ts +46 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +11 -0
- package/UI/Components/TelemetryViewer/components/FacetSearchInput.tsx +79 -0
- package/UI/Components/TelemetryViewer/components/FacetSectionHeader.tsx +69 -0
- package/UI/Components/TelemetryViewer/components/FacetShowMoreButton.tsx +36 -0
- package/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.tsx +88 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterActions.tsx +205 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +496 -0
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +30 -10
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +203 -10
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +60 -73
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +94 -7
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +17 -2
- package/UI/Components/TelemetryViewer/types.ts +19 -0
- package/UI/Components/TelemetryViewer/useFacetSearchExemptions.ts +158 -0
- package/UI/Components/TelemetryViewer/useFacetSectionSearch.ts +102 -0
- package/UI/Utils/Clipboard.ts +68 -2
- package/UI/Utils/Navigation.ts +17 -2
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +620 -0
- package/UI/Utils/Telemetry/UseTelemetryEntityNames.ts +151 -0
- package/Utils/AI/InvestigationReport.ts +1789 -0
- package/Utils/API.ts +90 -1
- package/Utils/Rum/SessionReplayHealth.ts +11 -0
- package/Utils/Rum/SessionReplayRecordingEnded.ts +134 -0
- package/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.ts +427 -0
- package/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.ts +197 -0
- package/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.ts +464 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.ts +567 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.ts +299 -0
- package/Utils/SecurityEvent/Connectors/OktaNormalizer.ts +467 -0
- package/Utils/SecurityEvent/Connectors/SplunkNormalizer.ts +439 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +124 -12
- package/Utils/Telemetry/CrossSignalScope.ts +22 -8
- package/Utils/Telemetry/EntityRelationship.ts +8 -0
- package/Utils/Telemetry/LockedFilterSearch.ts +412 -0
- package/Utils/Telemetry/NetworkHost.ts +43 -0
- package/Utils/Telemetry/OriginAllowList.ts +139 -4
- package/Utils/Traces/CriticalPath.ts +10 -4
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js +490 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js.map +1 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +2 -2
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +336 -27
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +182 -7
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +171 -0
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/TelemetryAPI.js +248 -170
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +57 -4
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +7 -16
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +8 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +22 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +8 -17
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +4 -14
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js +9 -0
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js +356 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -0
- package/build/dist/Server/Services/TraceAggregationService.js +51 -25
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +14 -7
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js +468 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js +230 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +32 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +6 -2
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +59 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js +752 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js +493 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +352 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js +405 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js +466 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js +344 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js +511 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js +406 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js +336 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js +474 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js +417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js +314 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +719 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js +404 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +209 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +40 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js +379 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +27 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +234 -61
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js +537 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +572 -115
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +35 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +52 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js.map +1 -0
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +521 -32
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +10 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +8 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js +80 -0
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +122 -67
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js +146 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +174 -248
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +492 -0
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js +259 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry.js +11 -5
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/InvestigationEvidence.js +2 -0
- package/build/dist/Types/AI/InvestigationEvidence.js.map +1 -0
- package/build/dist/Types/Permission.js +2 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +95 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js +18 -0
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +374 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +35 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js +35 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +14 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js +59 -0
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +16 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +16 -10
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +119 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -0
- package/build/dist/UI/Components/Card/Card.js +34 -17
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +6 -4
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +63 -13
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/ErrorBoundary.js +34 -0
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js +535 -0
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +117 -57
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +5 -7
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js +31 -44
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +17 -3
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +19 -3
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +64 -18
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +100 -41
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +13 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js +403 -0
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +197 -179
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +30 -21
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +12 -0
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +46 -12
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +26 -7
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +62 -34
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/Table/Table.js +3 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +8 -1
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +111 -0
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js +22 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js +36 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js +21 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js +14 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js +27 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js +88 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterActions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +228 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +6 -6
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +111 -12
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +27 -40
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +70 -10
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +17 -3
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/types.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/types.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js +70 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js +52 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js.map +1 -0
- package/build/dist/UI/Utils/Clipboard.js +59 -2
- package/build/dist/UI/Utils/Clipboard.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +11 -2
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +471 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js +113 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js.map +1 -0
- package/build/dist/Utils/AI/InvestigationReport.js +1241 -0
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -0
- package/build/dist/Utils/API.js +25 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayHealth.js +10 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js +54 -0
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js +311 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js +150 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js +328 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js +405 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js +212 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js +351 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js +348 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +103 -10
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +16 -5
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +7 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +277 -0
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js +39 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +105 -4
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/build/dist/Utils/Traces/CriticalPath.js +9 -4
- package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
- package/package.json +1 -1
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +0 -600
- package/UI/Components/GanttChart/Bar/BarLabel.tsx +0 -17
- package/UI/Components/GanttChart/Bar/Index.tsx +0 -149
- package/UI/Components/GanttChart/ChartContainer.tsx +0 -50
- package/UI/Components/GanttChart/Index.tsx +0 -90
- package/UI/Components/GanttChart/Row/Index.tsx +0 -22
- package/UI/Components/GanttChart/Row/Row.tsx +0 -231
- package/UI/Components/GanttChart/Row/RowLabel.tsx +0 -30
- package/UI/Components/GanttChart/Rows.tsx +0 -59
- package/UI/Components/GanttChart/Timeline/Index.tsx +0 -46
- package/UI/Components/GanttChart/Timeline/TimelineInterval.tsx +0 -33
- package/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.tsx +0 -43
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js +0 -8
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Bar/Index.js +0 -77
- package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +0 -33
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Index.js +0 -39
- package/build/dist/UI/Components/GanttChart/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Index.js +0 -7
- package/build/dist/UI/Components/GanttChart/Row/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Row.js +0 -106
- package/build/dist/UI/Components/GanttChart/Row/Row.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js +0 -10
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Rows.js +0 -19
- package/build/dist/UI/Components/GanttChart/Rows.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js +0 -16
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js.map +0 -1
|
@@ -3,12 +3,16 @@ import ModelAPI from "../../Utils/ModelAPI/ModelAPI";
|
|
|
3
3
|
import Page from "./Page";
|
|
4
4
|
import BaseModel from "../../../Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel";
|
|
5
5
|
import Label from "../../../Models/DatabaseModels/Label";
|
|
6
|
-
import { PromiseVoidFunction } from "../../../Types/FunctionTypes";
|
|
7
6
|
import Link from "../../../Types/Link";
|
|
8
7
|
import ObjectID from "../../../Types/ObjectID";
|
|
9
8
|
import { JSONObject } from "../../../Types/JSON";
|
|
10
|
-
import React, {
|
|
11
|
-
|
|
9
|
+
import React, {
|
|
10
|
+
MutableRefObject,
|
|
11
|
+
ReactElement,
|
|
12
|
+
useEffect,
|
|
13
|
+
useRef,
|
|
14
|
+
useState,
|
|
15
|
+
} from "react";
|
|
12
16
|
import Select from "../../../Server/Types/Database/Select";
|
|
13
17
|
|
|
14
18
|
export interface ComponentProps<TBaseModel extends BaseModel> {
|
|
@@ -23,21 +27,57 @@ export interface ComponentProps<TBaseModel extends BaseModel> {
|
|
|
23
27
|
modelAPI?: typeof ModelAPI | undefined;
|
|
24
28
|
}
|
|
25
29
|
|
|
30
|
+
/*
|
|
31
|
+
* What the header shows for one model: its title, its labels, or why it could
|
|
32
|
+
* not be read. Stamped with the id it was read for, so it can never be shown
|
|
33
|
+
* for a different model.
|
|
34
|
+
*/
|
|
35
|
+
interface LoadedModelHeader {
|
|
36
|
+
modelId: string;
|
|
37
|
+
title: string | undefined;
|
|
38
|
+
labels: Array<Label>;
|
|
39
|
+
error: string;
|
|
40
|
+
}
|
|
41
|
+
|
|
26
42
|
const ModelPage: <TBaseModel extends BaseModel>(
|
|
27
43
|
props: ComponentProps<TBaseModel>,
|
|
28
44
|
) => ReactElement = <TBaseModel extends BaseModel>(
|
|
29
45
|
props: ComponentProps<TBaseModel>,
|
|
30
46
|
): ReactElement => {
|
|
31
|
-
|
|
47
|
+
/*
|
|
48
|
+
* Keyed on the id's string, not the ObjectID: layouts build a new ObjectID
|
|
49
|
+
* from the route params on every render.
|
|
50
|
+
*/
|
|
51
|
+
const modelIdString: string = props.modelId.toString();
|
|
52
|
+
|
|
53
|
+
const [loadedHeader, setLoadedHeader] = useState<LoadedModelHeader | null>(
|
|
54
|
+
null,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
* Bumped by every fetch, when the model changes and on unmount. A response
|
|
59
|
+
* only lands while no newer fetch has started, so a slow read of the model
|
|
60
|
+
* the reader already left can never put its title back on the page.
|
|
61
|
+
*/
|
|
62
|
+
const latestRequestRef: MutableRefObject<number> = useRef<number>(0);
|
|
63
|
+
|
|
64
|
+
type FetchItemFunction = (modelId: ObjectID) => Promise<void>;
|
|
32
65
|
|
|
33
|
-
const
|
|
34
|
-
|
|
66
|
+
const fetchItem: FetchItemFunction = async (
|
|
67
|
+
modelId: ObjectID,
|
|
68
|
+
): Promise<void> => {
|
|
69
|
+
const requestNumber: number = latestRequestRef.current + 1;
|
|
70
|
+
latestRequestRef.current = requestNumber;
|
|
35
71
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
72
|
+
const requestedModelId: string = modelId.toString();
|
|
73
|
+
|
|
74
|
+
let header: LoadedModelHeader = {
|
|
75
|
+
modelId: requestedModelId,
|
|
76
|
+
title: props.title,
|
|
77
|
+
labels: [],
|
|
78
|
+
error: "",
|
|
79
|
+
};
|
|
39
80
|
|
|
40
|
-
setError("");
|
|
41
81
|
try {
|
|
42
82
|
const modelInstance: TBaseModel = new props.modelType();
|
|
43
83
|
const labelsColumn: string | null =
|
|
@@ -59,66 +99,91 @@ const ModelPage: <TBaseModel extends BaseModel>(
|
|
|
59
99
|
|
|
60
100
|
const item: TBaseModel | null = await modelAPI.getItem({
|
|
61
101
|
modelType: props.modelType,
|
|
62
|
-
id:
|
|
102
|
+
id: modelId,
|
|
63
103
|
select: select as Select<TBaseModel>,
|
|
64
104
|
requestOptions: {},
|
|
65
105
|
});
|
|
66
106
|
|
|
67
107
|
if (!item) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (labelsColumn) {
|
|
80
|
-
const columnValue: Array<Label> | null = (
|
|
81
|
-
item as BaseModel
|
|
82
|
-
).getColumnValue(labelsColumn) as Array<Label> | null;
|
|
83
|
-
|
|
84
|
-
const loadedLabels: Array<Label> =
|
|
85
|
-
columnValue || ((item as any)[labelsColumn] as Array<Label>) || [];
|
|
86
|
-
setLabels(loadedLabels);
|
|
108
|
+
const singularName: string = (
|
|
109
|
+
modelInstance.singularName || "item"
|
|
110
|
+
).toLowerCase();
|
|
111
|
+
|
|
112
|
+
header = {
|
|
113
|
+
...header,
|
|
114
|
+
error: `Cannot load ${singularName}. It could be because you don't have enough permissions to read this ${singularName}.`,
|
|
115
|
+
};
|
|
87
116
|
} else {
|
|
88
|
-
|
|
117
|
+
let loadedLabels: Array<Label> = [];
|
|
118
|
+
|
|
119
|
+
if (labelsColumn) {
|
|
120
|
+
const columnValue: Array<Label> | null = (
|
|
121
|
+
item as BaseModel
|
|
122
|
+
).getColumnValue(labelsColumn) as Array<Label> | null;
|
|
123
|
+
|
|
124
|
+
loadedLabels =
|
|
125
|
+
columnValue || ((item as any)[labelsColumn] as Array<Label>) || [];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
header = {
|
|
129
|
+
...header,
|
|
130
|
+
labels: loadedLabels,
|
|
131
|
+
title: `${props.title || ""} - ${
|
|
132
|
+
(item as any)[props.modelNameField] as string
|
|
133
|
+
}`,
|
|
134
|
+
};
|
|
89
135
|
}
|
|
90
|
-
|
|
91
|
-
setTitle(
|
|
92
|
-
`${props.title || ""} - ${
|
|
93
|
-
(item as any)[props.modelNameField] as string
|
|
94
|
-
}`,
|
|
95
|
-
);
|
|
96
136
|
} catch (err) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
* otherwise the page shows its loader forever instead of the error.
|
|
103
|
-
*/
|
|
104
|
-
setIsLoading(false);
|
|
137
|
+
header = {
|
|
138
|
+
...header,
|
|
139
|
+
labels: [],
|
|
140
|
+
error: API.getFriendlyMessage(err),
|
|
141
|
+
};
|
|
105
142
|
}
|
|
106
|
-
};
|
|
107
143
|
|
|
108
|
-
|
|
144
|
+
// The reader moved to another model (or left) while this was in flight.
|
|
145
|
+
if (requestNumber !== latestRequestRef.current) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
setLoadedHeader(header);
|
|
150
|
+
};
|
|
109
151
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
fetchItem(props.modelId).catch((err: Error) => {
|
|
154
|
+
setLoadedHeader({
|
|
155
|
+
modelId: modelIdString,
|
|
156
|
+
title: props.title,
|
|
157
|
+
labels: [],
|
|
158
|
+
error: API.getFriendlyMessage(err),
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
return () => {
|
|
163
|
+
latestRequestRef.current++;
|
|
164
|
+
};
|
|
165
|
+
}, [modelIdString]);
|
|
166
|
+
|
|
167
|
+
/*
|
|
168
|
+
* Decided at render time, not in an effect: the very first render for a
|
|
169
|
+
* different model already shows the loader, so the children (which read the
|
|
170
|
+
* id from the route) are unmounted before they can render or fetch for the
|
|
171
|
+
* new model under the old one's header. Layouts keep ModelPage mounted when
|
|
172
|
+
* the reader follows a link to another record on the same route, so this is
|
|
173
|
+
* the only place that can notice.
|
|
174
|
+
*/
|
|
175
|
+
const isCurrentModelLoaded: boolean =
|
|
176
|
+
loadedHeader !== null && loadedHeader.modelId === modelIdString;
|
|
177
|
+
|
|
178
|
+
const labels: Array<Label> = isCurrentModelLoaded ? loadedHeader!.labels : [];
|
|
114
179
|
|
|
115
180
|
return (
|
|
116
181
|
<Page
|
|
117
182
|
{...props}
|
|
118
183
|
labels={labels.length > 0 ? labels : undefined}
|
|
119
|
-
isLoading={
|
|
120
|
-
error={error}
|
|
121
|
-
title={title}
|
|
184
|
+
isLoading={!isCurrentModelLoaded}
|
|
185
|
+
error={isCurrentModelLoaded ? loadedHeader!.error : ""}
|
|
186
|
+
title={isCurrentModelLoaded ? loadedHeader!.title : props.title}
|
|
122
187
|
/>
|
|
123
188
|
);
|
|
124
189
|
};
|
|
@@ -43,6 +43,10 @@ export interface ComponentProps<T extends GenericObject> {
|
|
|
43
43
|
* bound and pagination switches to a prev/next-only UI.
|
|
44
44
|
*/
|
|
45
45
|
hasMore?: boolean | undefined;
|
|
46
|
+
/** Page sizes offered by the shared ModelTable-style footer. */
|
|
47
|
+
itemsOnPageOptions?: Array<number> | undefined;
|
|
48
|
+
/** Optional stable id for consumers that need to target this footer. */
|
|
49
|
+
paginationDataTestId?: string | undefined;
|
|
46
50
|
itemsOnPage: number;
|
|
47
51
|
error: string;
|
|
48
52
|
isLoading: boolean;
|
|
@@ -496,9 +500,13 @@ const Table: TableFunction = <T extends GenericObject>(
|
|
|
496
500
|
hasMore={props.hasMore}
|
|
497
501
|
itemsOnCurrentPage={props.data.length}
|
|
498
502
|
itemsOnPage={props.itemsOnPage}
|
|
503
|
+
itemsOnPageOptions={props.itemsOnPageOptions}
|
|
499
504
|
onNavigateToPage={props.onNavigateToPage}
|
|
500
505
|
isLoading={props.isLoading}
|
|
501
506
|
isError={Boolean(props.error)}
|
|
507
|
+
{...(props.paginationDataTestId
|
|
508
|
+
? { dataTestId: props.paginationDataTestId }
|
|
509
|
+
: {})}
|
|
502
510
|
/>
|
|
503
511
|
)}
|
|
504
512
|
</div>
|
|
@@ -193,8 +193,13 @@ const TableRow: TableRowFunction = <T extends GenericObject>(
|
|
|
193
193
|
<div className="space-y-3">
|
|
194
194
|
{renderedColumns.map((column: Column<T>, i: number) => {
|
|
195
195
|
if (column.type === FieldType.Actions) {
|
|
196
|
+
const customAction: ReactElement | null = column.getElement
|
|
197
|
+
? column.getElement(props.item)
|
|
198
|
+
: null;
|
|
199
|
+
|
|
196
200
|
return (
|
|
197
201
|
<div key={i} className="flex flex-wrap gap-2">
|
|
202
|
+
{customAction}
|
|
198
203
|
{error && (
|
|
199
204
|
<ConfirmModal
|
|
200
205
|
title={`Error`}
|
|
@@ -513,13 +518,16 @@ const TableRow: TableRowFunction = <T extends GenericObject>(
|
|
|
513
518
|
}
|
|
514
519
|
}}
|
|
515
520
|
>
|
|
516
|
-
{
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
+
{column.type !== FieldType.Actions &&
|
|
522
|
+
columnContent !== null &&
|
|
523
|
+
columnContent !== undefined && (
|
|
524
|
+
<div className={contentWrapperClassName}>
|
|
525
|
+
{columnContent}
|
|
526
|
+
</div>
|
|
527
|
+
)}
|
|
521
528
|
{column.type === FieldType.Actions && (
|
|
522
529
|
<div className={actionsContainerClassName}>
|
|
530
|
+
{columnContent}
|
|
523
531
|
{error && (
|
|
524
532
|
<div className="text-align-left">
|
|
525
533
|
<ConfirmModal
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { FacetData } from "./types";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* Which facet sections a telemetry sidebar (Logs, Traces, Metrics,
|
|
5
|
+
* Exceptions) renders, and which it folds into the "N empty filters hidden"
|
|
6
|
+
* footer instead.
|
|
7
|
+
*
|
|
8
|
+
* Only resource facets (Host, Docker Host, Kubernetes Cluster, ...) may be
|
|
9
|
+
* folded away. The server answers every resource facet with the project's
|
|
10
|
+
* full Postgres list — count 0 for a resource with no telemetry in range — so
|
|
11
|
+
* an empty list means the project has no resource of that type at all (or a
|
|
12
|
+
* facet search matched nothing). Service, severity, status and friends are
|
|
13
|
+
* never hidden: an empty list there is a real answer about the time range.
|
|
14
|
+
*
|
|
15
|
+
* Kept free of React so every rule below is unit-testable as a truth table.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
export interface FacetVisibilityOptions {
|
|
19
|
+
// Facet keys in the order the sidebar lists them.
|
|
20
|
+
keys: ReadonlyArray<string>;
|
|
21
|
+
facetData: FacetData;
|
|
22
|
+
// Whether the facet may be folded away while it has nothing to show.
|
|
23
|
+
isHideable: (facetKey: string) => boolean;
|
|
24
|
+
activeValuesByKey: Readonly<Record<string, Set<string> | undefined>>;
|
|
25
|
+
/*
|
|
26
|
+
* Facets with a search in progress, or whose on-screen values answer a
|
|
27
|
+
* search. Never folded away: the section is what the user is typing in.
|
|
28
|
+
*/
|
|
29
|
+
searchExemptKeys: ReadonlySet<string>;
|
|
30
|
+
// The footer's "Show" toggle: render hidden facets in their usual place.
|
|
31
|
+
showHidden: boolean;
|
|
32
|
+
// Section title per key, for the footer's tooltip. Defaults to the key.
|
|
33
|
+
getTitle?: ((facetKey: string) => string) | undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface FacetVisibility {
|
|
37
|
+
// Keys to render, in the order they were given.
|
|
38
|
+
visibleKeys: Array<string>;
|
|
39
|
+
/*
|
|
40
|
+
* Hideable keys with nothing to show, in order. Still listed while
|
|
41
|
+
* showHidden reveals them, so the footer keeps its count.
|
|
42
|
+
*/
|
|
43
|
+
hiddenKeys: Array<string>;
|
|
44
|
+
// Titles of hiddenKeys, same order.
|
|
45
|
+
hiddenTitles: Array<string>;
|
|
46
|
+
hiddenCount: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const DEFAULT_FACET_EMPTY_STATE_TEXT: string =
|
|
50
|
+
"No values in this time range";
|
|
51
|
+
|
|
52
|
+
const hasActiveValues: (activeValues: Set<string> | undefined) => boolean = (
|
|
53
|
+
activeValues: Set<string> | undefined,
|
|
54
|
+
): boolean => {
|
|
55
|
+
return Boolean(activeValues && activeValues.size > 0);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export const computeFacetVisibility: (
|
|
59
|
+
options: FacetVisibilityOptions,
|
|
60
|
+
) => FacetVisibility = (options: FacetVisibilityOptions): FacetVisibility => {
|
|
61
|
+
const visibleKeys: Array<string> = [];
|
|
62
|
+
const hiddenKeys: Array<string> = [];
|
|
63
|
+
|
|
64
|
+
for (const key of options.keys) {
|
|
65
|
+
if (!options.isHideable(key)) {
|
|
66
|
+
visibleKeys.push(key);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const isInUse: boolean =
|
|
71
|
+
hasActiveValues(options.activeValuesByKey[key]) ||
|
|
72
|
+
options.searchExemptKeys.has(key);
|
|
73
|
+
|
|
74
|
+
const values: FacetData[string] | undefined = options.facetData[key];
|
|
75
|
+
|
|
76
|
+
if (values === undefined) {
|
|
77
|
+
/*
|
|
78
|
+
* Not loaded yet (or not returned). Rendering it would flash a dozen
|
|
79
|
+
* empty resource sections — and a bogus "12 hidden" count — on every
|
|
80
|
+
* first load, so it is neither shown nor counted. The exception is a
|
|
81
|
+
* facet the user is working with: a selection or a search box must not
|
|
82
|
+
* vanish because a refetch failed.
|
|
83
|
+
*/
|
|
84
|
+
if (isInUse) {
|
|
85
|
+
visibleKeys.push(key);
|
|
86
|
+
}
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (values.length > 0 || isInUse) {
|
|
91
|
+
visibleKeys.push(key);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
hiddenKeys.push(key);
|
|
96
|
+
|
|
97
|
+
if (options.showHidden) {
|
|
98
|
+
visibleKeys.push(key);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const getTitle: (facetKey: string) => string =
|
|
103
|
+
options.getTitle ||
|
|
104
|
+
((facetKey: string): string => {
|
|
105
|
+
return facetKey;
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
visibleKeys: visibleKeys,
|
|
110
|
+
hiddenKeys: hiddenKeys,
|
|
111
|
+
hiddenTitles: hiddenKeys.map((key: string): string => {
|
|
112
|
+
return getTitle(key);
|
|
113
|
+
}),
|
|
114
|
+
hiddenCount: hiddenKeys.length,
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// Keeps only entries with non-blank text, trimmed.
|
|
119
|
+
export const getNonEmptySearchTextByKey: (
|
|
120
|
+
searchTextByKey: Readonly<Record<string, string | undefined>>,
|
|
121
|
+
) => Record<string, string> = (
|
|
122
|
+
searchTextByKey: Readonly<Record<string, string | undefined>>,
|
|
123
|
+
): Record<string, string> => {
|
|
124
|
+
const result: Record<string, string> = {};
|
|
125
|
+
|
|
126
|
+
for (const [key, text] of Object.entries(searchTextByKey)) {
|
|
127
|
+
const trimmed: string = (text || "").trim();
|
|
128
|
+
if (trimmed) {
|
|
129
|
+
result[key] = trimmed;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return result;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
/*
|
|
137
|
+
* Facets a sidebar must keep on screen because of search:
|
|
138
|
+
* - the box currently holds text (typing, or waiting on the debounce), or
|
|
139
|
+
* - the values on screen answer a search — the text last sent to the
|
|
140
|
+
* server was non-empty when this facetData arrived. Clearing the box
|
|
141
|
+
* leaves that stale, empty answer in place until the refetch lands, and
|
|
142
|
+
* the section must not blink out and back in meanwhile.
|
|
143
|
+
*/
|
|
144
|
+
export const getFacetSearchExemptKeys: (
|
|
145
|
+
searchTextByKey: Readonly<Record<string, string | undefined>>,
|
|
146
|
+
searchedAtArrivalByKey: Readonly<Record<string, string | undefined>>,
|
|
147
|
+
) => Set<string> = (
|
|
148
|
+
searchTextByKey: Readonly<Record<string, string | undefined>>,
|
|
149
|
+
searchedAtArrivalByKey: Readonly<Record<string, string | undefined>>,
|
|
150
|
+
): Set<string> => {
|
|
151
|
+
return new Set<string>([
|
|
152
|
+
...Object.keys(getNonEmptySearchTextByKey(searchTextByKey)),
|
|
153
|
+
...Object.keys(getNonEmptySearchTextByKey(searchedAtArrivalByKey)),
|
|
154
|
+
]);
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// "1 empty filter", "3 empty filters".
|
|
158
|
+
export const formatEmptyFacetCount: (count: number) => string = (
|
|
159
|
+
count: number,
|
|
160
|
+
): string => {
|
|
161
|
+
return `${count} empty ${count === 1 ? "filter" : "filters"}`;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
// "1 empty filter hidden", "3 empty filters hidden".
|
|
165
|
+
export const formatHiddenFacetCount: (hiddenCount: number) => string = (
|
|
166
|
+
hiddenCount: number,
|
|
167
|
+
): string => {
|
|
168
|
+
return `${formatEmptyFacetCount(hiddenCount)} hidden`;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
export const getFacetNoMatchesText: (searchText: string) => string = (
|
|
172
|
+
searchText: string,
|
|
173
|
+
): string => {
|
|
174
|
+
return `No matches for “${searchText.trim()}”`;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
// Empty state of a resource facet: the project has none of that resource.
|
|
178
|
+
export const getHiddenFacetEmptyStateText: (
|
|
179
|
+
pluralNoun: string | undefined,
|
|
180
|
+
) => string = (pluralNoun: string | undefined): string => {
|
|
181
|
+
const noun: string = (pluralNoun || "").trim();
|
|
182
|
+
return noun ? `No ${noun} in this project` : "No values in this project";
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export interface FacetEmptyStateTextOptions {
|
|
186
|
+
// The section's search text right now.
|
|
187
|
+
searchText: string;
|
|
188
|
+
// The sidebar's text for this facet; defaults to the time-range wording.
|
|
189
|
+
emptyStateText?: string | undefined;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export const getFacetEmptyStateText: (
|
|
193
|
+
options: FacetEmptyStateTextOptions,
|
|
194
|
+
) => string = (options: FacetEmptyStateTextOptions): string => {
|
|
195
|
+
if (options.searchText.trim()) {
|
|
196
|
+
return getFacetNoMatchesText(options.searchText);
|
|
197
|
+
}
|
|
198
|
+
return options.emptyStateText || DEFAULT_FACET_EMPTY_STATE_TEXT;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
export interface SidebarFacetEmptyStateOptions {
|
|
202
|
+
isHideable: boolean;
|
|
203
|
+
// Plural noun for a hideable facet ("Docker Hosts").
|
|
204
|
+
emptyStateNoun?: string | undefined;
|
|
205
|
+
/*
|
|
206
|
+
* Search text the on-screen values answer, if any (see
|
|
207
|
+
* getFacetSearchExemptKeys). While it is set the list is a search result,
|
|
208
|
+
* even though the box has since been cleared.
|
|
209
|
+
*/
|
|
210
|
+
searchedAtArrivalText?: string | undefined;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/*
|
|
214
|
+
* The empty-state line a sidebar hands a section for when its box is empty.
|
|
215
|
+
* Undefined means "use the section's default".
|
|
216
|
+
*/
|
|
217
|
+
export const getSidebarFacetEmptyStateText: (
|
|
218
|
+
options: SidebarFacetEmptyStateOptions,
|
|
219
|
+
) => string | undefined = (
|
|
220
|
+
options: SidebarFacetEmptyStateOptions,
|
|
221
|
+
): string | undefined => {
|
|
222
|
+
if (options.searchedAtArrivalText && options.searchedAtArrivalText.trim()) {
|
|
223
|
+
return getFacetNoMatchesText(options.searchedAtArrivalText);
|
|
224
|
+
}
|
|
225
|
+
if (options.isHideable) {
|
|
226
|
+
return getHiddenFacetEmptyStateText(options.emptyStateNoun);
|
|
227
|
+
}
|
|
228
|
+
return undefined;
|
|
229
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {
|
|
2
|
+
RESOURCE_FACET_CATALOG,
|
|
3
|
+
ResourceFacetDefinition,
|
|
4
|
+
} from "../../../Types/Telemetry/ResourceFacetCatalog";
|
|
5
|
+
import { FacetConfig } from "./types";
|
|
6
|
+
|
|
7
|
+
export interface BuildResourceFacetConfigsOptions {
|
|
8
|
+
/*
|
|
9
|
+
* Priority of the first resource facet. The rest follow in catalog order
|
|
10
|
+
* at 0.01 steps, so every resource facet sorts between `basePriority` and
|
|
11
|
+
* the next whole number the viewer uses for its own facets.
|
|
12
|
+
*/
|
|
13
|
+
basePriority: number;
|
|
14
|
+
/*
|
|
15
|
+
* Names the viewer already loaded, per facet key. Facets without a map
|
|
16
|
+
* still render names: the server resolves resource facet values against
|
|
17
|
+
* Postgres and returns a displayName with each value.
|
|
18
|
+
*/
|
|
19
|
+
valueDisplayMaps?:
|
|
20
|
+
| Partial<Record<string, Record<string, string> | undefined>>
|
|
21
|
+
| undefined;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* One FacetConfig per catalog resource type — searchable against the
|
|
26
|
+
* server, iconed, and folded away while empty so a project without, say,
|
|
27
|
+
* Podman hosts does not show a "Podman Host" section with nothing in it.
|
|
28
|
+
*/
|
|
29
|
+
export function buildResourceFacetConfigs(
|
|
30
|
+
options: BuildResourceFacetConfigsOptions,
|
|
31
|
+
): Array<FacetConfig> {
|
|
32
|
+
return RESOURCE_FACET_CATALOG.map(
|
|
33
|
+
(definition: ResourceFacetDefinition, index: number): FacetConfig => {
|
|
34
|
+
return {
|
|
35
|
+
key: definition.facetKey,
|
|
36
|
+
title: definition.label,
|
|
37
|
+
icon: definition.icon,
|
|
38
|
+
priority: options.basePriority + index * 0.01,
|
|
39
|
+
serverSearchable: true,
|
|
40
|
+
hideWhenEmpty: true,
|
|
41
|
+
emptyStateNoun: definition.pluralLabel,
|
|
42
|
+
valueDisplayMap: options.valueDisplayMaps?.[definition.facetKey],
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
);
|
|
46
|
+
}
|
|
@@ -15,6 +15,8 @@ import TelemetrySearchBar, {
|
|
|
15
15
|
} from "./components/TelemetrySearchBar";
|
|
16
16
|
import TelemetryFacetSidebar from "./components/TelemetryFacetSidebar";
|
|
17
17
|
import TelemetryActiveFilterChips from "./components/TelemetryActiveFilterChips";
|
|
18
|
+
import { LockedFilterActionOptions } from "./components/LockedFilterActions";
|
|
19
|
+
import { TelemetrySignal } from "../../../Utils/Telemetry/LockedFilterSearch";
|
|
18
20
|
import TelemetryHistogram from "./components/TelemetryHistogram";
|
|
19
21
|
import TelemetryPagination from "./components/TelemetryPagination";
|
|
20
22
|
import ComponentLoader from "../ComponentLoader/ComponentLoader";
|
|
@@ -90,6 +92,13 @@ export interface TelemetryViewerProps<T> {
|
|
|
90
92
|
activeFilters?: Array<ActiveFilter> | undefined;
|
|
91
93
|
onRemoveFilter?: ((facetKey: string, value: string) => void) | undefined;
|
|
92
94
|
onClearAllFilters?: (() => void) | undefined;
|
|
95
|
+
/*
|
|
96
|
+
* Which explorer this is (names the explorer in the locked chips' tooltips
|
|
97
|
+
* and actions) and how the host reproduces its locked scope on that
|
|
98
|
+
* explorer — see LockedFilterActions. Both forwarded to the chip list.
|
|
99
|
+
*/
|
|
100
|
+
lockedFilterSignal?: TelemetrySignal | undefined;
|
|
101
|
+
lockedFilterActions?: LockedFilterActionOptions | undefined;
|
|
93
102
|
|
|
94
103
|
// -- Histogram --
|
|
95
104
|
showHistogram?: boolean;
|
|
@@ -230,6 +239,8 @@ function TelemetryViewerInner<T>(props: TelemetryViewerProps<T>): ReactElement {
|
|
|
230
239
|
onClearAll={() => {
|
|
231
240
|
props.onClearAllFilters?.();
|
|
232
241
|
}}
|
|
242
|
+
signal={props.lockedFilterSignal}
|
|
243
|
+
lockedFilterActions={props.lockedFilterActions}
|
|
233
244
|
/>
|
|
234
245
|
)}
|
|
235
246
|
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import React, { FunctionComponent, ReactElement, useRef } from "react";
|
|
2
|
+
import Icon from "../../Icon/Icon";
|
|
3
|
+
import IconProp from "../../../../Types/Icon/IconProp";
|
|
4
|
+
|
|
5
|
+
export interface FacetSearchInputProps {
|
|
6
|
+
// Facet title; names the box ("Search Host") and fills the placeholder.
|
|
7
|
+
title: string;
|
|
8
|
+
value: string;
|
|
9
|
+
onChange: (searchText: string) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* A facet section's search box: leading magnifying glass, a clear button once
|
|
14
|
+
* there is text, and Escape to clear. Shared by the Logs and Telemetry facet
|
|
15
|
+
* sections so the two sidebars cannot drift apart.
|
|
16
|
+
*/
|
|
17
|
+
const FacetSearchInput: FunctionComponent<FacetSearchInputProps> = (
|
|
18
|
+
props: FacetSearchInputProps,
|
|
19
|
+
): ReactElement => {
|
|
20
|
+
const inputRef: React.RefObject<HTMLInputElement> =
|
|
21
|
+
useRef<HTMLInputElement>(null);
|
|
22
|
+
|
|
23
|
+
const hasText: boolean = props.value.length > 0;
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<div className="relative">
|
|
27
|
+
<div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-2">
|
|
28
|
+
<Icon
|
|
29
|
+
icon={IconProp.MagnifyingGlass}
|
|
30
|
+
className="h-3 w-3 text-gray-400"
|
|
31
|
+
/>
|
|
32
|
+
</div>
|
|
33
|
+
<input
|
|
34
|
+
ref={inputRef}
|
|
35
|
+
type="text"
|
|
36
|
+
/*
|
|
37
|
+
* A placeholder disappears as soon as the user types, taking the
|
|
38
|
+
* field's only description with it; the aria-label stays.
|
|
39
|
+
*/
|
|
40
|
+
aria-label={`Search ${props.title}`}
|
|
41
|
+
placeholder={`Search ${props.title.toLowerCase()}...`}
|
|
42
|
+
value={props.value}
|
|
43
|
+
onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
44
|
+
props.onChange(event.target.value);
|
|
45
|
+
}}
|
|
46
|
+
onKeyDown={(event: React.KeyboardEvent<HTMLInputElement>) => {
|
|
47
|
+
/*
|
|
48
|
+
* Escape clears a non-empty box and stops there. An empty box lets
|
|
49
|
+
* the key through, so viewer-level Escape handling still works.
|
|
50
|
+
*/
|
|
51
|
+
if (event.key === "Escape" && hasText) {
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
event.stopPropagation();
|
|
54
|
+
props.onChange("");
|
|
55
|
+
}
|
|
56
|
+
}}
|
|
57
|
+
className={`w-full rounded border border-gray-200 bg-gray-50 py-1 pl-6 text-[11px] text-gray-700 placeholder-gray-400 outline-none transition-colors focus:border-indigo-300 focus:bg-white focus:ring-1 focus:ring-indigo-200 ${
|
|
58
|
+
hasText ? "pr-6" : "pr-2"
|
|
59
|
+
}`}
|
|
60
|
+
/>
|
|
61
|
+
{hasText && (
|
|
62
|
+
<button
|
|
63
|
+
type="button"
|
|
64
|
+
aria-label="Clear search"
|
|
65
|
+
title="Clear search"
|
|
66
|
+
className="absolute inset-y-0 right-0 flex items-center rounded pr-1.5 pl-1 text-gray-400 transition-colors hover:text-gray-600"
|
|
67
|
+
onClick={() => {
|
|
68
|
+
props.onChange("");
|
|
69
|
+
inputRef.current?.focus();
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
72
|
+
<Icon icon={IconProp.XMark} className="h-3 w-3" />
|
|
73
|
+
</button>
|
|
74
|
+
)}
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export default FacetSearchInput;
|