@dile/ui 3.18.0 → 3.18.1
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/components/toast/src/DileToast.js +2 -1
- package/components/toast/src/DileToastPersistent.js +1 -1
- package/package.json +4 -4
- package/components/accordion/accordion.spec.js +0 -253
- package/components/app-drawer/app-drawer.spec.js +0 -262
- package/components/avatar/avatar.spec.js +0 -25
- package/components/bottom-nav/__screenshots__/bottom-nav.spec.js/dile-bottom-nav-places-the-sheet-and-the-overlay-above-the-bar-1.png +0 -0
- package/components/bottom-nav/bottom-nav.spec.js +0 -340
- package/components/box-selector/box-selector-item.spec.js +0 -27
- package/components/box-selector/box-selector.spec.js +0 -27
- package/components/breadcrumbs/breadcrumbs-item.spec.js +0 -28
- package/components/breadcrumbs/breadcrumbs.spec.js +0 -33
- package/components/button/button.spec.js +0 -234
- package/components/card/card-slide.spec.js +0 -30
- package/components/card/card.spec.js +0 -26
- package/components/checkbox/checkbox.spec.js +0 -235
- package/components/chip/chip.spec.js +0 -31
- package/components/color-picker/color-picker.spec.js +0 -133
- package/components/confirm/confirm.spec.js +0 -57
- package/components/confirm-text/confirm-text.spec.js +0 -29
- package/components/copy-markdown-url/copy-markdown-url.spec.js +0 -27
- package/components/copy-text/copy-text.spec.js +0 -38
- package/components/data-grid/__screenshots__/data-grid.spec.js/dile-data-grid-dispatches-item-checkbox-changed-and-dile-data-grid-item-selected-when-a-checkbox-is-toggled-1.png +0 -0
- package/components/data-grid/data-grid.spec.js +0 -421
- package/components/drop-file/drop-file.spec.js +0 -214
- package/components/drop-file/file-preview.spec.js +0 -35
- package/components/floating-feedback/floating-feedback.spec.js +0 -30
- package/components/floating-menu/floating-menu-item.spec.js +0 -27
- package/components/floating-menu/floating-menu.spec.js +0 -31
- package/components/form-separator/form-separator.spec.js +0 -28
- package/components/hamburger/hamburger.spec.js +0 -28
- package/components/icon/icon.spec.js +0 -31
- package/components/icon-switch/icon-switch-group.spec.js +0 -46
- package/components/icon-switch/icon-switch.spec.js +0 -35
- package/components/info-box/info-box.spec.js +0 -38
- package/components/inline-feedback/inline-feedback.spec.js +0 -46
- package/components/input/input-contact.spec.js +0 -32
- package/components/input/input-icon.spec.js +0 -166
- package/components/input/input-integer.spec.js +0 -31
- package/components/input/input-mask.spec.js +0 -314
- package/components/input/input-message.spec.js +0 -27
- package/components/input/input-money.spec.js +0 -30
- package/components/input/input-number-mask.spec.js +0 -48
- package/components/input/input-number.spec.js +0 -109
- package/components/input/input-percentage.spec.js +0 -31
- package/components/input/input-search.spec.js +0 -91
- package/components/input/input.spec.js +0 -47
- package/components/light-mode-switch/light-mode-switch.spec.js +0 -34
- package/components/menu-hamburger/menu-hamburger.spec.js +0 -34
- package/components/menu-overlay/menu-overlay.spec.js +0 -44
- package/components/message/message.spec.js +0 -42
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-closes-only-the-topmost-modal-when-Esc-is-pressed-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-dispatches-dile-modal-closed-and-animates-when-the-opened-property-is-set-to-false-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-does-not-close-a-blocking-modal-when-Esc-is-pressed-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-does-not-close-the-modal-below-when-the-topmost-modal-is-blocking-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-ignores-transitionend-events-coming-from-inner-elements-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-keeps-the-focus-on-content-focused-by-the-user-when-opening-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-opens-and-closes-through-the-opened-attribute-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-reflects-the-opened-property-to-the-attribute-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-releases-the-background-layer-after-the-close-animation-even-without-transitionend-1.png +0 -0
- package/components/modal/__screenshots__/modal.spec.js/dile-modal-releases-the-background-layer-immediately-when-the-animation-duration-is-0s-1.png +0 -0
- package/components/modal/modal-help.spec.js +0 -32
- package/components/modal/modal.spec.js +0 -250
- package/components/nav/nav.spec.js +0 -33
- package/components/number-picker/number-picker-element.spec.js +0 -30
- package/components/number-picker/number-picker.spec.js +0 -30
- package/components/order-switch/__screenshots__/order-switch.spec.js/dile-order-switch-clicking-the-label-re-announces-the-current-value-without-toggling-when-not-selected-1.png +0 -0
- package/components/order-switch/__screenshots__/order-switch.spec.js/dile-order-switch-clicking-the-label-toggles-the-order-when-selected-1.png +0 -0
- package/components/order-switch/__screenshots__/order-switch.spec.js/dile-order-switch-defaults-to-ascending-order-1.png +0 -0
- package/components/order-switch/order-switch.spec.js +0 -57
- package/components/otp-input/otp-input.spec.js +0 -41
- package/components/pages/pages.spec.js +0 -44
- package/components/password/password.spec.js +0 -35
- package/components/progress-bar/progress-bar.spec.js +0 -28
- package/components/radio-group/__screenshots__/radio-group-dialog.spec.js/dile-radio-group-dialog-renders-dialog-items-with-labels-and-values-1.png +0 -0
- package/components/radio-group/__screenshots__/radio-group-dialog.spec.js/dile-radio-group-dialog-renders-items-with-optional-description-1.png +0 -0
- package/components/radio-group/__screenshots__/radio-group-dialog.spec.js/dile-radio-group-dialog-updates-value-when-an-option-is-selected-1.png +0 -0
- package/components/radio-group/radio-group-dialog.spec.js +0 -126
- package/components/radio-group/radio-group.spec.js +0 -128
- package/components/radio-group/radio.spec.js +0 -32
- package/components/range/range.spec.js +0 -36
- package/components/rating/rating.spec.js +0 -34
- package/components/rating/star.spec.js +0 -30
- package/components/rating-scale-question/rating-scale-option.spec.js +0 -32
- package/components/rating-scale-question/rating-scale-question.spec.js +0 -35
- package/components/select/__screenshots__/select-search.spec.js/dile-select-search-Value-API-uses-the-label-as-accessible-name-of-the-selected-field-1.png +0 -0
- package/components/select/select-ajax-overlay.spec.js +0 -469
- package/components/select/select-overlay.spec.js +0 -612
- package/components/select/select-search.spec.js +0 -318
- package/components/select/select.spec.js +0 -574
- package/components/selector/selector-item.spec.js +0 -40
- package/components/selector/selector-overlay.spec.js +0 -139
- package/components/selector/selector.spec.js +0 -45
- package/components/slide-menu/slide-menu.spec.js +0 -38
- package/components/slide-show/slide-show.spec.js +0 -34
- package/components/social-icon/social-icon.spec.js +0 -26
- package/components/spinner/spinner-bar.spec.js +0 -26
- package/components/spinner/spinner-block.spec.js +0 -21
- package/components/spinner/spinner-horizontal.spec.js +0 -25
- package/components/spinner/spinner-icon.spec.js +0 -25
- package/components/spinner/spinner-modal.spec.js +0 -26
- package/components/spinner/spinner.spec.js +0 -26
- package/components/steps/steps.spec.js +0 -84
- package/components/switch/switch.spec.js +0 -33
- package/components/tabs/tabs.spec.js +0 -85
- package/components/textarea/textarea.spec.js +0 -39
- package/components/time-picker/time-picker.spec.js +0 -26
- package/components/timer/timer.spec.js +0 -31
- package/components/toast/toast.spec.js +0 -86
- package/components/tooltip/chip-tooltip.spec.js +0 -29
- package/components/tooltip/tooltip.spec.js +0 -32
- package/components/web-visor/web-visor.spec.js +0 -32
- package/mixins/form/src/DileForm.spec.js +0 -29
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './input.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-input', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderInput(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-input');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('renders a native text input with the given value', async () => {
|
|
17
|
-
const el = await renderInput('<dile-input name="first" value="hello"></dile-input>');
|
|
18
|
-
const input = el.shadowRoot.querySelector('input');
|
|
19
|
-
expect(input).toBeTruthy();
|
|
20
|
-
expect(input.value).toBe('hello');
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('renders the label when set', async () => {
|
|
24
|
-
const el = await renderInput('<dile-input label="First name"></dile-input>');
|
|
25
|
-
const label = el.shadowRoot.querySelector('label');
|
|
26
|
-
expect(label).toBeTruthy();
|
|
27
|
-
expect(label.textContent.trim()).toBe('First name');
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
it('updates the value property on user input', async () => {
|
|
31
|
-
const el = await renderInput('<dile-input name="first"></dile-input>');
|
|
32
|
-
const input = el.shadowRoot.querySelector('input');
|
|
33
|
-
input.value = 'typed';
|
|
34
|
-
input.dispatchEvent(new Event('input', { bubbles: true }));
|
|
35
|
-
await el.updateComplete;
|
|
36
|
-
|
|
37
|
-
expect(el.value).toBe('typed');
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('renders a message when the message property is set', async () => {
|
|
41
|
-
const el = await renderInput('<dile-input></dile-input>');
|
|
42
|
-
el.message = 'Required field';
|
|
43
|
-
await el.updateComplete;
|
|
44
|
-
|
|
45
|
-
expect(el.shadowRoot.querySelector('.message span').textContent.trim()).toBe('Required field');
|
|
46
|
-
});
|
|
47
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './light-mode-switch.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-light-mode-switch', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
localStorage.removeItem('dile_light_mode_switch_state');
|
|
8
|
-
document.documentElement.classList.remove('dark-theme');
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
async function renderLightModeSwitch(html) {
|
|
12
|
-
document.body.innerHTML = html;
|
|
13
|
-
const el = document.body.querySelector('dile-light-mode-switch');
|
|
14
|
-
await el.updateComplete;
|
|
15
|
-
return el;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
it('renders an icon and a switch', async () => {
|
|
19
|
-
const el = await renderLightModeSwitch('<dile-light-mode-switch></dile-light-mode-switch>');
|
|
20
|
-
expect(el.shadowRoot.querySelector('dile-icon')).toBeTruthy();
|
|
21
|
-
expect(el.shadowRoot.querySelector('dile-switch')).toBeTruthy();
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('toggles darkMode and reflects the attribute', async () => {
|
|
25
|
-
const el = await renderLightModeSwitch('<dile-light-mode-switch></dile-light-mode-switch>');
|
|
26
|
-
const initial = el.darkMode;
|
|
27
|
-
|
|
28
|
-
el.toggle();
|
|
29
|
-
await el.updateComplete;
|
|
30
|
-
|
|
31
|
-
expect(el.darkMode).toBe(!initial);
|
|
32
|
-
expect(el.hasAttribute('darkMode')).toBe(!initial);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './menu-hamburger.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-menu-hamburger', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderMenuHamburger(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-menu-hamburger');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('renders a hamburger and a drawer, closed by default', async () => {
|
|
17
|
-
const el = await renderMenuHamburger('<dile-menu-hamburger><nav slot="menu">Links</nav></dile-menu-hamburger>');
|
|
18
|
-
expect(el.opened).toBe(false);
|
|
19
|
-
expect(el.shadowRoot.querySelector('dile-hamburger')).toBeTruthy();
|
|
20
|
-
expect(el.shadowRoot.querySelector('dile-app-drawer')).toBeTruthy();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('opens on toggle and dispatches dile-menu-hamburger-opened', async () => {
|
|
24
|
-
const el = await renderMenuHamburger('<dile-menu-hamburger><nav slot="menu">Links</nav></dile-menu-hamburger>');
|
|
25
|
-
let opened = false;
|
|
26
|
-
el.addEventListener('dile-menu-hamburger-opened', () => { opened = true; });
|
|
27
|
-
|
|
28
|
-
el.toggle();
|
|
29
|
-
await el.updateComplete;
|
|
30
|
-
|
|
31
|
-
expect(el.opened).toBe(true);
|
|
32
|
-
expect(opened).toBe(true);
|
|
33
|
-
});
|
|
34
|
-
});
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './menu-overlay.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-menu-overlay', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderMenuOverlay(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-menu-overlay');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function wait(ms) {
|
|
17
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
it('renders the trigger and content slots', async () => {
|
|
21
|
-
const el = await renderMenuOverlay(`
|
|
22
|
-
<dile-menu-overlay>
|
|
23
|
-
<button slot="trigger">Open</button>
|
|
24
|
-
<div slot="content">Menu content</div>
|
|
25
|
-
</dile-menu-overlay>
|
|
26
|
-
`);
|
|
27
|
-
expect(el.shadowRoot.getElementById('trigger')).toBeTruthy();
|
|
28
|
-
expect(el.shadowRoot.getElementById('overlay')).toBeTruthy();
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('opens the overlay when the trigger is clicked', async () => {
|
|
32
|
-
const el = await renderMenuOverlay(`
|
|
33
|
-
<dile-menu-overlay>
|
|
34
|
-
<button slot="trigger">Open</button>
|
|
35
|
-
<div slot="content">Menu content</div>
|
|
36
|
-
</dile-menu-overlay>
|
|
37
|
-
`);
|
|
38
|
-
|
|
39
|
-
el.shadowRoot.getElementById('trigger').click();
|
|
40
|
-
await wait(100);
|
|
41
|
-
|
|
42
|
-
expect(el.shadowRoot.getElementById('overlay').classList.contains('opened')).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './message.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-message', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderMessage(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-message');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('renders closed by default with a close icon', async () => {
|
|
17
|
-
const el = await renderMessage('<dile-message></dile-message>');
|
|
18
|
-
expect(el.opened).toBe(false);
|
|
19
|
-
expect(el.shadowRoot.querySelector('dile-icon.icon')).toBeTruthy();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
it('opens and shows the message text via openMessage()', async () => {
|
|
23
|
-
const el = await renderMessage('<dile-message></dile-message>');
|
|
24
|
-
el.openMessage('Saved successfully');
|
|
25
|
-
await el.updateComplete;
|
|
26
|
-
|
|
27
|
-
expect(el.opened).toBe(true);
|
|
28
|
-
expect(el.shadowRoot.querySelector('.content').textContent.trim()).toBe('Saved successfully');
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('dispatches dile-message-closed-by-user when the close icon is clicked', async () => {
|
|
32
|
-
const el = await renderMessage('<dile-message opened></dile-message>');
|
|
33
|
-
let closed = false;
|
|
34
|
-
el.addEventListener('dile-message-closed-by-user', () => { closed = true; });
|
|
35
|
-
|
|
36
|
-
el.shadowRoot.querySelector('dile-icon.icon').click();
|
|
37
|
-
await el.updateComplete;
|
|
38
|
-
|
|
39
|
-
expect(closed).toBe(true);
|
|
40
|
-
expect(el.opened).toBe(false);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './modal-help.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-modal-help', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderModalHelp(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-modal-help');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('renders a trigger button with the default label and a closed inner modal', async () => {
|
|
17
|
-
const el = await renderModalHelp('<dile-modal-help>Help content</dile-modal-help>');
|
|
18
|
-
const button = el.shadowRoot.querySelector('dile-button-icon');
|
|
19
|
-
expect(button).toBeTruthy();
|
|
20
|
-
expect(button.textContent.trim()).toBe('Help');
|
|
21
|
-
expect(el.elmodal.opened).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('opens the inner modal on open()', async () => {
|
|
25
|
-
const el = await renderModalHelp('<dile-modal-help title="Info">Help content</dile-modal-help>');
|
|
26
|
-
el.open();
|
|
27
|
-
await el.elmodal.updateComplete;
|
|
28
|
-
|
|
29
|
-
expect(el.elmodal.opened).toBe(true);
|
|
30
|
-
expect(el.shadowRoot.querySelector('h1').textContent.trim()).toBe('Info');
|
|
31
|
-
});
|
|
32
|
-
});
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './modal.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-modal', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderModal(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-modal');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('renders closed by default with slotted content', async () => {
|
|
17
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
18
|
-
expect(el.opened).toBe(false);
|
|
19
|
-
expect(el.textContent.trim()).toBe('Modal content');
|
|
20
|
-
expect(el.shadowRoot.querySelector('section').classList.contains('opaque')).toBe(false);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('opens the modal via open()', async () => {
|
|
24
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
25
|
-
el.open();
|
|
26
|
-
await el.updateComplete;
|
|
27
|
-
|
|
28
|
-
expect(el.opened).toBe(true);
|
|
29
|
-
expect(el.shadowRoot.querySelector('section').classList.contains('opened')).toBe(true);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('closes and dispatches dile-modal-closed via close()', async () => {
|
|
33
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
34
|
-
el.open();
|
|
35
|
-
await el.updateComplete;
|
|
36
|
-
|
|
37
|
-
let closed = false;
|
|
38
|
-
el.addEventListener('dile-modal-closed', () => { closed = true; });
|
|
39
|
-
|
|
40
|
-
el.close();
|
|
41
|
-
await el.updateComplete;
|
|
42
|
-
|
|
43
|
-
expect(el.opened).toBe(false);
|
|
44
|
-
expect(closed).toBe(true);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('releases the background layer immediately when the animation duration is 0s', async () => {
|
|
48
|
-
const el = await renderModal('<dile-modal style="--dile-modal-animation-duration: 0s">Modal content</dile-modal>');
|
|
49
|
-
el.open();
|
|
50
|
-
await el.updateComplete;
|
|
51
|
-
|
|
52
|
-
el.close();
|
|
53
|
-
await el.updateComplete;
|
|
54
|
-
|
|
55
|
-
const section = el.shadowRoot.querySelector('section');
|
|
56
|
-
expect(getComputedStyle(section).display).toBe('none');
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
it('releases the background layer after the close animation even without transitionend', async () => {
|
|
60
|
-
const el = await renderModal('<dile-modal style="--dile-modal-animation-duration: 0.1s">Modal content</dile-modal>');
|
|
61
|
-
el.open();
|
|
62
|
-
await el.updateComplete;
|
|
63
|
-
|
|
64
|
-
el.close();
|
|
65
|
-
await el.updateComplete;
|
|
66
|
-
const section = el.shadowRoot.querySelector('section');
|
|
67
|
-
expect(getComputedStyle(section).pointerEvents).toBe('none');
|
|
68
|
-
|
|
69
|
-
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
70
|
-
await el.updateComplete;
|
|
71
|
-
expect(getComputedStyle(section).display).toBe('none');
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
it('ignores transitionend events coming from inner elements', async () => {
|
|
75
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
76
|
-
el.open();
|
|
77
|
-
await el.updateComplete;
|
|
78
|
-
el.close();
|
|
79
|
-
await el.updateComplete;
|
|
80
|
-
|
|
81
|
-
const section = el.shadowRoot.querySelector('section');
|
|
82
|
-
const content = el.shadowRoot.querySelector('.content');
|
|
83
|
-
content.dispatchEvent(new TransitionEvent('transitionend', { bubbles: true, propertyName: 'opacity' }));
|
|
84
|
-
await el.updateComplete;
|
|
85
|
-
|
|
86
|
-
expect(section.classList.contains('opened')).toBe(true);
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
it('dispatches dile-modal-closed and animates when the opened property is set to false', async () => {
|
|
90
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
91
|
-
el.opened = true;
|
|
92
|
-
await el.updateComplete;
|
|
93
|
-
|
|
94
|
-
let closed = false;
|
|
95
|
-
el.addEventListener('dile-modal-closed', () => { closed = true; });
|
|
96
|
-
|
|
97
|
-
el.opened = false;
|
|
98
|
-
await el.updateComplete;
|
|
99
|
-
|
|
100
|
-
expect(closed).toBe(true);
|
|
101
|
-
expect(el.shadowRoot.querySelector('section').classList.contains('opened')).toBe(true);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
it('opens and closes through the opened attribute', async () => {
|
|
105
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
106
|
-
let closed = false;
|
|
107
|
-
el.addEventListener('dile-modal-closed', () => { closed = true; });
|
|
108
|
-
|
|
109
|
-
el.setAttribute('opened', '');
|
|
110
|
-
await el.updateComplete;
|
|
111
|
-
expect(el.opened).toBe(true);
|
|
112
|
-
|
|
113
|
-
el.removeAttribute('opened');
|
|
114
|
-
await el.updateComplete;
|
|
115
|
-
expect(el.opened).toBe(false);
|
|
116
|
-
expect(closed).toBe(true);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it('reflects the opened property to the attribute', async () => {
|
|
120
|
-
const el = await renderModal('<dile-modal opened>Modal content</dile-modal>');
|
|
121
|
-
el.close();
|
|
122
|
-
await el.updateComplete;
|
|
123
|
-
expect(el.hasAttribute('opened')).toBe(false);
|
|
124
|
-
|
|
125
|
-
el.setAttribute('opened', '');
|
|
126
|
-
await el.updateComplete;
|
|
127
|
-
expect(el.opened).toBe(true);
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('closes a blocking modal when Esc is pressed', async () => {
|
|
131
|
-
const el = await renderModal('<dile-modal blocking>Modal content</dile-modal>');
|
|
132
|
-
el.open();
|
|
133
|
-
await el.updateComplete;
|
|
134
|
-
|
|
135
|
-
window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
|
|
136
|
-
await el.updateComplete;
|
|
137
|
-
|
|
138
|
-
expect(el.opened).toBe(false);
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
it('closes only the topmost modal when Esc is pressed', async () => {
|
|
142
|
-
document.body.innerHTML = '<dile-modal id="first">First</dile-modal><dile-modal id="second">Second</dile-modal>';
|
|
143
|
-
const first = document.getElementById('first');
|
|
144
|
-
const second = document.getElementById('second');
|
|
145
|
-
await first.updateComplete;
|
|
146
|
-
await second.updateComplete;
|
|
147
|
-
first.open();
|
|
148
|
-
second.open();
|
|
149
|
-
|
|
150
|
-
window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
|
|
151
|
-
expect(second.opened).toBe(false);
|
|
152
|
-
expect(first.opened).toBe(true);
|
|
153
|
-
|
|
154
|
-
window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape' }));
|
|
155
|
-
expect(first.opened).toBe(false);
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
it('exposes the content as an accessible modal dialog', async () => {
|
|
159
|
-
const el = await renderModal('<dile-modal label="Settings">Modal content</dile-modal>');
|
|
160
|
-
const dialog = el.shadowRoot.querySelector('[role="dialog"]');
|
|
161
|
-
|
|
162
|
-
expect(dialog).not.toBeNull();
|
|
163
|
-
expect(dialog.getAttribute('aria-modal')).toBe('true');
|
|
164
|
-
expect(dialog.getAttribute('aria-label')).toBe('Settings');
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
it('renders the close icon as an accessible button', async () => {
|
|
168
|
-
const el = await renderModal('<dile-modal showCloseIcon closeLabel="Cerrar">Modal content</dile-modal>');
|
|
169
|
-
el.open();
|
|
170
|
-
await el.updateComplete;
|
|
171
|
-
|
|
172
|
-
const button = el.shadowRoot.querySelector('button.closebutton');
|
|
173
|
-
expect(button.getAttribute('aria-label')).toBe('Cerrar');
|
|
174
|
-
|
|
175
|
-
button.click();
|
|
176
|
-
expect(el.opened).toBe(false);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('moves the focus into the modal and restores it on close', async () => {
|
|
180
|
-
document.body.innerHTML = '<button id="opener">Open</button><dile-modal>Modal content</dile-modal>';
|
|
181
|
-
const opener = document.getElementById('opener');
|
|
182
|
-
const el = document.querySelector('dile-modal');
|
|
183
|
-
await el.updateComplete;
|
|
184
|
-
|
|
185
|
-
opener.focus();
|
|
186
|
-
el.open();
|
|
187
|
-
await el.updateComplete;
|
|
188
|
-
expect(el.shadowRoot.activeElement).toBe(el.shadowRoot.querySelector('.content'));
|
|
189
|
-
|
|
190
|
-
el.close();
|
|
191
|
-
expect(document.activeElement).toBe(opener);
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
it('keeps the focus on content focused by the user when opening', async () => {
|
|
195
|
-
const el = await renderModal('<dile-modal><input id="field"></dile-modal>');
|
|
196
|
-
const field = document.getElementById('field');
|
|
197
|
-
|
|
198
|
-
el.open();
|
|
199
|
-
await el.updateComplete;
|
|
200
|
-
field.focus();
|
|
201
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
202
|
-
|
|
203
|
-
expect(document.activeElement).toBe(field);
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
it('dispatches dile-modal-opened when opened', async () => {
|
|
207
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
208
|
-
let opened = false;
|
|
209
|
-
el.addEventListener('dile-modal-opened', () => { opened = true; });
|
|
210
|
-
|
|
211
|
-
el.open();
|
|
212
|
-
expect(opened).toBe(true);
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
it('becomes opaque after opening', async () => {
|
|
216
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
217
|
-
el.open();
|
|
218
|
-
await el.updateComplete;
|
|
219
|
-
|
|
220
|
-
const section = el.shadowRoot.querySelector('section');
|
|
221
|
-
await expect.poll(() => section.classList.contains('opaque')).toBe(true);
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
it('locks the page scroll while any modal is opened', async () => {
|
|
225
|
-
document.body.innerHTML = '<dile-modal id="first">First</dile-modal><dile-modal id="second">Second</dile-modal>';
|
|
226
|
-
const first = document.getElementById('first');
|
|
227
|
-
const second = document.getElementById('second');
|
|
228
|
-
await second.updateComplete;
|
|
229
|
-
const root = document.documentElement;
|
|
230
|
-
|
|
231
|
-
first.open();
|
|
232
|
-
second.open();
|
|
233
|
-
expect(root.style.overflow).toBe('hidden');
|
|
234
|
-
|
|
235
|
-
second.close();
|
|
236
|
-
expect(root.style.overflow).toBe('hidden');
|
|
237
|
-
|
|
238
|
-
first.close();
|
|
239
|
-
expect(root.style.overflow).toBe('');
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
it('unlocks the page scroll when an opened modal is removed from the document', async () => {
|
|
243
|
-
const el = await renderModal('<dile-modal>Modal content</dile-modal>');
|
|
244
|
-
el.open();
|
|
245
|
-
expect(document.documentElement.style.overflow).toBe('hidden');
|
|
246
|
-
|
|
247
|
-
el.remove();
|
|
248
|
-
expect(document.documentElement.style.overflow).toBe('');
|
|
249
|
-
});
|
|
250
|
-
});
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './nav.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-nav', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderNav(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-nav');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('renders the menu, title and actions slots', async () => {
|
|
17
|
-
const el = await renderNav(`
|
|
18
|
-
<dile-nav>
|
|
19
|
-
<span slot="title">My App</span>
|
|
20
|
-
</dile-nav>
|
|
21
|
-
`);
|
|
22
|
-
|
|
23
|
-
expect(el.shadowRoot.querySelector('slot[name="menu"]')).toBeTruthy();
|
|
24
|
-
expect(el.shadowRoot.querySelector('slot[name="title"]')).toBeTruthy();
|
|
25
|
-
expect(el.shadowRoot.querySelector('slot[name="actions"]')).toBeTruthy();
|
|
26
|
-
expect(el.menu).toBe('left');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('reflects the menu property as an attribute', async () => {
|
|
30
|
-
const el = await renderNav('<dile-nav menu="right"></dile-nav>');
|
|
31
|
-
expect(el.getAttribute('menu')).toBe('right');
|
|
32
|
-
});
|
|
33
|
-
});
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './number-picker-element.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-number-picker-element', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderNumberPickerElement(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-number-picker-element');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('renders an input and increment/decrement icons', async () => {
|
|
17
|
-
const el = await renderNumberPickerElement('<dile-number-picker-element value="3"></dile-number-picker-element>');
|
|
18
|
-
|
|
19
|
-
expect(el.shadowRoot.querySelector('input')).toBeTruthy();
|
|
20
|
-
expect(el.shadowRoot.querySelectorAll('dile-icon').length).toBe(2);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('increments the value when calling increment()', async () => {
|
|
24
|
-
const el = await renderNumberPickerElement('<dile-number-picker-element value="3" step="1"></dile-number-picker-element>');
|
|
25
|
-
el.increment();
|
|
26
|
-
await el.updateComplete;
|
|
27
|
-
|
|
28
|
-
expect(el.value).toBe('4');
|
|
29
|
-
});
|
|
30
|
-
});
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './number-picker.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-number-picker', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderNumberPicker(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-number-picker');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('renders an inner dile-number-picker-element with the given value', async () => {
|
|
17
|
-
const el = await renderNumberPicker('<dile-number-picker name="qty" value="5"></dile-number-picker>');
|
|
18
|
-
|
|
19
|
-
const inner = el.shadowRoot.querySelector('dile-number-picker-element');
|
|
20
|
-
expect(inner).toBeTruthy();
|
|
21
|
-
expect(el.value).toBe('5');
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('renders the label when set', async () => {
|
|
25
|
-
const el = await renderNumberPicker('<dile-number-picker label="Quantity"></dile-number-picker>');
|
|
26
|
-
const label = el.shadowRoot.querySelector('label');
|
|
27
|
-
expect(label).toBeTruthy();
|
|
28
|
-
expect(label.textContent.trim()).toBe('Quantity');
|
|
29
|
-
});
|
|
30
|
-
});
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import './order-switch.js';
|
|
3
|
-
|
|
4
|
-
describe('dile-order-switch', () => {
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = '';
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
async function renderOrderSwitch(html) {
|
|
10
|
-
document.body.innerHTML = html;
|
|
11
|
-
const el = document.body.querySelector('dile-order-switch');
|
|
12
|
-
await el.updateComplete;
|
|
13
|
-
return el;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
it('defaults to ascending order', async () => {
|
|
17
|
-
const el = await renderOrderSwitch('<dile-order-switch label="Name"></dile-order-switch>');
|
|
18
|
-
|
|
19
|
-
expect(el.value).toBe('asc');
|
|
20
|
-
expect(el.shadowRoot.querySelector('dile-button-icon')).toBeTruthy();
|
|
21
|
-
expect(el.shadowRoot.querySelector('a').textContent.trim()).toBe('Name');
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
it('toggles between asc and desc', async () => {
|
|
25
|
-
const el = await renderOrderSwitch('<dile-order-switch></dile-order-switch>');
|
|
26
|
-
el.toggle();
|
|
27
|
-
await el.updateComplete;
|
|
28
|
-
|
|
29
|
-
expect(el.value).toBe('desc');
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('clicking the label re-announces the current value without toggling when not selected', async () => {
|
|
33
|
-
const el = await renderOrderSwitch('<dile-order-switch name="name" label="Name" value="asc"></dile-order-switch>');
|
|
34
|
-
|
|
35
|
-
let receivedDetail = null;
|
|
36
|
-
el.addEventListener('element-changed', (e) => { receivedDetail = e.detail; });
|
|
37
|
-
|
|
38
|
-
el.shadowRoot.querySelector('a').click();
|
|
39
|
-
await el.updateComplete;
|
|
40
|
-
|
|
41
|
-
expect(el.value).toBe('asc'); // unchanged
|
|
42
|
-
expect(receivedDetail).toEqual({ name: 'name', value: 'asc' });
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('clicking the label toggles the order when selected', async () => {
|
|
46
|
-
const el = await renderOrderSwitch('<dile-order-switch name="name" label="Name" value="asc" selected></dile-order-switch>');
|
|
47
|
-
|
|
48
|
-
let receivedDetail = null;
|
|
49
|
-
el.addEventListener('element-changed', (e) => { receivedDetail = e.detail; });
|
|
50
|
-
|
|
51
|
-
el.shadowRoot.querySelector('a').click();
|
|
52
|
-
await el.updateComplete;
|
|
53
|
-
|
|
54
|
-
expect(el.value).toBe('desc'); // toggled
|
|
55
|
-
expect(receivedDetail).toEqual({ name: 'name', value: 'desc' });
|
|
56
|
-
});
|
|
57
|
-
});
|