From ea59f0e141359127bcad87c95c7a06526e9ccf29 Mon Sep 17 00:00:00 2001 From: Kelvin Tan Date: Mon, 27 Apr 2026 16:32:04 -0400 Subject: [PATCH 01/46] initial impl --- .../entity_card_flyout_overview_canvas.tsx | 37 +-- .../explore/hosts/pages/details/index.tsx | 4 +- .../left/components/host_details.test.tsx | 4 +- .../left/components/host_details.tsx | 2 +- .../entity_details/host_right/index.test.tsx | 2 +- .../entity_details/host_right/index.tsx | 50 ++-- .../components/observed_data_section.tsx | 10 +- .../entity_details/host_right/constants.ts | 0 .../host_right/content.stories.tsx | 14 +- .../entity_details/host_right/content.tsx | 17 +- .../host_right/fields/basic_host_fields.tsx | 4 +- .../host_right/fields/cloud_fields.ts | 4 +- .../fields/endpoint_policy_fields.test.tsx | 2 +- .../fields/endpoint_policy_fields.tsx | 4 +- .../host_right/fields/translations.ts | 0 .../entity_details/host_right/footer.tsx | 42 +-- .../entity_details/host_right/header.test.tsx | 26 +- .../entity_details/host_right/header.tsx | 24 +- .../host_right/hooks/use_observed_host.ts | 4 +- .../hooks/use_observed_host_fields.test.ts | 2 +- .../hooks/use_observed_host_fields.ts | 6 +- .../entity_details/host_right/index.test.tsx | 70 +++++ .../entity_details/host_right/index.tsx | 275 ++++++++++++++++++ 23 files changed, 482 insertions(+), 121 deletions(-) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/components/observed_data_section.tsx (92%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/constants.ts (100%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/content.stories.tsx (92%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/content.tsx (89%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/fields/basic_host_fields.tsx (91%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/fields/cloud_fields.ts (82%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/fields/endpoint_policy_fields.test.tsx (95%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/fields/endpoint_policy_fields.tsx (92%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/fields/translations.ts (100%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/footer.tsx (53%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/header.test.tsx (81%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/header.tsx (87%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/hooks/use_observed_host.ts (96%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/hooks/use_observed_host_fields.test.ts (98%) rename x-pack/solutions/security/plugins/security_solution/public/{flyout => flyout_v2}/entity_details/host_right/hooks/use_observed_host_fields.ts (77%) create mode 100644 x-pack/solutions/security/plugins/security_solution/public/flyout_v2/entity_details/host_right/index.test.tsx create mode 100644 x-pack/solutions/security/plugins/security_solution/public/flyout_v2/entity_details/host_right/index.tsx diff --git a/x-pack/solutions/security/plugins/security_solution/public/agent_builder/components/entity_card_flyout_overview_canvas.tsx b/x-pack/solutions/security/plugins/security_solution/public/agent_builder/components/entity_card_flyout_overview_canvas.tsx index 9b4c3673e4308..66e90ac7d2dc4 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/agent_builder/components/entity_card_flyout_overview_canvas.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/agent_builder/components/entity_card_flyout_overview_canvas.tsx @@ -33,9 +33,9 @@ import { type RiskSeverity, } from '../../../common/search_strategy'; import { useUiSetting, useKibana } from '../../common/lib/kibana'; -import { HostPanelContent } from '../../flyout/entity_details/host_right/content'; -import { HostPanelHeader } from '../../flyout/entity_details/host_right/header'; -import { useObservedHost } from '../../flyout/entity_details/host_right/hooks/use_observed_host'; +import { Content as HostPanelContent } from '../../flyout_v2/entity_details/host_right/content'; +import { Header as HostPanelHeader } from '../../flyout_v2/entity_details/host_right/header'; +import { useObservedHost } from '../../flyout_v2/entity_details/host_right/hooks/use_observed_host'; import { EntityType } from '../../../common/entity_analytics/types'; import { buildRiskScoreStateFromEntityRecord, @@ -47,8 +47,9 @@ import { mergeLegacyIdentityWhenStoreEntityMissing, type IdentityFields, } from '../../flyout/document_details/shared/utils'; -import { HOST_PANEL_RISK_SCORE_QUERY_ID } from '../../flyout/entity_details/host_right/constants'; +import { HOST_PANEL_RISK_SCORE_QUERY_ID } from '../../flyout_v2/entity_details/host_right/constants'; import { FlyoutBody } from '../../flyout/shared/components/flyout_body'; +import { FlyoutHeader } from '../../flyout/shared/components/flyout_header'; import { useEntityPanelTabs, TABLE_TAB_ID, @@ -379,19 +380,21 @@ const HostEntityFlyoutOverviewCanvas: React.FC<{ return ( <> - + + + {observedHost.entityRecord && ( children({ anomaliesData: mockAnomalies, isLoadingAnomaliesData: false, jobNameById: {} }), })); -jest.mock('../../../entity_details/host_right/hooks/use_observed_host'); +jest.mock('../../../../flyout_v2/entity_details/host_right/hooks/use_observed_host'); const mockUseObservedHost = useObservedHost as jest.Mock; jest.mock('../../../../common/containers/related_entities/related_users'); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx index 1c43bb34b2007..49356288e6c97 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/document_details/left/components/host_details.tsx @@ -93,7 +93,7 @@ import { useSecurityDefaultPatterns } from '../../../../data_view_manager/hooks/ import { sourcererSelectors } from '../../../../sourcerer/store'; import { useSpaceId } from '../../../../common/hooks/use_space_id'; import type { EntityFromStoreResult } from '../../../entity_details/shared/hooks/use_entity_from_store'; -import { useObservedHost } from '../../../entity_details/host_right/hooks/use_observed_host'; +import { useObservedHost } from '../../../../flyout_v2/entity_details/host_right/hooks/use_observed_host'; import { buildRiskScoreStateFromEntityRecord, getRiskFromEntityRecord, diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/entity_details/host_right/index.test.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/entity_details/host_right/index.test.tsx index c527a56146561..8ff718dde943c 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/entity_details/host_right/index.test.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/entity_details/host_right/index.test.tsx @@ -38,7 +38,7 @@ jest.mock('../../../entity_analytics/api/hooks/use_risk_score', () => ({ const mockedUseObservedHost = jest.fn().mockReturnValue(mockObservedHostData); -jest.mock('./hooks/use_observed_host', () => ({ +jest.mock('../../../flyout_v2/entity_details/host_right/hooks/use_observed_host', () => ({ useObservedHost: () => mockedUseObservedHost(), })); diff --git a/x-pack/solutions/security/plugins/security_solution/public/flyout/entity_details/host_right/index.tsx b/x-pack/solutions/security/plugins/security_solution/public/flyout/entity_details/host_right/index.tsx index 7523eb690e333..b9c4d5653a746 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/flyout/entity_details/host_right/index.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/flyout/entity_details/host_right/index.tsx @@ -11,7 +11,7 @@ import { useHasMisconfigurations } from '@kbn/cloud-security-posture/src/hooks/u import { useHasVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_has_vulnerabilities'; import { TableId } from '@kbn/securitysolution-data-table'; import { FF_ENABLE_ENTITY_STORE_V2, useEntityStoreEuidApi } from '@kbn/entity-store/public'; -import { EuiSpacer } from '@elastic/eui'; +import { EuiFlyoutFooter, EuiSpacer } from '@elastic/eui'; import { useUpdateAssetCriticality } from '../../../entity_analytics/api/hooks/use_update_asset_criticality'; import { buildEuidCspPreviewOptions } from '../../../cloud_security_posture/utils/build_euid_csp_preview_options'; import { useNonClosedAlerts } from '../../../cloud_security_posture/hooks/use_non_closed_alerts'; @@ -26,14 +26,14 @@ import { useGlobalTime } from '../../../common/containers/use_global_time'; import { buildHostNamesFilter, type RiskSeverity } from '../../../../common/search_strategy'; import { useUiSetting, useKibana } from '../../../common/lib/kibana'; import { FlyoutNavigation } from '../../shared/components/flyout_navigation'; -import { HostPanelFooter } from './footer'; -import { HostPanelContent } from './content'; -import { HostPanelHeader } from './header'; +import { Footer } from '../../../flyout_v2/entity_details/host_right/footer'; +import { Content } from '../../../flyout_v2/entity_details/host_right/content'; +import { Header } from '../../../flyout_v2/entity_details/host_right/header'; import { EntityDetailsLeftPanelTab } from '../shared/components/left_panel/left_panel_header'; import { HostPreviewPanelFooter } from '../host_preview/footer'; import { useNavigateToHostDetails } from './hooks/use_navigate_to_host_details'; import { EntityType } from '../../../../common/entity_analytics/types'; -import { useObservedHost } from './hooks/use_observed_host'; +import { useObservedHost } from '../../../flyout_v2/entity_details/host_right/hooks/use_observed_host'; import { buildRiskScoreStateFromEntityRecord, getRiskFromEntityRecord, @@ -45,7 +45,11 @@ import { mergeLegacyIdentityWhenStoreEntityMissing, type IdentityFields, } from '../../document_details/shared/utils'; -import { HOST_PANEL_RISK_SCORE_QUERY_ID, HOST_PANEL_OBSERVED_HOST_QUERY_ID } from './constants'; +import { + HOST_PANEL_RISK_SCORE_QUERY_ID, + HOST_PANEL_OBSERVED_HOST_QUERY_ID, +} from '../../../flyout_v2/entity_details/host_right/constants'; +import { FlyoutHeader } from '../../shared/components/flyout_header'; import { FlyoutBody } from '../../shared/components/flyout_body'; import { useEntityPanelTabs, TABLE_TAB_ID } from '../shared/hooks/use_entity_panel_tabs'; import { EntityPanelHeaderTabs } from '../shared/components/entity_panel_tabs'; @@ -291,19 +295,21 @@ export const HostPanel = memo(function HostPanel({ isPreviewMode={isPreviewMode} isRulePreview={scopeId === TableId.rulePreview} /> - + +
+ {observedHost.entityRecord && ( ) : ( - )} {!isPreviewMode && assetInventoryEnabled && ( - + +