wcs-core 7.3.0 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -9
- package/design-tokens/dist/sncf-groupe-root-scoped.css +227 -227
- package/design-tokens/dist/sncf-groupe.css +227 -227
- package/design-tokens/dist/sncf-holding-root-scoped.css +227 -227
- package/design-tokens/dist/sncf-holding.css +227 -227
- package/design-tokens/dist/sncf-reseau-root-scoped.css +227 -227
- package/design-tokens/dist/sncf-reseau.css +227 -227
- package/design-tokens/dist/sncf-voyageurs-root-scoped.css +242 -242
- package/design-tokens/dist/sncf-voyageurs.css +242 -242
- package/dist/cjs/{popper-8d6e7fca.js → popper-1b61df21.js} +10 -17
- package/dist/cjs/popper-1b61df21.js.map +1 -0
- package/dist/cjs/wcs-breadcrumb.cjs.entry.js +1 -1
- package/dist/cjs/wcs-breadcrumb.cjs.entry.js.map +1 -1
- package/dist/cjs/wcs-com-nav-item.cjs.entry.js +1 -1
- package/dist/cjs/wcs-com-nav-item.cjs.entry.js.map +1 -1
- package/dist/cjs/wcs-com-nav.cjs.entry.js +3 -3
- package/dist/cjs/wcs-com-nav.cjs.entry.js.map +1 -1
- package/dist/cjs/wcs-dropdown.cjs.entry.js +1 -1
- package/dist/cjs/wcs-error_3.cjs.entry.js +1 -1
- package/dist/cjs/wcs-error_3.cjs.entry.js.map +1 -1
- package/dist/cjs/wcs-galactic-menu.cjs.entry.js +1 -1
- package/dist/cjs/wcs-grid.cjs.entry.js +5 -4
- package/dist/cjs/wcs-grid.cjs.entry.js.map +1 -1
- package/dist/cjs/wcs-horizontal-stepper.cjs.entry.js +3 -2
- package/dist/cjs/wcs-horizontal-stepper.cjs.entry.js.map +1 -1
- package/dist/cjs/wcs-modal.cjs.entry.js +2 -2
- package/dist/cjs/wcs-modal.cjs.entry.js.map +1 -1
- package/dist/cjs/wcs-select_2.cjs.entry.js +59 -24
- package/dist/cjs/wcs-select_2.cjs.entry.js.map +1 -1
- package/dist/cjs/wcs-tabs.cjs.entry.js +1 -1
- package/dist/cjs/wcs-tooltip.cjs.entry.js +1 -1
- package/dist/collection/components/accordion/{accordion.e2e.js → accordion.e2e.playwright.js} +51 -55
- package/dist/collection/components/accordion/accordion.e2e.playwright.js.map +1 -0
- package/dist/collection/components/accordion-panel/accordion-panel.js +1 -1
- package/dist/collection/components/alert/alert.e2e.playwright.js +125 -0
- package/dist/collection/components/alert/alert.e2e.playwright.js.map +1 -0
- package/dist/collection/components/alert-drawer/alert-drawer.e2e.playwright.js +107 -0
- package/dist/collection/components/alert-drawer/alert-drawer.e2e.playwright.js.map +1 -0
- package/dist/collection/components/breadcrumb/breadcrumb.e2e.playwright.js +188 -0
- package/dist/collection/components/breadcrumb/breadcrumb.e2e.playwright.js.map +1 -0
- package/dist/collection/components/breadcrumb/breadcrumb.js +2 -2
- package/dist/collection/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/collection/components/button/button.e2e.playwright.js +26 -0
- package/dist/collection/components/button/button.e2e.playwright.js.map +1 -0
- package/dist/collection/components/button/button.js +1 -1
- package/dist/collection/components/checkbox/checkbox.e2e.playwright.js +39 -0
- package/dist/collection/components/checkbox/checkbox.e2e.playwright.js.map +1 -0
- package/dist/collection/components/checkbox/checkbox.js +1 -1
- package/dist/collection/components/chip/chip.e2e.playwright.js +190 -0
- package/dist/collection/components/chip/chip.e2e.playwright.js.map +1 -0
- package/dist/collection/components/com-nav/com-nav.css +15 -0
- package/dist/collection/components/com-nav/{com-nav.e2e.js → com-nav.e2e.playwright.js} +60 -44
- package/dist/collection/components/com-nav/com-nav.e2e.playwright.js.map +1 -0
- package/dist/collection/components/com-nav/com-nav.js +3 -3
- package/dist/collection/components/com-nav/com-nav.js.map +1 -1
- package/dist/collection/components/com-nav-category/com-nav-category.js +1 -1
- package/dist/collection/components/com-nav-item/com-nav-item.css +2 -2
- package/dist/collection/components/com-nav-submenu/com-nav-submenu.js +1 -1
- package/dist/collection/components/counter/counter.e2e.playwright.js +187 -0
- package/dist/collection/components/counter/counter.e2e.playwright.js.map +1 -0
- package/dist/collection/components/counter/counter.js +1 -1
- package/dist/collection/components/dropdown/dropdown.e2e.playwright.js +320 -0
- package/dist/collection/components/dropdown/dropdown.e2e.playwright.js.map +1 -0
- package/dist/collection/components/dropdown/dropdown.js +1 -1
- package/dist/collection/components/editable-field/editable-field.e2e.playwright.js +156 -0
- package/dist/collection/components/editable-field/editable-field.e2e.playwright.js.map +1 -0
- package/dist/collection/components/form-field/form-field.e2e.playwright.js +104 -0
- package/dist/collection/components/form-field/form-field.e2e.playwright.js.map +1 -0
- package/dist/collection/components/galactic-menu/galactic-menu.js +1 -1
- package/dist/collection/components/grid/grid.e2e.playwright.js +153 -0
- package/dist/collection/components/grid/grid.e2e.playwright.js.map +1 -0
- package/dist/collection/components/grid/grid.js +6 -5
- package/dist/collection/components/grid/grid.js.map +1 -1
- package/dist/collection/components/grid-column/grid-column.js +1 -1
- package/dist/collection/components/grid-pagination/grid-pagination.js +1 -1
- package/dist/collection/components/header/header.js +1 -1
- package/dist/collection/components/horizontal-stepper/horizontal-step.js +2 -1
- package/dist/collection/components/horizontal-stepper/horizontal-step.js.map +1 -1
- package/dist/collection/components/horizontal-stepper/horizontal-stepper-interface.js.map +1 -1
- package/dist/collection/components/horizontal-stepper/horizontal-stepper.js +5 -1
- package/dist/collection/components/horizontal-stepper/horizontal-stepper.js.map +1 -1
- package/dist/collection/components/icon/icon.js +1 -1
- package/dist/collection/components/input/input.e2e.playwright.js +157 -0
- package/dist/collection/components/input/input.e2e.playwright.js.map +1 -0
- package/dist/collection/components/input/input.js +2 -2
- package/dist/collection/components/label/label.css +4 -6
- package/dist/collection/components/label/label.js +1 -1
- package/dist/collection/components/mat-icon/mat-icon.js +1 -1
- package/dist/collection/components/modal/modal.css +4 -0
- package/dist/collection/components/modal/modal.e2e.playwright.js +35 -0
- package/dist/collection/components/modal/modal.e2e.playwright.js.map +1 -0
- package/dist/collection/components/modal/modal.js +2 -2
- package/dist/collection/components/modal/modal.js.map +1 -1
- package/dist/collection/components/native-select/native-select.js +1 -1
- package/dist/collection/components/nav/nav.js +1 -1
- package/dist/collection/components/progress-bar/progress-bar.js +1 -1
- package/dist/collection/components/progress-radial/progress-radial.js +1 -1
- package/dist/collection/components/radio/radio.js +1 -1
- package/dist/collection/components/radio-group/radio-group.e2e.playwright.js +231 -0
- package/dist/collection/components/radio-group/radio-group.e2e.playwright.js.map +1 -0
- package/dist/collection/components/radio-group/radio-group.js +1 -1
- package/dist/collection/components/select/select.e2e.playwright.js +1702 -0
- package/dist/collection/components/select/select.e2e.playwright.js.map +1 -0
- package/dist/collection/components/select/select.js +49 -20
- package/dist/collection/components/select/select.js.map +1 -1
- package/dist/collection/components/select-option/select-option.js +3 -3
- package/dist/collection/components/select-option/select-option.js.map +1 -1
- package/dist/collection/components/switch/switch.e2e.playwright.js +40 -0
- package/dist/collection/components/switch/switch.e2e.playwright.js.map +1 -0
- package/dist/collection/components/switch/switch.js +1 -1
- package/dist/collection/components/tabs/tabs.e2e.playwright.js +205 -0
- package/dist/collection/components/tabs/tabs.e2e.playwright.js.map +1 -0
- package/dist/collection/components/tabs/tabs.js +1 -1
- package/dist/collection/components/textarea/textarea.e2e.playwright.js +133 -0
- package/dist/collection/components/textarea/textarea.e2e.playwright.js.map +1 -0
- package/dist/collection/components/textarea/textarea.js +1 -1
- package/dist/collection/utils/playwright/test-expect.js +2 -0
- package/dist/collection/utils/playwright/test-expect.js.map +1 -0
- package/dist/collection/utils/playwright/test.js +16 -0
- package/dist/collection/utils/playwright/test.js.map +1 -0
- package/dist/esm/{popper-e491c314.js → popper-ac238961.js} +10 -17
- package/dist/esm/popper-ac238961.js.map +1 -0
- package/dist/esm/wcs-breadcrumb.entry.js +1 -1
- package/dist/esm/wcs-breadcrumb.entry.js.map +1 -1
- package/dist/esm/wcs-com-nav-item.entry.js +1 -1
- package/dist/esm/wcs-com-nav-item.entry.js.map +1 -1
- package/dist/esm/wcs-com-nav.entry.js +3 -3
- package/dist/esm/wcs-com-nav.entry.js.map +1 -1
- package/dist/esm/wcs-dropdown.entry.js +1 -1
- package/dist/esm/wcs-error_3.entry.js +1 -1
- package/dist/esm/wcs-error_3.entry.js.map +1 -1
- package/dist/esm/wcs-galactic-menu.entry.js +1 -1
- package/dist/esm/wcs-grid.entry.js +5 -4
- package/dist/esm/wcs-grid.entry.js.map +1 -1
- package/dist/esm/wcs-horizontal-stepper.entry.js +3 -2
- package/dist/esm/wcs-horizontal-stepper.entry.js.map +1 -1
- package/dist/esm/wcs-modal.entry.js +2 -2
- package/dist/esm/wcs-modal.entry.js.map +1 -1
- package/dist/esm/wcs-select_2.entry.js +59 -24
- package/dist/esm/wcs-select_2.entry.js.map +1 -1
- package/dist/esm/wcs-tabs.entry.js +1 -1
- package/dist/esm/wcs-tooltip.entry.js +1 -1
- package/dist/types/components/accordion/accordion.e2e.playwright.d.ts +1 -0
- package/dist/types/components/alert/alert.e2e.playwright.d.ts +1 -0
- package/dist/types/components/alert-drawer/alert-drawer.e2e.playwright.d.ts +1 -0
- package/dist/types/components/breadcrumb/breadcrumb.e2e.playwright.d.ts +1 -0
- package/dist/types/components/button/button.e2e.playwright.d.ts +1 -0
- package/dist/types/components/checkbox/checkbox.e2e.playwright.d.ts +1 -0
- package/dist/types/components/chip/chip.e2e.playwright.d.ts +1 -0
- package/dist/types/components/com-nav/com-nav.e2e.playwright.d.ts +1 -0
- package/dist/types/components/counter/counter.e2e.playwright.d.ts +1 -0
- package/dist/types/components/dropdown/dropdown.e2e.playwright.d.ts +1 -0
- package/dist/types/components/editable-field/editable-field.e2e.playwright.d.ts +1 -0
- package/dist/types/components/form-field/form-field.e2e.playwright.d.ts +1 -0
- package/dist/types/components/grid/grid.e2e.playwright.d.ts +1 -0
- package/dist/types/components/horizontal-stepper/horizontal-stepper-interface.d.ts +2 -0
- package/dist/types/components/horizontal-stepper/horizontal-stepper.d.ts +4 -0
- package/dist/types/components/input/input.e2e.playwright.d.ts +1 -0
- package/dist/types/components/modal/modal.e2e.playwright.d.ts +1 -0
- package/dist/types/components/radio-group/radio-group.e2e.playwright.d.ts +1 -0
- package/dist/types/components/select/select.d.ts +7 -1
- package/dist/types/components/select/select.e2e.playwright.d.ts +1 -0
- package/dist/types/components/switch/switch.e2e.playwright.d.ts +1 -0
- package/dist/types/components/tabs/tabs.e2e.playwright.d.ts +1 -0
- package/dist/types/components/textarea/textarea.e2e.playwright.d.ts +1 -0
- package/dist/types/components.d.ts +12 -0
- package/dist/types/utils/playwright/test-expect.d.ts +33 -0
- package/dist/types/utils/playwright/test.d.ts +7 -0
- package/dist/wcs/{p-8e9bd0f1.entry.js → p-0326f834.entry.js} +2 -2
- package/dist/wcs/{p-8e9bd0f1.entry.js.map → p-0326f834.entry.js.map} +1 -1
- package/dist/wcs/p-2221bf0c.entry.js +16 -0
- package/dist/wcs/p-2221bf0c.entry.js.map +1 -0
- package/dist/wcs/p-4ae08567.entry.js +2 -0
- package/dist/wcs/p-4ae08567.entry.js.map +1 -0
- package/dist/wcs/p-4e2d6227.entry.js +2 -0
- package/dist/wcs/p-4e2d6227.entry.js.map +1 -0
- package/dist/wcs/p-8332a7e3.entry.js +2 -0
- package/dist/wcs/p-8332a7e3.entry.js.map +1 -0
- package/dist/wcs/{p-ec383729.entry.js → p-9b76b8e6.entry.js} +2 -2
- package/dist/wcs/{p-ec383729.entry.js.map → p-9b76b8e6.entry.js.map} +1 -1
- package/dist/wcs/{p-1f593d06.entry.js → p-abd8d5a0.entry.js} +2 -2
- package/dist/wcs/{p-622f7403.entry.js → p-c6f8c45c.entry.js} +2 -2
- package/dist/wcs/{p-a94e685c.entry.js → p-db7ba599.entry.js} +2 -2
- package/dist/wcs/p-e1fb3625.js +2 -0
- package/dist/wcs/p-e1fb3625.js.map +1 -0
- package/dist/wcs/{p-a956dc84.entry.js → p-f2f7595e.entry.js} +2 -2
- package/dist/wcs/{p-a956dc84.entry.js.map → p-f2f7595e.entry.js.map} +1 -1
- package/dist/wcs/p-fbd68522.entry.js +2 -0
- package/dist/wcs/p-fbd68522.entry.js.map +1 -0
- package/dist/wcs/{p-8c2605fd.entry.js → p-fe303f58.entry.js} +2 -2
- package/dist/wcs/wcs.esm.js +1 -1
- package/package.json +18 -24
- package/dist/cjs/popper-8d6e7fca.js.map +0 -1
- package/dist/collection/components/accordion/accordion.e2e.js.map +0 -1
- package/dist/collection/components/alert/alert.e2e.js +0 -142
- package/dist/collection/components/alert/alert.e2e.js.map +0 -1
- package/dist/collection/components/alert-drawer/alert-drawer.e2e.js +0 -111
- package/dist/collection/components/alert-drawer/alert-drawer.e2e.js.map +0 -1
- package/dist/collection/components/breadcrumb/breadcrumb.e2e.js +0 -223
- package/dist/collection/components/breadcrumb/breadcrumb.e2e.js.map +0 -1
- package/dist/collection/components/button/button.e2e.js +0 -25
- package/dist/collection/components/button/button.e2e.js.map +0 -1
- package/dist/collection/components/checkbox/checkbox.e2e.js +0 -45
- package/dist/collection/components/checkbox/checkbox.e2e.js.map +0 -1
- package/dist/collection/components/chip/chip.e2e.js +0 -209
- package/dist/collection/components/chip/chip.e2e.js.map +0 -1
- package/dist/collection/components/com-nav/com-nav.e2e.js.map +0 -1
- package/dist/collection/components/counter/counter.e2e.js +0 -206
- package/dist/collection/components/counter/counter.e2e.js.map +0 -1
- package/dist/collection/components/dropdown/dropdown.e2e.js +0 -156
- package/dist/collection/components/dropdown/dropdown.e2e.js.map +0 -1
- package/dist/collection/components/editable-field/editable-field.e2e.js +0 -176
- package/dist/collection/components/editable-field/editable-field.e2e.js.map +0 -1
- package/dist/collection/components/form-field/form-field.e2e.js +0 -122
- package/dist/collection/components/form-field/form-field.e2e.js.map +0 -1
- package/dist/collection/components/grid/grid.e2e.js +0 -147
- package/dist/collection/components/grid/grid.e2e.js.map +0 -1
- package/dist/collection/components/input/input.e2e.js +0 -152
- package/dist/collection/components/input/input.e2e.js.map +0 -1
- package/dist/collection/components/modal/modal.e2e.js +0 -36
- package/dist/collection/components/modal/modal.e2e.js.map +0 -1
- package/dist/collection/components/radio-group/radio-group.e2e.js +0 -239
- package/dist/collection/components/radio-group/radio-group.e2e.js.map +0 -1
- package/dist/collection/components/select/select.e2e.js +0 -1081
- package/dist/collection/components/select/select.e2e.js.map +0 -1
- package/dist/collection/components/switch/switch.e2e.js +0 -45
- package/dist/collection/components/switch/switch.e2e.js.map +0 -1
- package/dist/collection/components/tabs/tabs.e2e.js +0 -207
- package/dist/collection/components/tabs/tabs.e2e.js.map +0 -1
- package/dist/collection/components/textarea/textarea.e2e.js +0 -132
- package/dist/collection/components/textarea/textarea.e2e.js.map +0 -1
- package/dist/collection/utils/tests.js +0 -23
- package/dist/collection/utils/tests.js.map +0 -1
- package/dist/esm/popper-e491c314.js.map +0 -1
- package/dist/types/utils/tests.d.ts +0 -4
- package/dist/wcs/p-0dd07842.entry.js +0 -2
- package/dist/wcs/p-0dd07842.entry.js.map +0 -1
- package/dist/wcs/p-0f864e86.js +0 -2
- package/dist/wcs/p-0f864e86.js.map +0 -1
- package/dist/wcs/p-1244daa0.entry.js +0 -2
- package/dist/wcs/p-1244daa0.entry.js.map +0 -1
- package/dist/wcs/p-1fbe0328.entry.js +0 -2
- package/dist/wcs/p-1fbe0328.entry.js.map +0 -1
- package/dist/wcs/p-b94a09b6.entry.js +0 -16
- package/dist/wcs/p-b94a09b6.entry.js.map +0 -1
- package/dist/wcs/p-fd187bce.entry.js +0 -2
- package/dist/wcs/p-fd187bce.entry.js.map +0 -1
- /package/dist/wcs/{p-1f593d06.entry.js.map → p-abd8d5a0.entry.js.map} +0 -0
- /package/dist/wcs/{p-622f7403.entry.js.map → p-c6f8c45c.entry.js.map} +0 -0
- /package/dist/wcs/{p-a94e685c.entry.js.map → p-db7ba599.entry.js.map} +0 -0
- /package/dist/wcs/{p-8c2605fd.entry.js.map → p-fe303f58.entry.js.map} +0 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { setWcsContent } from "../../utils/playwright/test";
|
|
2
|
+
import { test } from "@stencil/playwright";
|
|
3
|
+
import { expect } from "@playwright/test";
|
|
4
|
+
test.describe('Dropdown component', () => {
|
|
5
|
+
test.describe('keyboard interactions', () => {
|
|
6
|
+
test('Enter should open menu and move focus to the first item', async ({ page }) => {
|
|
7
|
+
// Given
|
|
8
|
+
await setWcsContent(page, `
|
|
9
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
10
|
+
<span slot="placeholder">Dropdown</span>
|
|
11
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
12
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
13
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
14
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
15
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
16
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
17
|
+
</wcs-dropdown>
|
|
18
|
+
`);
|
|
19
|
+
const dropdown = page.locator('wcs-dropdown');
|
|
20
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
21
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
22
|
+
// When
|
|
23
|
+
await dropdown.focus();
|
|
24
|
+
await page.keyboard.press('Enter');
|
|
25
|
+
await page.waitForChanges();
|
|
26
|
+
// Then
|
|
27
|
+
await expect(dropdownButton).toHaveAttribute('aria-expanded', 'true');
|
|
28
|
+
await expect(firstItem).toBeFocused();
|
|
29
|
+
});
|
|
30
|
+
test('SPACE should open menu and move focus to the first item', async ({ page }) => {
|
|
31
|
+
// Given
|
|
32
|
+
await setWcsContent(page, `
|
|
33
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
34
|
+
<span slot="placeholder">Dropdown</span>
|
|
35
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
36
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
37
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
38
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
39
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
40
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
41
|
+
</wcs-dropdown>
|
|
42
|
+
`);
|
|
43
|
+
const dropdown = page.locator('wcs-dropdown');
|
|
44
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
45
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
46
|
+
// When
|
|
47
|
+
await dropdown.focus();
|
|
48
|
+
await page.keyboard.press('Space');
|
|
49
|
+
await page.waitForChanges();
|
|
50
|
+
// Then
|
|
51
|
+
await expect(dropdownButton).toHaveAttribute('aria-expanded', 'true');
|
|
52
|
+
await expect(firstItem).toBeFocused();
|
|
53
|
+
});
|
|
54
|
+
test('DOWN_ARROW should open menu and move focus to the first item', async ({ page }) => {
|
|
55
|
+
// Given
|
|
56
|
+
await setWcsContent(page, `
|
|
57
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
58
|
+
<span slot="placeholder">Dropdown</span>
|
|
59
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
60
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
61
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
62
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
63
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
64
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
65
|
+
</wcs-dropdown>
|
|
66
|
+
`);
|
|
67
|
+
const dropdown = page.locator('wcs-dropdown');
|
|
68
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
69
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
70
|
+
// When
|
|
71
|
+
await dropdown.focus();
|
|
72
|
+
await page.keyboard.press('ArrowDown');
|
|
73
|
+
await page.waitForChanges();
|
|
74
|
+
// Then
|
|
75
|
+
await expect(dropdownButton).toHaveAttribute('aria-expanded', 'true');
|
|
76
|
+
await expect(firstItem).toBeFocused();
|
|
77
|
+
});
|
|
78
|
+
test('UP_ARROW should open menu and move focus to the last item', async ({ page }) => {
|
|
79
|
+
// Given
|
|
80
|
+
await setWcsContent(page, `
|
|
81
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
82
|
+
<span slot="placeholder">Dropdown</span>
|
|
83
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
84
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
85
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
86
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
87
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
88
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
89
|
+
</wcs-dropdown>
|
|
90
|
+
`);
|
|
91
|
+
const dropdown = page.locator('wcs-dropdown');
|
|
92
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
93
|
+
const lastItem = page.locator('wcs-dropdown-item#last-item');
|
|
94
|
+
// When
|
|
95
|
+
await dropdown.focus();
|
|
96
|
+
await page.keyboard.press('ArrowUp');
|
|
97
|
+
await page.waitForChanges();
|
|
98
|
+
// Then
|
|
99
|
+
await expect(dropdownButton).toHaveAttribute('aria-expanded', 'true');
|
|
100
|
+
await expect(lastItem).toBeFocused();
|
|
101
|
+
});
|
|
102
|
+
test('HOME should focus the first item', async ({ page }) => {
|
|
103
|
+
// Given
|
|
104
|
+
await setWcsContent(page, `
|
|
105
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
106
|
+
<span slot="placeholder">Dropdown</span>
|
|
107
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
108
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
109
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
110
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
111
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
112
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
113
|
+
</wcs-dropdown>
|
|
114
|
+
`);
|
|
115
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
116
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
117
|
+
// When
|
|
118
|
+
await dropdownButton.dispatchEvent('click');
|
|
119
|
+
await page.waitForChanges();
|
|
120
|
+
await firstItem.waitFor({ state: 'visible' }); // wait for menu to open
|
|
121
|
+
await firstItem.focus(); // ensure focus is on an item before pressing Home
|
|
122
|
+
await page.keyboard.press('Home');
|
|
123
|
+
await page.waitForChanges();
|
|
124
|
+
// Then
|
|
125
|
+
await expect(firstItem).toBeFocused();
|
|
126
|
+
});
|
|
127
|
+
test('END should focus the last item', async ({ page }) => {
|
|
128
|
+
// Given
|
|
129
|
+
await setWcsContent(page, `
|
|
130
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
131
|
+
<span slot="placeholder">Dropdown</span>
|
|
132
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
133
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
134
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
135
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
136
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
137
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
138
|
+
</wcs-dropdown>
|
|
139
|
+
`);
|
|
140
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
141
|
+
const lastItem = page.locator('wcs-dropdown-item#last-item');
|
|
142
|
+
// When
|
|
143
|
+
await dropdownButton.dispatchEvent('click');
|
|
144
|
+
await page.waitForChanges();
|
|
145
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
146
|
+
await firstItem.waitFor({ state: 'visible' }); // wait for menu to open
|
|
147
|
+
await firstItem.focus(); // ensure focus is on an item before pressing End
|
|
148
|
+
await page.keyboard.press('End');
|
|
149
|
+
await page.waitForChanges();
|
|
150
|
+
// Then
|
|
151
|
+
await expect(lastItem).toBeFocused();
|
|
152
|
+
});
|
|
153
|
+
test('UP_ARROW should move focus to the previous item', async ({ page }) => {
|
|
154
|
+
// Given
|
|
155
|
+
await setWcsContent(page, `
|
|
156
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
157
|
+
<span slot="placeholder">Dropdown</span>
|
|
158
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
159
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
160
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
161
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
162
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
163
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
164
|
+
</wcs-dropdown>
|
|
165
|
+
`);
|
|
166
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
167
|
+
const lastItem = page.locator('wcs-dropdown-item#last-item');
|
|
168
|
+
// When
|
|
169
|
+
await dropdownButton.dispatchEvent('click'); // open the menu
|
|
170
|
+
await page.waitForChanges();
|
|
171
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
172
|
+
await firstItem.waitFor({ state: 'visible' }); // wait for menu to open
|
|
173
|
+
await firstItem.focus(); // ensure focus is on an item before pressing ArrowUp
|
|
174
|
+
await page.keyboard.press('ArrowUp');
|
|
175
|
+
await page.waitForChanges();
|
|
176
|
+
// Then
|
|
177
|
+
await expect(lastItem).toBeFocused();
|
|
178
|
+
});
|
|
179
|
+
test('DOWN_ARROW should move focus to the next item', async ({ page }) => {
|
|
180
|
+
// Given
|
|
181
|
+
await setWcsContent(page, `
|
|
182
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
183
|
+
<span slot="placeholder">Dropdown</span>
|
|
184
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
185
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
186
|
+
<wcs-dropdown-item id="second-item">Second item test avec un long texte</wcs-dropdown-item>
|
|
187
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
188
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
189
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
190
|
+
</wcs-dropdown>
|
|
191
|
+
`);
|
|
192
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
193
|
+
const secondItem = page.locator('wcs-dropdown-item#second-item');
|
|
194
|
+
// When
|
|
195
|
+
await dropdownButton.dispatchEvent('click');
|
|
196
|
+
await page.waitForChanges();
|
|
197
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
198
|
+
await firstItem.waitFor({ state: 'visible' }); // wait for menu to open
|
|
199
|
+
await firstItem.focus(); // ensure focus is on an item before pressing Escape
|
|
200
|
+
await page.keyboard.press('ArrowDown');
|
|
201
|
+
await page.waitForChanges();
|
|
202
|
+
// Then
|
|
203
|
+
await expect(secondItem).toBeFocused();
|
|
204
|
+
});
|
|
205
|
+
test('ESCAPE should close the menu and set focus on the dropdown button', async ({ page }) => {
|
|
206
|
+
// Given
|
|
207
|
+
await setWcsContent(page, `
|
|
208
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
209
|
+
<span slot="placeholder">Dropdown</span>
|
|
210
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
211
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
212
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
213
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
214
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
215
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
216
|
+
</wcs-dropdown>
|
|
217
|
+
`);
|
|
218
|
+
const dropdown = page.locator('wcs-dropdown');
|
|
219
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
220
|
+
// When
|
|
221
|
+
await dropdownButton.dispatchEvent('click');
|
|
222
|
+
await page.waitForChanges();
|
|
223
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
224
|
+
await firstItem.waitFor({ state: 'visible' }); // wait for menu to open
|
|
225
|
+
await firstItem.focus(); // ensure focus is on an item before pressing Escape
|
|
226
|
+
await page.keyboard.press('Escape');
|
|
227
|
+
await page.waitForChanges();
|
|
228
|
+
// Then
|
|
229
|
+
await expect(dropdownButton).toHaveAttribute('aria-expanded', 'false');
|
|
230
|
+
await expect(dropdown).toBeFocused();
|
|
231
|
+
});
|
|
232
|
+
test('TAB should close the menu and set focus on the dropdown button', async ({ page }) => {
|
|
233
|
+
// Given
|
|
234
|
+
await setWcsContent(page, `
|
|
235
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
236
|
+
<span slot="placeholder">Dropdown</span>
|
|
237
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
238
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
239
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
240
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
241
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
242
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
243
|
+
</wcs-dropdown>
|
|
244
|
+
`);
|
|
245
|
+
const dropdown = page.locator('wcs-dropdown');
|
|
246
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
247
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
248
|
+
// When
|
|
249
|
+
await dropdownButton.dispatchEvent('click'); // open the menu
|
|
250
|
+
await page.waitForChanges();
|
|
251
|
+
await firstItem.waitFor({ state: 'visible' }); // wait for menu to open
|
|
252
|
+
await firstItem.focus(); // ensure focus is on an item before pressing Tab
|
|
253
|
+
await page.keyboard.press('Tab'); // should close the menu and focus back to button
|
|
254
|
+
await page.waitForChanges();
|
|
255
|
+
// Then
|
|
256
|
+
await expect(dropdownButton).toHaveAttribute('aria-expanded', 'false');
|
|
257
|
+
await expect(dropdown).toBeFocused();
|
|
258
|
+
});
|
|
259
|
+
test('SHIFT+TAB should close the menu and set focus on the dropdown button', async ({ page }) => {
|
|
260
|
+
// Given
|
|
261
|
+
await setWcsContent(page, `
|
|
262
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
263
|
+
<span slot="placeholder">Dropdown</span>
|
|
264
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
265
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
266
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
267
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
268
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
269
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
270
|
+
</wcs-dropdown>
|
|
271
|
+
`);
|
|
272
|
+
const dropdown = page.locator('wcs-dropdown');
|
|
273
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
274
|
+
// When
|
|
275
|
+
await dropdownButton.dispatchEvent('click'); // open the menu
|
|
276
|
+
await page.waitForChanges();
|
|
277
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
278
|
+
await firstItem.waitFor({ state: 'visible' }); // wait for menu to open
|
|
279
|
+
await firstItem.focus(); // ensure focus is on an item before pressing Shift+Tab
|
|
280
|
+
await page.keyboard.down('Shift');
|
|
281
|
+
await page.keyboard.press('Tab');
|
|
282
|
+
await page.keyboard.up('Shift');
|
|
283
|
+
await page.waitForChanges();
|
|
284
|
+
// Then
|
|
285
|
+
await expect(dropdownButton).toHaveAttribute('aria-expanded', 'false');
|
|
286
|
+
await expect(dropdown).toBeFocused();
|
|
287
|
+
});
|
|
288
|
+
test('ENTER should activate the item, close menu, and set focus on the dropdown button', async ({ page }) => {
|
|
289
|
+
// Given
|
|
290
|
+
await setWcsContent(page, `
|
|
291
|
+
<wcs-dropdown mode="plain" shape="normal" size="m">
|
|
292
|
+
<span slot="placeholder">Dropdown</span>
|
|
293
|
+
<wcs-dropdown-item id="first-item">Premier item</wcs-dropdown-item>
|
|
294
|
+
<wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>
|
|
295
|
+
<wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>
|
|
296
|
+
<wcs-dropdown-item>Dernier item</wcs-dropdown-item>
|
|
297
|
+
<wcs-dropdown-divider></wcs-dropdown-divider>
|
|
298
|
+
<wcs-dropdown-item id="last-item">Dernier item</wcs-dropdown-item>
|
|
299
|
+
</wcs-dropdown>
|
|
300
|
+
`);
|
|
301
|
+
const dropdown = page.locator('wcs-dropdown');
|
|
302
|
+
// spy on the custom event on the locator
|
|
303
|
+
const itemClickSpy = await dropdown.spyOnEvent('wcsDropdownItemClick');
|
|
304
|
+
const dropdownButton = page.locator('wcs-dropdown #dropdown-button');
|
|
305
|
+
const firstItem = page.locator('wcs-dropdown-item#first-item');
|
|
306
|
+
// When
|
|
307
|
+
await dropdownButton.dispatchEvent('click');
|
|
308
|
+
await page.waitForChanges();
|
|
309
|
+
await firstItem.waitFor({ state: 'visible' }); // wait for menu to open
|
|
310
|
+
await firstItem.focus();
|
|
311
|
+
await page.keyboard.press('Enter');
|
|
312
|
+
await page.waitForChanges();
|
|
313
|
+
// Then
|
|
314
|
+
expect(itemClickSpy).toHaveReceivedEventTimes(1);
|
|
315
|
+
await expect(dropdownButton).toHaveAttribute('aria-expanded', 'false');
|
|
316
|
+
await expect(dropdown).toBeFocused();
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
//# sourceMappingURL=dropdown.e2e.playwright.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown.e2e.playwright.js","sourceRoot":"","sources":["../../../src/components/dropdown/dropdown.e2e.playwright.ts"],"names":[],"mappings":"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","sourcesContent":["import { setWcsContent } from '../../utils/playwright/test';\nimport { test, E2EPage } from \"@stencil/playwright\";\n\nimport { expect } from \"@playwright/test\";\n\ntest.describe('Dropdown component', () => {\n test.describe('keyboard interactions', () => {\n test('Enter should open menu and move focus to the first item', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdown = page.locator('wcs-dropdown');\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n\n // When\n await dropdown.focus();\n await page.keyboard.press('Enter');\n await page.waitForChanges();\n\n // Then\n await expect(dropdownButton).toHaveAttribute('aria-expanded', 'true');\n await expect(firstItem).toBeFocused();\n });\n\n test('SPACE should open menu and move focus to the first item', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdown = page.locator('wcs-dropdown');\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n\n // When\n await dropdown.focus();\n await page.keyboard.press('Space');\n await page.waitForChanges();\n\n // Then\n await expect(dropdownButton).toHaveAttribute('aria-expanded', 'true');\n await expect(firstItem).toBeFocused();\n });\n\n test('DOWN_ARROW should open menu and move focus to the first item', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdown = page.locator('wcs-dropdown');\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n\n // When\n await dropdown.focus();\n await page.keyboard.press('ArrowDown');\n await page.waitForChanges();\n\n // Then\n await expect(dropdownButton).toHaveAttribute('aria-expanded', 'true');\n await expect(firstItem).toBeFocused();\n });\n\n test('UP_ARROW should open menu and move focus to the last item', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdown = page.locator('wcs-dropdown');\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const lastItem = page.locator('wcs-dropdown-item#last-item');\n\n // When\n await dropdown.focus();\n await page.keyboard.press('ArrowUp');\n await page.waitForChanges();\n\n // Then\n await expect(dropdownButton).toHaveAttribute('aria-expanded', 'true');\n await expect(lastItem).toBeFocused();\n });\n\n test('HOME should focus the first item', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n\n // When\n await dropdownButton.dispatchEvent('click');\n await page.waitForChanges();\n await firstItem.waitFor({ state: 'visible' }); // wait for menu to open\n await firstItem.focus(); // ensure focus is on an item before pressing Home\n await page.keyboard.press('Home');\n await page.waitForChanges();\n\n // Then\n await expect(firstItem).toBeFocused();\n });\n\n test('END should focus the last item', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const lastItem = page.locator('wcs-dropdown-item#last-item');\n\n // When\n await dropdownButton.dispatchEvent('click');\n await page.waitForChanges();\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n await firstItem.waitFor({ state: 'visible' }); // wait for menu to open\n await firstItem.focus(); // ensure focus is on an item before pressing End\n await page.keyboard.press('End');\n await page.waitForChanges();\n\n // Then\n await expect(lastItem).toBeFocused();\n });\n\n test('UP_ARROW should move focus to the previous item', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const lastItem = page.locator('wcs-dropdown-item#last-item');\n\n // When\n await dropdownButton.dispatchEvent('click'); // open the menu\n await page.waitForChanges();\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n await firstItem.waitFor({ state: 'visible' }); // wait for menu to open\n await firstItem.focus(); // ensure focus is on an item before pressing ArrowUp\n await page.keyboard.press('ArrowUp');\n await page.waitForChanges();\n\n // Then\n await expect(lastItem).toBeFocused();\n });\n\n test('DOWN_ARROW should move focus to the next item', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item id=\"second-item\">Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const secondItem = page.locator('wcs-dropdown-item#second-item');\n\n // When\n await dropdownButton.dispatchEvent('click');\n await page.waitForChanges();\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n await firstItem.waitFor({ state: 'visible' }); // wait for menu to open\n await firstItem.focus(); // ensure focus is on an item before pressing Escape\n await page.keyboard.press('ArrowDown');\n await page.waitForChanges();\n\n // Then\n await expect(secondItem).toBeFocused();\n });\n\n test('ESCAPE should close the menu and set focus on the dropdown button', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdown = page.locator('wcs-dropdown');\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n\n // When\n await dropdownButton.dispatchEvent('click');\n await page.waitForChanges();\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n await firstItem.waitFor({ state: 'visible' }); // wait for menu to open\n await firstItem.focus(); // ensure focus is on an item before pressing Escape\n await page.keyboard.press('Escape');\n await page.waitForChanges();\n\n // Then\n await expect(dropdownButton).toHaveAttribute('aria-expanded', 'false');\n await expect(dropdown).toBeFocused();\n });\n\n test('TAB should close the menu and set focus on the dropdown button', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdown = page.locator('wcs-dropdown');\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n\n // When\n await dropdownButton.dispatchEvent('click'); // open the menu\n await page.waitForChanges();\n await firstItem.waitFor({ state: 'visible' }); // wait for menu to open\n await firstItem.focus(); // ensure focus is on an item before pressing Tab\n await page.keyboard.press('Tab'); // should close the menu and focus back to button\n await page.waitForChanges();\n\n // Then\n await expect(dropdownButton).toHaveAttribute('aria-expanded', 'false');\n await expect(dropdown).toBeFocused();\n });\n\n test('SHIFT+TAB should close the menu and set focus on the dropdown button', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdown = page.locator('wcs-dropdown');\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n\n // When\n await dropdownButton.dispatchEvent('click'); // open the menu\n await page.waitForChanges();\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n await firstItem.waitFor({ state: 'visible' }); // wait for menu to open\n await firstItem.focus(); // ensure focus is on an item before pressing Shift+Tab\n await page.keyboard.down('Shift');\n await page.keyboard.press('Tab');\n await page.keyboard.up('Shift');\n await page.waitForChanges();\n\n // Then\n await expect(dropdownButton).toHaveAttribute('aria-expanded', 'false');\n await expect(dropdown).toBeFocused();\n });\n\n test('ENTER should activate the item, close menu, and set focus on the dropdown button', async ({ page }: { page: E2EPage }) => {\n // Given\n await setWcsContent(page, `\n <wcs-dropdown mode=\"plain\" shape=\"normal\" size=\"m\">\n <span slot=\"placeholder\">Dropdown</span>\n <wcs-dropdown-item id=\"first-item\">Premier item</wcs-dropdown-item>\n <wcs-dropdown-header>ACTION HEADER</wcs-dropdown-header>\n <wcs-dropdown-item>Second item test avec un long texte</wcs-dropdown-item>\n <wcs-dropdown-item>Dernier item</wcs-dropdown-item>\n <wcs-dropdown-divider></wcs-dropdown-divider>\n <wcs-dropdown-item id=\"last-item\">Dernier item</wcs-dropdown-item>\n </wcs-dropdown>\n `);\n\n const dropdown = page.locator('wcs-dropdown');\n // spy on the custom event on the locator\n const itemClickSpy = await dropdown.spyOnEvent('wcsDropdownItemClick');\n\n const dropdownButton = page.locator('wcs-dropdown #dropdown-button');\n const firstItem = page.locator('wcs-dropdown-item#first-item');\n\n // When\n await dropdownButton.dispatchEvent('click');\n await page.waitForChanges();\n await firstItem.waitFor({ state: 'visible' }); // wait for menu to open\n await firstItem.focus();\n await page.keyboard.press('Enter');\n await page.waitForChanges();\n\n // Then\n expect(itemClickSpy).toHaveReceivedEventTimes(1);\n await expect(dropdownButton).toHaveAttribute('aria-expanded', 'false');\n await expect(dropdown).toBeFocused();\n });\n });\n});\n"]}
|
|
@@ -361,7 +361,7 @@ export class Dropdown {
|
|
|
361
361
|
"signature": "(attr: AriaAttributeName, value: string | null | undefined) => Promise<void>",
|
|
362
362
|
"parameters": [{
|
|
363
363
|
"name": "attr",
|
|
364
|
-
"type": "
|
|
364
|
+
"type": "`aria-${string}` | \"role\"",
|
|
365
365
|
"docs": ""
|
|
366
366
|
}, {
|
|
367
367
|
"name": "value",
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { setWcsContent } from "../../utils/playwright/test";
|
|
2
|
+
import { test } from "@stencil/playwright";
|
|
3
|
+
import { expect } from "@playwright/test";
|
|
4
|
+
test.describe('wcs-editable-field', () => {
|
|
5
|
+
test('renders with input element and default props', async ({ page }) => {
|
|
6
|
+
await setWcsContent(page, `
|
|
7
|
+
<wcs-editable-field label="Test Input" value="Initial value" type="input" id="test">
|
|
8
|
+
<wcs-input></wcs-input>
|
|
9
|
+
</wcs-editable-field>
|
|
10
|
+
`);
|
|
11
|
+
const displayContainer = page.locator('wcs-editable-field .display-container');
|
|
12
|
+
await expect(displayContainer).toContainText('Initial value');
|
|
13
|
+
const label = page.locator('wcs-editable-field .label');
|
|
14
|
+
await expect(label).toHaveText('Test Input');
|
|
15
|
+
});
|
|
16
|
+
test('transitions from DISPLAY to EDIT state when clicked', async ({ page }) => {
|
|
17
|
+
await setWcsContent(page, `
|
|
18
|
+
<wcs-editable-field label="Test Input" value="Initial value" type="input" id="test">
|
|
19
|
+
<wcs-input></wcs-input>
|
|
20
|
+
</wcs-editable-field>
|
|
21
|
+
`);
|
|
22
|
+
const displayContainer = page.locator('wcs-editable-field .display-container');
|
|
23
|
+
await displayContainer.click();
|
|
24
|
+
const editContainer = page.locator('wcs-editable-field .edit-container:not(.display-none)');
|
|
25
|
+
await expect(editContainer).toBeVisible();
|
|
26
|
+
});
|
|
27
|
+
test('properly handles validation', async ({ page }) => {
|
|
28
|
+
await setWcsContent(page, `
|
|
29
|
+
<wcs-editable-field id="validate-test" label="Test Validation" value="Valid" error-msg="Value is invalid" type="input">
|
|
30
|
+
<wcs-input></wcs-input>
|
|
31
|
+
</wcs-editable-field>
|
|
32
|
+
`);
|
|
33
|
+
// Set up validation function
|
|
34
|
+
await page.evaluate(() => {
|
|
35
|
+
const el = document.querySelector('wcs-editable-field');
|
|
36
|
+
el.validateFn = (val) => val === 'Valid';
|
|
37
|
+
});
|
|
38
|
+
// Go to edit mode
|
|
39
|
+
const displayContainer = page.locator('wcs-editable-field .display-container');
|
|
40
|
+
await displayContainer.click();
|
|
41
|
+
// Input invalid value
|
|
42
|
+
const wcsInput = page.locator('wcs-input');
|
|
43
|
+
const nativeInput = page.locator('wcs-input input');
|
|
44
|
+
await nativeInput.fill('Invalid');
|
|
45
|
+
// Trigger validation (simulate Enter key)
|
|
46
|
+
await wcsInput.press('Enter');
|
|
47
|
+
await page.waitForChanges();
|
|
48
|
+
// Check error message is displayed
|
|
49
|
+
const errorElement = page.locator('wcs-editable-field wcs-error');
|
|
50
|
+
await expect(errorElement).toBeVisible();
|
|
51
|
+
await expect(errorElement).toHaveText('Value is invalid');
|
|
52
|
+
});
|
|
53
|
+
test('emits wcsChange event with correct data', async ({ page }) => {
|
|
54
|
+
await setWcsContent(page, `
|
|
55
|
+
<wcs-editable-field label="Test Events" value="Old value" type="input" id="event-test">
|
|
56
|
+
<wcs-input id="test-input"></wcs-input>
|
|
57
|
+
</wcs-editable-field>
|
|
58
|
+
`);
|
|
59
|
+
const changeSpy = await page.spyOnEvent('wcsChange');
|
|
60
|
+
// Go to edit mode
|
|
61
|
+
const displayContainer = page.locator('wcs-editable-field .display-container');
|
|
62
|
+
await displayContainer.click();
|
|
63
|
+
await page.waitForChanges();
|
|
64
|
+
const input = page.locator('wcs-input');
|
|
65
|
+
await input.press('Backspace'); // Clear value (backspace is easier than selecting all)
|
|
66
|
+
await input.pressSequentially('New value'); // send input event
|
|
67
|
+
await page.waitForChanges();
|
|
68
|
+
// Submit the form by pressing Enter
|
|
69
|
+
await input.press('Enter');
|
|
70
|
+
await page.waitForChanges();
|
|
71
|
+
// Note: Functions defined in the event's detail object (successHandler and errorHandler)
|
|
72
|
+
// are not cloned by the DOM's structured clone algorithm.
|
|
73
|
+
// This means that when the event is emitted, these functions will not be present in the
|
|
74
|
+
// event.detail object when accessed in E2E tests, even though they exist in the browser.
|
|
75
|
+
expect(changeSpy).toHaveNthReceivedEventDetail(0, {
|
|
76
|
+
newValue: 'New value',
|
|
77
|
+
successHandler: undefined,
|
|
78
|
+
errorHandler: undefined
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
test('respects readonly property', async ({ page }) => {
|
|
82
|
+
await setWcsContent(page, `
|
|
83
|
+
<wcs-editable-field label="Read Only Field" value="Readonly value" readonly="true" type="input" id="test">
|
|
84
|
+
<wcs-input></wcs-input>
|
|
85
|
+
</wcs-editable-field>
|
|
86
|
+
`);
|
|
87
|
+
// Check readonly icon is displayed
|
|
88
|
+
const readonlyIcon = page.locator('wcs-editable-field .readonly-icon');
|
|
89
|
+
await expect(readonlyIcon).toBeVisible();
|
|
90
|
+
// Try clicking
|
|
91
|
+
const displayContainer = page.locator('wcs-editable-field .display-container');
|
|
92
|
+
await displayContainer.click();
|
|
93
|
+
// Should still be in display mode
|
|
94
|
+
const editContainer = page.locator('wcs-editable-field .edit-container:not(.display-none)');
|
|
95
|
+
await expect(editContainer).toHaveCount(0);
|
|
96
|
+
});
|
|
97
|
+
test('works correctly with textarea', async ({ page }) => {
|
|
98
|
+
await setWcsContent(page, `
|
|
99
|
+
<wcs-editable-field label="Textarea Test" type="textarea" value="Multiline\nText" id="test">
|
|
100
|
+
<wcs-textarea></wcs-textarea>
|
|
101
|
+
</wcs-editable-field>
|
|
102
|
+
`);
|
|
103
|
+
// Check it renders correctly
|
|
104
|
+
const displayContainer = page.locator('wcs-editable-field .display-container');
|
|
105
|
+
await expect(displayContainer).toContainText('Multiline\nText');
|
|
106
|
+
// Go to edit mode
|
|
107
|
+
await displayContainer.click();
|
|
108
|
+
// Should need Ctrl+Enter to submit with textarea
|
|
109
|
+
const textarea = page.locator('wcs-textarea');
|
|
110
|
+
await textarea.press('Enter'); // This should NOT submit
|
|
111
|
+
// Should still be in edit mode
|
|
112
|
+
const editContainerVisible = page.locator('wcs-editable-field .edit-container:not(.display-none)');
|
|
113
|
+
await expect(editContainerVisible).toBeVisible();
|
|
114
|
+
});
|
|
115
|
+
test('works correctly with select', async ({ page }) => {
|
|
116
|
+
await setWcsContent(page, `
|
|
117
|
+
<wcs-editable-field label="Select Test" type="select" value="option1" id="test">
|
|
118
|
+
<wcs-select>
|
|
119
|
+
<wcs-select-option value="option1">Option 1</wcs-select-option>
|
|
120
|
+
<wcs-select-option value="option2">Option 2</wcs-select-option>
|
|
121
|
+
</wcs-select>
|
|
122
|
+
</wcs-editable-field>
|
|
123
|
+
`);
|
|
124
|
+
// Go to edit mode
|
|
125
|
+
const displayContainer = page.locator('wcs-editable-field .display-container');
|
|
126
|
+
await displayContainer.click();
|
|
127
|
+
// We get the select element
|
|
128
|
+
const select = page.locator('wcs-select');
|
|
129
|
+
await select.focus();
|
|
130
|
+
await select.press('ArrowDown');
|
|
131
|
+
// press CTRL + ENTER (combined) to validate
|
|
132
|
+
await page.keyboard.down('Control');
|
|
133
|
+
await page.keyboard.press('Enter');
|
|
134
|
+
await page.keyboard.up('Control');
|
|
135
|
+
await page.waitForChanges();
|
|
136
|
+
// Should be in load state after change
|
|
137
|
+
const loadContainer = page.locator('wcs-editable-field .load-container:not(.display-none)');
|
|
138
|
+
await expect(loadContainer).toBeVisible();
|
|
139
|
+
});
|
|
140
|
+
test('properly handles custom formatting function', async ({ page }) => {
|
|
141
|
+
await setWcsContent(page, `
|
|
142
|
+
<wcs-editable-field id="format-test" label="Formatting Test" value="test value" type="input">
|
|
143
|
+
<wcs-input></wcs-input>
|
|
144
|
+
</wcs-editable-field>
|
|
145
|
+
`);
|
|
146
|
+
// Set custom formatter
|
|
147
|
+
await page.evaluate(() => {
|
|
148
|
+
const el = document.querySelector('wcs-editable-field');
|
|
149
|
+
el.formatFn = (val) => val ? val.toUpperCase() : '';
|
|
150
|
+
});
|
|
151
|
+
// Check formatted output
|
|
152
|
+
const displayContainer = page.locator('wcs-editable-field .display-container');
|
|
153
|
+
await expect(displayContainer).toContainText('TEST VALUE');
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=editable-field.e2e.playwright.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editable-field.e2e.playwright.js","sourceRoot":"","sources":["../../../src/components/editable-field/editable-field.e2e.playwright.ts"],"names":[],"mappings":"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","sourcesContent":["import { setWcsContent } from '../../utils/playwright/test';\nimport { test, E2EPage } from \"@stencil/playwright\";\n\nimport { expect } from \"@playwright/test\";\n\ntest.describe('wcs-editable-field', () => {\n test('renders with input element and default props', async ({ page }: { page: E2EPage }) => {\n await setWcsContent(page, `\n <wcs-editable-field label=\"Test Input\" value=\"Initial value\" type=\"input\" id=\"test\">\n <wcs-input></wcs-input>\n </wcs-editable-field>\n `);\n\n const displayContainer = page.locator('wcs-editable-field .display-container');\n await expect(displayContainer).toContainText('Initial value');\n\n const label = page.locator('wcs-editable-field .label');\n await expect(label).toHaveText('Test Input');\n });\n\n test('transitions from DISPLAY to EDIT state when clicked', async ({ page }: { page: E2EPage }) => {\n await setWcsContent(page, `\n <wcs-editable-field label=\"Test Input\" value=\"Initial value\" type=\"input\" id=\"test\">\n <wcs-input></wcs-input>\n </wcs-editable-field>\n `);\n\n const displayContainer = page.locator('wcs-editable-field .display-container');\n await displayContainer.click();\n\n const editContainer = page.locator('wcs-editable-field .edit-container:not(.display-none)');\n await expect(editContainer).toBeVisible();\n });\n\n test('properly handles validation', async ({ page }: { page: E2EPage }) => {\n await setWcsContent(page, `\n <wcs-editable-field id=\"validate-test\" label=\"Test Validation\" value=\"Valid\" error-msg=\"Value is invalid\" type=\"input\">\n <wcs-input></wcs-input>\n </wcs-editable-field>\n `);\n\n // Set up validation function\n await page.evaluate(() => {\n const el = document.querySelector('wcs-editable-field') as any;\n el.validateFn = (val: string) => val === 'Valid';\n });\n\n // Go to edit mode\n const displayContainer = page.locator('wcs-editable-field .display-container');\n await displayContainer.click();\n\n // Input invalid value\n const wcsInput = page.locator('wcs-input');\n const nativeInput = page.locator('wcs-input input');\n await nativeInput.fill('Invalid');\n\n // Trigger validation (simulate Enter key)\n await wcsInput.press('Enter');\n await page.waitForChanges();\n\n // Check error message is displayed\n const errorElement = page.locator('wcs-editable-field wcs-error');\n await expect(errorElement).toBeVisible();\n await expect(errorElement).toHaveText('Value is invalid');\n });\n\n test('emits wcsChange event with correct data', async ({ page }: { page: E2EPage }) => {\n await setWcsContent(page, `\n <wcs-editable-field label=\"Test Events\" value=\"Old value\" type=\"input\" id=\"event-test\">\n <wcs-input id=\"test-input\"></wcs-input>\n </wcs-editable-field>\n `);\n\n const changeSpy = await page.spyOnEvent('wcsChange');\n\n // Go to edit mode\n const displayContainer = page.locator('wcs-editable-field .display-container');\n await displayContainer.click();\n await page.waitForChanges();\n\n const input = page.locator('wcs-input');\n await input.press('Backspace'); // Clear value (backspace is easier than selecting all)\n await input.pressSequentially('New value'); // send input event\n await page.waitForChanges();\n\n // Submit the form by pressing Enter\n await input.press('Enter');\n await page.waitForChanges();\n\n // Note: Functions defined in the event's detail object (successHandler and errorHandler)\n // are not cloned by the DOM's structured clone algorithm.\n // This means that when the event is emitted, these functions will not be present in the\n // event.detail object when accessed in E2E tests, even though they exist in the browser.\n\n expect(changeSpy).toHaveNthReceivedEventDetail(0, {\n newValue: 'New value',\n successHandler: undefined,\n errorHandler: undefined\n });\n });\n\n test('respects readonly property', async ({ page }: { page: E2EPage }) => {\n await setWcsContent(page, `\n <wcs-editable-field label=\"Read Only Field\" value=\"Readonly value\" readonly=\"true\" type=\"input\" id=\"test\">\n <wcs-input></wcs-input>\n </wcs-editable-field>\n `);\n\n // Check readonly icon is displayed\n const readonlyIcon = page.locator('wcs-editable-field .readonly-icon');\n await expect(readonlyIcon).toBeVisible();\n\n // Try clicking\n const displayContainer = page.locator('wcs-editable-field .display-container');\n await displayContainer.click();\n\n // Should still be in display mode\n const editContainer = page.locator('wcs-editable-field .edit-container:not(.display-none)');\n await expect(editContainer).toHaveCount(0);\n });\n\n test('works correctly with textarea', async ({ page }: { page: E2EPage }) => {\n await setWcsContent(page, `\n <wcs-editable-field label=\"Textarea Test\" type=\"textarea\" value=\"Multiline\\nText\" id=\"test\">\n <wcs-textarea></wcs-textarea>\n </wcs-editable-field>\n `);\n\n // Check it renders correctly\n const displayContainer = page.locator('wcs-editable-field .display-container');\n await expect(displayContainer).toContainText('Multiline\\nText');\n\n // Go to edit mode\n await displayContainer.click();\n\n // Should need Ctrl+Enter to submit with textarea\n const textarea = page.locator('wcs-textarea');\n await textarea.press('Enter'); // This should NOT submit\n\n // Should still be in edit mode\n const editContainerVisible = page.locator('wcs-editable-field .edit-container:not(.display-none)');\n await expect(editContainerVisible).toBeVisible();\n });\n\n test('works correctly with select', async ({ page }: { page: E2EPage }) => {\n await setWcsContent(page, `\n <wcs-editable-field label=\"Select Test\" type=\"select\" value=\"option1\" id=\"test\">\n <wcs-select>\n <wcs-select-option value=\"option1\">Option 1</wcs-select-option>\n <wcs-select-option value=\"option2\">Option 2</wcs-select-option>\n </wcs-select>\n </wcs-editable-field>\n `);\n\n // Go to edit mode\n const displayContainer = page.locator('wcs-editable-field .display-container');\n await displayContainer.click();\n\n // We get the select element\n const select = page.locator('wcs-select');\n await select.focus();\n await select.press('ArrowDown');\n\n // press CTRL + ENTER (combined) to validate\n await page.keyboard.down('Control');\n await page.keyboard.press('Enter');\n await page.keyboard.up('Control');\n await page.waitForChanges();\n\n // Should be in load state after change\n const loadContainer = page.locator('wcs-editable-field .load-container:not(.display-none)');\n await expect(loadContainer).toBeVisible();\n });\n\n test('properly handles custom formatting function', async ({ page }: { page: E2EPage }) => {\n await setWcsContent(page, `\n <wcs-editable-field id=\"format-test\" label=\"Formatting Test\" value=\"test value\" type=\"input\">\n <wcs-input></wcs-input>\n </wcs-editable-field>\n `);\n\n // Set custom formatter\n await page.evaluate(() => {\n const el = document.querySelector('wcs-editable-field') as any;\n el.formatFn = (val: string) => val ? val.toUpperCase() : '';\n });\n\n // Check formatted output\n const displayContainer = page.locator('wcs-editable-field .display-container');\n await expect(displayContainer).toContainText('TEST VALUE');\n });\n});\n"]}
|