Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions src/aria/menu/menu.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,17 @@ describe('Menu Trigger Pattern', () => {
expect(isExpanded()).toBe(false);
});
});

describe('Selection', () => {
beforeEach(() => setupMenu());

it('should select an item on click', () => {
spyOn(fixture.componentInstance, 'itemSelected');
click(getTrigger());
click(getItem('Apple')!);
expect(fixture.componentInstance.itemSelected).toHaveBeenCalledWith('Apple');
});
});
});

describe('Menu Bar Pattern', () => {
Expand Down Expand Up @@ -987,7 +998,7 @@ class StandaloneMenuExample {
template: `
<button ngMenuTrigger [menu]="menu">Open menu</button>
<div ngMenu [expansionDelay]="0" #menu="ngMenu">
<div ngMenu [expansionDelay]="0" #menu="ngMenu" (itemSelected)="itemSelected($event)">
<ng-template ngMenuContent>
<div ngMenuItem value='Apple' searchTerm='Apple'>Apple</div>
<div ngMenuItem value='Banana' searchTerm='Banana'>Banana</div>
Expand All @@ -1007,7 +1018,9 @@ class StandaloneMenuExample {
`,
imports: [Menu, MenuItem, MenuTrigger, MenuContent],
})
class MenuTriggerExample {}
class MenuTriggerExample {
itemSelected(value: string) {}
}

@Component({
template: `
Expand Down
31 changes: 13 additions & 18 deletions src/aria/private/menu/menu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -357,26 +357,21 @@ export class MenuPattern<V> {

/** Submits the menu. */
submit(item = this.inputs.activeItem()) {
const root = this.root();

if (item && !item.disabled()) {
const isMenu = root instanceof MenuPattern;
const isMenuBar = root instanceof MenuBarPattern;
const isMenuTrigger = root instanceof MenuTriggerPattern;

if (!item.submenu() && isMenuTrigger) {
root.close({refocus: true});
}
if (!item || item.disabled() || item.submenu()) {
return;
}

if (!item.submenu() && isMenuBar) {
root.close();
root?.inputs.itemSelected?.(item.value());
}
const root = this.root();

if (!item.submenu() && isMenu) {
root.inputs.activeItem()?.close({refocus: true});
root?.inputs.itemSelected?.(item.value());
}
if (root instanceof MenuTriggerPattern) {
root.close({refocus: true});
root?.inputs.menu()?.inputs.itemSelected?.(item.value());
} else if (root instanceof MenuBarPattern) {
root.close();
root?.inputs.itemSelected?.(item.value());
} else if (root instanceof MenuPattern) {
root.inputs.activeItem()?.close({refocus: true});
root?.inputs.itemSelected?.(item.value());
}
}

Expand Down
Loading