From e97273edded1e9a0a182490361e057b33916d7c8 Mon Sep 17 00:00:00 2001 From: Andrei Zhaleznichenka Date: Fri, 18 Oct 2024 13:12:37 +0200 Subject: [PATCH] fix: Makes button dropdown main action clickable with Enter (#2897) --- pages/button-dropdown/main-action.page.tsx | 52 ++++++++++++++----- .../__integ__/button-dropdown-events.test.ts | 19 +++++++ src/button-dropdown/internal.tsx | 36 ++++++------- 3 files changed, 75 insertions(+), 32 deletions(-) diff --git a/pages/button-dropdown/main-action.page.tsx b/pages/button-dropdown/main-action.page.tsx index cc5fe4ac24..239e17f0c6 100644 --- a/pages/button-dropdown/main-action.page.tsx +++ b/pages/button-dropdown/main-action.page.tsx @@ -1,24 +1,48 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 -import * as React from 'react'; +import React, { useState } from 'react'; -import ButtonDropdown from '~components/button-dropdown'; +import { Box, Button, ButtonDropdown, SpaceBetween } from '~components'; +import InternalButtonDropdown from '~components/button-dropdown/internal'; export default function ButtonDropdownPage() { + const [clickedButton, setClickedButton] = useState(''); return ( <> -

Button dropdown with main action

- + +

Button dropdown with main action

+ + + + setClickedButton('Launch instance from template')} + mainAction={{ text: 'Launch instance', onClick: () => setClickedButton('Launch instance') }} + ariaLabel="More launch options" + variant="primary" + /> + + setClickedButton('Launch instance (main action only)'), + }} + showMainActionOnly={true} + /> + +
{clickedButton}
+
+
); } diff --git a/src/button-dropdown/__integ__/button-dropdown-events.test.ts b/src/button-dropdown/__integ__/button-dropdown-events.test.ts index a2142b690e..59c1d28ee8 100644 --- a/src/button-dropdown/__integ__/button-dropdown-events.test.ts +++ b/src/button-dropdown/__integ__/button-dropdown-events.test.ts @@ -1,6 +1,8 @@ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 +import { BasePageObject } from '@cloudscape-design/browser-test-tools/page-objects'; import useBrowser from '@cloudscape-design/browser-test-tools/use-browser'; +import { createWrapper } from '@cloudscape-design/test-utils-core/selectors'; import ButtonDropdownPage from '../../__integ__/page-objects/button-dropdown-page'; @@ -76,4 +78,21 @@ describe('clicking on a ButtonDropdown item', () => { await expect(page.getLocation()).resolves.toEqual(oldLocation); }) ); + test( + 'main action can be pressed with Enter', + useBrowser(async browser => { + const focusBefore = createWrapper().findButton('[data-testid="focus-before"]'); + + const page = new BasePageObject(browser); + await browser.url('#/light/button-dropdown/main-action'); + await page.waitForVisible(focusBefore.toSelector()); + + await page.click(focusBefore.toSelector()); + await page.keys(['Tab', 'Enter']); + await expect(page.getElementsText('#clicked')).resolves.toEqual(['Launch instance']); + + await page.keys(['Tab', 'Tab', 'Enter']); + await expect(page.getElementsText('#clicked')).resolves.toEqual(['Launch instance (main action only)']); + }) + ); }); diff --git a/src/button-dropdown/internal.tsx b/src/button-dropdown/internal.tsx index 75357efe81..bf6f20bd41 100644 --- a/src/button-dropdown/internal.tsx +++ b/src/button-dropdown/internal.tsx @@ -230,9 +230,7 @@ const InternalButtonDropdown = React.forwardRef( {text} ); - trigger = showMainActionOnly ? ( -
{mainActionButton}
- ) : ( + trigger = (
{mainActionButton}
-
- - {children} - -
+ {!showMainActionOnly && ( +
+ + {children} + +
+ )}
); } else {