diff --git a/src/Core/Components/List/ListComponentBase.razor.cs b/src/Core/Components/List/ListComponentBase.razor.cs index 66cd251b5e..06bb5577a1 100644 --- a/src/Core/Components/List/ListComponentBase.razor.cs +++ b/src/Core/Components/List/ListComponentBase.razor.cs @@ -626,7 +626,7 @@ protected virtual async Task OnKeydownHandlerAsync(KeyboardEventArgs e) { return; } - if (!ChangeOnEnterOnly || (ChangeOnEnterOnly && e.Code == "Enter")) + if (!ChangeOnEnterOnly || (ChangeOnEnterOnly && e.Code == nameof(KeyCode.Enter))) { await item.OnClickHandlerAsync(); } diff --git a/src/Core/Components/Menu/FluentMenuItem.razor b/src/Core/Components/Menu/FluentMenuItem.razor index dadf33efc6..bb68a41ddf 100644 --- a/src/Core/Components/Menu/FluentMenuItem.razor +++ b/src/Core/Components/Menu/FluentMenuItem.razor @@ -4,13 +4,14 @@ class="@Class" style="@Style" id="@Id" - disabled="@Disabled" + disabled="@Disabled" expanded=@Expanded role="@GetRole()" checked="@Checked" @onchange="@OnChangeHandlerAsync" @onclick="@OnClickHandlerAsync" - @attributes="AdditionalAttributes"> + @attributes="AdditionalAttributes" + @onkeydown="@OnKeyDownHandlerAsync"> @Label @ChildContent @if (MenuItems != null) diff --git a/src/Core/Components/Menu/FluentMenuItem.razor.cs b/src/Core/Components/Menu/FluentMenuItem.razor.cs index 07693ff541..8c1661c903 100644 --- a/src/Core/Components/Menu/FluentMenuItem.razor.cs +++ b/src/Core/Components/Menu/FluentMenuItem.razor.cs @@ -135,5 +135,18 @@ protected async Task OnChangeHandlerAsync(ChangeEventArgs ev) return null; } + private async Task OnKeyDownHandlerAsync(KeyboardEventArgs e) + { + if (e.ShiftKey || e.AltKey || e.CtrlKey) + { + return; + } + + if (e.Code is nameof(KeyCode.Enter)) + { + await OnClickHandlerAsync(new MouseEventArgs()); + } + } + public void Dispose() => Owner?.Unregister(this); } diff --git a/tests/Core/_ToDo/Menu/FluentMenuTests.razor b/tests/Core/_ToDo/Menu/FluentMenuTests.razor new file mode 100644 index 0000000000..76ad14f146 --- /dev/null +++ b/tests/Core/_ToDo/Menu/FluentMenuTests.razor @@ -0,0 +1,33 @@ +@namespace Microsoft.FluentUI.AspNetCore.Components.Tests.Menu + +@using Xunit +@inherits TestContext + +@code { + [Fact] + public void FluentMenu_ChildMenuItem_OnKeyboardEnter_Works() + { + // Arrange && Act + var clickCount = 0; + var lockObj = new object(); + var cut = Render(@ + test + ); + + cut.Find("#to-select").KeyDown("Enter", "Enter"); + cut.Find("#to-select").Click(); + + // Assert + cut.WaitForAssertion(() => Assert.Equal(2, clickCount)); + return; + + void OnClick() + { + lock (lockObj) + { + clickCount++; + } + } + } + +} diff --git a/tests/Core/_ToDo/Menu/FluentMenuTests.cs b/tests/Core/_ToDo/Menu/FluentMenuTests.razor.cs similarity index 75% rename from tests/Core/_ToDo/Menu/FluentMenuTests.cs rename to tests/Core/_ToDo/Menu/FluentMenuTests.razor.cs index 2743775cd1..ff27af48f2 100644 --- a/tests/Core/_ToDo/Menu/FluentMenuTests.cs +++ b/tests/Core/_ToDo/Menu/FluentMenuTests.razor.cs @@ -6,13 +6,13 @@ using Xunit; namespace Microsoft.FluentUI.AspNetCore.Components.Tests.Menu; -public class FluentMenuTests : TestBase +public partial class FluentMenuTests : TestContext { public FluentMenuTests() { - TestContext.JSInterop.SetupModule("./_content/Microsoft.FluentUI.AspNetCore.Components/Components/Menu/FluentMenu.razor.js"); - TestContext.Services.AddSingleton(LibraryConfiguration.ForUnitTests); - TestContext.Services.AddSingleton(); + JSInterop.SetupModule("./_content/Microsoft.FluentUI.AspNetCore.Components/Components/Menu/FluentMenu.razor.js"); + Services.AddSingleton(LibraryConfiguration.ForUnitTests); + Services.AddSingleton(); } [Fact] @@ -27,7 +27,7 @@ public void FluentMenu_Default() string width = default!; Action openChanged = _ => { }; bool anchored = default!; - var cut = TestContext.RenderComponent(parameters => parameters + var cut = RenderComponent(parameters => parameters .Add(p => p.Anchor, anchor) .Add(p => p.Trigger, trigger) .Add(p => p.Open, open) @@ -48,8 +48,8 @@ public void FluentMenuProvider_ShouldUseFluentMenuClass() { //Arrange var className = "some-class"; - var menuProviderCut = TestContext.RenderComponent(); - var menuCut = TestContext.RenderComponent(parameters => parameters + var menuProviderCut = RenderComponent(); + var menuCut = RenderComponent(parameters => parameters .Add(p => p.UseMenuService, true) .Add(p => p.Class, className) .Add(p => p.Anchored, true)