@oneuptime/common 14.0.8 → 14.0.9
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 +2 -0
- package/Models/DatabaseModels/KubernetesAiAgent.ts +364 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +3 -3
- package/Models/DatabaseModels/Project.ts +55 -5
- package/Models/DatabaseModels/ProxmoxResource.ts +49 -1
- package/Models/DatabaseModels/RunnerJob.ts +75 -0
- package/Models/DatabaseModels/TeamComplianceSetting.ts +143 -2
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +17 -0
- package/Server/API/AIChatAPI.ts +6 -3
- package/Server/API/AIInvestigationAPI.ts +17 -10
- package/Server/API/AutoRemediationAPI.ts +207 -25
- package/Server/API/KubernetesClusterAiAccessAPI.ts +623 -21
- package/Server/API/MicrosoftTeamsAPI.ts +93 -14
- package/Server/API/ProxmoxResourceAPI.ts +244 -14
- package/Server/Infrastructure/GlobalCache.ts +32 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.ts +137 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.ts +42 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/TelemetryIngest.ts +41 -18
- package/Server/Services/AIService.ts +70 -1
- package/Server/Services/AlertService.ts +352 -11
- package/Server/Services/AlertSeverityService.ts +65 -15
- package/Server/Services/AutoRemediationRuleService.ts +1 -1
- package/Server/Services/IncidentService.ts +280 -104
- package/Server/Services/IncidentSeverityService.ts +66 -15
- package/Server/Services/KubernetesAiAgentJobService.ts +185 -0
- package/Server/Services/KubernetesAiAgentService.ts +1634 -0
- package/Server/Services/KubernetesClusterAiAccessService.ts +1118 -451
- package/Server/Services/KubernetesClusterService.ts +129 -21
- package/Server/Services/ProjectService.ts +32 -0
- package/Server/Services/ProxmoxResourceService.ts +322 -5
- package/Server/Services/RunnerJobService.ts +241 -104
- package/Server/Services/RunnerService.ts +1 -1
- package/Server/Services/ScheduledMaintenanceService.ts +737 -1
- package/Server/Services/ScheduledMaintenanceStateTimelineService.ts +414 -56
- package/Server/Services/TeamComplianceSettingService.ts +1125 -9
- package/Server/Utils/AI/ClusterAccess/ClusterAccessContext.ts +67 -9
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +39 -10
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +14 -3
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +37 -15
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +67 -24
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +48 -5
- package/Server/Utils/AI/SRE/IncidentPostmortemRunner.ts +40 -8
- package/Server/Utils/AI/SRE/InvestigationEligibility.ts +13 -2
- package/Server/Utils/AI/SRE/InvestigationGrader.ts +1 -1
- package/Server/Utils/AutoRemediation/CommandPlanExecutor.ts +6 -1
- package/Server/Utils/Telemetry/InventoryEntityRegistry.ts +133 -7
- package/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.ts +58 -4
- package/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.ts +447 -0
- package/Server/Utils/Telemetry/ProxmoxNativePush.ts +903 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +87 -27
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +684 -47
- package/Tests/App/AdminDashboard/RowActionPlacementOverrides.test.tsx +278 -0
- package/Tests/App/Dashboard/AIChatChartWidgetZoom.test.tsx +738 -0
- package/Tests/App/Dashboard/AIFeaturesSettingsPointers.test.tsx +147 -0
- package/Tests/App/Dashboard/AIInsightsKubernetesClusterPage.test.tsx +1523 -0
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +463 -3
- package/Tests/App/Dashboard/AffectedResourcesPickerDropdownPlacement.test.tsx +958 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerFocusLeave.test.tsx +595 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +20 -3
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +8 -3
- package/Tests/App/Dashboard/CephRateChartReload.test.tsx +1456 -0
- package/Tests/App/Dashboard/CephTimeRangeZoom.test.tsx +1229 -0
- package/Tests/App/Dashboard/ChartCardTimeRangeZoom.test.tsx +151 -0
- package/Tests/App/Dashboard/ChartCardZoomAffordances.test.tsx +257 -0
- package/Tests/App/Dashboard/ChartRefetchFrame.test.tsx +141 -0
- package/Tests/App/Dashboard/ChartZoomHarness.tsx +249 -0
- package/Tests/App/Dashboard/ChartZoomStandIn.tsx +131 -0
- package/Tests/App/Dashboard/CloudServerlessSlowLoads.test.tsx +628 -0
- package/Tests/App/Dashboard/CloudServerlessTimeRangeZoom.test.tsx +607 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +91 -19
- package/Tests/App/Dashboard/CompanionMetricsTabZoom.test.tsx +632 -0
- package/Tests/App/Dashboard/ContainerChartZoomStandIn.tsx +195 -0
- package/Tests/App/Dashboard/ContainerHostOverviewSlowLoads.test.tsx +542 -0
- package/Tests/App/Dashboard/ContainerHostOverviewTimeRangeZoom.test.tsx +848 -0
- package/Tests/App/Dashboard/ContainerMetricsTimeRangeZoom.test.tsx +561 -0
- package/Tests/App/Dashboard/DashboardBoardWideZoomShell.test.tsx +1147 -0
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +3 -2
- package/Tests/App/Dashboard/DashboardHistogramWidgetDragCursor.test.tsx +399 -0
- package/Tests/App/Dashboard/DashboardHistogramWidgetZoom.test.tsx +985 -0
- package/Tests/App/Dashboard/DashboardHistogramWidgetZoomHint.test.tsx +803 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +1 -0
- package/Tests/App/Dashboard/DashboardSettingsPreviewZoom.test.tsx +679 -0
- package/Tests/App/Dashboard/DashboardSloAndDataSourceChartZoom.test.tsx +881 -0
- package/Tests/App/Dashboard/DashboardTraceStatusWidgets.test.tsx +878 -0
- package/Tests/App/Dashboard/DatabaseMetricChartModalTimeRangeZoom.test.tsx +442 -0
- package/Tests/App/Dashboard/DatabaseOverviewTimeRangeZoom.test.tsx +831 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +43 -0
- package/Tests/App/Dashboard/DockerSwarmInsightsTimeRangeZoom.test.tsx +524 -0
- package/Tests/App/Dashboard/DockerSwarmRateChartRefresh.test.tsx +259 -0
- package/Tests/App/Dashboard/EdgeDetailPanelHistory.test.tsx +763 -0
- package/Tests/App/Dashboard/EdgeDetailPanelTimeRangeZoom.test.tsx +547 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsCases.tsx +565 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsKathmandu.test.tsx +73 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsKolkata.test.tsx +74 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsNewYork.test.tsx +72 -0
- package/Tests/App/Dashboard/EdgeHistoryBucketsUtc.test.tsx +72 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardRefresh.test.tsx +310 -0
- package/Tests/App/Dashboard/EmbeddedMetricCardTimeRangeZoom.test.tsx +536 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +3 -1
- package/Tests/App/Dashboard/EscalationRuleRowActions.test.tsx +660 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +2 -2
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +587 -13
- package/Tests/App/Dashboard/EventOverviewSnapshotExplorerZoom.test.tsx +1139 -0
- package/Tests/App/Dashboard/EventOverviewSnapshotZoomAcrossTabs.test.tsx +1057 -0
- package/Tests/App/Dashboard/EventOverviewTelemetrySnapshotZoom.test.tsx +757 -0
- package/Tests/App/Dashboard/ExceptionOccurrenceTrendZoom.test.tsx +675 -0
- package/Tests/App/Dashboard/ExceptionOccurrencesZoomSurvivesViewSwitch.test.tsx +405 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +67 -3
- package/Tests/App/Dashboard/ExceptionTablesSpanStatus.test.tsx +515 -0
- package/Tests/App/Dashboard/ExplorerOwnZoomRegression.test.tsx +739 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisCases.tsx +461 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisKathmandu.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisKolkata.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisNewYork.test.tsx +25 -0
- package/Tests/App/Dashboard/FlowBandwidthAxisUtc.test.tsx +24 -0
- package/Tests/App/Dashboard/FlowTopTalkersZoomRefetch.test.tsx +722 -0
- package/Tests/App/Dashboard/FlowViewportGuard.test.tsx +2526 -0
- package/Tests/App/Dashboard/HostPagesSlowLoads.test.tsx +872 -0
- package/Tests/App/Dashboard/HostPagesTimeRangeZoom.test.tsx +1208 -0
- package/Tests/App/Dashboard/IncidentRootCauseTimeRangeZoom.test.tsx +358 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +100 -9
- package/Tests/App/Dashboard/InfrastructureMetricsTabTimeRangeZoom.test.tsx +485 -0
- package/Tests/App/Dashboard/InvestigationDrawerCompanionZoom.test.tsx +655 -0
- package/Tests/App/Dashboard/InvestigationDrawerZoom.test.tsx +830 -0
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +338 -2
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +454 -16
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +799 -819
- package/Tests/App/Dashboard/KubernetesClusterAiAgentOverviewCard.test.tsx +367 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAgentStatus.test.ts +1202 -0
- package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +106 -0
- package/Tests/App/Dashboard/KubernetesClusterAiNavigation.test.tsx +354 -0
- package/Tests/App/Dashboard/KubernetesClusterAiPage.test.tsx +1884 -2054
- package/Tests/App/Dashboard/KubernetesClusterAiPageServerParity.test.ts +478 -179
- package/Tests/App/Dashboard/KubernetesClusterMetricTooltips.test.ts +50 -0
- package/Tests/App/Dashboard/KubernetesClusterOverviewTooltips.test.tsx +2 -1
- package/Tests/App/Dashboard/KubernetesClusterOverviewZoom.test.tsx +1217 -0
- package/Tests/App/Dashboard/KubernetesClusterPagesZoom.test.tsx +731 -0
- package/Tests/App/Dashboard/KubernetesCostsLoadRecovery.test.tsx +869 -0
- package/Tests/App/Dashboard/KubernetesCostsZoom.test.tsx +1214 -0
- package/Tests/App/Dashboard/KubernetesCostsZoomExactHours.test.tsx +692 -0
- package/Tests/App/Dashboard/KubernetesNetworkThroughputReload.test.tsx +902 -0
- package/Tests/App/Dashboard/KubernetesNetworkZoomBucketEdges.test.tsx +571 -0
- package/Tests/App/Dashboard/KubernetesOverviewZoomBucketEdges.test.tsx +697 -0
- package/Tests/App/Dashboard/KubernetesResourceMetricsTabZoom.test.tsx +633 -0
- package/Tests/App/Dashboard/LogsExplorerTimeRangeZoom.test.tsx +470 -0
- package/Tests/App/Dashboard/LogsInsightsTimeRangeZoom.test.tsx +948 -0
- package/Tests/App/Dashboard/LogsViewerPinnedWindowZoom.test.tsx +486 -0
- package/Tests/App/Dashboard/MetricChartsBucketInspectorDoubleClick.test.tsx +1001 -0
- package/Tests/App/Dashboard/MetricExplorerInvestigationAutoRefresh.test.tsx +514 -0
- package/Tests/App/Dashboard/MetricExplorerSavedViewZoomRoundTrip.test.tsx +581 -0
- package/Tests/App/Dashboard/MetricExplorerTimeRangeZoom.test.tsx +1162 -0
- package/Tests/App/Dashboard/MetricMonitorPreviewZoomLabel.test.ts +72 -0
- package/Tests/App/Dashboard/MetricRowSparklineTimeRangeZoom.test.tsx +204 -0
- package/Tests/App/Dashboard/MetricViewFirstResultLands.test.tsx +408 -0
- package/Tests/App/Dashboard/MetricViewOwnZoomResetPlacement.test.tsx +952 -0
- package/Tests/App/Dashboard/MetricViewTimeRange.test.ts +139 -0
- package/Tests/App/Dashboard/MetricViewTimeRangeZoom.test.tsx +556 -0
- package/Tests/App/Dashboard/MonitorMetricsChartWrappersZoom.test.tsx +552 -0
- package/Tests/App/Dashboard/MonitorMetricsTabsTimeRangeZoom.test.tsx +740 -0
- package/Tests/App/Dashboard/MonitorOverviewChartsTimeRangeZoom.test.tsx +735 -0
- package/Tests/App/Dashboard/MonitorStepPreviewsTimeRangeZoom.test.tsx +835 -0
- package/Tests/App/Dashboard/NetworkDeviceTimeRangeZoom.test.tsx +1115 -0
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +186 -17
- package/Tests/App/Dashboard/OnCallRulesDeleteGuard.test.tsx +155 -46
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +87 -2
- package/Tests/App/Dashboard/ProjectAISettingsPages.test.tsx +884 -0
- package/Tests/App/Dashboard/ProxmoxNodeRemove.test.tsx +621 -0
- package/Tests/App/Dashboard/ProxmoxOverviewSlowLoads.test.tsx +584 -0
- package/Tests/App/Dashboard/ProxmoxPagesTimeRangeZoom.test.tsx +823 -0
- package/Tests/App/Dashboard/ProxmoxRateChartReload.test.tsx +1253 -0
- package/Tests/App/Dashboard/PublicDashboardBoardWideZoom.test.tsx +605 -0
- package/Tests/App/Dashboard/RealRowsLineChart.tsx +250 -0
- package/Tests/App/Dashboard/RechartsHostsPlotCursor.test.tsx +513 -0
- package/Tests/App/Dashboard/RowActionPlacementOverrides.test.tsx +865 -0
- package/Tests/App/Dashboard/RumOverviewTimeRangeZoom.test.tsx +877 -0
- package/Tests/App/Dashboard/RunnerKubernetesAgentForm.test.tsx +20 -4
- package/Tests/App/Dashboard/RunnerSupersededByAiAgentNote.test.tsx +296 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +146 -36
- package/Tests/App/Dashboard/ServiceDatabaseSlowLoads.test.tsx +1166 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +1243 -104
- package/Tests/App/Dashboard/ServiceOverviewTimeRangeZoom.test.tsx +792 -0
- package/Tests/App/Dashboard/SloBudgetBurnDownZoom.test.tsx +771 -0
- package/Tests/App/Dashboard/SloBudgetBurnDownZoomAffordances.test.tsx +380 -0
- package/Tests/App/Dashboard/SloEventMetricsBarChartZoom.test.tsx +369 -0
- package/Tests/App/Dashboard/SloHistoryChartsTimeRangeZoom.test.tsx +694 -0
- package/Tests/App/Dashboard/SloHistoryChartsZoomAffordances.test.tsx +497 -0
- package/Tests/App/Dashboard/SloMetricsTimeRangeZoom.test.tsx +541 -0
- package/Tests/App/Dashboard/SlowLoadHarness.ts +123 -0
- package/Tests/App/Dashboard/SnapshotExplorerPrimaryZoom.test.tsx +1194 -0
- package/Tests/App/Dashboard/SnapshotViewerPinnedWindow.test.tsx +620 -0
- package/Tests/App/Dashboard/TelemetrySnapshotPanelTimeRangeZoom.test.tsx +765 -0
- package/Tests/App/Dashboard/TelemetrySnapshotZoom.test.tsx +516 -0
- package/Tests/App/Dashboard/TelemetrySnapshotZoomAcrossTabs.test.tsx +827 -0
- package/Tests/App/Dashboard/TimeRangeZoomPageHarness.tsx +463 -0
- package/Tests/App/Dashboard/TraceChartEditorStatusSplit.test.tsx +543 -0
- package/Tests/App/Dashboard/TraceStatusPresentation.test.tsx +967 -0
- package/Tests/App/Dashboard/TraceTimelineMinimapZoom.test.tsx +315 -0
- package/Tests/App/Dashboard/TracesAnalyticsStatusSplit.test.tsx +778 -0
- package/Tests/App/Dashboard/TracesAnalyticsViewZoom.test.tsx +349 -0
- package/Tests/App/Dashboard/TracesExplorerTimeRangeZoom.test.tsx +551 -0
- package/Tests/App/Dashboard/TracesStatusChartAndFacet.test.tsx +687 -0
- package/Tests/App/Dashboard/TracesViewerStaleResponses.test.tsx +458 -0
- package/Tests/App/Dashboard/UptimeStripsExcludedFromZoom.test.tsx +406 -0
- package/Tests/App/Dashboard/VMwareOverviewSlowLoads.test.tsx +535 -0
- package/Tests/App/Dashboard/VMwarePagesTimeRangeZoom.test.tsx +606 -0
- package/Tests/App/Dashboard/ValueWidgetSparklineStaleHover.test.tsx +1292 -0
- package/Tests/App/Dashboard/ValueWidgetSparklineZoom.test.tsx +765 -0
- package/Tests/App/StatusPage/StatusPageResourceExplorer.test.tsx +98 -0
- package/Tests/Models/DatabaseModels/KubernetesAiAgentModel.test.ts +295 -0
- package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +347 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +58 -0
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +1 -1
- package/Tests/Server/API/AIInvestigationAPI.test.ts +123 -45
- package/Tests/Server/API/AutoRemediationApproveClusterRound.test.ts +1329 -0
- package/Tests/Server/API/AutoRemediationApproveKubectlRecheck.test.ts +25 -2
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPIAgent.test.ts +903 -0
- package/Tests/Server/API/MicrosoftTeamsChatsRefreshRoute.test.ts +667 -0
- package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +294 -6
- package/Tests/Server/API/ProxmoxResourceAPIRemoveNode.test.ts +1932 -0
- package/Tests/Server/Infrastructure/GlobalCache.test.ts +195 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesAiAgentAndAiDefaultsMigration.test.ts +623 -0
- package/Tests/Server/Infrastructure/Postgres/AddKubernetesClusterAiAccessMigration.test.ts +87 -10
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleScopeMigration.test.ts +622 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +61 -4
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerPinnedKey.test.ts +98 -2
- package/Tests/Server/Middleware/TelemetryIngestKubernetesAgentRunnerRateLimit.test.ts +105 -2
- package/Tests/Server/Services/AIServiceBalanceBlocker.test.ts +282 -0
- package/Tests/Server/Services/AlertMonitorClearWritesNull.test.ts +409 -0
- package/Tests/Server/Services/AlertMonitorEditFeed.test.ts +474 -0
- package/Tests/Server/Services/AlertMonitorEditGuard.test.ts +610 -0
- package/Tests/Server/Services/AutoRemediationClusterRuleEngine.test.ts +2 -0
- package/Tests/Server/Services/AutoRemediationRuleCommandRunners.test.ts +2 -1
- package/Tests/Server/Services/IncidentAffectedMonitorsEdit.test.ts +1360 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +3 -1
- package/Tests/Server/Services/IncidentSeverityDeletePausesComplianceRules.test.ts +488 -0
- package/Tests/Server/Services/KubernetesAiAgentJobService.test.ts +329 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceHelpers.test.ts +618 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceLifecycle.test.ts +1444 -0
- package/Tests/Server/Services/KubernetesAiAgentServiceRegister.test.ts +1666 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessDeletedRunnerRemedy.test.ts +140 -111
- package/Tests/Server/Services/KubernetesClusterAiAccessGapNextSteps.test.ts +267 -105
- package/Tests/Server/Services/KubernetesClusterAiAccessLegacySuperseded.test.ts +440 -0
- package/Tests/Server/Services/KubernetesClusterAiAccessService.test.ts +567 -411
- package/Tests/Server/Services/KubernetesClusterAiAccessTarget.test.ts +1168 -0
- package/Tests/Server/Services/KubernetesClusterAiSettingsPermission.test.ts +410 -12
- package/Tests/Server/Services/KubernetesClusterServiceAiAccessFeed.test.ts +55 -0
- package/Tests/Server/Services/ProjectServiceNewProjectAiDefaults.test.ts +288 -0
- package/Tests/Server/Services/ProxmoxResourcePostgres.test.ts +5633 -0
- package/Tests/Server/Services/ProxmoxResourceService.test.ts +6458 -5
- package/Tests/Server/Services/RunnerJobEnqueueKubectl.test.ts +48 -15
- package/Tests/Server/Services/RunnerJobEnqueueKubectlAiAgent.test.ts +620 -0
- package/Tests/Server/Services/RunnerJobKubectlWriteScope.test.ts +170 -3
- package/Tests/Server/Services/RunnerJobTimeoutReason.test.ts +72 -0
- package/Tests/Server/Services/RunnerServiceAgentName.test.ts +6 -4
- package/Tests/Server/Services/ScheduledMaintenanceAttachmentEdit.test.ts +2113 -0
- package/Tests/Server/Services/ScheduledMaintenanceMonitorRelease.test.ts +972 -0
- package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +2237 -0
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +3988 -138
- package/Tests/Server/Utils/AI/ClusterAccessContext.test.ts +107 -1
- package/Tests/Server/Utils/AI/IncidentPostmortemRunner.test.ts +351 -0
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +2 -0
- package/Tests/Server/Utils/AI/InvestigationEligibility.test.ts +310 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +70 -0
- package/Tests/Server/Utils/AI/KubectlJobRunnerFinishedJob.test.ts +58 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectl.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsKubectlOutcome.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsLiveCluster.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationCommandToolsRunnerScope.test.ts +125 -1
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +252 -3
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerClusterMode.test.ts +2 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerProjectGates.test.ts +240 -0
- package/Tests/Server/Utils/AI/RemediationKubectlCopyParity.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutor.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanExecutorUnknownRun.test.ts +2 -0
- package/Tests/Server/Utils/AutoRemediation/CommandPlanVerification.test.ts +2 -0
- package/Tests/Server/Utils/Telemetry/HostAssetAttributesFromOtlp.test.ts +68 -0
- package/Tests/Server/Utils/Telemetry/InventoryMirrorPostgres.test.ts +370 -0
- package/Tests/Server/Utils/Telemetry/NetworkDeviceInventoryAttributes.test.ts +522 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.test.ts +155 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.test.ts +8631 -0
- package/Tests/Server/Utils/Telemetry/ProxmoxNativePush.test.ts +2852 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +367 -1
- package/Tests/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.test.ts +45 -3
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsChats.test.ts +25 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNames.test.ts +3119 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsGroupChatNamesPostgres.test.ts +1721 -0
- package/Tests/Types/Kubernetes/KubernetesAgentChartAiAccess.test.ts +581 -113
- package/Tests/Types/Kubernetes/KubernetesAiAgentAccessContract.test.ts +510 -0
- package/Tests/Types/Team/ComplianceRule.test.ts +1029 -0
- package/Tests/Types/Team/TeamComplianceStatus.test.ts +176 -0
- package/Tests/UI/Components/ActionButton/RowActions.test.tsx +641 -0
- package/Tests/UI/Components/ActionButton/RowActionsAccessibility.test.tsx +414 -0
- package/Tests/UI/Components/ActionButton/SplitActionButtons.test.ts +565 -0
- package/Tests/UI/Components/Charts/BarChartDragToSelect.test.tsx +386 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickResetWithoutDblclick.test.tsx +1025 -0
- package/Tests/UI/Components/Charts/ChartGroupPageZoomHint.test.tsx +196 -0
- package/Tests/UI/Components/Charts/ChartPlaceholdersTakeDoubleClick.test.tsx +1861 -0
- package/Tests/UI/Components/Charts/ChartPlotClicksWhileResetArmed.test.tsx +382 -0
- package/Tests/UI/Components/Charts/ChartRangeSelection.test.tsx +704 -0
- package/Tests/UI/Components/Charts/ChartRangeSelectionDoubleClickReset.test.tsx +1481 -0
- package/Tests/UI/Components/Charts/ChartRangeSelectionRealRecharts.test.tsx +918 -0
- package/Tests/UI/Components/Charts/ChartRowBucketStart.test.ts +350 -0
- package/Tests/UI/Components/Charts/DoubleClickReset.test.tsx +996 -0
- package/Tests/UI/Components/Charts/HistogramDoubleClickResetRealRecharts.test.tsx +965 -0
- package/Tests/UI/Components/Charts/HistogramDriftThenRefetch.test.tsx +277 -0
- package/Tests/UI/Components/Charts/HistogramRangeSelectionDataChange.test.tsx +1757 -0
- package/Tests/UI/Components/Charts/HistogramRangeSelectionRealRecharts.test.tsx +560 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/ChartPageTimeRangeZoom.test.tsx +513 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.test.tsx +845 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.test.tsx +119 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHintTailwind.test.tsx +274 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.test.ts +433 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.test.tsx +863 -0
- package/Tests/UI/Components/Charts/TimeRangeZoom/ZoomDocsPromises.test.tsx +1147 -0
- package/Tests/UI/Components/DisabledButtonTooltip.test.tsx +14 -3
- package/Tests/UI/Components/EntityDropdownEscape.test.tsx +454 -0
- package/Tests/UI/Components/EntityDropdownFocusLeave.test.tsx +420 -0
- package/Tests/UI/Components/Forms/FormFieldDropdownDisabled.test.tsx +233 -0
- package/Tests/UI/Components/Input.test.tsx +80 -1
- package/Tests/UI/Components/LogsAnalyticsViewZoom.test.tsx +947 -0
- package/Tests/UI/Components/LogsHistogramDragTooltip.test.tsx +17 -5
- package/Tests/UI/Components/LogsViewerAnalyticsZoom.test.tsx +501 -0
- package/Tests/UI/Components/LogsViewerHistogramZoom.test.tsx +1 -1
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +6 -4
- package/Tests/UI/Components/ModelTable/BaseModelTablePermissionGating.test.tsx +60 -8
- package/Tests/UI/Components/ModelTable/BaseModelTableRowActions.test.tsx +476 -0
- package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +7 -5
- package/Tests/UI/Components/MoreMenuPortal.test.tsx +623 -0
- package/Tests/UI/Components/StatusPage/ResourceGridActions.test.tsx +538 -0
- package/Tests/UI/Components/StatusPage/ResourceGridSelection.test.tsx +14 -4
- package/Tests/UI/Components/TableCellWrapping.test.tsx +3 -3
- package/Tests/UI/Components/TableRowActions.test.tsx +472 -0
- package/Tests/UI/Components/TelemetryHistogramDragTooltip.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerHistogramClickZoom.test.tsx +1 -1
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerZoomScope.test.tsx +470 -0
- package/Tests/UI/Components/TelemetryViewer/UseViewerTimeRangeZoom.test.tsx +571 -0
- package/Tests/UI/Components/TelemetryViewer/ViewerDoubleClickResetUnderDataChange.test.tsx +928 -0
- package/Tests/UI/Components/TelemetryViewer/ViewerFollowsEnclosingZoom.test.tsx +1569 -0
- package/Tests/UI/Components/Toggle.test.tsx +66 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardRefreshNames.test.tsx +1023 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +201 -0
- package/Tests/UI/Rum/FidelityNotices.test.ts +54 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +72 -0
- package/Tests/UI/Rum/ReplayFrameCapture.test.ts +1009 -9
- package/Tests/UI/Rum/ReplayRecordedAssets.test.ts +1069 -0
- package/Tests/UI/Rum/ReplayStage.test.tsx +913 -2
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +443 -8
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +439 -9
- package/Tests/UI/Rum/UserFlowTablesRowActions.test.tsx +501 -0
- package/Tests/Utils/AiRemediation/KubectlPolicyChartRbacParity.test.ts +47 -19
- package/Tests/Utils/AiRemediation/KubectlWriteScopeCallerParity.test.ts +2 -0
- package/Tests/Utils/AiRemediation/KubernetesAiAgentPolicyCopyParity.test.ts +396 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +104 -1
- package/Types/AI/AIRunType.ts +9 -4
- package/Types/AI/InvestigationNotStartedReason.ts +6 -0
- package/Types/AutoRemediation/AiRemediationCommandPlan.ts +14 -16
- package/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.ts +28 -0
- package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +4 -2
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +263 -32
- package/Types/Kubernetes/KubernetesClusterAiAccessPermissions.ts +20 -16
- package/Types/Kubernetes/KubernetesClusterAiInsights.ts +81 -0
- package/Types/Monitor/ProxmoxAlertTemplates.ts +4 -4
- package/Types/Team/ComplianceNotificationChannel.ts +22 -0
- package/Types/Team/ComplianceRule.ts +434 -0
- package/Types/Team/ComplianceRuleType.ts +21 -0
- package/Types/Team/TeamComplianceStatus.ts +81 -0
- package/Types/Telemetry/TelemetryIngestSurface.ts +28 -0
- package/UI/Components/ActionButton/ActionButtonSchema.ts +21 -0
- package/UI/Components/ActionButton/RowActions.tsx +238 -0
- package/UI/Components/ActionButton/SplitActionButtons.ts +173 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +32 -2
- package/UI/Components/Charts/Bar/BarChart.tsx +40 -3
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +37 -11
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +80 -243
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +122 -31
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +95 -244
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +214 -0
- package/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.ts +32 -0
- package/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.ts +599 -0
- package/UI/Components/Charts/Line/LineChart.tsx +32 -2
- package/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.tsx +70 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.tsx +226 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.tsx +73 -0
- package/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.ts +163 -0
- package/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.ts +215 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +20 -8
- package/UI/Components/Charts/Utils/XAxis.ts +75 -0
- package/UI/Components/Charts/Utils/useHistogramRangeSelection.ts +493 -59
- package/UI/Components/EntityDropdown/EntityDropdown.tsx +107 -11
- package/UI/Components/Forms/Fields/FormField.tsx +10 -0
- package/UI/Components/Input/Input.tsx +90 -57
- package/UI/Components/List/ListRow.tsx +8 -74
- package/UI/Components/LogsViewer/LogsViewer.tsx +40 -11
- package/UI/Components/LogsViewer/components/LogTimeRangePicker.tsx +22 -6
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +209 -6
- package/UI/Components/LogsViewer/components/LogsHistogram.tsx +127 -84
- package/UI/Components/LogsViewer/components/LogsViewerToolbar.tsx +3 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +12 -1
- package/UI/Components/MoreMenu/MoreMenu.tsx +365 -30
- package/UI/Components/MoreMenu/MoreMenuItem.tsx +70 -17
- package/UI/Components/OrderedStatesList/Item.tsx +7 -72
- package/UI/Components/StatusPage/ResourceGrid.tsx +126 -77
- package/UI/Components/Table/TableBody.tsx +8 -2
- package/UI/Components/Table/TableRow.tsx +20 -140
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +41 -10
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +47 -9
- package/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.tsx +25 -6
- package/UI/Components/TelemetryViewer/types.ts +2 -0
- package/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.ts +448 -0
- package/UI/Components/Toggle/Toggle.tsx +26 -0
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Styles/Theme.css +14 -2
- package/Utils/AiRemediation/CommandPolicy.ts +1 -1
- package/Utils/AiRemediation/KubectlPolicy.ts +1 -1
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +46 -2
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js +385 -0
- package/build/dist/Models/DatabaseModels/KubernetesAiAgent.js.map +1 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +3 -3
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +56 -5
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js +51 -1
- package/build/dist/Models/DatabaseModels/ProxmoxResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RunnerJob.js +74 -0
- package/build/dist/Models/DatabaseModels/RunnerJob.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +134 -3
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +6 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +17 -10
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +144 -24
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js +436 -22
- package/build/dist/Server/API/KubernetesClusterAiAccessAPI.js.map +1 -1
- package/build/dist/Server/API/MicrosoftTeamsAPI.js +69 -13
- package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/ProxmoxResourceAPI.js +187 -14
- package/build/dist/Server/API/ProxmoxResourceAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/GlobalCache.js +27 -0
- package/build/dist/Server/Infrastructure/GlobalCache.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796000000000-AddTeamComplianceRuleScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js +84 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796100000000-AddKubernetesAiAgentAndAiDefaults.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js +31 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796200000000-AddProxmoxResourceNativePushColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +34 -19
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +59 -1
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +248 -13
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AlertSeverityService.js +51 -15
- package/build/dist/Server/Services/AlertSeverityService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +199 -72
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSeverityService.js +51 -15
- package/build/dist/Server/Services/IncidentSeverityService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesAiAgentJobService.js +158 -0
- package/build/dist/Server/Services/KubernetesAiAgentJobService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesAiAgentService.js +1145 -0
- package/build/dist/Server/Services/KubernetesAiAgentService.js.map +1 -0
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js +842 -371
- package/build/dist/Server/Services/KubernetesClusterAiAccessService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterService.js +86 -17
- package/build/dist/Server/Services/KubernetesClusterService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +22 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxResourceService.js +258 -3
- package/build/dist/Server/Services/ProxmoxResourceService.js.map +1 -1
- package/build/dist/Server/Services/RunnerJobService.js +178 -92
- package/build/dist/Server/Services/RunnerJobService.js.map +1 -1
- package/build/dist/Server/Services/RunnerService.js +1 -1
- package/build/dist/Server/Services/RunnerService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +535 -3
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js +316 -46
- package/build/dist/Server/Services/ScheduledMaintenanceStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceSettingService.js +833 -7
- package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js +52 -9
- package/build/dist/Server/Utils/AI/ClusterAccess/ClusterAccessContext.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +13 -9
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +7 -3
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +29 -15
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +56 -20
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +39 -5
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js +30 -3
- package/build/dist/Server/Utils/AI/SRE/IncidentPostmortemRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js +13 -2
- package/build/dist/Server/Utils/AI/SRE/InvestigationEligibility.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationGrader.js +1 -1
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js +4 -2
- package/build/dist/Server/Utils/AutoRemediation/CommandPlanExecutor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js +111 -6
- package/build/dist/Server/Utils/Telemetry/InventoryEntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js +40 -4
- package/build/dist/Server/Utils/Telemetry/ProxmoxCephSnapshotScan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js +296 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativeNodeLiveness.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js +699 -0
- package/build/dist/Server/Utils/Telemetry/ProxmoxNativePush.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +77 -19
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +505 -42
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIRunType.js +9 -4
- package/build/dist/Types/AI/AIRunType.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js +10 -16
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPlan.js.map +1 -1
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js +28 -0
- package/build/dist/Types/AutoRemediation/AiRemediationCommandPolicyVerdict.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +72 -16
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js +20 -16
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccessPermissions.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js +17 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiInsights.js.map +1 -0
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +4 -4
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js.map +1 -1
- package/build/dist/Types/Team/ComplianceNotificationChannel.js +23 -0
- package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -0
- package/build/dist/Types/Team/ComplianceRule.js +304 -0
- package/build/dist/Types/Team/ComplianceRule.js.map +1 -0
- package/build/dist/Types/Team/ComplianceRuleType.js +21 -0
- package/build/dist/Types/Team/ComplianceRuleType.js.map +1 -1
- package/build/dist/Types/Team/TeamComplianceStatus.js +2 -0
- package/build/dist/Types/Team/TeamComplianceStatus.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js +25 -0
- package/build/dist/Types/Telemetry/TelemetryIngestSurface.js.map +1 -1
- package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js +20 -1
- package/build/dist/UI/Components/ActionButton/ActionButtonSchema.js.map +1 -1
- package/build/dist/UI/Components/ActionButton/RowActions.js +113 -0
- package/build/dist/UI/Components/ActionButton/RowActions.js.map +1 -0
- package/build/dist/UI/Components/ActionButton/SplitActionButtons.js +71 -0
- package/build/dist/UI/Components/ActionButton/SplitActionButtons.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +16 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +16 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +27 -5
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +61 -194
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +84 -26
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +75 -196
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +133 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js +26 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartBucketsChange.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js +371 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/UseChartRangeSelection.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +16 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js +35 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/ResetTimeRangeZoomButton.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js +107 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomContext.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js +41 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomHint.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js +117 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/TimeRangeZoomUtil.js.map +1 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js +121 -0
- package/build/dist/UI/Components/Charts/TimeRangeZoom/UseTimeRangeZoom.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +15 -7
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +70 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js +305 -38
- package/build/dist/UI/Components/Charts/Utils/useHistogramRangeSelection.js.map +1 -1
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js +89 -14
- package/build/dist/UI/Components/EntityDropdown/EntityDropdown.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +11 -2
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +69 -54
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/List/ListRow.js +4 -39
- package/build/dist/UI/Components/List/ListRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +31 -8
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js +10 -1
- package/build/dist/UI/Components/LogsViewer/components/LogTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +139 -21
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js +30 -8
- package/build/dist/UI/Components/LogsViewer/components/LogsHistogram.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsViewerToolbar.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +10 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +253 -14
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js +43 -13
- package/build/dist/UI/Components/MoreMenu/MoreMenuItem.js.map +1 -1
- package/build/dist/UI/Components/OrderedStatesList/Item.js +2 -38
- package/build/dist/UI/Components/OrderedStatesList/Item.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js +53 -15
- package/build/dist/UI/Components/StatusPage/ResourceGrid.js.map +1 -1
- package/build/dist/UI/Components/Table/TableBody.js +6 -2
- package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +12 -75
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +32 -7
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +27 -9
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js +11 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryTimeRangePicker.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js +272 -0
- package/build/dist/UI/Components/TelemetryViewer/useViewerTimeRangeZoom.js.map +1 -0
- package/build/dist/UI/Components/Toggle/Toggle.js +14 -1
- package/build/dist/UI/Components/Toggle/Toggle.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js +1 -1
- package/build/dist/Utils/AiRemediation/CommandPolicy.js.map +1 -1
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js +1 -1
- package/build/dist/Utils/AiRemediation/KubectlPolicy.js.map +1 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +27 -1
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -1
- package/package.json +1 -1
|
@@ -25,7 +25,13 @@ import ExemplarPoint from "../../Types/ExemplarPoint";
|
|
|
25
25
|
import FormattedExemplarPoint from "../Types/FormattedExemplarPoint";
|
|
26
26
|
import FormattedReferenceRegion from "../Types/FormattedReferenceRegion";
|
|
27
27
|
import FormattedTimeReferenceLine from "../Types/FormattedTimeReferenceLine";
|
|
28
|
-
import {
|
|
28
|
+
import useChartRangeSelection, {
|
|
29
|
+
ChartBucketWindow,
|
|
30
|
+
ChartRangeSelection,
|
|
31
|
+
RangeSelectionChartState,
|
|
32
|
+
getChartBucketWindow,
|
|
33
|
+
getChartRowIndex,
|
|
34
|
+
} from "../Utils/UseChartRangeSelection";
|
|
29
35
|
import { AxisDomain } from "recharts/types/util/types";
|
|
30
36
|
|
|
31
37
|
import { useOnWindowResize } from "../Utils/UseWindowOnResize";
|
|
@@ -41,7 +47,11 @@ import useChartAnnotations, {
|
|
|
41
47
|
UseChartAnnotationsResult,
|
|
42
48
|
} from "../Annotations/UseChartAnnotations";
|
|
43
49
|
import { cx } from "../Utils/Cx";
|
|
44
|
-
import {
|
|
50
|
+
import {
|
|
51
|
+
DeferredChartClick,
|
|
52
|
+
useDeferredChartClick,
|
|
53
|
+
} from "../Utils/DoubleClick";
|
|
54
|
+
import useChartBucketsChange from "../Utils/UseChartBucketsChange";
|
|
45
55
|
import { getYAxisDomain } from "../Utils/GetYAxisDomain";
|
|
46
56
|
import { hasOnlyOneValueForKey } from "../Utils/HasOnlyOneValueForKey";
|
|
47
57
|
import {
|
|
@@ -600,15 +610,6 @@ type BaseEventProps = {
|
|
|
600
610
|
|
|
601
611
|
type LineChartEventProps = BaseEventProps | null | undefined;
|
|
602
612
|
|
|
603
|
-
/*
|
|
604
|
-
* Subset of the recharts MouseHandlerDataParam passed to chart-level
|
|
605
|
-
* mouse handlers — just the fields range selection needs.
|
|
606
|
-
*/
|
|
607
|
-
type RangeSelectionChartState = {
|
|
608
|
-
activeTooltipIndex?: number | string | null | undefined;
|
|
609
|
-
activeLabel?: string | number | undefined;
|
|
610
|
-
};
|
|
611
|
-
|
|
612
613
|
interface LineChartProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
613
614
|
data: Record<string, any>[];
|
|
614
615
|
index: string;
|
|
@@ -728,41 +729,31 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
728
729
|
const [activeLegend, setActiveLegend] = React.useState<string | undefined>(
|
|
729
730
|
undefined,
|
|
730
731
|
);
|
|
731
|
-
const hasOnTimeRangeSelect: boolean = Boolean(onTimeRangeSelect);
|
|
732
|
-
const [rangeSelectionStart, setRangeSelectionStart] = React.useState<
|
|
733
|
-
string | null
|
|
734
|
-
>(null);
|
|
735
|
-
const [rangeSelectionEnd, setRangeSelectionEnd] = React.useState<
|
|
736
|
-
string | null
|
|
737
|
-
>(null);
|
|
738
|
-
const isRangeSelecting: React.MutableRefObject<boolean> =
|
|
739
|
-
React.useRef<boolean>(false);
|
|
740
|
-
const rangeSelectionStartIndexRef: React.MutableRefObject<number | null> =
|
|
741
|
-
React.useRef<number | null>(null);
|
|
742
|
-
const rangeSelectionEndIndexRef: React.MutableRefObject<number | null> =
|
|
743
|
-
React.useRef<number | null>(null);
|
|
744
|
-
const suppressNextClickRef: React.MutableRefObject<boolean> =
|
|
745
|
-
React.useRef<boolean>(false);
|
|
746
|
-
const hasOnTimeRangeReset: boolean = Boolean(onTimeRangeReset);
|
|
747
732
|
/*
|
|
748
|
-
*
|
|
749
|
-
*
|
|
733
|
+
* Every click on the plot waits out the double-click window while a
|
|
734
|
+
* reset is on offer; see useDeferredChartClick.
|
|
735
|
+
*/
|
|
736
|
+
const deferredClick: DeferredChartClick = useDeferredChartClick(
|
|
737
|
+
Boolean(onTimeRangeReset),
|
|
738
|
+
);
|
|
739
|
+
/*
|
|
740
|
+
* Drag-to-select a time window, and the double-click that undoes a
|
|
741
|
+
* zoom, dropping the clicks it was made of; see useChartRangeSelection.
|
|
750
742
|
*/
|
|
751
|
-
const
|
|
752
|
-
|
|
753
|
-
|
|
743
|
+
const rangeSelection: ChartRangeSelection = useChartRangeSelection({
|
|
744
|
+
data: data,
|
|
745
|
+
index: index,
|
|
746
|
+
onTimeRangeSelect: onTimeRangeSelect,
|
|
747
|
+
onTimeRangeReset: onTimeRangeReset
|
|
748
|
+
? (): void => {
|
|
749
|
+
deferredClick.cancel();
|
|
750
|
+
onTimeRangeReset();
|
|
751
|
+
}
|
|
752
|
+
: undefined,
|
|
753
|
+
});
|
|
754
754
|
const categoryColors: Map<string, ChartColorValue> =
|
|
755
755
|
constructCategoryColors(categories, colors);
|
|
756
756
|
|
|
757
|
-
React.useEffect(() => {
|
|
758
|
-
return () => {
|
|
759
|
-
if (pendingClickTimeoutRef.current !== null) {
|
|
760
|
-
clearTimeout(pendingClickTimeoutRef.current);
|
|
761
|
-
pendingClickTimeoutRef.current = null;
|
|
762
|
-
}
|
|
763
|
-
};
|
|
764
|
-
}, []);
|
|
765
|
-
|
|
766
757
|
/*
|
|
767
758
|
* Annotations are drawn onto the categorical axis, so the layer needs
|
|
768
759
|
* the same x values recharts is drawing — not the source dates.
|
|
@@ -777,6 +768,20 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
777
768
|
);
|
|
778
769
|
}, [data, index]);
|
|
779
770
|
|
|
771
|
+
/*
|
|
772
|
+
* A clicked dot names its row by index, and after a zoom, a reset or a
|
|
773
|
+
* new range that index holds another bucket: drop it, with the series
|
|
774
|
+
* highlight it brought. A series picked from the legend still exists,
|
|
775
|
+
* so it stays picked.
|
|
776
|
+
*/
|
|
777
|
+
useChartBucketsChange(categoryLabels, (): void => {
|
|
778
|
+
if (activeDot) {
|
|
779
|
+
setActiveDot(undefined);
|
|
780
|
+
setActiveLegend(undefined);
|
|
781
|
+
onValueChange?.(null);
|
|
782
|
+
}
|
|
783
|
+
});
|
|
784
|
+
|
|
780
785
|
const annotations: UseChartAnnotationsResult = useChartAnnotations({
|
|
781
786
|
formattedTimeReferenceLines,
|
|
782
787
|
formattedReferenceRegions,
|
|
@@ -784,9 +789,7 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
784
789
|
axisPaddingPx: paddingValue,
|
|
785
790
|
scaleKind: "point",
|
|
786
791
|
hasTopLegend: showLegend,
|
|
787
|
-
isClickSuppressed:
|
|
788
|
-
return suppressNextClickRef.current;
|
|
789
|
-
},
|
|
792
|
+
isClickSuppressed: rangeSelection.isClickSuppressed,
|
|
790
793
|
});
|
|
791
794
|
|
|
792
795
|
const yAxisDomain: (number | "auto")[] = getYAxisDomain(
|
|
@@ -804,13 +807,19 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
804
807
|
event.stopPropagation();
|
|
805
808
|
|
|
806
809
|
// Ignore the click that immediately follows a drag-to-select.
|
|
807
|
-
if (
|
|
810
|
+
if (rangeSelection.isClickSuppressed()) {
|
|
808
811
|
return;
|
|
809
812
|
}
|
|
810
813
|
|
|
811
814
|
if (!hasOnValueChange) {
|
|
812
815
|
return;
|
|
813
816
|
}
|
|
817
|
+
deferredClick.run((): void => {
|
|
818
|
+
toggleDot(itemData);
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
function toggleDot(itemData: any): void {
|
|
814
823
|
if (
|
|
815
824
|
(itemData.index === activeDot?.index &&
|
|
816
825
|
itemData.dataKey === activeDot?.dataKey) ||
|
|
@@ -837,7 +846,7 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
837
846
|
|
|
838
847
|
function onCategoryClick(dataKey: string): void {
|
|
839
848
|
// Ignore the click that immediately follows a drag-to-select.
|
|
840
|
-
if (
|
|
849
|
+
if (rangeSelection.isClickSuppressed()) {
|
|
841
850
|
return;
|
|
842
851
|
}
|
|
843
852
|
if (!hasOnValueChange) {
|
|
@@ -861,151 +870,6 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
861
870
|
setActiveDot(undefined);
|
|
862
871
|
}
|
|
863
872
|
|
|
864
|
-
function getRowIndexFromChartState(
|
|
865
|
-
chartState: RangeSelectionChartState,
|
|
866
|
-
): number | null {
|
|
867
|
-
const activeTooltipIndex: number | string | null | undefined =
|
|
868
|
-
chartState.activeTooltipIndex;
|
|
869
|
-
const numericIndex: number =
|
|
870
|
-
typeof activeTooltipIndex === "number"
|
|
871
|
-
? activeTooltipIndex
|
|
872
|
-
: Number(activeTooltipIndex);
|
|
873
|
-
if (
|
|
874
|
-
activeTooltipIndex !== undefined &&
|
|
875
|
-
activeTooltipIndex !== null &&
|
|
876
|
-
Number.isInteger(numericIndex) &&
|
|
877
|
-
numericIndex >= 0 &&
|
|
878
|
-
numericIndex < data.length
|
|
879
|
-
) {
|
|
880
|
-
return numericIndex;
|
|
881
|
-
}
|
|
882
|
-
// Fall back to matching activeLabel against the row labels.
|
|
883
|
-
if (chartState.activeLabel !== undefined) {
|
|
884
|
-
const rowIndex: number = data.findIndex(
|
|
885
|
-
(row: Record<string, unknown>) => {
|
|
886
|
-
return row[index] === chartState.activeLabel;
|
|
887
|
-
},
|
|
888
|
-
);
|
|
889
|
-
return rowIndex >= 0 ? rowIndex : null;
|
|
890
|
-
}
|
|
891
|
-
return null;
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
function getBucketDateAtIndex(rowIndex: number): Date | null {
|
|
895
|
-
const rawDate: unknown = data[rowIndex]?.[CHART_DATA_POINT_DATE_KEY];
|
|
896
|
-
return typeof rawDate === "number" ? new Date(rawDate) : null;
|
|
897
|
-
}
|
|
898
|
-
|
|
899
|
-
function handleRangeSelectMouseDown(
|
|
900
|
-
chartState: RangeSelectionChartState,
|
|
901
|
-
): void {
|
|
902
|
-
if (!hasOnTimeRangeSelect) {
|
|
903
|
-
return;
|
|
904
|
-
}
|
|
905
|
-
const rowIndex: number | null = getRowIndexFromChartState(chartState);
|
|
906
|
-
if (rowIndex === null) {
|
|
907
|
-
return;
|
|
908
|
-
}
|
|
909
|
-
const rowLabel: unknown = data[rowIndex]?.[index];
|
|
910
|
-
if (typeof rowLabel !== "string") {
|
|
911
|
-
return;
|
|
912
|
-
}
|
|
913
|
-
isRangeSelecting.current = true;
|
|
914
|
-
rangeSelectionStartIndexRef.current = rowIndex;
|
|
915
|
-
rangeSelectionEndIndexRef.current = rowIndex;
|
|
916
|
-
setRangeSelectionStart(rowLabel);
|
|
917
|
-
setRangeSelectionEnd(null);
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
function handleRangeSelectMouseMove(
|
|
921
|
-
chartState: RangeSelectionChartState,
|
|
922
|
-
mouseEvent: React.MouseEvent<SVGGraphicsElement>,
|
|
923
|
-
): void {
|
|
924
|
-
if (!isRangeSelecting.current) {
|
|
925
|
-
return;
|
|
926
|
-
}
|
|
927
|
-
// Button was released outside the chart — abandon the selection.
|
|
928
|
-
if (mouseEvent.buttons === 0) {
|
|
929
|
-
isRangeSelecting.current = false;
|
|
930
|
-
rangeSelectionStartIndexRef.current = null;
|
|
931
|
-
rangeSelectionEndIndexRef.current = null;
|
|
932
|
-
setRangeSelectionStart(null);
|
|
933
|
-
setRangeSelectionEnd(null);
|
|
934
|
-
return;
|
|
935
|
-
}
|
|
936
|
-
const rowIndex: number | null = getRowIndexFromChartState(chartState);
|
|
937
|
-
if (rowIndex === null) {
|
|
938
|
-
return;
|
|
939
|
-
}
|
|
940
|
-
const rowLabel: unknown = data[rowIndex]?.[index];
|
|
941
|
-
if (typeof rowLabel !== "string") {
|
|
942
|
-
return;
|
|
943
|
-
}
|
|
944
|
-
rangeSelectionEndIndexRef.current = rowIndex;
|
|
945
|
-
setRangeSelectionEnd(rowLabel);
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
function handleRangeSelectMouseUp(): void {
|
|
949
|
-
if (!isRangeSelecting.current) {
|
|
950
|
-
return;
|
|
951
|
-
}
|
|
952
|
-
isRangeSelecting.current = false;
|
|
953
|
-
|
|
954
|
-
const startIndex: number | null = rangeSelectionStartIndexRef.current;
|
|
955
|
-
const endIndex: number | null = rangeSelectionEndIndexRef.current;
|
|
956
|
-
rangeSelectionStartIndexRef.current = null;
|
|
957
|
-
rangeSelectionEndIndexRef.current = null;
|
|
958
|
-
setRangeSelectionStart(null);
|
|
959
|
-
setRangeSelectionEnd(null);
|
|
960
|
-
|
|
961
|
-
/*
|
|
962
|
-
* A plain click (pointer never left the starting bucket) must keep
|
|
963
|
-
* behaving exactly as before — only a real drag selects a range.
|
|
964
|
-
*/
|
|
965
|
-
if (startIndex === null || endIndex === null || startIndex === endIndex) {
|
|
966
|
-
return;
|
|
967
|
-
}
|
|
968
|
-
|
|
969
|
-
/*
|
|
970
|
-
* The browser fires a click right after mouseup; swallow it so a
|
|
971
|
-
* drag doesn't also toggle legend/dot selection. Cleared on a
|
|
972
|
-
* timeout so a never-delivered click can't suppress a later one.
|
|
973
|
-
*/
|
|
974
|
-
suppressNextClickRef.current = true;
|
|
975
|
-
setTimeout(() => {
|
|
976
|
-
suppressNextClickRef.current = false;
|
|
977
|
-
}, 0);
|
|
978
|
-
|
|
979
|
-
if (!onTimeRangeSelect) {
|
|
980
|
-
return;
|
|
981
|
-
}
|
|
982
|
-
|
|
983
|
-
const lowerIndex: number = Math.min(startIndex, endIndex);
|
|
984
|
-
const upperIndex: number = Math.max(startIndex, endIndex);
|
|
985
|
-
const startDate: Date | null = getBucketDateAtIndex(lowerIndex);
|
|
986
|
-
const lastBucketDate: Date | null = getBucketDateAtIndex(upperIndex);
|
|
987
|
-
if (!startDate || !lastBucketDate) {
|
|
988
|
-
return;
|
|
989
|
-
}
|
|
990
|
-
|
|
991
|
-
/*
|
|
992
|
-
* Cover the full final bucket: its end is its start plus one
|
|
993
|
-
* bucket width, derived from adjacent row dates.
|
|
994
|
-
*/
|
|
995
|
-
const adjacentDate: Date | null =
|
|
996
|
-
upperIndex > 0
|
|
997
|
-
? getBucketDateAtIndex(upperIndex - 1)
|
|
998
|
-
: getBucketDateAtIndex(upperIndex + 1);
|
|
999
|
-
const bucketWidthInMs: number = adjacentDate
|
|
1000
|
-
? Math.abs(lastBucketDate.getTime() - adjacentDate.getTime())
|
|
1001
|
-
: 0;
|
|
1002
|
-
const endDate: Date = new Date(
|
|
1003
|
-
lastBucketDate.getTime() + bucketWidthInMs,
|
|
1004
|
-
);
|
|
1005
|
-
|
|
1006
|
-
onTimeRangeSelect(startDate, endDate);
|
|
1007
|
-
}
|
|
1008
|
-
|
|
1009
873
|
/*
|
|
1010
874
|
* The plain-click path, split out so it can either run inline (no
|
|
1011
875
|
* reset handler) or be deferred behind the double-click window.
|
|
@@ -1025,28 +889,25 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
1025
889
|
if (!onBucketClick) {
|
|
1026
890
|
return;
|
|
1027
891
|
}
|
|
1028
|
-
const rowIndex: number | null =
|
|
892
|
+
const rowIndex: number | null = getChartRowIndex(data, index, chartState);
|
|
1029
893
|
if (rowIndex === null) {
|
|
1030
894
|
return;
|
|
1031
895
|
}
|
|
1032
|
-
const bucketStart: Date | null = getBucketDateAtIndex(rowIndex);
|
|
1033
|
-
if (!bucketStart) {
|
|
1034
|
-
return;
|
|
1035
|
-
}
|
|
1036
896
|
/*
|
|
1037
897
|
* Cover the full bucket: width from adjacent row dates, the
|
|
1038
898
|
* same derivation drag-to-select uses.
|
|
1039
899
|
*/
|
|
1040
|
-
const
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
900
|
+
const bucket: ChartBucketWindow | null = getChartBucketWindow(
|
|
901
|
+
data,
|
|
902
|
+
rowIndex,
|
|
903
|
+
rowIndex,
|
|
904
|
+
);
|
|
905
|
+
if (!bucket) {
|
|
906
|
+
return;
|
|
907
|
+
}
|
|
1047
908
|
onBucketClick(
|
|
1048
|
-
|
|
1049
|
-
|
|
909
|
+
bucket.start,
|
|
910
|
+
bucket.end,
|
|
1050
911
|
(data[rowIndex] || {}) as Record<string, number | string>,
|
|
1051
912
|
);
|
|
1052
913
|
}
|
|
@@ -1056,7 +917,7 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
1056
917
|
ref={ref}
|
|
1057
918
|
className={cx(
|
|
1058
919
|
"flex-1 w-full",
|
|
1059
|
-
|
|
920
|
+
rangeSelection.canSelect && "cursor-crosshair select-none",
|
|
1060
921
|
className,
|
|
1061
922
|
)}
|
|
1062
923
|
{...other}
|
|
@@ -1077,47 +938,21 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
1077
938
|
* accidentally sync with every other one.
|
|
1078
939
|
*/
|
|
1079
940
|
{...(props.syncid ? { syncId: props.syncid.toString() } : {})}
|
|
1080
|
-
{...
|
|
1081
|
-
? {
|
|
1082
|
-
onMouseDown: handleRangeSelectMouseDown,
|
|
1083
|
-
onMouseMove: handleRangeSelectMouseMove,
|
|
1084
|
-
onMouseUp: handleRangeSelectMouseUp,
|
|
1085
|
-
}
|
|
1086
|
-
: {})}
|
|
941
|
+
{...rangeSelection.chartEventProps}
|
|
1087
942
|
onClick={(chartState: RangeSelectionChartState) => {
|
|
1088
943
|
// Ignore the click that follows a drag-to-select.
|
|
1089
|
-
if (
|
|
1090
|
-
return;
|
|
1091
|
-
}
|
|
1092
|
-
if (!hasOnTimeRangeReset) {
|
|
1093
|
-
handleChartClick(chartState);
|
|
944
|
+
if (rangeSelection.isClickSuppressed()) {
|
|
1094
945
|
return;
|
|
1095
946
|
}
|
|
1096
947
|
/*
|
|
1097
|
-
*
|
|
1098
|
-
*
|
|
1099
|
-
*
|
|
1100
|
-
* dblclick clears it.
|
|
948
|
+
* With reset on, both clicks of a double-click arrive
|
|
949
|
+
* before dblclick does, and neither may pin a bucket: the
|
|
950
|
+
* second click re-arms the wait, dblclick drops it.
|
|
1101
951
|
*/
|
|
1102
|
-
|
|
1103
|
-
clearTimeout(pendingClickTimeoutRef.current);
|
|
1104
|
-
}
|
|
1105
|
-
pendingClickTimeoutRef.current = setTimeout(() => {
|
|
1106
|
-
pendingClickTimeoutRef.current = null;
|
|
952
|
+
deferredClick.run((): void => {
|
|
1107
953
|
handleChartClick(chartState);
|
|
1108
|
-
}
|
|
954
|
+
});
|
|
1109
955
|
}}
|
|
1110
|
-
{...(hasOnTimeRangeReset
|
|
1111
|
-
? {
|
|
1112
|
-
onDoubleClick: () => {
|
|
1113
|
-
if (pendingClickTimeoutRef.current !== null) {
|
|
1114
|
-
clearTimeout(pendingClickTimeoutRef.current);
|
|
1115
|
-
pendingClickTimeoutRef.current = null;
|
|
1116
|
-
}
|
|
1117
|
-
onTimeRangeReset?.();
|
|
1118
|
-
},
|
|
1119
|
-
}
|
|
1120
|
-
: {})}
|
|
1121
956
|
margin={{
|
|
1122
957
|
/*
|
|
1123
958
|
* Tick labels are 10px font with a translate(0, 6) — they
|
|
@@ -1443,10 +1278,25 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
1443
1278
|
tooltipType="none"
|
|
1444
1279
|
strokeWidth={12}
|
|
1445
1280
|
connectNulls={connectNulls}
|
|
1281
|
+
/*
|
|
1282
|
+
* The 12px band is the target. Dots here are
|
|
1283
|
+
* invisible nodes a press could land on, and an
|
|
1284
|
+
* animated redraw (after a zoom, say) swaps them
|
|
1285
|
+
* out from under a double-click.
|
|
1286
|
+
*/
|
|
1287
|
+
dot={false}
|
|
1288
|
+
activeDot={false}
|
|
1289
|
+
isAnimationActive={false}
|
|
1446
1290
|
onClick={(props: any, event: any) => {
|
|
1447
1291
|
event.stopPropagation();
|
|
1292
|
+
// A drag's trailing click toggles nothing.
|
|
1293
|
+
if (rangeSelection.isClickSuppressed()) {
|
|
1294
|
+
return;
|
|
1295
|
+
}
|
|
1448
1296
|
const { name } = props;
|
|
1449
|
-
|
|
1297
|
+
deferredClick.run((): void => {
|
|
1298
|
+
onCategoryClick(name);
|
|
1299
|
+
});
|
|
1450
1300
|
}}
|
|
1451
1301
|
/>
|
|
1452
1302
|
);
|
|
@@ -1499,7 +1349,7 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
1499
1349
|
// Never let an exemplar click also pin a bucket.
|
|
1500
1350
|
stopChartEventPropagation(...args);
|
|
1501
1351
|
// Ignore the click that follows a drag-to-select.
|
|
1502
|
-
if (
|
|
1352
|
+
if (rangeSelection.isClickSuppressed()) {
|
|
1503
1353
|
return;
|
|
1504
1354
|
}
|
|
1505
1355
|
props.onExemplarClick?.(exemplar.original);
|
|
@@ -1521,10 +1371,11 @@ const LineChart: React.ForwardRefExoticComponent<
|
|
|
1521
1371
|
},
|
|
1522
1372
|
)}
|
|
1523
1373
|
{/* Live drag-to-select highlight */}
|
|
1524
|
-
{
|
|
1374
|
+
{rangeSelection.selectionStartLabel &&
|
|
1375
|
+
rangeSelection.selectionEndLabel ? (
|
|
1525
1376
|
<ReferenceArea
|
|
1526
|
-
x1={
|
|
1527
|
-
x2={
|
|
1377
|
+
x1={rangeSelection.selectionStartLabel}
|
|
1378
|
+
x2={rangeSelection.selectionEndLabel}
|
|
1528
1379
|
fill="rgba(99,102,241,0.12)"
|
|
1529
1380
|
stroke="rgba(99,102,241,0.5)"
|
|
1530
1381
|
strokeWidth={1}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* How long a chart holds a single click open, waiting to see whether it is
|
|
3
5
|
* really the first half of a double-click.
|
|
@@ -11,3 +13,215 @@
|
|
|
11
13
|
* feels immediate. Charts with no reset handler skip the wait entirely.
|
|
12
14
|
*/
|
|
13
15
|
export const DOUBLE_CLICK_DISAMBIGUATION_MS: number = 250;
|
|
16
|
+
|
|
17
|
+
export interface DeferredChartClick {
|
|
18
|
+
/*
|
|
19
|
+
* Runs a click's action: at once while no double-click is on offer,
|
|
20
|
+
* else once DOUBLE_CLICK_DISAMBIGUATION_MS pass with no dblclick. A
|
|
21
|
+
* later click replaces a pending one.
|
|
22
|
+
*/
|
|
23
|
+
run: (action: () => void) => void;
|
|
24
|
+
// For the chart's dblclick: drops the clicks it was made of.
|
|
25
|
+
cancel: () => void;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Holds every click action on a chart's plot (a bucket click, a series,
|
|
30
|
+
* dot or bar toggle) open while a double-click reset is on offer, so a
|
|
31
|
+
* double-click is not also two clicks.
|
|
32
|
+
*
|
|
33
|
+
* Holding them also keeps the chart from re-rendering between the two
|
|
34
|
+
* clicks and the dblclick. Chrome sends dblclick to the node the second
|
|
35
|
+
* click landed on, straight after that click; an action that re-renders
|
|
36
|
+
* the chart there (a series toggle - recharts re-keys a line's path when
|
|
37
|
+
* its props change) takes that node out of the page first, the dblclick
|
|
38
|
+
* never reaches the chart, and the zoom is not reset.
|
|
39
|
+
*/
|
|
40
|
+
export function useDeferredChartClick(isArmed: boolean): DeferredChartClick {
|
|
41
|
+
const pendingClickRef: React.MutableRefObject<ReturnType<
|
|
42
|
+
typeof setTimeout
|
|
43
|
+
> | null> = React.useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
44
|
+
|
|
45
|
+
const cancel: () => void = React.useCallback((): void => {
|
|
46
|
+
if (pendingClickRef.current !== null) {
|
|
47
|
+
clearTimeout(pendingClickRef.current);
|
|
48
|
+
pendingClickRef.current = null;
|
|
49
|
+
}
|
|
50
|
+
}, []);
|
|
51
|
+
|
|
52
|
+
React.useEffect(() => {
|
|
53
|
+
return cancel;
|
|
54
|
+
}, [cancel]);
|
|
55
|
+
|
|
56
|
+
const run: (action: () => void) => void = React.useCallback(
|
|
57
|
+
(action: () => void): void => {
|
|
58
|
+
if (!isArmed) {
|
|
59
|
+
action();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
cancel();
|
|
63
|
+
pendingClickRef.current = setTimeout(() => {
|
|
64
|
+
pendingClickRef.current = null;
|
|
65
|
+
action();
|
|
66
|
+
}, DOUBLE_CLICK_DISAMBIGUATION_MS);
|
|
67
|
+
},
|
|
68
|
+
[isArmed, cancel],
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return React.useMemo((): DeferredChartClick => {
|
|
72
|
+
return { run: run, cancel: cancel };
|
|
73
|
+
}, [run, cancel]);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* The part of a press or release a chart's handlers read. recharts hands a
|
|
78
|
+
* chart-level mouse handler the React event as its second argument.
|
|
79
|
+
*/
|
|
80
|
+
export interface ChartPointerEvent {
|
|
81
|
+
// The browser's click count: 2 on both halves of a double-click's second click.
|
|
82
|
+
detail?: number | undefined;
|
|
83
|
+
clientX?: number | undefined;
|
|
84
|
+
button?: number | undefined;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Whether a press is the second of a double-click, by the browser's own
|
|
89
|
+
* count (MouseEvent.detail), so the platform's double-click time and
|
|
90
|
+
* distance decide, exactly as they decide when `dblclick` is sent: at a
|
|
91
|
+
* count of 2, not at the third press of a triple-click.
|
|
92
|
+
*/
|
|
93
|
+
export function isSecondPressOfDoubleClick(
|
|
94
|
+
event?: ChartPointerEvent | null,
|
|
95
|
+
): boolean {
|
|
96
|
+
if (!event || event.detail !== 2) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Only the main button: a right-click opens a context menu.
|
|
101
|
+
return !event.button;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface DoubleClickReset {
|
|
105
|
+
/*
|
|
106
|
+
* For every press on the chart. True when the press is the second of a
|
|
107
|
+
* double-click while a reset is on offer: that press IS the reset, so
|
|
108
|
+
* it must neither start a selection nor count as a click.
|
|
109
|
+
*/
|
|
110
|
+
onPress: (event?: ChartPointerEvent | null) => boolean;
|
|
111
|
+
/*
|
|
112
|
+
* For the release of a press on the chart, or heard by the page. True
|
|
113
|
+
* when it ended the reset press, which the caller must then not handle
|
|
114
|
+
* as anything else.
|
|
115
|
+
*/
|
|
116
|
+
onRelease: (event?: ChartPointerEvent | null) => boolean;
|
|
117
|
+
/*
|
|
118
|
+
* Whether a reset is armed for the next task: true from the release of
|
|
119
|
+
* the reset press until it runs or a dblclick does it first. False when
|
|
120
|
+
* that release was a fresh click's (see onRelease).
|
|
121
|
+
*/
|
|
122
|
+
willReset: () => boolean;
|
|
123
|
+
// The chart's dblclick handler.
|
|
124
|
+
onDoubleClick: () => void;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Double-click to reset, without depending on the browser's `dblclick`
|
|
129
|
+
* arriving.
|
|
130
|
+
*
|
|
131
|
+
* Chrome sends `dblclick` to the node the second click landed on, straight
|
|
132
|
+
* after that click, and sends neither when that node left the page during
|
|
133
|
+
* the press. A chart re-renders under a press whenever fresh data lands:
|
|
134
|
+
* recharts re-keys a histogram's bars and a line's path when their data
|
|
135
|
+
* changes. And fresh data lands right after a zoom - the very moment a
|
|
136
|
+
* reader double-clicks to undo it - so the reset was lost at random, and
|
|
137
|
+
* the chart stayed zoomed (issue #4116).
|
|
138
|
+
*
|
|
139
|
+
* The second press itself always arrives, counted: MouseEvent.detail is 2
|
|
140
|
+
* whatever becomes of the node it landed on. Its release arms a reset for
|
|
141
|
+
* the next task. Chrome sends the release's click and `dblclick` before
|
|
142
|
+
* then, and the `dblclick` resets and stands the fallback down, so a
|
|
143
|
+
* double-click that keeps its `dblclick` resets exactly as it always has,
|
|
144
|
+
* and one that lost it still resets.
|
|
145
|
+
*
|
|
146
|
+
* `reset` is read when the reset happens, so a chart can hand a new one
|
|
147
|
+
* every render; with none, there is no reset on offer.
|
|
148
|
+
*/
|
|
149
|
+
export function useDoubleClickReset(
|
|
150
|
+
reset: (() => void) | undefined,
|
|
151
|
+
): DoubleClickReset {
|
|
152
|
+
const resetRef: React.MutableRefObject<(() => void) | undefined> =
|
|
153
|
+
React.useRef<(() => void) | undefined>(reset);
|
|
154
|
+
resetRef.current = reset;
|
|
155
|
+
|
|
156
|
+
// Whether the press in progress is the second of a double-click.
|
|
157
|
+
const isResetPressRef: React.MutableRefObject<boolean> =
|
|
158
|
+
React.useRef<boolean>(false);
|
|
159
|
+
const fallbackRef: React.MutableRefObject<ReturnType<
|
|
160
|
+
typeof setTimeout
|
|
161
|
+
> | null> = React.useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
162
|
+
|
|
163
|
+
const standDown: () => void = React.useCallback((): void => {
|
|
164
|
+
if (fallbackRef.current !== null) {
|
|
165
|
+
clearTimeout(fallbackRef.current);
|
|
166
|
+
fallbackRef.current = null;
|
|
167
|
+
}
|
|
168
|
+
}, []);
|
|
169
|
+
|
|
170
|
+
React.useEffect(() => {
|
|
171
|
+
return standDown;
|
|
172
|
+
}, [standDown]);
|
|
173
|
+
|
|
174
|
+
const onPress: (event?: ChartPointerEvent | null) => boolean =
|
|
175
|
+
React.useCallback((event?: ChartPointerEvent | null): boolean => {
|
|
176
|
+
isResetPressRef.current =
|
|
177
|
+
Boolean(resetRef.current) && isSecondPressOfDoubleClick(event);
|
|
178
|
+
return isResetPressRef.current;
|
|
179
|
+
}, []);
|
|
180
|
+
|
|
181
|
+
const onRelease: (event?: ChartPointerEvent | null) => boolean =
|
|
182
|
+
React.useCallback(
|
|
183
|
+
(event?: ChartPointerEvent | null): boolean => {
|
|
184
|
+
if (!isResetPressRef.current) {
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
isResetPressRef.current = false;
|
|
189
|
+
|
|
190
|
+
/*
|
|
191
|
+
* The release of a fresh single click cannot end the second press:
|
|
192
|
+
* that press's own release never came (the window lost focus while
|
|
193
|
+
* the button was down, say), and this one belongs to a later click.
|
|
194
|
+
* It ends the reset press without resetting.
|
|
195
|
+
*/
|
|
196
|
+
if (event && event.detail === 1) {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
standDown();
|
|
201
|
+
fallbackRef.current = setTimeout(() => {
|
|
202
|
+
fallbackRef.current = null;
|
|
203
|
+
resetRef.current?.();
|
|
204
|
+
}, 0);
|
|
205
|
+
return true;
|
|
206
|
+
},
|
|
207
|
+
[standDown],
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
const willReset: () => boolean = React.useCallback((): boolean => {
|
|
211
|
+
return fallbackRef.current !== null;
|
|
212
|
+
}, []);
|
|
213
|
+
|
|
214
|
+
const onDoubleClick: () => void = React.useCallback((): void => {
|
|
215
|
+
standDown();
|
|
216
|
+
resetRef.current?.();
|
|
217
|
+
}, [standDown]);
|
|
218
|
+
|
|
219
|
+
return React.useMemo((): DoubleClickReset => {
|
|
220
|
+
return {
|
|
221
|
+
onPress: onPress,
|
|
222
|
+
onRelease: onRelease,
|
|
223
|
+
willReset: willReset,
|
|
224
|
+
onDoubleClick: onDoubleClick,
|
|
225
|
+
};
|
|
226
|
+
}, [onPress, onRelease, willReset, onDoubleClick]);
|
|
227
|
+
}
|