Skip to content

Commit 8e8ad2b

Browse files
committed
refactor(popover): simplify toggle listener attachment and enhance keyboard interaction tests
1 parent 30c5c09 commit 8e8ad2b

File tree

3 files changed

+90
-2
lines changed

3 files changed

+90
-2
lines changed

packages/components/src/components/popover-button/component.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,9 +244,8 @@ export class KolPopoverButton implements PopoverButtonProps {
244244
public componentDidRender() {
245245
// The popoverElement is already set via popoverRef callback from PopoverFC.
246246
// Register the toggle listener once the popover element is available.
247-
if (this.popoverElement && !this.popoverElement.hasAttribute('data-toggle-listener-attached')) {
247+
if (this.popoverElement) {
248248
this.popoverElement.addEventListener('toggle', this.handleToggle);
249-
this.popoverElement.setAttribute('data-toggle-listener-attached', 'true');
250249
}
251250
}
252251

packages/components/src/components/popover-button/popover-button.e2e.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,76 @@ test.describe('kol-popover-button', () => {
6565

6666
await expect(wrapper).toHaveClass(/kol-popover-button--inline/);
6767
});
68+
69+
test.describe('Keyboard interaction', () => {
70+
test('should toggle popover with Enter key', async ({ page }) => {
71+
await page.setContent(`
72+
<kol-popover-button _label="Toggle popover">
73+
Popover content
74+
</kol-popover-button>
75+
`);
76+
77+
const button = page.locator('.kol-popover-button button');
78+
const popover = page.locator('.kol-popover');
79+
80+
// Initially hidden
81+
await expect(popover).not.toBeVisible();
82+
83+
// Focus and press Enter
84+
await button.focus();
85+
await page.keyboard.press('Enter');
86+
87+
// Should be visible after Enter
88+
await expect(popover).toBeVisible();
89+
90+
// Press Enter again to close
91+
await page.keyboard.press('Enter');
92+
await expect(popover).not.toBeVisible();
93+
});
94+
95+
test('should toggle popover with Space key', async ({ page }) => {
96+
await page.setContent(`
97+
<kol-popover-button _label="Toggle popover">
98+
Popover content
99+
</kol-popover-button>
100+
`);
101+
102+
const button = page.locator('.kol-popover-button button');
103+
const popover = page.locator('.kol-popover');
104+
105+
// Initially hidden
106+
await expect(popover).not.toBeVisible();
107+
108+
// Focus and press Space
109+
await button.focus();
110+
await page.keyboard.press(' ');
111+
112+
// Should be visible after Space
113+
await expect(popover).toBeVisible();
114+
115+
// Press Space again to close
116+
await page.keyboard.press(' ');
117+
await expect(popover).not.toBeVisible();
118+
});
119+
120+
test('should close popover with Escape key', async ({ page }) => {
121+
await page.setContent(`
122+
<kol-popover-button _label="Toggle popover">
123+
Popover content
124+
</kol-popover-button>
125+
`);
126+
127+
const button = page.locator('.kol-popover-button button');
128+
const popover = page.locator('.kol-popover');
129+
130+
// Open popover
131+
await button.focus();
132+
await page.keyboard.press('Enter');
133+
await expect(popover).toBeVisible();
134+
135+
// Close with Escape
136+
await page.keyboard.press('Escape');
137+
await expect(popover).not.toBeVisible();
138+
});
139+
});
68140
});

packages/components/src/internal/functional-components/popover/popover.e2e.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,5 +42,22 @@ test.describe('kol-popover', () => {
4242
await page.keyboard.press('Escape');
4343
await expect(popover).not.toBeVisible();
4444
});
45+
46+
test('should emit toggle event when popover visibility changes', async ({ page }) => {
47+
await page.setContent(`<kol-split-button _label="Toggle">Popover content</kol-split-button>`);
48+
const splitButton = page.locator('kol-split-button');
49+
const popover = splitButton.locator('.kol-popover');
50+
51+
const toggleEventPromise = popover.evaluate((element) => {
52+
return new Promise((resolve) => {
53+
element.addEventListener('toggle', resolve);
54+
});
55+
});
56+
57+
// Trigger toggle by clicking the secondary button
58+
await splitButton.locator('.kol-split-button__secondary-button').click();
59+
60+
await expect(toggleEventPromise).resolves.toBeTruthy();
61+
});
4562
});
4663
});

0 commit comments

Comments
 (0)