Skip to content

Commit 6fb139a

Browse files
authored
Keyboard enter on menu items should trigger OnClick (#4032)
1 parent 2b4679c commit 6fb139a

File tree

5 files changed

+57
-10
lines changed

5 files changed

+57
-10
lines changed

src/Core/Components/List/ListComponentBase.razor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ protected virtual async Task OnKeydownHandlerAsync(KeyboardEventArgs e)
626626
{
627627
return;
628628
}
629-
if (!ChangeOnEnterOnly || (ChangeOnEnterOnly && e.Code == "Enter"))
629+
if (!ChangeOnEnterOnly || (ChangeOnEnterOnly && e.Code == nameof(KeyCode.Enter)))
630630
{
631631
await item.OnClickHandlerAsync();
632632
}

src/Core/Components/Menu/FluentMenuItem.razor

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
class="@Class"
55
style="@Style"
66
id="@Id"
7-
disabled="@Disabled"
7+
disabled="@Disabled"
88
expanded=@Expanded
99
role="@GetRole()"
1010
checked="@Checked"
1111
@onchange="@OnChangeHandlerAsync"
1212
@onclick="@OnClickHandlerAsync"
13-
@attributes="AdditionalAttributes">
13+
@attributes="AdditionalAttributes"
14+
@onkeydown="@OnKeyDownHandlerAsync">
1415
@Label
1516
@ChildContent
1617
@if (MenuItems != null)

src/Core/Components/Menu/FluentMenuItem.razor.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,5 +135,18 @@ protected async Task OnChangeHandlerAsync(ChangeEventArgs ev)
135135
return null;
136136
}
137137

138+
private async Task OnKeyDownHandlerAsync(KeyboardEventArgs e)
139+
{
140+
if (e.ShiftKey || e.AltKey || e.CtrlKey)
141+
{
142+
return;
143+
}
144+
145+
if (e.Code is nameof(KeyCode.Enter))
146+
{
147+
await OnClickHandlerAsync(new MouseEventArgs());
148+
}
149+
}
150+
138151
public void Dispose() => Owner?.Unregister(this);
139152
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
@namespace Microsoft.FluentUI.AspNetCore.Components.Tests.Menu
2+
3+
@using Xunit
4+
@inherits TestContext
5+
6+
@code {
7+
[Fact]
8+
public void FluentMenu_ChildMenuItem_OnKeyboardEnter_Works()
9+
{
10+
// Arrange && Act
11+
var clickCount = 0;
12+
var lockObj = new object();
13+
var cut = Render(@<FluentMenu Open="true">
14+
<FluentMenuItem Id="to-select" OnClick="@OnClick">test</FluentMenuItem>
15+
</FluentMenu>);
16+
17+
cut.Find("#to-select").KeyDown("Enter", "Enter");
18+
cut.Find("#to-select").Click();
19+
20+
// Assert
21+
cut.WaitForAssertion(() => Assert.Equal(2, clickCount));
22+
return;
23+
24+
void OnClick()
25+
{
26+
lock (lockObj)
27+
{
28+
clickCount++;
29+
}
30+
}
31+
}
32+
33+
}

tests/Core/_ToDo/Menu/FluentMenuTests.cs renamed to tests/Core/_ToDo/Menu/FluentMenuTests.razor.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
using Xunit;
77

88
namespace Microsoft.FluentUI.AspNetCore.Components.Tests.Menu;
9-
public class FluentMenuTests : TestBase
9+
public partial class FluentMenuTests : TestContext
1010
{
1111
public FluentMenuTests()
1212
{
13-
TestContext.JSInterop.SetupModule("./_content/Microsoft.FluentUI.AspNetCore.Components/Components/Menu/FluentMenu.razor.js");
14-
TestContext.Services.AddSingleton(LibraryConfiguration.ForUnitTests);
15-
TestContext.Services.AddSingleton<IMenuService, MenuService>();
13+
JSInterop.SetupModule("./_content/Microsoft.FluentUI.AspNetCore.Components/Components/Menu/FluentMenu.razor.js");
14+
Services.AddSingleton(LibraryConfiguration.ForUnitTests);
15+
Services.AddSingleton<IMenuService, MenuService>();
1616
}
1717

1818
[Fact]
@@ -27,7 +27,7 @@ public void FluentMenu_Default()
2727
string width = default!;
2828
Action<bool> openChanged = _ => { };
2929
bool anchored = default!;
30-
var cut = TestContext.RenderComponent<FluentMenu>(parameters => parameters
30+
var cut = RenderComponent<FluentMenu>(parameters => parameters
3131
.Add(p => p.Anchor, anchor)
3232
.Add(p => p.Trigger, trigger)
3333
.Add(p => p.Open, open)
@@ -48,8 +48,8 @@ public void FluentMenuProvider_ShouldUseFluentMenuClass()
4848
{
4949
//Arrange
5050
var className = "some-class";
51-
var menuProviderCut = TestContext.RenderComponent<FluentMenuProvider>();
52-
var menuCut = TestContext.RenderComponent<FluentMenu>(parameters => parameters
51+
var menuProviderCut = RenderComponent<FluentMenuProvider>();
52+
var menuCut = RenderComponent<FluentMenu>(parameters => parameters
5353
.Add(p => p.UseMenuService, true)
5454
.Add(p => p.Class, className)
5555
.Add(p => p.Anchored, true)

0 commit comments

Comments
 (0)