diff --git a/packages/elements/src/card/__test__/card.test.js b/packages/elements/src/card/__test__/card.test.js index 26b80e202e..3a5838dd97 100644 --- a/packages/elements/src/card/__test__/card.test.js +++ b/packages/elements/src/card/__test__/card.test.js @@ -10,7 +10,7 @@ import '@formatjs/intl-pluralrules/locale-data/en'; import '@refinitiv-ui/elements/card'; import '@refinitiv-ui/elemental-theme/light/ef-card'; -const menuData = [{ label: 'Spain', value: 'Spain' }, { label: 'France',value: 'France', disabled: true }, { label: 'Italy', value: 'Italy' }]; +const menuData = [{ label: 'Spain', value: 'Spain' }, { label: 'France',value: 'France', disabled: true }, { label: 'Italy', value: 'Italy' }, { label: 'Other', items: [{ label: 'Thailand', value: 'Thailand' }] }]; describe('card/Card', () => { describe('DOM structure', () => { @@ -82,6 +82,36 @@ describe('card/Card', () => { await oneEvent(el, 'item-trigger'); expect(menu.opened).to.equal(false, 'Menu should close when item is selected'); }); + it('Should open menu and not close when clicked on non value item', async function () { + const el = await fixture('Card'); + el.config = { + menu: { + data: menuData + } + }; + await elementUpdated(el); + + const openMenu = el.openMenuElement; + const menu = el.menuElement; + + expect(openMenu, 'Open menu button element does not exist').to.exist; + expect(menu, 'Menu element does not exist').to.exist; + + openMenu.click(); + + await elementUpdated(el); + expect(menu.opened).to.equal(true, 'Menu should open on button click'); + + const item = menu.shadowRoot.querySelectorAll('ef-item')[3]; + + expect(item, 'Menu config is not passed correctly').to.exist; + + setTimeout(() => { + item.click(); + }); + await oneEvent(el, 'item-trigger'); + expect(menu.opened).to.equal(true, 'Menu should still open'); + }); }); describe('Accessibility', () => { diff --git a/packages/elements/src/card/index.ts b/packages/elements/src/card/index.ts index dcf08bc7cc..15f74934b6 100644 --- a/packages/elements/src/card/index.ts +++ b/packages/elements/src/card/index.ts @@ -15,7 +15,7 @@ import { isSlotEmpty } from '@refinitiv-ui/utils/is-slot-empty.js'; import type { Button } from '../button'; import type { OverlayMenu, OverlayMenuData } from '../overlay-menu'; import type { CardConfig } from './helpers/types'; -import type { OpenedChangedEvent } from '../events'; +import type { OpenedChangedEvent, ItemTriggerEvent } from '../events'; import '../label/index.js'; import '../button/index.js'; import '../overlay-menu/index.js'; @@ -155,10 +155,11 @@ export class Card extends BasicElement { /** * Close menu + * @param event ItemTriggerEvent * @returns {void} */ - private closeMenu (): void { - if (this.menuElement?.opened) { + private closeMenu (event: ItemTriggerEvent): void { + if (this.menuElement?.opened && event.detail.value) { this.menuElement.opened = false; this.menuOpened = false; } @@ -225,8 +226,7 @@ export class Card extends BasicElement { */ protected firstUpdated (changedProperties: PropertyValues): void { super.firstUpdated(changedProperties); - - this.addEventListener('item-trigger', this.closeMenu); // Here to cover nested menus + this.addEventListener('item-trigger', (event) => this.closeMenu(event as ItemTriggerEvent)); // Here to cover nested menus } /** diff --git a/packages/elements/src/overlay-menu/index.ts b/packages/elements/src/overlay-menu/index.ts index 1108d6a924..6bca49fbe3 100644 --- a/packages/elements/src/overlay-menu/index.ts +++ b/packages/elements/src/overlay-menu/index.ts @@ -1029,7 +1029,7 @@ export class OverlayMenu extends Overlay { .label=${label} .subLabel=${subLabel} .icon=${icon} - .value=${value} + .value=${ifDefined(value || undefined)} .for=${ifDefined(forMenu || undefined)}> `; }