Skip to content

Commit df3b89c

Browse files
authored
[fix]: add click event for close slot for drawer (#34479)
1 parent 2ae4091 commit df3b89c

File tree

7 files changed

+58
-11
lines changed

7 files changed

+58
-11
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "prerelease",
3+
"comment": "Adds click event to close slot of drawer",
4+
"packageName": "@fluentui/web-components",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

packages/web-components/docs/web-components.api.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2312,7 +2312,7 @@ export class Dialog extends FASTElement {
23122312
// @public
23132313
export class DialogBody extends FASTElement {
23142314
// @internal
2315-
clickHandler(event: MouseEvent): boolean | void;
2315+
clickHandler(event: PointerEvent): boolean | void;
23162316
}
23172317

23182318
// @public
@@ -2433,6 +2433,8 @@ export class Drawer extends FASTElement {
24332433
//
24342434
// @public
24352435
export class DrawerBody extends FASTElement {
2436+
// @internal
2437+
clickHandler(event: PointerEvent): boolean | void;
24362438
}
24372439

24382440
// @public (undocumented)

packages/web-components/src/dialog-body/dialog-body.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export class DialogBody extends FASTElement {
1515
* @param e - the click event
1616
* @internal
1717
*/
18-
public clickHandler(event: MouseEvent): boolean | void {
18+
public clickHandler(event: PointerEvent): boolean | void {
1919
if (!event.defaultPrevented) {
2020
const dialog = this.parentElement;
2121

packages/web-components/src/drawer-body/drawer-body.template.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export function drawerBodyTemplate<T extends DrawerBody>(): ElementViewTemplate<
99
return html<T>`
1010
<div class="header" part="header">
1111
<slot name="title"></slot>
12-
<slot name="close"></slot>
12+
<slot name="close" @click="${(x, c) => x.clickHandler(c.event as PointerEvent)}"></slot>
1313
</div>
1414
<div class="content" part="content">
1515
<slot></slot>

packages/web-components/src/drawer-body/drawer-body.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { FASTElement } from '@microsoft/fast-element';
2+
import { isDialog } from '../dialog/dialog.options';
23

34
/**
45
* A DrawerBody component to layout drawer content
@@ -20,4 +21,22 @@ import { FASTElement } from '@microsoft/fast-element';
2021
*
2122
* @tag fluent-drawer-body
2223
*/
23-
export class DrawerBody extends FASTElement {}
24+
export class DrawerBody extends FASTElement {
25+
/**
26+
* Handles click event for the close slot
27+
*
28+
* @param e - the click event
29+
* @internal
30+
*/
31+
public clickHandler(event: PointerEvent): boolean | void {
32+
if (!event.defaultPrevented) {
33+
const dialog = this.parentElement;
34+
35+
if (isDialog(dialog, '-drawer')) {
36+
dialog.hide();
37+
}
38+
}
39+
40+
return true;
41+
}
42+
}

packages/web-components/src/drawer/drawer.spec.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,29 @@ test.describe('Drawer', () => {
148148

149149
await expect(wasDismissed).resolves.toBe(true);
150150
});
151+
152+
test('should close after a button is slotted into the close slot and clicked', async ({ fastPage, page }) => {
153+
const { element } = fastPage;
154+
const closeButton = element.locator('fluent-button[slot="close"]');
155+
const content = element.locator('#content');
156+
157+
await fastPage.setTemplate(/* html */ `
158+
<fluent-drawer>
159+
<fluent-drawer-body>
160+
<fluent-button slot="close">Close</fluent-button>
161+
<div id="content">content</div>
162+
</fluent-drawer-body>
163+
</fluent-drawer>
164+
`);
165+
166+
await element.evaluate((node: Drawer) => {
167+
node.show();
168+
});
169+
170+
await expect(content).toBeVisible();
171+
172+
await closeButton.click();
173+
174+
await expect(content).toBeHidden();
175+
});
151176
});

packages/web-components/src/drawer/drawer.stories.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,7 @@ const storyTemplate = html<StoryArgs<FluentDrawer>>`
4747
>
4848
<fluent-drawer-body>
4949
<h2 slot="title">Drawer Header</h2>
50-
<fluent-button
51-
slot="close"
52-
appearance="transparent"
53-
icon-only
54-
aria-label="close"
55-
@click="${() => hideDrawer('drawer-default')}"
56-
>
50+
<fluent-button slot="close" appearance="transparent" icon-only aria-label="close">
5751
${dismissed20Regular}
5852
</fluent-button>
5953
<div>

0 commit comments

Comments
 (0)