@lion/ui 0.15.2 → 0.15.4
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 +46 -11
- package/components/combobox/src/LionCombobox.js +4 -1
- package/components/combobox/test/lion-combobox-integrations.test.js +23 -0
- package/components/combobox/test/lion-combobox.test.js +20 -0
- package/components/core/src/ScopedStylesController.js +7 -10
- package/components/core/test-helpers/getCachedFixture.js +55 -0
- package/components/form-core/src/validate/LionValidationFeedback.js +2 -2
- package/components/form-core/src/validate/ValidateMixin.js +3 -3
- package/components/form-core/test/validate/lion-validation-feedback.test.js +2 -2
- package/components/form-core/test-suites/ValidateMixin.suite.js +23 -11
- package/components/form-core/translations/bg.js +4 -4
- package/components/form-core/translations/cs.js +4 -4
- package/components/form-core/translations/de.js +4 -4
- package/components/form-core/translations/en.js +4 -4
- package/components/form-core/translations/es.js +4 -4
- package/components/form-core/translations/fr.js +4 -4
- package/components/form-core/translations/hu.js +4 -4
- package/components/form-core/translations/it.js +4 -4
- package/components/form-core/translations/nl.js +4 -4
- package/components/form-core/translations/pl.js +4 -4
- package/components/form-core/translations/ro.js +4 -4
- package/components/form-core/translations/ru.js +4 -4
- package/components/form-core/translations/sk.js +4 -4
- package/components/form-core/translations/uk.js +4 -4
- package/components/form-core/translations/zh.js +4 -4
- package/components/input-amount/src/parsers.js +3 -2
- package/components/input-amount/test/parsers.test.js +6 -0
- package/components/input-amount-dropdown/src/currencyUtil.js +1 -1
- package/components/input-file/src/localizeNamespaceLoader.js +4 -0
- package/components/input-file/translations/bg.js +5 -0
- package/components/input-file/translations/cs.js +5 -0
- package/components/input-file/translations/es.js +5 -0
- package/components/input-file/translations/fr.js +5 -0
- package/components/input-file/translations/hu.js +5 -0
- package/components/input-file/translations/id-ID.js +5 -0
- package/components/input-file/translations/id.js +19 -0
- package/components/input-file/translations/it.js +5 -0
- package/components/input-file/translations/pl.js +5 -0
- package/components/input-file/translations/ro.js +5 -0
- package/components/input-file/translations/sk.js +5 -0
- package/components/input-file/translations/uk.js +5 -0
- package/components/input-file/translations/zh.js +5 -0
- package/components/input-stepper/src/LionInputStepper.js +48 -52
- package/components/input-stepper/test/lion-input-stepper-integrations.test.js +2 -19
- package/components/input-stepper/test/lion-input-stepper.test.js +2 -476
- package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +19 -0
- package/components/input-stepper/test-suites/lion-input-stepper.suite.js +673 -0
- package/components/listbox/src/ListboxMixin.js +0 -1
- package/components/listbox/test-suites/ListboxMixin.suite.js +71 -2
- package/components/overlays/src/OverlayController.js +3 -0
- package/components/overlays/src/OverlaysManager.js +9 -2
- package/components/overlays/test/OverlayController.test.js +22 -9
- package/components/overlays/test/OverlaysManager.test.js +16 -0
- package/components/pagination/src/LionPagination.js +2 -1
- package/components/pagination/test/lion-pagination.test.js +41 -0
- package/components/validate-messages/translations/it.js +2 -2
- package/custom-elements.json +281 -179
- package/dist-types/components/combobox/src/LionCombobox.d.ts.map +1 -1
- package/dist-types/components/core/src/ScopedStylesController.d.ts +1 -2
- package/dist-types/components/core/src/ScopedStylesController.d.ts.map +1 -1
- package/dist-types/components/core/test-helpers/getCachedFixture.d.ts +14 -0
- package/dist-types/components/core/test-helpers/getCachedFixture.d.ts.map +1 -0
- package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-integrations/test/helpers/helpers.d.ts +3 -3
- package/dist-types/components/form-integrations/test/helpers/helpers.d.ts.map +1 -1
- package/dist-types/components/input-amount/src/parsers.d.ts.map +1 -1
- package/dist-types/components/input-file/src/localizeNamespaceLoader.d.ts +1 -1
- package/dist-types/components/input-file/src/localizeNamespaceLoader.d.ts.map +1 -1
- package/dist-types/components/input-file/translations/bg-BG.d.ts +5 -0
- package/dist-types/components/input-file/translations/bg.d.ts +5 -0
- package/dist-types/components/input-file/translations/cs-CZ.d.ts +5 -0
- package/dist-types/components/input-file/translations/cs.d.ts +5 -0
- package/dist-types/components/input-file/translations/es-ES.d.ts +5 -0
- package/dist-types/components/input-file/translations/es.d.ts +5 -0
- package/dist-types/components/input-file/translations/fr-BE.d.ts +5 -0
- package/dist-types/components/input-file/translations/fr-FR.d.ts +5 -0
- package/dist-types/components/input-file/translations/fr.d.ts +5 -0
- package/dist-types/components/input-file/translations/hu-HU.d.ts +5 -0
- package/dist-types/components/input-file/translations/hu.d.ts +5 -0
- package/dist-types/components/input-file/translations/id-ID.d.ts +20 -0
- package/dist-types/components/input-file/translations/id-ID.d.ts.map +1 -0
- package/dist-types/components/input-file/translations/id.d.ts +20 -0
- package/dist-types/components/input-file/translations/id.d.ts.map +1 -0
- package/dist-types/components/input-file/translations/it-IT.d.ts +5 -0
- package/dist-types/components/input-file/translations/it.d.ts +5 -0
- package/dist-types/components/input-file/translations/pl-PL.d.ts +5 -0
- package/dist-types/components/input-file/translations/pl.d.ts +5 -0
- package/dist-types/components/input-file/translations/ro-RO.d.ts +5 -0
- package/dist-types/components/input-file/translations/ro.d.ts +5 -0
- package/dist-types/components/input-file/translations/sk-SK.d.ts +5 -0
- package/dist-types/components/input-file/translations/sk.d.ts +5 -0
- package/dist-types/components/input-file/translations/uk-UA.d.ts +5 -0
- package/dist-types/components/input-file/translations/uk.d.ts +5 -0
- package/dist-types/components/input-file/translations/zh-CN.d.ts +5 -0
- package/dist-types/components/input-file/translations/zh.d.ts +5 -0
- package/dist-types/components/input-stepper/src/LionInputStepper.d.ts +4 -20
- package/dist-types/components/input-stepper/src/LionInputStepper.d.ts.map +1 -1
- package/dist-types/components/input-stepper/test/lion-input-stepper.test.d.ts +1 -2
- package/dist-types/components/input-stepper/test/lion-input-stepper.test.d.ts.map +1 -1
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.integration.suite.d.ts +3 -0
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.integration.suite.d.ts.map +1 -0
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts +4 -0
- package/dist-types/components/input-stepper/test-suites/lion-input-stepper.suite.d.ts.map +1 -0
- package/dist-types/components/listbox/src/ListboxMixin.d.ts.map +1 -1
- package/dist-types/components/listbox/test-suites/ListboxMixin.suite.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlaysManager.d.ts +4 -1
- package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
- package/dist-types/components/pagination/src/LionPagination.d.ts.map +1 -1
- package/dist-types/exports/input-stepper-suites.d.ts +6 -0
- package/dist-types/exports/input-stepper-suites.d.ts.map +1 -0
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/docs/components/checkbox-group/overview.md +2 -2
- package/docs/components/checkbox-group/use-cases.md +3 -9
- package/docs/components/collapsible/overview.md +1 -1
- package/docs/components/combobox/overview.md +1 -1
- package/docs/components/combobox/use-cases.md +1 -1
- package/docs/components/dialog/overview.md +1 -1
- package/docs/components/fieldset/overview.md +5 -5
- package/docs/components/form/overview.md +3 -3
- package/docs/components/form/use-cases.md +2 -2
- package/docs/components/icon/use-cases.md +1 -1
- package/docs/components/input/overview.md +1 -1
- package/docs/components/input-amount/overview.md +3 -3
- package/docs/components/input-date/overview.md +3 -3
- package/docs/components/input-datepicker/overview.md +5 -5
- package/docs/components/input-email/overview.md +2 -2
- package/docs/components/input-file/overview.md +1 -1
- package/docs/components/input-iban/overview.md +2 -2
- package/docs/components/input-range/overview.md +2 -2
- package/docs/components/input-stepper/api-table.md +2 -3
- package/docs/components/input-stepper/overview.md +1 -1
- package/docs/components/input-tel/overview.md +1 -1
- package/docs/components/input-tel/use-cases.md +6 -6
- package/docs/components/input-tel-dropdown/overview.md +1 -1
- package/docs/components/listbox/use-cases.md +1 -1
- package/docs/components/radio-group/overview.md +3 -3
- package/docs/components/radio-group/use-cases.md +3 -9
- package/docs/components/select/overview.md +1 -1
- package/docs/components/select/use-cases.md +6 -6
- package/docs/components/select-rich/use-cases.md +2 -2
- package/docs/components/tabs/examples.md +1 -1
- package/docs/fundamentals/index.md +4 -4
- package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
- package/docs/fundamentals/rationales/accessibility.md +1 -1
- package/docs/fundamentals/systems/core/SlotMixin.md +2 -2
- package/docs/fundamentals/systems/core/api-table.md +3 -4
- package/docs/fundamentals/systems/core/overview.md +1 -1
- package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
- package/docs/fundamentals/systems/form/model-value.md +1 -1
- package/docs/fundamentals/systems/form/overview.md +28 -28
- package/docs/fundamentals/systems/form/validate.md +38 -30
- package/docs/fundamentals/systems/localize/overview.md +4 -4
- package/docs/fundamentals/systems/overlays/api-table.md +1 -1
- package/docs/fundamentals/systems/overlays/configuration.md +2 -2
- package/docs/fundamentals/systems/overlays/overview.md +5 -5
- package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
- package/docs/fundamentals/tools/helpers/overview.md +1 -1
- package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
- package/docs/guides/how-to/create-a-custom-field.md +5 -5
- package/docs/guides/how-to/create-a-form.md +4 -4
- package/docs/guides/how-to/extend-a-native-input.md +2 -2
- package/docs/guides/index.md +8 -8
- package/docs/guides/principles/index.md +5 -5
- package/docs/guides/principles/styling.md +1 -1
- package/exports/input-stepper-suites.js +11 -0
- package/input-stepper-suites.js +11 -0
- package/package.json +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
|
+
import { ref } from 'lit/directives/ref.js';
|
|
2
3
|
import { repeat } from 'lit/directives/repeat.js';
|
|
3
4
|
import { Required } from '@lion/ui/form-core.js';
|
|
4
5
|
import { LionOptions } from '@lion/ui/listbox.js';
|
|
@@ -17,6 +18,7 @@ import { sendKeys } from '@web/test-runner-commands';
|
|
|
17
18
|
import sinon from 'sinon';
|
|
18
19
|
import { getListboxMembers } from '../../../exports/listbox-test-helpers.js';
|
|
19
20
|
import { browserDetection } from '../../core/src/browserDetection.js';
|
|
21
|
+
import { getCachedFixture } from '../../core/test-helpers/getCachedFixture.js';
|
|
20
22
|
|
|
21
23
|
/**
|
|
22
24
|
* @typedef {import('../src/LionListbox.js').LionListbox} LionListbox
|
|
@@ -589,6 +591,55 @@ export function runListboxMixinSuite(customConfig = {}) {
|
|
|
589
591
|
el.reset();
|
|
590
592
|
expect(el.activeIndex).to.equal(-1);
|
|
591
593
|
});
|
|
594
|
+
|
|
595
|
+
it('clears modelValue on clear()', async () => {
|
|
596
|
+
const el = await fixture(html`
|
|
597
|
+
<${tag} has-no-default-selected>
|
|
598
|
+
<${optionTag} .choiceValue=${'10'}>Item 1</${optionTag}>
|
|
599
|
+
<${optionTag} .choiceValue=${'20'}>Item 2</${optionTag}>
|
|
600
|
+
</${tag}>
|
|
601
|
+
`);
|
|
602
|
+
|
|
603
|
+
el.setCheckedIndex(0);
|
|
604
|
+
await el.updateComplete;
|
|
605
|
+
expect(el.modelValue).to.deep.equal('10');
|
|
606
|
+
|
|
607
|
+
el.clear();
|
|
608
|
+
await el.updateComplete;
|
|
609
|
+
expect(el.modelValue).to.equal('');
|
|
610
|
+
});
|
|
611
|
+
|
|
612
|
+
it('clears modelValue on clear() when multiple-choice', async () => {
|
|
613
|
+
const el = await fixture(html`
|
|
614
|
+
<${tag} has-no-default-selected multiple-choice>
|
|
615
|
+
<${optionTag} .choiceValue=${'10'}>Item 1</${optionTag}>
|
|
616
|
+
<${optionTag} .choiceValue=${'20'}>Item 2</${optionTag}>
|
|
617
|
+
</${tag}>
|
|
618
|
+
`);
|
|
619
|
+
el.setCheckedIndex(0);
|
|
620
|
+
await el.updateComplete;
|
|
621
|
+
expect(el.modelValue).to.eql(['10']);
|
|
622
|
+
|
|
623
|
+
el.clear();
|
|
624
|
+
expect(el.modelValue).to.eql([]);
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
it('keeps interaction states on clear()', async () => {
|
|
628
|
+
const el = await fixture(html`
|
|
629
|
+
<${tag} has-no-default-selected>
|
|
630
|
+
<${optionTag} .choiceValue=${'10'}>Item 1</${optionTag}>
|
|
631
|
+
<${optionTag} .choiceValue=${'20'}>Item 2</${optionTag}>
|
|
632
|
+
</${tag}>
|
|
633
|
+
`);
|
|
634
|
+
|
|
635
|
+
el.setCheckedIndex(0);
|
|
636
|
+
await el.updateComplete;
|
|
637
|
+
expect(el.dirty).to.equal(true);
|
|
638
|
+
|
|
639
|
+
el.clear();
|
|
640
|
+
await el.updateComplete;
|
|
641
|
+
expect(el.dirty).to.equal(true);
|
|
642
|
+
});
|
|
592
643
|
});
|
|
593
644
|
|
|
594
645
|
describe('Interactions', () => {
|
|
@@ -1547,8 +1598,12 @@ export function runListboxMixinSuite(customConfig = {}) {
|
|
|
1547
1598
|
expect(el.querySelector('[role=listbox]')).to.equal(_listboxNode);
|
|
1548
1599
|
|
|
1549
1600
|
expect(el.formElements.length).to.equal(2);
|
|
1550
|
-
|
|
1551
|
-
|
|
1601
|
+
// When we use ScopedStylesController, lisboxNode can have style tag along with options
|
|
1602
|
+
const childrenOtherThanStyle = Array.from(_listboxNode.children).filter(
|
|
1603
|
+
child => child.nodeName !== 'STYLE',
|
|
1604
|
+
);
|
|
1605
|
+
expect(childrenOtherThanStyle.length).to.equal(2);
|
|
1606
|
+
expect(childrenOtherThanStyle[0].tagName).to.equal(cfg.optionTagString.toUpperCase());
|
|
1552
1607
|
});
|
|
1553
1608
|
});
|
|
1554
1609
|
|
|
@@ -1735,6 +1790,20 @@ export function runListboxMixinSuite(customConfig = {}) {
|
|
|
1735
1790
|
await el.updateComplete;
|
|
1736
1791
|
expect(spy).to.have.been.calledTwice;
|
|
1737
1792
|
});
|
|
1793
|
+
|
|
1794
|
+
it('does not calls "_onListboxContentChanged" during connect and disconnected', async () => {
|
|
1795
|
+
const renderEl = /** @param {import('lit/directives/ref.js').Ref<any>} refObj */ refObj =>
|
|
1796
|
+
html`<${wrappingTag} ${ref(refObj)}></${wrappingTag}>`;
|
|
1797
|
+
const { el, show, hide } = await getCachedFixture(renderEl);
|
|
1798
|
+
const typedEl = /** @type {MyEl} */ (el);
|
|
1799
|
+
await typedEl?.listbox.registrationComplete;
|
|
1800
|
+
// @ts-ignore [allow-protected] in test
|
|
1801
|
+
const spy = sinon.spy(typedEl.listbox, '_onListboxContentChanged');
|
|
1802
|
+
await hide();
|
|
1803
|
+
await show();
|
|
1804
|
+
|
|
1805
|
+
expect(spy).not.to.have.been.called;
|
|
1806
|
+
});
|
|
1738
1807
|
});
|
|
1739
1808
|
});
|
|
1740
1809
|
}
|
|
@@ -1081,6 +1081,9 @@ export class OverlayController extends EventTarget {
|
|
|
1081
1081
|
case 'hide':
|
|
1082
1082
|
this.manager.requestToEnableScroll();
|
|
1083
1083
|
break;
|
|
1084
|
+
case 'teardown':
|
|
1085
|
+
this.manager.requestToEnableScroll(this);
|
|
1086
|
+
break;
|
|
1084
1087
|
/* no default */
|
|
1085
1088
|
}
|
|
1086
1089
|
}
|
|
@@ -184,8 +184,15 @@ export class OverlaysManager {
|
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
186
|
|
|
187
|
-
|
|
188
|
-
|
|
187
|
+
/**
|
|
188
|
+
* @param {OverlayController} [currentController]
|
|
189
|
+
*/
|
|
190
|
+
requestToEnableScroll(currentController) {
|
|
191
|
+
const openedSiblings = currentController
|
|
192
|
+
? this.shownList.filter(ctrl => ctrl !== currentController)
|
|
193
|
+
: this.shownList;
|
|
194
|
+
|
|
195
|
+
const hasOpenSiblingThatPreventsScroll = openedSiblings.some(
|
|
189
196
|
ctrl => ctrl.preventsScroll === true,
|
|
190
197
|
);
|
|
191
198
|
if (hasOpenSiblingThatPreventsScroll) {
|
|
@@ -353,14 +353,17 @@ describe('OverlayController', () => {
|
|
|
353
353
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
354
354
|
|
|
355
355
|
// The total dom structure created...
|
|
356
|
-
expect(el).shadowDom.to.equal(
|
|
356
|
+
expect(el).shadowDom.to.equal(
|
|
357
|
+
`
|
|
357
358
|
<dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
|
|
358
359
|
<div data-id="content-wrapper">
|
|
359
360
|
<slot name="content">
|
|
360
361
|
</slot>
|
|
361
362
|
</div>
|
|
362
363
|
</dialog>
|
|
363
|
-
|
|
364
|
+
`,
|
|
365
|
+
{ ignoreAttributes: ['closedby'] },
|
|
366
|
+
);
|
|
364
367
|
|
|
365
368
|
expect(el).lightDom.to.equal(`<div slot="content">projected</div>`);
|
|
366
369
|
});
|
|
@@ -380,13 +383,16 @@ describe('OverlayController', () => {
|
|
|
380
383
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
381
384
|
|
|
382
385
|
// The total dom structure created...
|
|
383
|
-
expect(el).lightDom.to.equal(
|
|
386
|
+
expect(el).lightDom.to.equal(
|
|
387
|
+
`
|
|
384
388
|
<dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
|
|
385
389
|
<div data-id="content-wrapper">
|
|
386
390
|
<div id="content">non projected</div>
|
|
387
391
|
</div>
|
|
388
392
|
</dialog>
|
|
389
|
-
|
|
393
|
+
`,
|
|
394
|
+
{ ignoreAttributes: ['closedby'] },
|
|
395
|
+
);
|
|
390
396
|
});
|
|
391
397
|
});
|
|
392
398
|
|
|
@@ -421,13 +427,16 @@ describe('OverlayController', () => {
|
|
|
421
427
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
422
428
|
|
|
423
429
|
// The total dom structure created...
|
|
424
|
-
expect(el).shadowDom.to.equal(
|
|
430
|
+
expect(el).shadowDom.to.equal(
|
|
431
|
+
`
|
|
425
432
|
<dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
|
|
426
433
|
<div data-id="content-wrapper">
|
|
427
434
|
<slot name="content"></slot>
|
|
428
435
|
</div>
|
|
429
436
|
</dialog>
|
|
430
|
-
|
|
437
|
+
`,
|
|
438
|
+
{ ignoreAttributes: ['closedby'] },
|
|
439
|
+
);
|
|
431
440
|
});
|
|
432
441
|
|
|
433
442
|
it("uses the .contentWrapperNode as container for Popper's arrow", async () => {
|
|
@@ -464,14 +473,17 @@ describe('OverlayController', () => {
|
|
|
464
473
|
normalizeOverlayContentWapper(ctrl.contentWrapperNode);
|
|
465
474
|
|
|
466
475
|
// The total dom structure created...
|
|
467
|
-
expect(el).shadowDom.to.equal(
|
|
476
|
+
expect(el).shadowDom.to.equal(
|
|
477
|
+
`
|
|
468
478
|
<dialog data-overlay-outer-wrapper="" open="" role="none" style="${wrappingDialogNodeStyle}">
|
|
469
479
|
<div data-id="content-wrapper">
|
|
470
480
|
<div id="arrow"></div>
|
|
471
481
|
<slot name="content"></slot>
|
|
472
482
|
</div>
|
|
473
483
|
</dialog>
|
|
474
|
-
|
|
484
|
+
`,
|
|
485
|
+
{ ignoreAttributes: ['closedby'] },
|
|
486
|
+
);
|
|
475
487
|
});
|
|
476
488
|
});
|
|
477
489
|
});
|
|
@@ -540,6 +552,7 @@ describe('OverlayController', () => {
|
|
|
540
552
|
</div>
|
|
541
553
|
</dialog>
|
|
542
554
|
`,
|
|
555
|
+
{ ignoreAttributes: ['closedby'] },
|
|
543
556
|
);
|
|
544
557
|
});
|
|
545
558
|
});
|
|
@@ -800,7 +813,7 @@ describe('OverlayController', () => {
|
|
|
800
813
|
await mimicEscapePress(childOverlay.contentNode);
|
|
801
814
|
|
|
802
815
|
// without this line, the test is unstable on FF sometimes
|
|
803
|
-
await aTimeout(
|
|
816
|
+
await aTimeout(100);
|
|
804
817
|
|
|
805
818
|
expect(parentOverlay.isShown).to.be.false;
|
|
806
819
|
expect(childOverlay.isShown).to.be.true;
|
|
@@ -163,6 +163,22 @@ describe('OverlaysManager', () => {
|
|
|
163
163
|
'overlays-scroll-lock-ios-fix',
|
|
164
164
|
);
|
|
165
165
|
});
|
|
166
|
+
it('remove class "overlays-scroll-lock-ios-fix" after teardown', async () => {
|
|
167
|
+
mockIOS();
|
|
168
|
+
const dialog = new OverlayController({ ...defaultOptions, preventsScroll: true }, mngr);
|
|
169
|
+
await dialog.show();
|
|
170
|
+
|
|
171
|
+
await dialog.teardown();
|
|
172
|
+
|
|
173
|
+
expect(
|
|
174
|
+
Array.from(document.body.classList).filter(cls =>
|
|
175
|
+
['overlays-scroll-lock', 'overlays-scroll-lock-ios-fix'].includes(cls),
|
|
176
|
+
),
|
|
177
|
+
).to.be.empty;
|
|
178
|
+
expect(Array.from(document.documentElement.classList)).to.not.contain(
|
|
179
|
+
'overlays-scroll-lock-ios-fix',
|
|
180
|
+
);
|
|
181
|
+
});
|
|
166
182
|
});
|
|
167
183
|
});
|
|
168
184
|
});
|
|
@@ -196,7 +196,8 @@ export class LionPagination extends LocalizeMixin(LitElement) {
|
|
|
196
196
|
const finish = this.count;
|
|
197
197
|
// If there are more pages then we want to display we have to redo the list each time
|
|
198
198
|
// Else we can just return the same list every time.
|
|
199
|
-
|
|
199
|
+
// Allow up to 2 extra pages without ellipsis (e.g., count=6 or count=7 when visiblePages=5)
|
|
200
|
+
if (this.count > this.__visiblePages + 2) {
|
|
200
201
|
// Calculate left side of current page and right side
|
|
201
202
|
const pos3 = this.current - 1;
|
|
202
203
|
const pos4 = this.current;
|
|
@@ -164,4 +164,45 @@ describe('Pagination', () => {
|
|
|
164
164
|
expect(buttons[3].getAttribute('aria-current')).to.equal('false');
|
|
165
165
|
});
|
|
166
166
|
});
|
|
167
|
+
|
|
168
|
+
describe('Ellipsis display', () => {
|
|
169
|
+
it('should not show ellipsis when count is visiblePages + 1 (count=6, visiblePages=5)', async () => {
|
|
170
|
+
const el = await fixture(html` <lion-pagination count="6" current="1"></lion-pagination> `);
|
|
171
|
+
const navItems = Array.from(/** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li'));
|
|
172
|
+
// Check that no ellipsis is rendered (no <span> elements with '...')
|
|
173
|
+
const spans = Array.from(
|
|
174
|
+
/** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li span'),
|
|
175
|
+
);
|
|
176
|
+
expect(spans.length).to.equal(0);
|
|
177
|
+
|
|
178
|
+
// There should be 8 nav items: previous button + 6 page buttons + next button
|
|
179
|
+
expect(navItems.length).to.equal(8);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('should not show ellipsis when count is visiblePages + 2 (count=7, visiblePages=5)', async () => {
|
|
183
|
+
const el = await fixture(html` <lion-pagination count="7" current="1"></lion-pagination> `);
|
|
184
|
+
// Check that no ellipsis is rendered (no <span> elements with '...')
|
|
185
|
+
const spans = Array.from(
|
|
186
|
+
/** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li span'),
|
|
187
|
+
);
|
|
188
|
+
expect(spans.length).to.equal(0);
|
|
189
|
+
|
|
190
|
+
// There should be 9 nav items: previous button + 7 page buttons + next button
|
|
191
|
+
const navItems = Array.from(/** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li'));
|
|
192
|
+
expect(navItems.length).to.equal(9);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('should show ellipsis when count is visiblePages + 3 (count=8, visiblePages=5)', async () => {
|
|
196
|
+
const el = await fixture(html` <lion-pagination count="8" current="1"></lion-pagination> `);
|
|
197
|
+
// Check that ellipsis is rendered (should have <span> elements with '...')
|
|
198
|
+
const spans = Array.from(
|
|
199
|
+
/** @type {ShadowRoot} */ (el.shadowRoot).querySelectorAll('li span'),
|
|
200
|
+
);
|
|
201
|
+
expect(spans.length).to.be.greaterThan(0);
|
|
202
|
+
|
|
203
|
+
// Verify the ellipsis contains '...'
|
|
204
|
+
const ellipsisText = Array.from(spans).map(span => span.textContent);
|
|
205
|
+
expect(ellipsisText).to.include('...');
|
|
206
|
+
});
|
|
207
|
+
});
|
|
167
208
|
});
|
|
@@ -18,7 +18,7 @@ export default {
|
|
|
18
18
|
MaxDate: 'Inserire un(a) {fieldName} prima di {params, date, YYYYMMDD}.',
|
|
19
19
|
MinMaxDate:
|
|
20
20
|
'Inserire un(a) {fieldName} tra {params.min, date, YYYYMMDD} e {params.max, date, YYYYMMDD}.',
|
|
21
|
-
IsDateDisabled: "
|
|
21
|
+
IsDateDisabled: "Questa data non è disponibile, sceglierne un'altra.",
|
|
22
22
|
IsEmail: 'Inserire un valore valido per {fieldName} nel formato "name@example.com".',
|
|
23
23
|
MatchesOption:
|
|
24
24
|
'Nessun risultato corrispondente. Provare con una parola chiave o una categoria diversa.',
|
|
@@ -41,7 +41,7 @@ export default {
|
|
|
41
41
|
MaxDate: 'Inserire un(a) {fieldName} prima di {params, date, YYYYMMDD}.',
|
|
42
42
|
MinMaxDate:
|
|
43
43
|
'Inserire un(a) {fieldName} tra {params.min, date, YYYYMMDD} e {params.max, date, YYYYMMDD}.',
|
|
44
|
-
IsDateDisabled: "
|
|
44
|
+
IsDateDisabled: "Questa data non è disponibile, sceglierne un'altra.",
|
|
45
45
|
IsEmail: 'Inserire un valore valido per {fieldName} nel formato "name@example.com".',
|
|
46
46
|
MatchesOption:
|
|
47
47
|
'Nessun risultato corrispondente. Provare con una parola chiave o una categoria diversa.',
|