From 02938d35f3a8cb0a5d659ee5b69fb38fd43394c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Mar 2026 14:49:17 +0000 Subject: [PATCH 1/5] Initial plan From e695af3a20f82bc87f6a260743dc4c2f4d49294b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Mar 2026 14:52:15 +0000 Subject: [PATCH 2/5] fix: rename aria-label from 'Open' to 'Actions' for agent policies table actions button Co-authored-by: bhavyarm <7074629+bhavyarm@users.noreply.github.com> --- .../shared/fleet/public/components/context_menu_actions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx b/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx index 53ca16a366f54..75ebdb2c98994 100644 --- a/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx +++ b/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx @@ -63,7 +63,7 @@ export const ContextMenuActions = React.memo(({ button, onChange, isOpen, iconType="boxesHorizontal" onClick={handleToggleMenu} aria-label={i18n.translate('xpack.fleet.genericActionsMenuText', { - defaultMessage: 'Open', + defaultMessage: 'Actions', })} data-test-subj="agentActionsBtn" /> From 64a4792f9b2e646cbcb8be07e470d960544ab1bf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 18:43:38 +0000 Subject: [PATCH 3/5] fix: add row-specific aria-labels to ContextMenuActions for better screen reader context Agent-Logs-Url: https://github.com/elastic/kibana/sessions/83cf3322-0f30-4e5e-bdfc-f7a25c429a59 Co-authored-by: alexwizp <20072247+alexwizp@users.noreply.github.com> --- .../agent_policy/components/actions_menu.tsx | 9 +++++++++ .../components/data_stream_row_actions.tsx | 16 ++++++++++++---- .../public/components/context_menu_actions.tsx | 12 ++++++++---- .../components/package_policy_actions_menu.tsx | 5 +++++ 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx b/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx index d85bb4ac27c7e..b8ba4943da106 100644 --- a/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx +++ b/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx @@ -7,6 +7,7 @@ import React, { memo, useState, useMemo, useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; import { EuiContextMenuItem, EuiPortal } from '@elastic/eui'; import type { AgentPolicy } from '../../../types'; @@ -88,6 +89,13 @@ export const AgentPolicyActionMenu = memo<{ } }, [onCancelEnrollment, setIsEnrollmentFlyoutOpen]); + const actionsAriaLabel = fullButton + ? undefined + : i18n.translate('xpack.fleet.agentPolicyActionMenu.actionsAriaLabel', { + defaultMessage: 'Actions for {policyName}', + values: { policyName: agentPolicy.name }, + }); + return ( {(copyAgentPolicyPrompt) => { @@ -350,6 +358,7 @@ export const AgentPolicyActionMenu = memo<{ (({ datastre const { dashboards } = datastream; const dashboardLocator = useDashboardLocator(); + const actionsAriaLabel = i18n.translate( + 'xpack.fleet.dataStreamList.rowActionsAriaLabel', + { + defaultMessage: 'Actions for {dataset}', + values: { dataset: datastream.dataset }, + } + ); + const actionNameSingular = ( (({ datastre ], }, ]; - return ; + return ; } if (!dashboards || dashboards.length === 0) { @@ -74,7 +82,7 @@ export const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastre ], }, ]; - return ; + return ; } if (dashboards.length === 1) { @@ -91,7 +99,7 @@ export const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastre ], }, ]; - return ; + return ; } const panelItems = [ @@ -119,5 +127,5 @@ export const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastre }, ]; - return ; + return ; }); diff --git a/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx b/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx index 19ef10018f7cc..c42409a65a258 100644 --- a/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx +++ b/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx @@ -27,6 +27,7 @@ type Props = { isOpen?: boolean; isManaged?: boolean; onChange?: (isOpen: boolean) => void; + ariaLabel?: string; } & ( | { items: EuiContextMenuPanelProps['items']; @@ -36,7 +37,7 @@ type Props = { } ); -export const ContextMenuActions = React.memo(({ button, onChange, isOpen, ...props }) => { +export const ContextMenuActions = React.memo(({ button, onChange, isOpen, ariaLabel, ...props }) => { const [isOpenState, setIsOpenState] = useState(false); const handleCloseMenu = useCallback(() => { if (onChange) { @@ -62,9 +63,12 @@ export const ContextMenuActions = React.memo(({ button, onChange, isOpen, isDisabled={props.isManaged} iconType="boxesVertical" onClick={handleToggleMenu} - aria-label={i18n.translate('xpack.fleet.genericActionsMenuText', { - defaultMessage: 'Actions', - })} + aria-label={ + ariaLabel ?? + i18n.translate('xpack.fleet.genericActionsMenuText', { + defaultMessage: 'Actions', + }) + } data-test-subj="agentActionsBtn" /> ); diff --git a/x-pack/platform/plugins/shared/fleet/public/components/package_policy_actions_menu.tsx b/x-pack/platform/plugins/shared/fleet/public/components/package_policy_actions_menu.tsx index e23581502803c..9b2c7555924ac 100644 --- a/x-pack/platform/plugins/shared/fleet/public/components/package_policy_actions_menu.tsx +++ b/x-pack/platform/plugins/shared/fleet/public/components/package_policy_actions_menu.tsx @@ -8,6 +8,7 @@ import React, { useMemo, useState } from 'react'; import { EuiContextMenuItem, EuiPortal } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; import { EXCLUDED_FROM_PACKAGE_POLICY_COPY_PACKAGES } from '../../common/constants'; import type { AgentPolicy, InMemoryPackagePolicy } from '../types'; @@ -250,6 +251,10 @@ export const PackagePolicyActionsMenu: React.FunctionComponent<{ isOpen={isActionsMenuOpen} items={menuItems} onChange={(open) => setIsActionsMenuOpen(open)} + ariaLabel={i18n.translate('xpack.fleet.packagePolicyActionsMenu.actionsAriaLabel', { + defaultMessage: 'Actions for {policyName}', + values: { policyName: packagePolicy.name }, + })} /> ); From af139b368dc428ae66b8f391f4f35b4b551272cf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Mar 2026 10:01:32 +0000 Subject: [PATCH 4/5] fix: rename ariaLabel prop to 'aria-label' on ContextMenuActions Agent-Logs-Url: https://github.com/elastic/kibana/sessions/942291d1-c771-4535-8b03-97ecb8f411dd Co-authored-by: alexwizp <20072247+alexwizp@users.noreply.github.com> --- .../sections/agent_policy/components/actions_menu.tsx | 2 +- .../list_page/components/data_stream_row_actions.tsx | 8 ++++---- .../fleet/public/components/context_menu_actions.tsx | 4 ++-- .../public/components/package_policy_actions_menu.tsx | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx b/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx index b8ba4943da106..08c28d5481054 100644 --- a/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx +++ b/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/agent_policy/components/actions_menu.tsx @@ -358,7 +358,7 @@ export const AgentPolicyActionMenu = memo<{ (({ datastre ], }, ]; - return ; + return ; } if (!dashboards || dashboards.length === 0) { @@ -82,7 +82,7 @@ export const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastre ], }, ]; - return ; + return ; } if (dashboards.length === 1) { @@ -99,7 +99,7 @@ export const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastre ], }, ]; - return ; + return ; } const panelItems = [ @@ -127,5 +127,5 @@ export const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastre }, ]; - return ; + return ; }); diff --git a/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx b/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx index c42409a65a258..7eef88b874b5b 100644 --- a/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx +++ b/x-pack/platform/plugins/shared/fleet/public/components/context_menu_actions.tsx @@ -27,7 +27,7 @@ type Props = { isOpen?: boolean; isManaged?: boolean; onChange?: (isOpen: boolean) => void; - ariaLabel?: string; + 'aria-label'?: string; } & ( | { items: EuiContextMenuPanelProps['items']; @@ -37,7 +37,7 @@ type Props = { } ); -export const ContextMenuActions = React.memo(({ button, onChange, isOpen, ariaLabel, ...props }) => { +export const ContextMenuActions = React.memo(({ button, onChange, isOpen, 'aria-label': ariaLabel, ...props }) => { const [isOpenState, setIsOpenState] = useState(false); const handleCloseMenu = useCallback(() => { if (onChange) { diff --git a/x-pack/platform/plugins/shared/fleet/public/components/package_policy_actions_menu.tsx b/x-pack/platform/plugins/shared/fleet/public/components/package_policy_actions_menu.tsx index 9b2c7555924ac..e7ba1b87a8a98 100644 --- a/x-pack/platform/plugins/shared/fleet/public/components/package_policy_actions_menu.tsx +++ b/x-pack/platform/plugins/shared/fleet/public/components/package_policy_actions_menu.tsx @@ -251,7 +251,7 @@ export const PackagePolicyActionsMenu: React.FunctionComponent<{ isOpen={isActionsMenuOpen} items={menuItems} onChange={(open) => setIsActionsMenuOpen(open)} - ariaLabel={i18n.translate('xpack.fleet.packagePolicyActionsMenu.actionsAriaLabel', { + aria-label={i18n.translate('xpack.fleet.packagePolicyActionsMenu.actionsAriaLabel', { defaultMessage: 'Actions for {policyName}', values: { policyName: packagePolicy.name }, })} From 6ab234545aa46f66fc9ae5fd480aad1d8b97ba8a Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 27 Mar 2026 11:09:06 +0000 Subject: [PATCH 5/5] Changes from node scripts/eslint_all_files --no-cache --fix --- .../components/data_stream_row_actions.tsx | 11 +- .../components/context_menu_actions.tsx | 124 +++++++++--------- 2 files changed, 67 insertions(+), 68 deletions(-) diff --git a/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/data_stream/list_page/components/data_stream_row_actions.tsx b/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/data_stream/list_page/components/data_stream_row_actions.tsx index 12065d795b815..4094f089cbd82 100644 --- a/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/data_stream/list_page/components/data_stream_row_actions.tsx +++ b/x-pack/platform/plugins/shared/fleet/public/applications/fleet/sections/data_stream/list_page/components/data_stream_row_actions.tsx @@ -19,13 +19,10 @@ export const DataStreamRowActions = memo<{ datastream: DataStream }>(({ datastre const { dashboards } = datastream; const dashboardLocator = useDashboardLocator(); - const actionsAriaLabel = i18n.translate( - 'xpack.fleet.dataStreamList.rowActionsAriaLabel', - { - defaultMessage: 'Actions for {dataset}', - values: { dataset: datastream.dataset }, - } - ); + const actionsAriaLabel = i18n.translate('xpack.fleet.dataStreamList.rowActionsAriaLabel', { + defaultMessage: 'Actions for {dataset}', + values: { dataset: datastream.dataset }, + }); const actionNameSingular = ( (({ button, onChange, isOpen, 'aria-label': ariaLabel, ...props }) => { - const [isOpenState, setIsOpenState] = useState(false); - const handleCloseMenu = useCallback(() => { - if (onChange) { - onChange(false); - } else { - setIsOpenState(false); - } - }, [setIsOpenState, onChange]); - const handleToggleMenu = useCallback(() => { - if (onChange) { - onChange(!isOpen); - } else { - setIsOpenState(!isOpenState); - } - }, [isOpenState, onChange, isOpen]); - - const actionButton = button ? ( - - {button.children} - - ) : ( - ( + ({ button, onChange, isOpen, 'aria-label': ariaLabel, ...props }) => { + const [isOpenState, setIsOpenState] = useState(false); + const handleCloseMenu = useCallback(() => { + if (onChange) { + onChange(false); + } else { + setIsOpenState(false); + } + }, [setIsOpenState, onChange]); + const handleToggleMenu = useCallback(() => { + if (onChange) { + onChange(!isOpen); + } else { + setIsOpenState(!isOpenState); } - data-test-subj="agentActionsBtn" - /> - ); + }, [isOpenState, onChange, isOpen]); - return ( - - {actionButton} - + const actionButton = button ? ( + + {button.children} + + ) : ( + + ); + + return ( + + {actionButton} + + ) : ( + actionButton + ) + } + isOpen={isOpen === undefined ? isOpenState : isOpen} + closePopover={handleCloseMenu} + > + {'items' in props ? ( + ) : ( - actionButton - ) - } - isOpen={isOpen === undefined ? isOpenState : isOpen} - closePopover={handleCloseMenu} - > - {'items' in props ? ( - - ) : ( - - )} - - ); -}); + + )} + + ); + } +);