Skip to content

Commit 2595235

Browse files
Blazor: add support for onclose event (#50727)
* Blazor: add support for onclose event * Remove StateHasChanged call in test * Also support cancel event * Update .js --------- Co-authored-by: campersau <[email protected]>
1 parent 8ef1934 commit 2595235

File tree

12 files changed

+70
-6
lines changed

12 files changed

+70
-6
lines changed

src/Components/Web.JS/dist/Release/blazor.server.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Components/Web.JS/dist/Release/blazor.web.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Components/Web.JS/dist/Release/blazor.webview.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Components/Web.JS/src/Rendering/Events/EventDelegator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import { dispatchEvent } from '../WebRendererInteropMethods';
88
const nonBubblingEvents = toLookup([
99
'abort',
1010
'blur',
11+
'cancel',
1112
'canplay',
1213
'canplaythrough',
1314
'change',
15+
'close',
1416
'cuechange',
1517
'durationchange',
1618
'emptied',

src/Components/Web.JS/src/Rendering/Events/EventTypes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ registerBuiltInEventType(['wheel', 'mousewheel'], {
160160
createEventArgs: e => parseWheelEvent(e as WheelEvent),
161161
});
162162

163-
registerBuiltInEventType(['toggle'], createBlankEventArgsOptions);
163+
registerBuiltInEventType(['cancel', 'close', 'toggle'], createBlankEventArgsOptions);
164164

165165
function parseChangeEvent(event: Event): ChangeEventArgs {
166166
const element = event.target as Element;

src/Components/Web/src/Web/EventHandlers.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,12 @@ namespace Microsoft.AspNetCore.Components.Web;
122122
[EventHandler("onreadystatechange", typeof(EventArgs), true, true)]
123123
[EventHandler("onscroll", typeof(EventArgs), true, true)]
124124

125+
// <details>
125126
[EventHandler("ontoggle", typeof(EventArgs), true, true)]
127+
128+
// <dialog>
129+
[EventHandler("oncancel", typeof(EventArgs), false, true)]
130+
[EventHandler("onclose", typeof(EventArgs), false, true)]
126131
public static class EventHandlers
127132
{
128133
}

src/Components/Web/src/WebEventData/WebEventData.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ private static bool TryDeserializeStandardWebEventArgs(
185185
eventArgs = WheelEventArgsReader.Read(eventArgsJson);
186186
return true;
187187

188+
case "cancel":
189+
case "close":
188190
case "toggle":
189191
eventArgs = EventArgs.Empty;
190192
return true;

src/Components/test/E2ETest/Tests/EventTest.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,37 @@ public void Toggle_CanTrigger()
185185
Browser.Equal("ontoggle,", () => output.Text);
186186
}
187187

188+
[Fact]
189+
public void Close_CanTrigger()
190+
{
191+
Browser.MountTestComponent<DialogEventsComponent>();
192+
193+
Browser.Exists(By.Id("show-dialog")).Click();
194+
195+
var output = Browser.Exists(By.Id("output"));
196+
Assert.Equal(string.Empty, output.Text);
197+
198+
// Click
199+
Browser.Exists(By.Id("dialog-close")).Click();
200+
Browser.Equal("onclose,", () => output.Text);
201+
}
202+
203+
[Fact]
204+
public void Cancel_CanTrigger()
205+
{
206+
Browser.MountTestComponent<DialogEventsComponent>();
207+
208+
Browser.Exists(By.Id("show-dialog")).Click();
209+
210+
var output = Browser.Exists(By.Id("output"));
211+
Assert.Equal(string.Empty, output.Text);
212+
213+
// Press escape to cancel. This fires both close and cancel, but MDN doesn't document in which order
214+
Browser.FindElement(By.Id("my-dialog")).SendKeys(Keys.Escape);
215+
Browser.Contains("onclose,", () => output.Text);
216+
Browser.Contains("oncancel,", () => output.Text);
217+
}
218+
188219
[Fact]
189220
public void PointerDown_CanTrigger()
190221
{
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<div>
2+
<p>
3+
Output: <span id="output">@message</span>
4+
</p>
5+
6+
<button id="show-dialog" onclick="document.getElementById('my-dialog').showModal()">
7+
Show modal dialog
8+
</button>
9+
10+
<dialog id="my-dialog" @onclose="OnClose" @oncancel="OnCancel">
11+
<form method="dialog">
12+
<button id="dialog-close">Close</button>
13+
</form>
14+
</dialog>
15+
</div>
16+
17+
@code {
18+
string message;
19+
20+
void OnClose(EventArgs e)
21+
=> message += "onclose,";
22+
23+
void OnCancel(EventArgs e)
24+
=> message += "oncancel,";
25+
}

src/Components/test/testassets/BasicTestApp/Index.razor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@
103103
<option value="BasicTestApp.SvgFocusComponent">SVG Focus component</option>
104104
<option value="BasicTestApp.TextOnlyComponent">Plain text</option>
105105
<option value="BasicTestApp.ToggleEventComponent">Toggle Event</option>
106+
<option value="BasicTestApp.DialogEventsComponent">Dialog Events</option>
106107
<option value="BasicTestApp.TouchEventComponent">Touch events</option>
107108
<option value="BasicTestApp.VirtualizationComponent">Virtualization</option>
108109
<option value="BasicTestApp.VirtualizationDataChanges">Virtualization data changes</option>

0 commit comments

Comments
 (0)