@lion/ui 0.23.0 → 0.24.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 +50 -20
- package/components/accordion/src/LionAccordion.js +31 -42
- package/components/accordion/test/lion-accordion.test.js +108 -134
- package/components/button/src/LionButton.js +9 -12
- package/components/button/src/LionButtonReset.js +0 -5
- package/components/button/src/LionButtonSubmit.js +7 -12
- package/components/button/test/demos.screenshots-test.js +50 -11
- package/components/button/test/lion-button.test.js +0 -1
- package/components/button/test-suites/LionButton.suite.js +135 -145
- package/components/button/test-suites/LionButtonReset.suite.js +54 -72
- package/components/button/test-suites/LionButtonSubmit.suite.js +49 -68
- package/components/calendar/src/LionCalendar.js +151 -104
- package/components/calendar/src/calendarStyle.js +0 -1
- package/components/calendar/src/utils/createMonth.js +3 -4
- package/components/calendar/src/utils/createMultipleMonth.js +15 -7
- package/components/calendar/src/utils/createWeek.js +0 -2
- package/components/calendar/src/utils/dataTemplate.js +8 -4
- package/components/calendar/src/utils/dayTemplate.js +0 -6
- package/components/calendar/src/utils/getDayMonthYear.js +6 -2
- package/components/calendar/test/demos.screenshots-test.js +40 -9
- package/components/calendar/test/lion-calendar.test.js +171 -282
- package/components/calendar/test/utils/createMonth.test.js +61 -22
- package/components/calendar/test/utils/createMultipleMonth.test.js +14 -7
- package/components/calendar/test/utils/createWeek.test.js +51 -17
- package/components/calendar/test/utils/dataTemplate.test.js +3 -4
- package/components/calendar/test/utils/dayTemplate.test.js +106 -34
- package/components/calendar/test/utils/getFirstDayNextMonth.test.js +0 -1
- package/components/calendar/test/utils/getLastDayPreviousMonth.test.js +0 -1
- package/components/calendar/test/utils/isSameDate.test.js +0 -1
- package/components/calendar/test/utils/snapshots/monthTemplate_en-GB_Sunday_2018-12.js +1 -2
- package/components/calendar/test-helpers/CalendarObject.js +31 -62
- package/components/calendar/test-helpers/DayObject.js +7 -15
- package/components/calendar/test-suites/LionCalendar.suite.js +7 -9
- package/components/checkbox-group/src/LionCheckboxIndeterminate.js +17 -30
- package/components/checkbox-group/test/lion-checkbox-group-integrations.test.js +0 -1
- package/components/checkbox-group/test/lion-checkbox-group.test.js +21 -16
- package/components/checkbox-group/test/lion-checkbox-indeterminate-integrations.test.js +3 -3
- package/components/checkbox-group/test/lion-checkbox-integrations.test.js +3 -2
- package/components/checkbox-group/test/lion-checkbox.test.js +30 -16
- package/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.js +147 -191
- package/components/collapsible/src/LionCollapsible.js +10 -15
- package/components/collapsible/test/lion-collapsible.test.js +4 -18
- package/components/combobox/src/LionCombobox.js +35 -53
- package/components/combobox/src/utils/makeMatchingTextBold.js +2 -5
- package/components/combobox/src/validators.js +0 -1
- package/components/combobox/test/lion-combobox-integrations.test.js +6 -6
- package/components/combobox/test/lion-combobox.test.js +576 -869
- package/components/combobox/test/validators.test.js +6 -13
- package/components/combobox/test-helpers/combobox-helpers.js +24 -11
- package/components/core/src/DisabledMixin.js +61 -66
- package/components/core/src/DisabledWithTabIndexMixin.js +76 -83
- package/components/core/src/EventTargetShim.js +1 -4
- package/components/core/src/ScopedElementsMixin.js +4 -15
- package/components/core/src/ScopedStylesController.js +1 -5
- package/components/core/src/SlotMixin.js +236 -239
- package/components/core/src/browserDetection.js +5 -12
- package/components/core/test/DisabledMixin.test.js +24 -39
- package/components/core/test/DisabledWithTabIndexMixin.test.js +21 -34
- package/components/core/test/EventTargetShim.test.js +0 -8
- package/components/core/test/ScopedElementsMixin.test.js +22 -38
- package/components/core/test/ScopedStylesController.test.js +11 -20
- package/components/core/test/SlotMixin.test.js +102 -154
- package/components/core/test-helpers/getCachedFixture.js +5 -11
- package/components/core/types/SlotMixinTypes.ts +8 -3
- package/components/dialog/src/LionDialog.js +4 -3
- package/components/dialog/test/lion-dialog.integration.test.js +10 -20
- package/components/dialog/test/lion-dialog.test.js +48 -62
- package/components/dialog/test-helpers/test-router.js +4 -6
- package/components/drawer/src/LionDrawer.js +18 -34
- package/components/drawer/src/drawerStyle.js +0 -1
- package/components/drawer/test/lion-drawer.test.js +1 -17
- package/components/fieldset/test/lion-fieldset.test.js +6 -4
- package/components/form/src/LionForm.js +18 -13
- package/components/form/test/lion-form.test.js +22 -52
- package/components/form-core/src/FocusMixin.js +172 -174
- package/components/form-core/src/FormControlMixin.js +811 -813
- package/components/form-core/src/FormatMixin.js +537 -537
- package/components/form-core/src/InteractionStateMixin.js +196 -183
- package/components/form-core/src/LionField.js +9 -5
- package/components/form-core/src/NativeTextFieldMixin.js +114 -116
- package/components/form-core/src/choice-group/ChoiceGroupMixin.js +322 -364
- package/components/form-core/src/choice-group/ChoiceInputMixin.js +306 -296
- package/components/form-core/src/choice-group/CustomChoiceGroupMixin.js +114 -139
- package/components/form-core/src/form-group/FormElementsHaveNoError.js +0 -2
- package/components/form-core/src/form-group/FormGroupMixin.js +551 -557
- package/components/form-core/src/registration/FormRegisteringMixin.js +72 -71
- package/components/form-core/src/registration/FormRegistrarMixin.js +201 -217
- package/components/form-core/src/registration/FormRegistrarPortalMixin.js +31 -37
- package/components/form-core/src/utils/SyncUpdatableMixin.js +106 -117
- package/components/form-core/src/utils/getAriaElementsInRightDomOrder.js +1 -2
- package/components/form-core/src/validate/LionValidationFeedback.js +12 -8
- package/components/form-core/src/validate/Unparseable.js +4 -2
- package/components/form-core/src/validate/ValidateMixin.js +829 -883
- package/components/form-core/src/validate/Validator.js +3 -6
- package/components/form-core/src/validate/resultValidators/DefaultSuccess.js +1 -2
- package/components/form-core/src/validate/validators/DateValidators.js +0 -5
- package/components/form-core/src/validate/validators/NumberValidators.js +1 -5
- package/components/form-core/src/validate/validators/Required.js +1 -1
- package/components/form-core/src/validate/validators/StringValidators.js +1 -8
- package/components/form-core/test/FocusMixin.test.js +96 -82
- package/components/form-core/test/FormControlMixin.test.js +120 -176
- package/components/form-core/test/FormRegistrationMixins.test.js +0 -2
- package/components/form-core/test/FormatMixin.test.js +0 -1
- package/components/form-core/test/InteractionStateMixin.test.js +0 -1
- package/components/form-core/test/NativeTextFieldMixin.test.js +0 -1
- package/components/form-core/test/choice-group/ChoiceGroupMixin.test.js +0 -1
- package/components/form-core/test/choice-group/ChoiceInputMixin.test.js +0 -1
- package/components/form-core/test/choice-group/CustomChoiceGroupMixin.integrations.test.js +6 -8
- package/components/form-core/test/choice-group/CustomChoiceGroupMixin.test.js +0 -3
- package/components/form-core/test/form-group/FormGroupMixin.test.js +0 -1
- package/components/form-core/test/lion-field.test.js +88 -98
- package/components/form-core/test/utils/SyncUpdatableMixin.test.js +51 -65
- package/components/form-core/test/utils/getAriaElementsInRightDomOrder.test.js +3 -3
- package/components/form-core/test/validate/DateValidators.test.js +5 -27
- package/components/form-core/test/validate/NumberValidators.test.js +4 -16
- package/components/form-core/test/validate/Required.test.js +8 -21
- package/components/form-core/test/validate/ResultValidator.test.js +1 -2
- package/components/form-core/test/validate/StringValidators.test.js +4 -35
- package/components/form-core/test/validate/ValidateMixin.test.js +0 -1
- package/components/form-core/test/validate/ValidateMixinFeedbackPart.test.js +0 -1
- package/components/form-core/test/validate/Validator.test.js +39 -34
- package/components/form-core/test/validate/lion-validation-feedback.test.js +81 -43
- package/components/form-core/test-helpers/ExampleValidators.js +0 -5
- package/components/form-core/test-helpers/getFormControlMembers.js +2 -2
- package/components/form-core/test-helpers/mimicUserInput.js +5 -1
- package/components/form-core/test-suites/FormRegistrationMixins.suite.js +65 -122
- package/components/form-core/test-suites/FormatMixin.suite.js +202 -227
- package/components/form-core/test-suites/InteractionStateMixin.suite.js +47 -60
- package/components/form-core/test-suites/NativeTextFieldMixin.suite.js +8 -11
- package/components/form-core/test-suites/ValidateMixin.suite.js +280 -359
- package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +112 -163
- package/components/form-core/test-suites/choice-group/ChoiceGroupMixin.suite.js +185 -218
- package/components/form-core/test-suites/choice-group/ChoiceInputMixin.suite.js +116 -109
- package/components/form-core/test-suites/choice-group/CustomChoiceGroupMixin.suite.js +36 -70
- package/components/form-core/test-suites/form-group/FormGroupMixin-input.suite.js +57 -65
- package/components/form-core/test-suites/form-group/FormGroupMixin.suite.js +664 -523
- package/components/form-core/translations/bg-BG.js +0 -1
- package/components/form-core/translations/cs-CZ.js +0 -1
- package/components/form-core/translations/de-DE.js +0 -1
- package/components/form-core/translations/en-AU.js +0 -1
- package/components/form-core/translations/en-GB.js +0 -1
- package/components/form-core/translations/en-US.js +0 -1
- package/components/form-core/translations/es-ES.js +0 -1
- package/components/form-core/translations/fr-BE.js +0 -1
- package/components/form-core/translations/fr-FR.js +0 -1
- package/components/form-core/translations/hu-HU.js +0 -1
- package/components/form-core/translations/it-IT.js +0 -1
- package/components/form-core/translations/nl-BE.js +0 -1
- package/components/form-core/translations/nl-NL.js +0 -1
- package/components/form-core/translations/pl-PL.js +0 -1
- package/components/form-core/translations/ro-RO.js +0 -1
- package/components/form-core/translations/ru-RU.js +0 -1
- package/components/form-core/translations/sk-SK.js +0 -1
- package/components/form-core/translations/tr-TR.js +0 -1
- package/components/form-core/translations/uk-UA.js +0 -1
- package/components/form-integrations/test/dialog-integrations.test.js +1 -4
- package/components/form-integrations/test/form-group-methods.test.js +28 -31
- package/components/form-integrations/test/form-integrations.test.js +27 -28
- package/components/form-integrations/test/form-validation-integrations.test.js +21 -29
- package/components/form-integrations/test/helpers/umbrella-form.js +3 -5
- package/components/form-integrations/test/model-value-consistency.test.js +75 -77
- package/components/form-integrations/test/model-value-event.test.js +10 -20
- package/components/helpers/src/SbActionLogger.js +13 -17
- package/components/helpers/src/SbLocaleSwitcher.js +5 -5
- package/components/helpers/src/sortEachDepth.js +0 -2
- package/components/helpers/test/renderLitAsNode.test.js +0 -4
- package/components/helpers/test/sb-action-logger.test.js +24 -55
- package/components/icon/src/IconManager.js +0 -2
- package/components/icon/src/LionIcon.js +2 -7
- package/components/icon/src/icons.js +0 -2
- package/components/icon/test/IconManager.test.js +0 -15
- package/components/icon/test/hammer.svg.js +3 -4
- package/components/icon/test/heart.svg.js +3 -4
- package/components/icon/test/lion-icon.test.js +14 -43
- package/components/input/src/LionInput.js +2 -8
- package/components/input/test/input-integrations.test.js +0 -5
- package/components/input/test/lion-input-integrations.test.js +0 -4
- package/components/input/test/lion-input.test.js +28 -58
- package/components/input/test-helpers/getInputMembers.js +2 -2
- package/components/input-amount/src/LionInputAmount.js +20 -20
- package/components/input-amount/src/formatters.js +0 -3
- package/components/input-amount/src/parsers.js +0 -3
- package/components/input-amount/test/formatters.test.js +24 -16
- package/components/input-amount/test/lion-input-amount-integrations.test.js +0 -4
- package/components/input-amount/test/lion-input-amount.test.js +123 -147
- package/components/input-amount/test/parsers.test.js +33 -17
- package/components/input-amount/test/preprocessors.test.js +0 -3
- package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +49 -59
- package/components/input-amount-dropdown/src/currencyUtil.js +8 -7
- package/components/input-amount-dropdown/src/parsers.js +0 -1
- package/components/input-amount-dropdown/src/validators.js +0 -1
- package/components/input-amount-dropdown/test/LionInputAmountDropdown.test.js +34 -36
- package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +18 -13
- package/components/input-amount-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
- package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +132 -107
- package/components/input-date/src/LionInputDate.js +4 -3
- package/components/input-date/test/lion-input-date-integrations.test.js +0 -3
- package/components/input-date/test/lion-input-date.test.js +19 -32
- package/components/input-datepicker/src/LionInputDatepicker.js +17 -29
- package/components/input-datepicker/src/localizeNamespaceLoader.js +1 -2
- package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +0 -3
- package/components/input-datepicker/test/lion-input-datepicker.test.js +88 -153
- package/components/input-datepicker/test-helpers/DatepickerInputObject.js +9 -12
- package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +6 -4
- package/components/input-datepicker/translations/bg-BG.js +0 -1
- package/components/input-datepicker/translations/cs-CZ.js +0 -1
- package/components/input-datepicker/translations/de-DE.js +0 -1
- package/components/input-datepicker/translations/en-AU.js +0 -1
- package/components/input-datepicker/translations/en-GB.js +0 -1
- package/components/input-datepicker/translations/en-US.js +0 -1
- package/components/input-datepicker/translations/es-ES.js +0 -1
- package/components/input-datepicker/translations/fr-BE.js +0 -1
- package/components/input-datepicker/translations/fr-FR.js +0 -1
- package/components/input-datepicker/translations/hu-HU.js +0 -1
- package/components/input-datepicker/translations/it-IT.js +0 -1
- package/components/input-datepicker/translations/nl-BE.js +0 -1
- package/components/input-datepicker/translations/nl-NL.js +0 -1
- package/components/input-datepicker/translations/pl-PL.js +0 -1
- package/components/input-datepicker/translations/ro-RO.js +0 -1
- package/components/input-datepicker/translations/ru-RU.js +0 -1
- package/components/input-datepicker/translations/sk-SK.js +0 -1
- package/components/input-datepicker/translations/tr-TR.js +0 -1
- package/components/input-datepicker/translations/uk-UA.js +0 -1
- package/components/input-email/test/lion-input-email-integrations.test.js +0 -2
- package/components/input-email/test/lion-input-email.test.js +1 -7
- package/components/input-file/src/FileHandle.js +0 -3
- package/components/input-file/src/LionInputFile.js +85 -83
- package/components/input-file/src/LionSelectedFileList.js +12 -12
- package/components/input-file/src/validators.js +10 -9
- package/components/input-file/test/FileValidators.test.js +170 -80
- package/components/input-file/test/lion-input-file.test.js +160 -244
- package/components/input-file/test/lion-selected-file-list.test.js +13 -22
- package/components/input-file/translations/bg-BG.js +0 -1
- package/components/input-file/translations/cs-CZ.js +0 -1
- package/components/input-file/translations/de-DE.js +0 -1
- package/components/input-file/translations/en-AU.js +0 -1
- package/components/input-file/translations/en-GB.js +0 -1
- package/components/input-file/translations/en-PH.js +0 -1
- package/components/input-file/translations/en-US.js +0 -1
- package/components/input-file/translations/en.js +2 -1
- package/components/input-file/translations/es-ES.js +0 -1
- package/components/input-file/translations/fr-BE.js +0 -1
- package/components/input-file/translations/fr-FR.js +0 -1
- package/components/input-file/translations/hu-HU.js +0 -1
- package/components/input-file/translations/id-ID.js +0 -1
- package/components/input-file/translations/id.js +2 -1
- package/components/input-file/translations/it-IT.js +0 -1
- package/components/input-file/translations/nl-BE.js +0 -1
- package/components/input-file/translations/nl-NL.js +0 -1
- package/components/input-file/translations/pl-PL.js +0 -1
- package/components/input-file/translations/ro-RO.js +0 -1
- package/components/input-file/translations/ru-RU.js +0 -1
- package/components/input-file/translations/sk-SK.js +0 -1
- package/components/input-file/translations/uk-UA.js +0 -1
- package/components/input-file/translations/zh-CN.js +0 -1
- package/components/input-iban/src/validators.js +6 -11
- package/components/input-iban/test/formatters.test.js +0 -3
- package/components/input-iban/test/lion-input-iban-integrations.test.js +0 -2
- package/components/input-iban/test/lion-input-iban.test.js +1 -9
- package/components/input-iban/test/parsers.test.js +0 -2
- package/components/input-iban/test/validators.test.js +0 -12
- package/components/input-iban/translations/bg-BG.js +0 -1
- package/components/input-iban/translations/cs-CZ.js +0 -1
- package/components/input-iban/translations/de-DE.js +0 -1
- package/components/input-iban/translations/en-AU.js +0 -1
- package/components/input-iban/translations/en-GB.js +0 -1
- package/components/input-iban/translations/en-US.js +0 -1
- package/components/input-iban/translations/es-ES.js +0 -1
- package/components/input-iban/translations/fr-BE.js +0 -1
- package/components/input-iban/translations/fr-FR.js +0 -1
- package/components/input-iban/translations/hu-HU.js +0 -1
- package/components/input-iban/translations/it-IT.js +0 -1
- package/components/input-iban/translations/nl-BE.js +0 -1
- package/components/input-iban/translations/nl-NL.js +0 -1
- package/components/input-iban/translations/pl-PL.js +0 -1
- package/components/input-iban/translations/ro-RO.js +0 -1
- package/components/input-iban/translations/ru-RU.js +0 -1
- package/components/input-iban/translations/sk-SK.js +0 -1
- package/components/input-iban/translations/uk-UA.js +0 -1
- package/components/input-range/src/LionInputRange.js +18 -19
- package/components/input-range/test/lion-input-range.test.js +23 -48
- package/components/input-range/translations/bg-BG.js +0 -1
- package/components/input-range/translations/cs-CZ.js +0 -1
- package/components/input-range/translations/de-DE.js +0 -1
- package/components/input-range/translations/en-AU.js +0 -1
- package/components/input-range/translations/en-GB.js +0 -1
- package/components/input-range/translations/en-PH.js +0 -1
- package/components/input-range/translations/en-US.js +0 -1
- package/components/input-range/translations/es-ES.js +0 -1
- package/components/input-range/translations/fr-BE.js +0 -1
- package/components/input-range/translations/fr-FR.js +0 -1
- package/components/input-range/translations/hu-HU.js +0 -1
- package/components/input-range/translations/it-IT.js +0 -1
- package/components/input-range/translations/nl-BE.js +0 -1
- package/components/input-range/translations/nl-NL.js +0 -1
- package/components/input-range/translations/pl-PL.js +0 -1
- package/components/input-range/translations/ro-RO.js +0 -1
- package/components/input-range/translations/ru-RU.js +0 -1
- package/components/input-range/translations/sk-SK.js +0 -1
- package/components/input-range/translations/uk-UA.js +0 -1
- package/components/input-range/translations/zh-CN.js +0 -1
- package/components/input-stepper/src/LionInputStepper.js +19 -38
- package/components/input-stepper/test/lion-input-stepper-integrations.test.js +0 -1
- package/components/input-stepper/test/lion-input-stepper.test.js +0 -1
- package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +0 -2
- package/components/input-stepper/test-suites/lion-input-stepper.suite.js +56 -105
- package/components/input-stepper/translations/bg-BG.js +0 -1
- package/components/input-stepper/translations/cs-CZ.js +0 -1
- package/components/input-stepper/translations/de-DE.js +0 -1
- package/components/input-stepper/translations/en-AU.js +0 -1
- package/components/input-stepper/translations/en-GB.js +0 -1
- package/components/input-stepper/translations/en-US.js +0 -1
- package/components/input-stepper/translations/es-ES.js +0 -1
- package/components/input-stepper/translations/fr-BE.js +0 -1
- package/components/input-stepper/translations/fr-FR.js +0 -1
- package/components/input-stepper/translations/hu-HU.js +0 -1
- package/components/input-stepper/translations/it-IT.js +0 -1
- package/components/input-stepper/translations/nl-BE.js +0 -1
- package/components/input-stepper/translations/nl-NL.js +0 -1
- package/components/input-stepper/translations/pl-PL.js +0 -1
- package/components/input-stepper/translations/ro-RO.js +0 -1
- package/components/input-stepper/translations/ru-RU.js +0 -1
- package/components/input-stepper/translations/sk-SK.js +0 -1
- package/components/input-stepper/translations/uk-UA.js +0 -1
- package/components/input-tel/src/LionInputTel.js +53 -37
- package/components/input-tel/src/PhoneUtilManager.js +6 -4
- package/components/input-tel/src/formatters.js +12 -10
- package/components/input-tel/src/parsers.js +3 -3
- package/components/input-tel/src/preprocessors.js +15 -7
- package/components/input-tel/src/validators.js +4 -6
- package/components/input-tel/test/LionInputTel.test.js +4 -2
- package/components/input-tel/test/formatters.test.js +22 -10
- package/components/input-tel/test/parsers.test.js +40 -11
- package/components/input-tel/test/preprocessors.test.js +24 -13
- package/components/input-tel/test/validators.test.js +7 -14
- package/components/input-tel/test-helpers/mockPhoneUtilManager.js +7 -6
- package/components/input-tel/test-suites/LionInputTel.suite.js +33 -73
- package/components/input-tel/translations/bg-BG.js +0 -1
- package/components/input-tel/translations/cs-CZ.js +0 -1
- package/components/input-tel/translations/de-DE.js +0 -1
- package/components/input-tel/translations/en-AU.js +0 -1
- package/components/input-tel/translations/en-GB.js +0 -1
- package/components/input-tel/translations/en-US.js +0 -1
- package/components/input-tel/translations/es-ES.js +0 -1
- package/components/input-tel/translations/fr-BE.js +0 -1
- package/components/input-tel/translations/fr-FR.js +0 -1
- package/components/input-tel/translations/hu-HU.js +0 -1
- package/components/input-tel/translations/it-IT.js +0 -1
- package/components/input-tel/translations/nl-BE.js +0 -1
- package/components/input-tel/translations/nl-NL.js +0 -1
- package/components/input-tel/translations/pl-PL.js +0 -1
- package/components/input-tel/translations/ro-RO.js +0 -1
- package/components/input-tel/translations/ru-RU.js +0 -1
- package/components/input-tel/translations/sk-SK.js +0 -1
- package/components/input-tel/translations/uk-UA.js +0 -1
- package/components/input-tel-dropdown/src/LionInputTelDropdown.js +10 -28
- package/components/input-tel-dropdown/src/regionCodeToLocale.js +3 -1
- package/components/input-tel-dropdown/test/LionInputTelDropdown.test.js +31 -38
- package/components/input-tel-dropdown/test/regionCodeToLocale.test.js +0 -1
- package/components/input-tel-dropdown/test-helpers/mimicUserChangingDropdown.js +5 -1
- package/components/input-tel-dropdown/test-suites/LionInputTelDropdown--parentheses.suite.js +16 -11
- package/components/input-tel-dropdown/test-suites/LionInputTelDropdown.suite.js +54 -79
- package/components/listbox/src/LionListbox.js +4 -1
- package/components/listbox/src/LionOption.js +8 -7
- package/components/listbox/src/LionOptions.js +0 -3
- package/components/listbox/src/ListboxMixin.js +786 -820
- package/components/listbox/test/lion-listbox.test.js +0 -1
- package/components/listbox/test/lion-option.test.js +53 -64
- package/components/listbox/test/lion-options.test.js +3 -4
- package/components/listbox/test-helpers/getListboxMembers.js +6 -3
- package/components/listbox/test-suites/ListboxMixin.suite.js +101 -261
- package/components/localize/src/LocalizeManager.js +40 -40
- package/components/localize/src/LocalizeMixin.js +130 -157
- package/components/localize/src/date/formatDate.js +1 -5
- package/components/localize/src/date/getDateFormatBasedOnLocale.js +5 -3
- package/components/localize/src/date/getMonthNames.js +3 -5
- package/components/localize/src/date/getWeekdayNames.js +1 -5
- package/components/localize/src/date/parseDate.js +5 -20
- package/components/localize/src/date/utils/normalizeIntlDate.js +0 -7
- package/components/localize/src/getLocalizeManager.js +0 -3
- package/components/localize/src/number/formatNumber.js +3 -7
- package/components/localize/src/number/formatNumberToParts.js +52 -18
- package/components/localize/src/number/getCurrencyName.js +5 -5
- package/components/localize/src/number/getFractionDigits.js +4 -4
- package/components/localize/src/number/getSeparatorsFromNumber.js +1 -3
- package/components/localize/src/number/parseNumber.js +0 -3
- package/components/localize/src/number/utils/normalize-format-number-to-parts/forceAddGroupSeparators.js +0 -1
- package/components/localize/src/number/utils/normalize-format-number-to-parts/forceSpaceBetweenCurrencyCodeAndNumber.js +4 -1
- package/components/localize/test/LocalizeManager.test.js +385 -278
- package/components/localize/test/LocalizeMixin.test.js +28 -112
- package/components/localize/test/date/formatDate.test.js +18 -48
- package/components/localize/test/date/getDateFormatBasedOnLocale.test.js +0 -3
- package/components/localize/test/date/getMonthNames.test.js +27 -12
- package/components/localize/test/date/getWeekdayNames.test.js +93 -49
- package/components/localize/test/date/normalizeDateTime.test.js +0 -2
- package/components/localize/test/date/parseDate.test.js +12 -16
- package/components/localize/test/getLocalizeManager.test.js +0 -3
- package/components/localize/test/isLocalizeESModule.test.js +32 -13
- package/components/localize/test/localize.test.js +0 -4
- package/components/localize/test/number/formatNumber.test.js +215 -106
- package/components/localize/test/number/formatNumberToParts.test.js +31 -38
- package/components/localize/test/number/getCurrencyName.test.js +20 -6
- package/components/localize/test/number/getDecimalSeparator.test.js +5 -4
- package/components/localize/test/number/getFractionDigits.test.js +0 -2
- package/components/localize/test/number/getGroupSeparator.test.js +0 -2
- package/components/localize/test/number/getSeparatorsFromNumber.test.js +5 -3
- package/components/localize/test/number/parseNumber.test.js +123 -56
- package/components/localize/test/side-effect-free-entrypoint.test.js +0 -6
- package/components/localize/test-helpers/fake-imports.js +11 -6
- package/components/localize/test-helpers/localizeTearDown.js +0 -1
- package/components/menu/src/InteractiveListMixin.js +637 -638
- package/components/menu/src/LionMenu.js +46 -59
- package/components/menu/src/MoreButtonMenuMixin.js +215 -238
- package/components/menu/src/MultiLevelListMixin.js +240 -246
- package/components/menu/src/utils/isInView.js +0 -1
- package/components/menu/src/utils/listItemInteractions.js +4 -4
- package/components/menu/test/InteractiveListMixin.test.js +0 -1
- package/components/menu/test/MoreButtonMenuMixin.test.js +3 -2
- package/components/menu/test/MultiLevelListMixin.test.js +0 -1
- package/components/menu/test/lion-menu-interactions.test.js +0 -1
- package/components/menu/test/lion-menu.test.js +6 -2
- package/components/menu/test-helpers/mimicKeyPress.js +12 -2
- package/components/menu/test-suites/InteractiveListMixin.suite.js +4 -43
- package/components/menu/test-suites/LionMenu.suite.js +1 -8
- package/components/menu/test-suites/LionMenuInteractions.suite.js +22 -44
- package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +34 -41
- package/components/menu/test-suites/MultiLevelListMixin.suite.js +5 -23
- package/components/overlays/src/ArrowMixin.js +111 -127
- package/components/overlays/src/OverlayController.js +166 -151
- package/components/overlays/src/OverlayMixin.js +61 -63
- package/components/overlays/src/OverlaysManager.js +30 -32
- package/components/overlays/src/configurations/visibility-trigger-partials/withClickInteraction.js +0 -1
- package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +11 -11
- package/components/overlays/src/configurations/withBottomSheetConfig.js +12 -13
- package/components/overlays/src/configurations/withDropdownConfig.js +4 -2
- package/components/overlays/src/configurations/withModalDialogConfig.js +12 -13
- package/components/overlays/src/configurations/withPopoverConfig.js +27 -25
- package/components/overlays/src/configurations/withTooltipConfig.js +15 -13
- package/components/overlays/src/overlayDocumentStyle.js +1 -1
- package/components/overlays/src/overlayShadowDomStyle.js +0 -1
- package/components/overlays/src/singleton.js +0 -2
- package/components/overlays/src/utils/adopt-styles.js +18 -18
- package/components/overlays/src/utils/deep-contains.js +7 -6
- package/components/overlays/src/utils/get-focusable-elements.js +7 -10
- package/components/overlays/src/utils/inert-siblings.js +2 -4
- package/components/overlays/src/utils/is-equal-config.js +2 -3
- package/components/overlays/src/utils/is-visible.js +0 -1
- package/components/overlays/src/utils/simulate-tab.js +1 -4
- package/components/overlays/src/utils/sort-by-tabindex.js +2 -4
- package/components/overlays/test/ArrowMixin.test.js +18 -30
- package/components/overlays/test/OverlayController.test.js +375 -555
- package/components/overlays/test/OverlayMixin.test.js +0 -2
- package/components/overlays/test/OverlaysManager.test.js +30 -35
- package/components/overlays/test/global-positioning.test.js +6 -10
- package/components/overlays/test/local-positioning.test.js +101 -103
- package/components/overlays/test/utils-tests/active-element.test.js +12 -27
- package/components/overlays/test/utils-tests/adopt-styles.test.js +25 -56
- package/components/overlays/test/utils-tests/deep-contains.test.js +73 -74
- package/components/overlays/test/utils-tests/get-focusable-elements.test.js +6 -23
- package/components/overlays/test/utils-tests/is-equal-config.test.js +32 -13
- package/components/overlays/test/utils-tests/visibility.test.js +44 -79
- package/components/overlays/test-helpers/createShadowHost.js +5 -3
- package/components/overlays/test-helpers/normalizeTransformStyle.js +2 -4
- package/components/overlays/test-suites/OverlayMixin.suite.js +152 -181
- package/components/overlays/test-suites/WithHoverInteraction.suite.js +96 -79
- package/components/overlays/translations/bg-BG.js +0 -1
- package/components/overlays/translations/cs-CZ.js +0 -1
- package/components/overlays/translations/de-DE.js +0 -1
- package/components/overlays/translations/en-AU.js +0 -1
- package/components/overlays/translations/en-GB.js +0 -1
- package/components/overlays/translations/en-US.js +0 -1
- package/components/overlays/translations/es-ES.js +0 -1
- package/components/overlays/translations/fr-BE.js +0 -1
- package/components/overlays/translations/fr-FR.js +0 -1
- package/components/overlays/translations/hu-HU.js +0 -1
- package/components/overlays/translations/it-IT.js +0 -1
- package/components/overlays/translations/nl-BE.js +0 -1
- package/components/overlays/translations/nl-NL.js +0 -1
- package/components/overlays/translations/pl-PL.js +0 -1
- package/components/overlays/translations/ro-RO.js +0 -1
- package/components/overlays/translations/ru-RU.js +0 -1
- package/components/overlays/translations/sk-SK.js +0 -1
- package/components/overlays/translations/tr-TR.js +0 -1
- package/components/overlays/translations/uk-UA.js +0 -1
- package/components/pagination/src/LionPagination.js +9 -12
- package/components/pagination/test/lion-pagination.test.js +18 -50
- package/components/progress-indicator/src/LionProgressIndicator.js +10 -12
- package/components/progress-indicator/test/lion-progress-indicator.test.js +1 -22
- package/components/radio-group/src/LionRadioGroup.js +1 -2
- package/components/radio-group/test/lion-radio-group-integrations.test.js +0 -1
- package/components/radio-group/test/lion-radio-group.test.js +27 -27
- package/components/radio-group/test/lion-radio-integrations.test.js +3 -2
- package/components/radio-group/test/lion-radio.test.js +30 -16
- package/components/select/src/LionSelect.js +12 -13
- package/components/select/test/lion-select.test.js +7 -12
- package/components/select-rich/src/LionSelectInvoker.js +18 -11
- package/components/select-rich/src/LionSelectRich.js +20 -43
- package/components/select-rich/test/demos.screenshots-test.js +40 -9
- package/components/select-rich/test/lion-select-invoker.test.js +26 -43
- package/components/select-rich/test/lion-select-listbox-suite-integration.test.js +3 -3
- package/components/select-rich/test/lion-select-rich-dialog-integration.test.js +4 -9
- package/components/select-rich/test/lion-select-rich-interaction.test.js +116 -116
- package/components/select-rich/test/lion-select-rich-upgrade.test.js +3 -7
- package/components/select-rich/test/lion-select-rich.test.js +153 -195
- package/components/select-rich/test-helpers/getSelectRichMembers.js +4 -1
- package/components/steps/src/LionStep.js +21 -12
- package/components/steps/src/LionSteps.js +25 -25
- package/components/steps/test/lion-step.test.js +18 -25
- package/components/steps/test/lion-steps.test.js +45 -78
- package/components/switch/src/LionSwitch.js +2 -7
- package/components/switch/src/LionSwitchButton.js +5 -6
- package/components/switch/test/lion-switch-button.test.js +16 -28
- package/components/switch/test/lion-switch.test.js +17 -31
- package/components/tabs/src/LionTabs.js +25 -28
- package/components/tabs/test/lion-tabs.test.js +156 -154
- package/components/textarea/src/LionTextarea.js +4 -23
- package/components/textarea/test/lion-textarea-integrations.test.js +0 -5
- package/components/textarea/test/lion-textarea.test.js +2 -28
- package/components/tooltip/src/LionTooltip.js +6 -6
- package/components/tooltip/test/lion-tooltip.test.js +75 -102
- package/components/validate-messages/src/getLocalizedMessage.js +8 -7
- package/components/validate-messages/src/loadDefaultFeedbackMessages.js +3 -1
- package/components/validate-messages/src/loadDefaultFeedbackMessagesNoSideEffects.js +9 -5
- package/components/validate-messages/src/per-entrypoint/loadComboboxMessagesNoSideEffects.js +5 -2
- package/components/validate-messages/src/per-entrypoint/loadFormCoreMessagesNoSideEffects.js +99 -35
- package/components/validate-messages/src/per-entrypoint/loadInputTelMessagesNoSideEffects.js +4 -3
- package/components/validate-messages/test/loadDefaultFeedbackMessages.test.js +5 -3
- package/components/validate-messages/test/loadDefaultFeedbackMessagesNoSideEffects.test.js +80 -45
- package/components/validate-messages/translations/bg-BG.js +0 -1
- package/components/validate-messages/translations/cs-CZ.js +0 -1
- package/components/validate-messages/translations/de-DE.js +0 -1
- package/components/validate-messages/translations/en-AU.js +0 -1
- package/components/validate-messages/translations/en-GB.js +0 -1
- package/components/validate-messages/translations/en-PH.js +0 -1
- package/components/validate-messages/translations/en-US.js +0 -1
- package/components/validate-messages/translations/es-ES.js +0 -1
- package/components/validate-messages/translations/fr-BE.js +0 -1
- package/components/validate-messages/translations/fr-FR.js +0 -1
- package/components/validate-messages/translations/hu-HU.js +0 -1
- package/components/validate-messages/translations/it-IT.js +0 -1
- package/components/validate-messages/translations/nl-BE.js +0 -1
- package/components/validate-messages/translations/nl-NL.js +0 -1
- package/components/validate-messages/translations/pl-PL.js +0 -1
- package/components/validate-messages/translations/ro-RO.js +0 -1
- package/components/validate-messages/translations/ru-RU.js +0 -1
- package/components/validate-messages/translations/sk-SK.js +0 -1
- package/components/validate-messages/translations/tr-TR.js +0 -1
- package/components/validate-messages/translations/uk-UA.js +0 -1
- package/custom-elements.json +191 -56
- package/dist-types/components/core/src/SlotMixin.d.ts +6 -1
- package/dist-types/components/core/src/SlotMixin.d.ts.map +1 -1
- package/dist-types/components/core/types/SlotMixinTypes.d.ts +5 -1
- package/dist-types/components/core/types/SlotMixinTypes.d.ts.map +1 -1
- package/dist-types/components/form-core/src/LionField.d.ts +3 -1
- package/dist-types/components/form-core/src/LionField.d.ts.map +1 -1
- package/dist-types/components/input-tel/src/LionInputTel.d.ts +6 -6
- package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
- package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts +2 -2
- package/dist-types/components/input-tel/src/PhoneUtilManager.d.ts.map +1 -1
- package/dist-types/components/input-tel/src/formatters.d.ts +2 -2
- package/dist-types/components/input-tel/src/formatters.d.ts.map +1 -1
- package/dist-types/components/input-tel/src/preprocessors.d.ts +2 -2
- package/dist-types/components/input-tel/src/preprocessors.d.ts.map +1 -1
- package/dist-types/components/input-tel/test/validators.test.d.ts +1 -1
- package/dist-types/components/input-tel/test/validators.test.d.ts.map +1 -1
- package/dist-types/components/listbox/src/LionOption.d.ts +5 -2
- package/dist-types/components/listbox/src/LionOption.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlaysManager.d.ts.map +1 -1
- package/dist-types/components/overlays/src/overlayDocumentStyle.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts +3 -1
- package/dist-types/components/select-rich/src/LionSelectInvoker.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts +1 -1
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/docs/components/accordion/overview.md +2 -2
- package/docs/components/accordion/reference.md +2 -2
- package/docs/components/accordion/use-cases.md +2 -2
- package/docs/components/button/examples.md +2 -2
- package/docs/components/button/extensions.md +2 -2
- package/docs/components/button/overview.md +2 -2
- package/docs/components/button/use-cases.md +2 -2
- package/docs/components/calendar/overview.md +2 -2
- package/docs/components/calendar/use-cases.md +2 -2
- package/docs/components/checkbox-group/overview.md +4 -4
- package/docs/components/checkbox-group/use-cases.md +2 -2
- package/docs/components/collapsible/examples.md +2 -2
- package/docs/components/collapsible/overview.md +3 -3
- package/docs/components/collapsible/use-cases.md +2 -2
- package/docs/components/combobox/extensions.md +2 -2
- package/docs/components/combobox/overview.md +3 -3
- package/docs/components/combobox/use-cases.md +3 -3
- package/docs/components/dialog/overview.md +3 -3
- package/docs/components/dialog/use-cases.md +2 -2
- package/docs/components/drawer/overview.md +2 -2
- package/docs/components/drawer/use-cases.md +2 -2
- package/docs/components/fieldset/overview.md +7 -7
- package/docs/components/fieldset/use-cases.md +2 -2
- package/docs/components/form/overview.md +5 -5
- package/docs/components/form/use-cases.md +4 -4
- package/docs/components/icon/overview.md +2 -2
- package/docs/components/icon/use-cases.md +3 -3
- package/docs/components/input/overview.md +3 -3
- package/docs/components/input/use-cases.md +2 -2
- package/docs/components/input-amount/overview.md +5 -5
- package/docs/components/input-amount/use-cases.md +2 -2
- package/docs/components/input-amount-dropdown/use-cases.md +2 -2
- package/docs/components/input-date/overview.md +5 -5
- package/docs/components/input-date/use-cases.md +2 -2
- package/docs/components/input-datepicker/overview.md +7 -7
- package/docs/components/input-datepicker/use-cases.md +2 -2
- package/docs/components/input-email/overview.md +4 -4
- package/docs/components/input-email/use-cases.md +2 -2
- package/docs/components/input-file/overview.md +3 -3
- package/docs/components/input-file/use-cases.md +2 -2
- package/docs/components/input-iban/overview.md +4 -4
- package/docs/components/input-iban/use-cases.md +2 -2
- package/docs/components/input-range/overview.md +4 -4
- package/docs/components/input-range/use-cases.md +2 -2
- package/docs/components/input-stepper/overview.md +3 -3
- package/docs/components/input-stepper/use-cases.md +2 -2
- package/docs/components/input-tel/overview.md +3 -3
- package/docs/components/input-tel/use-cases.md +8 -8
- package/docs/components/input-tel-dropdown/extensions.md +2 -2
- package/docs/components/input-tel-dropdown/overview.md +3 -3
- package/docs/components/input-tel-dropdown/use-cases.md +2 -2
- package/docs/components/listbox/overview.md +2 -2
- package/docs/components/listbox/use-cases.md +3 -3
- package/docs/components/menu/extensions.md +2 -2
- package/docs/components/menu/migration.md +2 -2
- package/docs/components/menu/overview.md +2 -2
- package/docs/components/menu/use-cases.md +1 -1
- package/docs/components/pagination/overview.md +2 -2
- package/docs/components/pagination/use-cases.md +2 -2
- package/docs/components/progress-indicator/examples.md +2 -2
- package/docs/components/progress-indicator/overview.md +2 -2
- package/docs/components/radio-group/overview.md +5 -5
- package/docs/components/radio-group/use-cases.md +2 -2
- package/docs/components/select/overview.md +2 -2
- package/docs/components/select/use-cases.md +3 -3
- package/docs/components/select-rich/examples.md +2 -2
- package/docs/components/select-rich/overview.md +2 -2
- package/docs/components/select-rich/use-cases.md +4 -4
- package/docs/components/steps/overview.md +2 -2
- package/docs/components/steps/use-cases.md +2 -2
- package/docs/components/switch/overview.md +2 -2
- package/docs/components/switch/reference.md +2 -2
- package/docs/components/switch/use-cases.md +2 -2
- package/docs/components/tabs/examples.md +3 -3
- package/docs/components/tabs/overview.md +2 -2
- package/docs/components/tabs/use-cases.md +2 -2
- package/docs/components/textarea/overview.md +2 -2
- package/docs/components/textarea/use-cases.md +2 -2
- package/docs/components/tooltip/examples.md +2 -2
- package/docs/components/tooltip/overview.md +2 -2
- package/docs/components/tooltip/use-cases.md +2 -2
- package/docs/fundamentals/index.md +4 -4
- package/docs/fundamentals/node-tools/babel-plugin-extend-docs/index.md +2 -2
- package/docs/fundamentals/node-tools/babel-plugin-extend-docs/overview.md +2 -2
- package/docs/fundamentals/node-tools/providence-analytics/index.md +2 -2
- package/docs/fundamentals/node-tools/providence-analytics/overview.md +2 -2
- package/docs/fundamentals/node-tools/publish-docs/index.md +2 -2
- package/docs/fundamentals/node-tools/publish-docs/overview.md +5 -5
- package/docs/fundamentals/node-tools/remark-extend/index.md +2 -2
- package/docs/fundamentals/node-tools/remark-extend/overview.md +2 -2
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/index.md +2 -2
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +4 -4
- package/docs/fundamentals/rationales/TypeScript.md +62 -2
- package/docs/fundamentals/rationales/accessibility.md +5 -5
- package/docs/fundamentals/rationales/side-effects.md +2 -2
- package/docs/fundamentals/rationales/versioning.md +2 -2
- package/docs/fundamentals/systems/core/SlotMixin.md +3 -3
- package/docs/fundamentals/systems/core/index.md +2 -2
- package/docs/fundamentals/systems/core/overview.md +3 -3
- package/docs/fundamentals/systems/form/formatting-and-parsing.md +6 -6
- package/docs/fundamentals/systems/form/index.md +2 -2
- package/docs/fundamentals/systems/form/interaction-states.md +2 -2
- package/docs/fundamentals/systems/form/model-value.md +3 -3
- package/docs/fundamentals/systems/form/overview.md +30 -30
- package/docs/fundamentals/systems/form/styling.md +2 -2
- package/docs/fundamentals/systems/form/use-cases.md +2 -2
- package/docs/fundamentals/systems/form/validate.md +4 -4
- package/docs/fundamentals/systems/icon/index.md +2 -2
- package/docs/fundamentals/systems/icon/overview.md +2 -2
- package/docs/fundamentals/systems/localize/dates.md +2 -2
- package/docs/fundamentals/systems/localize/index.md +2 -2
- package/docs/fundamentals/systems/localize/numbers.md +2 -2
- package/docs/fundamentals/systems/localize/overview.md +6 -6
- package/docs/fundamentals/systems/localize/rationale.md +2 -2
- package/docs/fundamentals/systems/localize/text.md +2 -2
- package/docs/fundamentals/systems/localize/use-cases.md +2 -2
- package/docs/fundamentals/systems/overlays/_edge-cases.md +2 -2
- package/docs/fundamentals/systems/overlays/configuration.md +4 -4
- package/docs/fundamentals/systems/overlays/index.md +2 -2
- package/docs/fundamentals/systems/overlays/overview.md +7 -7
- package/docs/fundamentals/systems/overlays/rationale.md +2 -2
- package/docs/fundamentals/systems/overlays/use-cases.md +4 -4
- package/docs/fundamentals/tools/ajax/index.md +2 -2
- package/docs/fundamentals/tools/ajax/overview.md +2 -2
- package/docs/fundamentals/tools/ajax/use-cases.md +2 -2
- package/docs/fundamentals/tools/helpers/action-logger.md +2 -2
- package/docs/fundamentals/tools/helpers/index.md +2 -2
- package/docs/fundamentals/tools/helpers/overview.md +3 -3
- package/docs/fundamentals/tools/singleton-manager/example-complex/index.md +2 -2
- package/docs/fundamentals/tools/singleton-manager/example-fail/index.md +2 -2
- package/docs/fundamentals/tools/singleton-manager/example-success/index.md +2 -2
- package/docs/fundamentals/tools/singleton-manager/index.md +2 -2
- package/docs/fundamentals/tools/singleton-manager/overview.md +6 -6
- package/docs/guides/how-to/create-a-custom-field.md +7 -7
- package/docs/guides/how-to/create-a-form.md +6 -6
- package/docs/guides/how-to/extend-a-native-input.md +4 -4
- package/docs/guides/how-to/get-started.md +2 -2
- package/docs/guides/how-to/index.md +1 -1
- package/docs/guides/index.md +8 -8
- package/docs/guides/principles/definitions-and-terms.md +2 -2
- package/docs/guides/principles/index.md +5 -5
- package/docs/guides/principles/scoped-elements.md +2 -2
- package/docs/guides/principles/styling.md +3 -3
- package/docs/guides/principles/subclasser-apis.md +2 -2
- package/exports/define/lion-accordion.js +0 -1
- package/exports/define/lion-button-reset.js +0 -1
- package/exports/define/lion-button-submit.js +0 -1
- package/exports/define/lion-button.js +0 -1
- package/exports/define/lion-calendar.js +0 -1
- package/exports/define/lion-checkbox-group.js +0 -1
- package/exports/define/lion-checkbox-indeterminate.js +0 -1
- package/exports/define/lion-checkbox.js +0 -1
- package/exports/define/lion-collapsible.js +0 -1
- package/exports/define/lion-combobox.js +0 -1
- package/exports/define/lion-dialog.js +0 -1
- package/exports/define/lion-drawer.js +0 -1
- package/exports/define/lion-field.js +0 -1
- package/exports/define/lion-fieldset.js +0 -1
- package/exports/define/lion-form.js +0 -1
- package/exports/define/lion-icon.js +0 -1
- package/exports/define/lion-input-amount-dropdown.js +0 -1
- package/exports/define/lion-input-amount.js +0 -1
- package/exports/define/lion-input-date.js +0 -1
- package/exports/define/lion-input-datepicker.js +0 -1
- package/exports/define/lion-input-email.js +0 -1
- package/exports/define/lion-input-file.js +0 -1
- package/exports/define/lion-input-iban.js +0 -1
- package/exports/define/lion-input-range.js +0 -1
- package/exports/define/lion-input-stepper.js +0 -1
- package/exports/define/lion-input-tel-dropdown.js +0 -1
- package/exports/define/lion-input-tel.js +0 -1
- package/exports/define/lion-input.js +0 -1
- package/exports/define/lion-item.js +0 -1
- package/exports/define/lion-listbox.js +0 -1
- package/exports/define/lion-menu.js +0 -1
- package/exports/define/lion-menuitem.js +0 -1
- package/exports/define/lion-option.js +0 -1
- package/exports/define/lion-options.js +0 -1
- package/exports/define/lion-pagination.js +0 -1
- package/exports/define/lion-progress-indicator.js +0 -1
- package/exports/define/lion-radio-group.js +0 -1
- package/exports/define/lion-radio.js +0 -1
- package/exports/define/lion-select-invoker.js +0 -1
- package/exports/define/lion-select-rich.js +0 -1
- package/exports/define/lion-select.js +0 -1
- package/exports/define/lion-selected-file-list.js +0 -1
- package/exports/define/lion-step.js +0 -1
- package/exports/define/lion-steps.js +0 -1
- package/exports/define/lion-switch-button.js +0 -1
- package/exports/define/lion-switch.js +0 -1
- package/exports/define/lion-tabs.js +0 -1
- package/exports/define/lion-textarea.js +0 -1
- package/exports/define/lion-tooltip.js +0 -1
- package/exports/define/lion-validation-feedback.js +0 -1
- package/exports/define-helpers/sb-action-logger.js +0 -1
- package/exports/define-helpers/sb-locale-switcher.js +0 -1
- package/exports/form-core.js +0 -8
- package/exports/localize-no-side-effects.js +0 -1
- package/exports/localize.js +0 -2
- package/exports/overlays.js +0 -4
- package/generated/awesome-phonenumber/LICENSE +22 -0
- package/generated/awesome-phonenumber/LICENSE.closure-library +176 -0
- package/generated/awesome-phonenumber/LICENSE.libphonenumber +176 -0
- package/generated/awesome-phonenumber/checksums.json +6 -0
- package/generated/awesome-phonenumber/index-esm.mjs +817 -0
- package/generated/awesome-phonenumber/index.d.ts +227 -0
- package/generated/awesome-phonenumber/index.js +45 -0
- package/generated/awesome-phonenumber/lib/index.js +710 -0
- package/generated/awesome-phonenumber/package.json +9 -0
- package/generated/awesome-phonenumber/provenance.json +13 -0
- package/package.json +32 -10
- package/web-types.json +1 -1
- package/vendor/README.md +0 -61
- package/vendor/awesome-phonenumber-7.9.0-tlouisse.libphonenumber-9.0.41.tgz +0 -0
|
@@ -12,13 +12,11 @@ import sinon from 'sinon';
|
|
|
12
12
|
* @typedef {import('../types/input-file.js').SystemFile} SystemFile
|
|
13
13
|
* @typedef {import('lit').TemplateResult} TemplateResult
|
|
14
14
|
*/
|
|
15
|
-
const fixture = /** @type {(arg: TemplateResult|string) => Promise<LionInputFile>} */
|
|
16
|
-
|
|
15
|
+
const fixture = /** @type {(arg: TemplateResult|string) => Promise<LionInputFile>} */ _fixture;
|
|
17
16
|
const filesListChanged = (/** @type {LionInputFile} */ el, /** @type { CustomEvent } */ ev) => {
|
|
18
17
|
// eslint-disable-next-line no-param-reassign
|
|
19
18
|
el.uploadResponse = [...ev.detail.newFiles];
|
|
20
19
|
};
|
|
21
|
-
|
|
22
20
|
function mimicSelectFile(
|
|
23
21
|
/** @type {LionInputFile} */ formControl,
|
|
24
22
|
/** @type {InputFile[]} */ mockFiles,
|
|
@@ -26,7 +24,7 @@ function mimicSelectFile(
|
|
|
26
24
|
// @ts-expect-error [allow-protected-in-tests]
|
|
27
25
|
formControl._processFiles(mockFiles);
|
|
28
26
|
// TODO: doesn't this set latest file.name only to formControl._inputNode.value?
|
|
29
|
-
mockFiles.forEach(file => {
|
|
27
|
+
mockFiles.forEach((file) => {
|
|
30
28
|
// @ts-expect-error [allow-protected-in-tests]
|
|
31
29
|
Object.defineProperty(formControl._inputNode, 'value', {
|
|
32
30
|
value: `C:\\fakepath\\${file.name}`,
|
|
@@ -34,75 +32,75 @@ function mimicSelectFile(
|
|
|
34
32
|
});
|
|
35
33
|
});
|
|
36
34
|
// @ts-expect-error [allow-protected-in-tests]
|
|
37
|
-
Object.defineProperty(formControl._inputNode, 'files', {
|
|
35
|
+
Object.defineProperty(formControl._inputNode, 'files', {
|
|
36
|
+
value: mockFiles,
|
|
37
|
+
writable: true,
|
|
38
|
+
});
|
|
38
39
|
// @ts-expect-error [allow-protected-in-tests]
|
|
39
|
-
formControl._inputNode.dispatchEvent(
|
|
40
|
+
formControl._inputNode.dispatchEvent(
|
|
41
|
+
new Event('input', {
|
|
42
|
+
bubbles: true,
|
|
43
|
+
}),
|
|
44
|
+
);
|
|
40
45
|
}
|
|
41
|
-
|
|
42
|
-
|
|
46
|
+
const file =
|
|
47
|
+
/** @type {InputFile} */
|
|
43
48
|
new File(['foo'], 'foo.txt', {
|
|
44
49
|
type: 'text/plain',
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
|
|
50
|
+
});
|
|
51
|
+
const file2 =
|
|
52
|
+
/** @type {InputFile} */
|
|
48
53
|
new File(['bar'], 'bar.txt', {
|
|
49
54
|
type: 'text/plain',
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
});
|
|
56
|
+
const file3 =
|
|
57
|
+
/** @type {InputFile} */
|
|
53
58
|
new File(['foo3'], 'foo3.txt', {
|
|
54
59
|
type: 'text/plain',
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
|
|
60
|
+
});
|
|
61
|
+
const file4 =
|
|
62
|
+
/** @type {InputFile} */
|
|
58
63
|
new File(['foo4'], 'foo4.txt', {
|
|
59
64
|
type: 'text/plain',
|
|
60
|
-
})
|
|
61
|
-
);
|
|
62
|
-
|
|
65
|
+
});
|
|
63
66
|
describe('lion-input-file', () => {
|
|
64
67
|
const localizeManager = getLocalizeManager();
|
|
65
|
-
|
|
66
68
|
afterEach(localizeTearDown);
|
|
67
|
-
|
|
68
69
|
it('has a type of "file"', async () => {
|
|
69
70
|
const el = await fixture(html`<lion-input-file></lion-input-file>`);
|
|
70
71
|
// @ts-expect-error [allow-protected-in-tests]
|
|
71
72
|
const { _inputNode } = getInputMembers(el);
|
|
72
73
|
expect(_inputNode.type).to.equal('file');
|
|
73
74
|
});
|
|
74
|
-
|
|
75
75
|
it('should add single file and dispatch "file-list-changed" event with newly added file', async () => {
|
|
76
76
|
const el = await fixture(html`<lion-input-file></lion-input-file>`);
|
|
77
|
-
|
|
78
77
|
const fileListChangedEventPromise = oneEvent(el, 'file-list-changed');
|
|
79
78
|
mimicSelectFile(el, [file]);
|
|
80
79
|
const fileListChangedEvent = await fileListChangedEventPromise;
|
|
81
80
|
// @ts-expect-error [allow-protected-in-tests]
|
|
82
81
|
expect(el._selectedFilesMetaData.length).to.equal(1);
|
|
83
82
|
expect(el.uploadResponse.length).to.equal(1);
|
|
84
|
-
|
|
85
83
|
expect(fileListChangedEvent).to.exist;
|
|
86
84
|
expect(fileListChangedEvent.detail.newFiles.length).to.equal(1);
|
|
87
85
|
expect(fileListChangedEvent.detail.newFiles[0].name).to.equal('foo.txt');
|
|
88
86
|
});
|
|
89
|
-
|
|
90
87
|
it('should select 1 file', async () => {
|
|
91
88
|
const el = await fixture(html`<lion-input-file></lion-input-file>`);
|
|
92
89
|
// @ts-expect-error [allow-protected-in-test]
|
|
93
90
|
const processedFilesSpy = sinon.spy(el, '_processFiles');
|
|
94
91
|
|
|
95
92
|
// @ts-expect-error [allow-protected-in-test]
|
|
96
|
-
await el._onChange({
|
|
93
|
+
await el._onChange({
|
|
94
|
+
target: {
|
|
95
|
+
files: [file],
|
|
96
|
+
},
|
|
97
|
+
});
|
|
97
98
|
expect(processedFilesSpy).have.been.calledOnce;
|
|
98
99
|
processedFilesSpy.restore();
|
|
99
100
|
});
|
|
100
|
-
|
|
101
101
|
it('should retain selected file when "Cancel" button is clicked in system file explorer dialog', async () => {
|
|
102
102
|
const el = await fixture(html`<lion-input-file></lion-input-file>`);
|
|
103
|
-
|
|
104
103
|
mimicSelectFile(el, [file]);
|
|
105
|
-
|
|
106
104
|
await el.updateComplete;
|
|
107
105
|
// @ts-expect-error [allow-protected-in-test]
|
|
108
106
|
expect(el._selectedFilesMetaData.length).to.equal(1);
|
|
@@ -110,12 +108,10 @@ describe('lion-input-file', () => {
|
|
|
110
108
|
|
|
111
109
|
// when cancel is clicked, native input value is blank which means modelValue is blank
|
|
112
110
|
el.modelValue = [];
|
|
113
|
-
|
|
114
111
|
await el.updateComplete;
|
|
115
112
|
// @ts-expect-error [allow-protected-in-test]
|
|
116
113
|
expect(el._selectedFilesMetaData.length).to.equal(1);
|
|
117
114
|
});
|
|
118
|
-
|
|
119
115
|
it('has an attribute focused when focused', async () => {
|
|
120
116
|
const el = await fixture(html` <lion-input-file label="Select"></lion-input-file> `);
|
|
121
117
|
|
|
@@ -129,26 +125,26 @@ describe('lion-input-file', () => {
|
|
|
129
125
|
await el.updateComplete;
|
|
130
126
|
expect(el.hasAttribute('focused')).to.be.false;
|
|
131
127
|
});
|
|
132
|
-
|
|
133
128
|
it('should set touched property true on change', async () => {
|
|
134
129
|
const el = await fixture(html` <lion-input-file label="Select"></lion-input-file> `);
|
|
135
130
|
expect(el.touched).to.be.false;
|
|
136
131
|
|
|
137
132
|
// @ts-expect-error [allow-protected-in-test]
|
|
138
|
-
await el._onChange({
|
|
133
|
+
await el._onChange({
|
|
134
|
+
target: {
|
|
135
|
+
files: [file],
|
|
136
|
+
},
|
|
137
|
+
});
|
|
139
138
|
expect(el.touched).to.be.true;
|
|
140
139
|
});
|
|
141
|
-
|
|
142
140
|
it('should replace previous file when new file is selected', async () => {
|
|
143
141
|
const el = await fixture(html`<lion-input-file></lion-input-file>`);
|
|
144
|
-
|
|
145
142
|
mimicSelectFile(el, [file]);
|
|
146
143
|
await el.updateComplete;
|
|
147
144
|
// @ts-expect-error [allow-protected-in-test]
|
|
148
145
|
expect(el._selectedFilesMetaData.length).to.equal(1);
|
|
149
146
|
// @ts-expect-error [allow-protected-in-test]
|
|
150
147
|
expect(el._selectedFilesMetaData[0].systemFile.name).to.equal('foo.txt');
|
|
151
|
-
|
|
152
148
|
mimicSelectFile(el, [file2]);
|
|
153
149
|
await el.updateComplete;
|
|
154
150
|
// @ts-expect-error [allow-protected-in-test]
|
|
@@ -156,67 +152,55 @@ describe('lion-input-file', () => {
|
|
|
156
152
|
// @ts-expect-error [allow-protected-in-test]
|
|
157
153
|
expect(el._selectedFilesMetaData[0].systemFile.name).to.equal('bar.txt');
|
|
158
154
|
});
|
|
159
|
-
|
|
160
155
|
describe('structure', async () => {
|
|
161
156
|
it('can has a button label by default', async () => {
|
|
162
157
|
const el = await fixture(html`<lion-input-file></lion-input-file>`);
|
|
163
158
|
// @ts-expect-error [allow-protected-in-test]
|
|
164
159
|
expect(el._buttonNode.textContent).to.equal('Select file');
|
|
165
160
|
});
|
|
166
|
-
|
|
167
161
|
it('can has a button label by default when multiple', async () => {
|
|
168
162
|
const el = await fixture(html`<lion-input-file multiple></lion-input-file>`);
|
|
169
163
|
// @ts-expect-error [allow-protected-in-test]
|
|
170
164
|
expect(el._buttonNode.textContent).to.equal('Select files');
|
|
171
165
|
});
|
|
172
|
-
|
|
173
166
|
it('will update the button label on locale change', async () => {
|
|
174
167
|
const el = await fixture(html`<lion-input-file></lion-input-file>`);
|
|
175
168
|
// @ts-expect-error [allow-protected-in-test]
|
|
176
169
|
expect(el._buttonNode.textContent).to.equal('Select file');
|
|
177
|
-
|
|
178
170
|
localizeManager.locale = 'nl-NL';
|
|
179
171
|
await localizeManager.loadingComplete;
|
|
180
172
|
await el.updateComplete;
|
|
181
173
|
// @ts-expect-error [allow-protected-in-test]
|
|
182
174
|
expect(el._buttonNode.textContent).to.equal('Selecteer bestand');
|
|
183
175
|
});
|
|
184
|
-
|
|
185
176
|
it('can overwrite the button label', async () => {
|
|
186
177
|
const el = await fixture(html`<lion-input-file .buttonLabel="${'Foo'}"></lion-input-file>`);
|
|
187
178
|
// @ts-expect-error [allow-protected-in-test]
|
|
188
179
|
expect(el._buttonNode.textContent).to.equal('Foo');
|
|
189
|
-
|
|
190
180
|
el.buttonLabel = 'Bar';
|
|
191
181
|
await el.updateComplete;
|
|
192
182
|
// @ts-expect-error [allow-protected-in-test]
|
|
193
183
|
expect(el._buttonNode.textContent).to.equal('Bar');
|
|
194
184
|
});
|
|
195
185
|
});
|
|
196
|
-
|
|
197
186
|
describe('invalid file types', async () => {
|
|
198
|
-
const fileWrongType =
|
|
187
|
+
const fileWrongType =
|
|
188
|
+
/** @type {InputFile} */
|
|
199
189
|
new File(['foobar'], 'foobar.txt', {
|
|
200
190
|
type: 'xxxxx',
|
|
201
|
-
})
|
|
202
|
-
);
|
|
203
|
-
|
|
191
|
+
});
|
|
204
192
|
it('error should not be there when the file extensions are accepted', async () => {
|
|
205
193
|
const el = await fixture(html`
|
|
206
194
|
<lion-input-file label="Select" accept=".txt"></lion-input-file>
|
|
207
195
|
`);
|
|
208
|
-
|
|
209
196
|
mimicSelectFile(el, [fileWrongType]);
|
|
210
197
|
await el.updateComplete;
|
|
211
|
-
|
|
212
198
|
expect(el.hasFeedbackFor.length).to.equal(0);
|
|
213
199
|
});
|
|
214
|
-
|
|
215
200
|
it('should not be added to the selected list', async () => {
|
|
216
201
|
const el = await fixture(html`
|
|
217
202
|
<lion-input-file label="Select" accept="text/plain"></lion-input-file>
|
|
218
203
|
`);
|
|
219
|
-
|
|
220
204
|
mimicSelectFile(el, [fileWrongType]);
|
|
221
205
|
await el.updateComplete;
|
|
222
206
|
|
|
@@ -230,118 +214,101 @@ describe('lion-input-file', () => {
|
|
|
230
214
|
expect(el._selectedFilesMetaData[0].status).to.equal('FAIL');
|
|
231
215
|
expect(el.uploadResponse[0].status).to.equal('FAIL');
|
|
232
216
|
});
|
|
233
|
-
|
|
234
217
|
it('error message should use main type when "/*" is used', async () => {
|
|
235
218
|
const el = await fixture(html`
|
|
236
219
|
<lion-input-file label="Select" accept="text/*"></lion-input-file>
|
|
237
220
|
`);
|
|
238
|
-
|
|
239
221
|
mimicSelectFile(el, [fileWrongType]);
|
|
240
222
|
await el.updateComplete;
|
|
241
223
|
|
|
242
224
|
// @ts-expect-error [allow-protected-in-test]
|
|
243
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
225
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
244
226
|
expect(error.message).to.deep.equal('Please select a(n) text file with max 500MB.');
|
|
245
227
|
});
|
|
246
228
|
});
|
|
247
|
-
|
|
248
229
|
it('error message should use main type when "text/plain" is used', async () => {
|
|
249
230
|
const el = await fixture(html`
|
|
250
231
|
<lion-input-file label="Select" accept="text/plain"></lion-input-file>
|
|
251
232
|
`);
|
|
252
|
-
|
|
253
233
|
mimicSelectFile(el, [fileWrongType]);
|
|
254
234
|
await el.updateComplete;
|
|
255
235
|
|
|
256
236
|
// @ts-expect-error [allow-protected-in-test]
|
|
257
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
237
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
258
238
|
expect(error.message).to.deep.equal('Please select a(n) text file with max 500MB.');
|
|
259
239
|
});
|
|
260
240
|
});
|
|
261
|
-
|
|
262
241
|
it('error message should use sub type when e.g. "text/html" is used', async () => {
|
|
263
242
|
const el = await fixture(html`
|
|
264
243
|
<lion-input-file label="Select" accept="text/html"></lion-input-file>
|
|
265
244
|
`);
|
|
266
|
-
|
|
267
245
|
mimicSelectFile(el, [fileWrongType]);
|
|
268
246
|
await el.updateComplete;
|
|
269
247
|
|
|
270
248
|
// @ts-expect-error [allow-protected-in-test]
|
|
271
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
249
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
272
250
|
expect(error.message).to.deep.equal('Please select a(n) .html file with max 500MB.');
|
|
273
251
|
});
|
|
274
252
|
});
|
|
275
|
-
|
|
276
253
|
it('error message should use the first sub type when e.g. "image/svg+xml" is used', async () => {
|
|
277
254
|
const el = await fixture(html`
|
|
278
255
|
<lion-input-file label="Select" accept="image/svg+xml"></lion-input-file>
|
|
279
256
|
`);
|
|
280
|
-
|
|
281
257
|
mimicSelectFile(el, [fileWrongType]);
|
|
282
258
|
await el.updateComplete;
|
|
283
259
|
|
|
284
260
|
// @ts-expect-error [allow-protected-in-test]
|
|
285
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
261
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
286
262
|
expect(error.message).to.deep.equal('Please select a(n) .svg file with max 500MB.');
|
|
287
263
|
});
|
|
288
264
|
});
|
|
289
|
-
|
|
290
265
|
it('can reflect multiple types in the error message', async () => {
|
|
291
266
|
const el = await fixture(html`
|
|
292
267
|
<lion-input-file label="Select" accept="text/html, text/csv"></lion-input-file>
|
|
293
268
|
`);
|
|
294
|
-
|
|
295
269
|
mimicSelectFile(el, [fileWrongType]);
|
|
296
270
|
await el.updateComplete;
|
|
297
271
|
|
|
298
272
|
// @ts-expect-error [allow-protected-in-test]
|
|
299
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
273
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
300
274
|
expect(error.message).to.deep.equal('Please select a .html or .csv file with max 500MB.');
|
|
301
275
|
});
|
|
302
276
|
});
|
|
303
|
-
|
|
304
277
|
it('can reflect multiple types in the error message also with a space " "', async () => {
|
|
305
278
|
const el = await fixture(html`
|
|
306
279
|
<lion-input-file label="Select" accept="text/html,text/csv"></lion-input-file>
|
|
307
280
|
`);
|
|
308
|
-
|
|
309
281
|
mimicSelectFile(el, [fileWrongType]);
|
|
310
282
|
await el.updateComplete;
|
|
311
283
|
|
|
312
284
|
// @ts-expect-error [allow-protected-in-test]
|
|
313
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
285
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
314
286
|
expect(error.message).to.deep.equal('Please select a .html or .csv file with max 500MB.');
|
|
315
287
|
});
|
|
316
288
|
});
|
|
317
|
-
|
|
318
289
|
it('can reflect multiple types in the error message with preference to extensions', async () => {
|
|
319
290
|
const el = await fixture(html`
|
|
320
291
|
<lion-input-file label="Select" accept=".jpg,image/svg+xml"></lion-input-file>
|
|
321
292
|
`);
|
|
322
|
-
|
|
323
293
|
mimicSelectFile(el, [fileWrongType]);
|
|
324
294
|
await el.updateComplete;
|
|
325
295
|
|
|
326
296
|
// @ts-expect-error [allow-protected-in-test]
|
|
327
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
297
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
328
298
|
expect(error.message).to.deep.equal('Please select a(n) .jpg file with max 500MB.');
|
|
329
299
|
});
|
|
330
300
|
});
|
|
331
301
|
});
|
|
332
|
-
|
|
333
302
|
describe('invalid file extensions', async () => {
|
|
334
|
-
const fileWrongType =
|
|
303
|
+
const fileWrongType =
|
|
304
|
+
/** @type {InputFile} */
|
|
335
305
|
new File(['foobar'], 'foobar.txt', {
|
|
336
306
|
type: 'xxxxx',
|
|
337
|
-
})
|
|
338
|
-
);
|
|
339
|
-
|
|
307
|
+
});
|
|
340
308
|
it('should not be added to the selected list', async () => {
|
|
341
309
|
const el = await fixture(html`
|
|
342
310
|
<lion-input-file label="Select" accept=".jpg, .png, .pdf"></lion-input-file>
|
|
343
311
|
`);
|
|
344
|
-
|
|
345
312
|
mimicSelectFile(el, [fileWrongType]);
|
|
346
313
|
await el.updateComplete;
|
|
347
314
|
|
|
@@ -355,57 +322,48 @@ describe('lion-input-file', () => {
|
|
|
355
322
|
expect(el._selectedFilesMetaData[0].status).to.equal('FAIL');
|
|
356
323
|
expect(el.uploadResponse[0].status).to.equal('FAIL');
|
|
357
324
|
});
|
|
358
|
-
|
|
359
325
|
it('error message should add the file extension to the validator message', async () => {
|
|
360
326
|
const el = await fixture(html`
|
|
361
327
|
<lion-input-file label="Select" accept=".jpg"></lion-input-file>
|
|
362
328
|
`);
|
|
363
|
-
|
|
364
329
|
mimicSelectFile(el, [fileWrongType]);
|
|
365
330
|
await el.updateComplete;
|
|
366
331
|
|
|
367
332
|
// @ts-expect-error [allow-protected-in-test]
|
|
368
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
333
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
369
334
|
expect(error.message).to.equal('Please select a(n) .jpg file with max 500MB.');
|
|
370
335
|
});
|
|
371
336
|
});
|
|
372
|
-
|
|
373
337
|
it('error message should add all file extensions to the validator message', async () => {
|
|
374
338
|
const el = await fixture(html`
|
|
375
339
|
<lion-input-file label="Select" accept=".jpg, .png, .pdf"></lion-input-file>
|
|
376
340
|
`);
|
|
377
|
-
|
|
378
341
|
mimicSelectFile(el, [fileWrongType]);
|
|
379
342
|
await el.updateComplete;
|
|
380
343
|
|
|
381
344
|
// @ts-expect-error [allow-protected-in-test]
|
|
382
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
345
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
383
346
|
expect(error.message).to.equal('Please select a .jpg, .png or .pdf file with max 500MB.');
|
|
384
347
|
});
|
|
385
348
|
});
|
|
386
|
-
|
|
387
349
|
it('error message should add all file extensions to the validator message also works without spaces " "', async () => {
|
|
388
350
|
const el = await fixture(html`
|
|
389
351
|
<lion-input-file label="Select" accept=".jpg,.png,.pdf"></lion-input-file>
|
|
390
352
|
`);
|
|
391
|
-
|
|
392
353
|
mimicSelectFile(el, [fileWrongType]);
|
|
393
354
|
await el.updateComplete;
|
|
394
355
|
|
|
395
356
|
// @ts-expect-error [allow-protected-in-test]
|
|
396
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
357
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
397
358
|
expect(error.message).to.equal('Please select a .jpg, .png or .pdf file with max 500MB.');
|
|
398
359
|
});
|
|
399
360
|
});
|
|
400
361
|
});
|
|
401
|
-
|
|
402
362
|
describe('invalid file sizes', async () => {
|
|
403
363
|
// Size of this file is 4 bytes
|
|
404
|
-
const fileWrongSize = /** @type {InputFile} */
|
|
405
|
-
|
|
364
|
+
const fileWrongSize = /** @type {InputFile} */ new File(['foobar'], 'foobar.txt');
|
|
406
365
|
it('should not be added to the selected list', async () => {
|
|
407
366
|
const el = await fixture(html` <lion-input-file max-file-size="2"></lion-input-file> `);
|
|
408
|
-
|
|
409
367
|
mimicSelectFile(el, [fileWrongSize]);
|
|
410
368
|
await el.updateComplete;
|
|
411
369
|
|
|
@@ -419,21 +377,18 @@ describe('lion-input-file', () => {
|
|
|
419
377
|
expect(el._selectedFilesMetaData[0].status).to.equal('FAIL');
|
|
420
378
|
expect(el.uploadResponse[0].status).to.equal('FAIL');
|
|
421
379
|
});
|
|
422
|
-
|
|
423
380
|
it('error message should show only the max file size if no type/extension restrictions are defined', async () => {
|
|
424
381
|
const el = await fixture(html`
|
|
425
382
|
<lion-input-file label="Select" max-file-size="2"></lion-input-file>
|
|
426
383
|
`);
|
|
427
|
-
|
|
428
384
|
mimicSelectFile(el, [fileWrongSize]);
|
|
429
385
|
await el.updateComplete;
|
|
430
386
|
|
|
431
387
|
// @ts-expect-error [allow-protected-in-test]
|
|
432
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
388
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
433
389
|
expect(error.message).to.equal('Please select a file with max 2 bytes.');
|
|
434
390
|
});
|
|
435
391
|
});
|
|
436
|
-
|
|
437
392
|
it('error message should show the correct max file size if type/extension restrictions are defined', async () => {
|
|
438
393
|
const el = await fixture(html`
|
|
439
394
|
<lion-input-file
|
|
@@ -442,27 +397,23 @@ describe('lion-input-file', () => {
|
|
|
442
397
|
accept=".jpg, .png, .pdf"
|
|
443
398
|
></lion-input-file>
|
|
444
399
|
`);
|
|
445
|
-
|
|
446
400
|
mimicSelectFile(el, [fileWrongSize]);
|
|
447
401
|
await el.updateComplete;
|
|
448
402
|
|
|
449
403
|
// @ts-expect-error [allow-protected-in-test]
|
|
450
|
-
el._selectedFilesMetaData[0].validationFeedback?.forEach(error => {
|
|
404
|
+
el._selectedFilesMetaData[0].validationFeedback?.forEach((error) => {
|
|
451
405
|
expect(error.message).to.equal('Please select a .jpg, .png or .pdf file with max 2 bytes.');
|
|
452
406
|
});
|
|
453
407
|
});
|
|
454
408
|
});
|
|
455
|
-
|
|
456
409
|
it('should send "file-list-changed" event if selecting files succeeded partially', async () => {
|
|
457
410
|
const el = await fixture(html`<lion-input-file multiple max-file-size="3"></lion-input-file>`);
|
|
458
411
|
|
|
459
412
|
// Size of this file is 4 bytes
|
|
460
|
-
const fileWrongSize = /** @type {InputFile} */
|
|
461
|
-
|
|
413
|
+
const fileWrongSize = /** @type {InputFile} */ new File(['foobar'], 'foobar.txt');
|
|
462
414
|
setTimeout(() => {
|
|
463
415
|
mimicSelectFile(el, [fileWrongSize, file2]);
|
|
464
416
|
});
|
|
465
|
-
|
|
466
417
|
const fileListChangedEvent = await oneEvent(el, 'file-list-changed');
|
|
467
418
|
|
|
468
419
|
// @ts-expect-error [allow-protected-in-test]
|
|
@@ -470,13 +421,10 @@ describe('lion-input-file', () => {
|
|
|
470
421
|
// @ts-expect-error [allow-protected-in-test]
|
|
471
422
|
expect(el._selectedFilesMetaData[0].status).to.equal('FAIL');
|
|
472
423
|
expect(el.uploadResponse[0].status).to.equal('FAIL');
|
|
473
|
-
|
|
474
424
|
expect(fileListChangedEvent.detail.newFiles.length).to.equal(1);
|
|
475
425
|
});
|
|
476
|
-
|
|
477
426
|
it('should update downloadurl for successful files', async () => {
|
|
478
427
|
const el = await fixture(html`<lion-input-file></lion-input-file>`);
|
|
479
|
-
|
|
480
428
|
setTimeout(() => {
|
|
481
429
|
mimicSelectFile(el, [file]);
|
|
482
430
|
});
|
|
@@ -486,54 +434,41 @@ describe('lion-input-file', () => {
|
|
|
486
434
|
// @ts-expect-error [allow-protected-in-test]
|
|
487
435
|
expect(el._selectedFilesMetaData[0].downloadUrl).to.exist;
|
|
488
436
|
});
|
|
489
|
-
|
|
490
437
|
describe('format', () => {
|
|
491
438
|
it('modelValue is an array of files', async () => {
|
|
492
439
|
const el = await fixture(html` <lion-input-file name="select"></lion-input-file> `);
|
|
493
|
-
|
|
494
440
|
mimicSelectFile(el, [file]);
|
|
495
441
|
await el.updateComplete;
|
|
496
442
|
expect(el.modelValue).to.deep.equal([file]);
|
|
497
443
|
});
|
|
498
|
-
|
|
499
444
|
it('view value is a string', async () => {
|
|
500
445
|
const el = await fixture(html` <lion-input-file name="select"></lion-input-file> `);
|
|
501
|
-
|
|
502
446
|
mimicSelectFile(el, [file]);
|
|
503
447
|
await el.updateComplete;
|
|
504
|
-
|
|
505
448
|
expect(el.value).to.equal('C:\\fakepath\\foo.txt');
|
|
506
449
|
// @ts-expect-error [allow-protected-in-tests]
|
|
507
450
|
expect(el._inputNode.value).to.equal('C:\\fakepath\\foo.txt');
|
|
508
451
|
});
|
|
509
|
-
|
|
510
452
|
it('formattedValue is a string', async () => {
|
|
511
453
|
const el = await fixture(html` <lion-input-file name="select"></lion-input-file> `);
|
|
512
|
-
|
|
513
454
|
mimicSelectFile(el, [file]);
|
|
514
455
|
await el.updateComplete;
|
|
515
|
-
|
|
516
456
|
expect(el.formattedValue).to.equal('C:\\fakepath\\foo.txt');
|
|
517
457
|
});
|
|
518
|
-
|
|
519
458
|
it('serializedValue is an array of files', async () => {
|
|
520
459
|
const el = await fixture(html` <lion-input-file name="select"></lion-input-file> `);
|
|
521
|
-
|
|
522
460
|
mimicSelectFile(el, [file]);
|
|
523
461
|
await el.updateComplete;
|
|
524
462
|
expect(el.serializedValue).to.deep.equal([file]);
|
|
525
463
|
});
|
|
526
|
-
|
|
527
464
|
it('fires `model-value-changed` for every programmatic modelValue change', async () => {
|
|
528
465
|
const el = await fixture(html` <lion-input-file name="select"></lion-input-file> `);
|
|
529
466
|
let counter = 0;
|
|
530
467
|
let isTriggeredByUser = false;
|
|
531
|
-
|
|
532
|
-
el.addEventListener('model-value-changed', event => {
|
|
468
|
+
el.addEventListener('model-value-changed', (event) => {
|
|
533
469
|
counter += 1;
|
|
534
|
-
isTriggeredByUser = /** @type {CustomEvent} */
|
|
470
|
+
isTriggeredByUser = /** @type {CustomEvent} */ event.detail.isTriggeredByUser;
|
|
535
471
|
});
|
|
536
|
-
|
|
537
472
|
el.modelValue = [file];
|
|
538
473
|
expect(counter).to.equal(1);
|
|
539
474
|
expect(isTriggeredByUser).to.be.false;
|
|
@@ -545,36 +480,29 @@ describe('lion-input-file', () => {
|
|
|
545
480
|
el.modelValue = [file, file2];
|
|
546
481
|
expect(counter).to.equal(2);
|
|
547
482
|
});
|
|
548
|
-
|
|
549
483
|
it('fires `model-value-changed` for every user input, adding `isTriggeredByUser` in event detail', async () => {
|
|
550
484
|
const el = await fixture(html` <lion-input-file name="select"></lion-input-file> `);
|
|
551
485
|
let counter = 0;
|
|
552
486
|
let isTriggeredByUser = false;
|
|
553
|
-
|
|
554
|
-
el.addEventListener('model-value-changed', event => {
|
|
487
|
+
el.addEventListener('model-value-changed', (event) => {
|
|
555
488
|
counter += 1;
|
|
556
|
-
isTriggeredByUser = /** @type {CustomEvent} */
|
|
489
|
+
isTriggeredByUser = /** @type {CustomEvent} */ event.detail.isTriggeredByUser;
|
|
557
490
|
});
|
|
558
|
-
|
|
559
491
|
mimicSelectFile(el, [file]);
|
|
560
492
|
await el.updateComplete;
|
|
561
493
|
expect(counter).to.equal(1);
|
|
562
494
|
expect(isTriggeredByUser).to.be.true;
|
|
563
|
-
|
|
564
495
|
mimicSelectFile(el, [file, file2]);
|
|
565
496
|
await el.updateComplete;
|
|
566
497
|
expect(counter).to.equal(2);
|
|
567
498
|
});
|
|
568
499
|
});
|
|
569
|
-
|
|
570
500
|
describe('multiple file select', () => {
|
|
571
501
|
it('should add multiple files', async () => {
|
|
572
502
|
const el = await fixture(html`
|
|
573
503
|
<lion-input-file label="Select" .multiple="${true}"> </lion-input-file>
|
|
574
504
|
`);
|
|
575
|
-
|
|
576
505
|
mimicSelectFile(el, [file, file2]);
|
|
577
|
-
|
|
578
506
|
await el.updateComplete;
|
|
579
507
|
// @ts-expect-error [allow-protected-in-test]
|
|
580
508
|
expect(el._selectedFilesMetaData.length).to.equal(2);
|
|
@@ -582,15 +510,12 @@ describe('lion-input-file', () => {
|
|
|
582
510
|
expect(el._selectedFilesMetaData[0].systemFile.name).to.equal('foo.txt');
|
|
583
511
|
// @ts-expect-error [allow-protected-in-test]
|
|
584
512
|
expect(el._selectedFilesMetaData[1].systemFile.name).to.equal('bar.txt');
|
|
585
|
-
|
|
586
513
|
expect(el.uploadResponse.length).to.equal(2);
|
|
587
514
|
expect(el.uploadResponse[0].name).to.equal('foo.txt');
|
|
588
515
|
expect(el.uploadResponse[1].name).to.equal('bar.txt');
|
|
589
516
|
});
|
|
590
|
-
|
|
591
517
|
it('should add new files and retain previous files', async () => {
|
|
592
518
|
const el = await fixture(html` <lion-input-file .multiple="${true}"></lion-input-file> `);
|
|
593
|
-
|
|
594
519
|
setTimeout(() => {
|
|
595
520
|
mimicSelectFile(el, [file, file2]);
|
|
596
521
|
});
|
|
@@ -601,7 +526,6 @@ describe('lion-input-file', () => {
|
|
|
601
526
|
// @ts-expect-error [allow-protected-in-test]
|
|
602
527
|
expect(el._selectedFilesMetaData.length).to.equal(2);
|
|
603
528
|
expect(el.modelValue.length).to.equal(2);
|
|
604
|
-
|
|
605
529
|
setTimeout(() => {
|
|
606
530
|
mimicSelectFile(el, [file3, file4]);
|
|
607
531
|
});
|
|
@@ -613,23 +537,18 @@ describe('lion-input-file', () => {
|
|
|
613
537
|
expect(el._selectedFilesMetaData.length).to.equal(4);
|
|
614
538
|
expect(el.modelValue.length).to.equal(4);
|
|
615
539
|
});
|
|
616
|
-
|
|
617
540
|
it('should add multiple files and dispatch file-list-changed event ONLY with newly added file', async () => {
|
|
618
541
|
const el = await fixture(html` <lion-input-file .multiple="${true}"></lion-input-file> `);
|
|
619
|
-
|
|
620
542
|
setTimeout(() => {
|
|
621
543
|
mimicSelectFile(el, [file, file2]);
|
|
622
544
|
});
|
|
623
545
|
const fileListChangedEvent = await oneEvent(el, 'file-list-changed');
|
|
624
546
|
filesListChanged(el, fileListChangedEvent);
|
|
625
|
-
|
|
626
547
|
setTimeout(() => {
|
|
627
548
|
mimicSelectFile(el, [file3, file4]);
|
|
628
549
|
});
|
|
629
|
-
|
|
630
550
|
const fileListChangedEvent1 = await oneEvent(el, 'file-list-changed');
|
|
631
551
|
filesListChanged(el, fileListChangedEvent1);
|
|
632
|
-
|
|
633
552
|
expect(fileListChangedEvent1).to.exist;
|
|
634
553
|
// @ts-expect-error [allow-protected-in-test]
|
|
635
554
|
expect(el._selectedFilesMetaData.length).to.equal(4);
|
|
@@ -637,10 +556,8 @@ describe('lion-input-file', () => {
|
|
|
637
556
|
expect(fileListChangedEvent1.detail.newFiles[0].name).to.equal('foo3.txt');
|
|
638
557
|
expect(fileListChangedEvent1.detail.newFiles[1].name).to.equal('foo4.txt');
|
|
639
558
|
});
|
|
640
|
-
|
|
641
559
|
it('should not allow duplicate files to be selected and show notification message', async () => {
|
|
642
560
|
const el = await fixture(html` <lion-input-file .multiple="${true}"></lion-input-file> `);
|
|
643
|
-
|
|
644
561
|
setTimeout(() => {
|
|
645
562
|
mimicSelectFile(el, [file]);
|
|
646
563
|
});
|
|
@@ -653,17 +570,14 @@ describe('lion-input-file', () => {
|
|
|
653
570
|
expect(el._selectedFilesMetaData.length).to.equal(1);
|
|
654
571
|
// @ts-expect-error [allow-protected-in-test]
|
|
655
572
|
expect(el._selectedFilesMetaData[0].systemFile.name).to.equal('foo.txt');
|
|
656
|
-
|
|
657
573
|
expect(fileListChangedEvent).to.exist;
|
|
658
574
|
expect(fileListChangedEvent.detail.newFiles.length).to.equal(1);
|
|
659
575
|
expect(fileListChangedEvent.detail.newFiles[0].name).to.equal('foo.txt');
|
|
660
|
-
|
|
661
|
-
|
|
576
|
+
const fileDuplicate =
|
|
577
|
+
/** @type {InputFile} */
|
|
662
578
|
new File(['foo'], 'foo.txt', {
|
|
663
579
|
type: 'text/plain',
|
|
664
|
-
})
|
|
665
|
-
);
|
|
666
|
-
|
|
580
|
+
});
|
|
667
581
|
mimicSelectFile(el, [fileDuplicate]);
|
|
668
582
|
await el.updateComplete;
|
|
669
583
|
// @ts-expect-error [allow-protected-in-test]
|
|
@@ -671,23 +585,19 @@ describe('lion-input-file', () => {
|
|
|
671
585
|
expect(el.hasFeedbackFor).to.deep.equals(['info'], 'hasFeedbackFor');
|
|
672
586
|
expect(el.showsFeedbackFor).to.deep.equals(['info'], 'showsFeedbackFor');
|
|
673
587
|
});
|
|
674
|
-
|
|
675
588
|
it('should add valid files and skip invalid ones', async () => {
|
|
676
|
-
const fileWrongSize = /** @type {InputFile} */
|
|
677
|
-
const fileWrongType =
|
|
589
|
+
const fileWrongSize = /** @type {InputFile} */ new File(['foobar'], 'foobar.txt');
|
|
590
|
+
const fileWrongType =
|
|
591
|
+
/** @type {InputFile} */
|
|
678
592
|
new File(['foobar'], 'foobar.txt', {
|
|
679
593
|
type: 'xxxxx',
|
|
680
|
-
})
|
|
681
|
-
);
|
|
682
|
-
|
|
594
|
+
});
|
|
683
595
|
const el = await fixture(html`
|
|
684
596
|
<lion-input-file multiple max-file-size="3" accept=".txt"></lion-input-file>
|
|
685
597
|
`);
|
|
686
|
-
|
|
687
598
|
setTimeout(() => {
|
|
688
599
|
mimicSelectFile(el, [file, fileWrongSize, file2, fileWrongType]);
|
|
689
600
|
});
|
|
690
|
-
|
|
691
601
|
const fileListChangedEvent = await oneEvent(el, 'file-list-changed');
|
|
692
602
|
// @ts-expect-error [allow-protected-in-test]
|
|
693
603
|
expect(el._selectedFilesMetaData.length).to.equal(4);
|
|
@@ -697,7 +607,6 @@ describe('lion-input-file', () => {
|
|
|
697
607
|
expect(fileListChangedEvent.detail.newFiles[1].name).to.equal('bar.txt');
|
|
698
608
|
});
|
|
699
609
|
});
|
|
700
|
-
|
|
701
610
|
describe('status and error', () => {
|
|
702
611
|
/**
|
|
703
612
|
* @type {LionInputFile}
|
|
@@ -706,12 +615,15 @@ describe('lion-input-file', () => {
|
|
|
706
615
|
beforeEach(async () => {
|
|
707
616
|
el = await fixture(html`<lion-input-file accept="text/plain"></lion-input-file>`);
|
|
708
617
|
});
|
|
709
|
-
|
|
710
618
|
it('should set uploadResponse data to _selectedFilesMetaData for rendering error and status', async () => {
|
|
711
619
|
mimicSelectFile(el, [file]);
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
620
|
+
el.uploadResponse = [
|
|
621
|
+
{
|
|
622
|
+
name: 'foo.txt',
|
|
623
|
+
status: 'LOADING',
|
|
624
|
+
errorMessage: '500',
|
|
625
|
+
},
|
|
626
|
+
];
|
|
715
627
|
await el.updateComplete;
|
|
716
628
|
|
|
717
629
|
// @ts-expect-error [allow-protected-in-test]
|
|
@@ -719,32 +631,27 @@ describe('lion-input-file', () => {
|
|
|
719
631
|
// @ts-ignore
|
|
720
632
|
expect(el._selectedFilesMetaData[0].validationFeedback[0].message).to.equal('500');
|
|
721
633
|
});
|
|
722
|
-
|
|
723
634
|
it('should not fire file-list-changed event if invalid file is selected', async () => {
|
|
724
|
-
const filePdf =
|
|
635
|
+
const filePdf =
|
|
636
|
+
/** @type {InputFile} */
|
|
725
637
|
new File(['foo'], 'foo.pdf', {
|
|
726
638
|
type: 'application/pdf',
|
|
727
|
-
})
|
|
728
|
-
);
|
|
639
|
+
});
|
|
729
640
|
// @ts-ignore
|
|
730
641
|
const fileListChangedSpy = sinon.spy(el, '_dispatchFileListChangeEvent');
|
|
731
|
-
|
|
732
642
|
mimicSelectFile(el, [filePdf]);
|
|
733
|
-
|
|
734
643
|
expect(fileListChangedSpy).have.not.been.called;
|
|
735
644
|
fileListChangedSpy.restore();
|
|
736
645
|
});
|
|
737
|
-
|
|
738
646
|
it('updates showFeedbackFor when a wrong file has been added/removed', async () => {
|
|
739
|
-
const fileWrongType =
|
|
647
|
+
const fileWrongType =
|
|
648
|
+
/** @type {InputFile} */
|
|
740
649
|
new File(['foobar'], 'foobar.txt', {
|
|
741
650
|
type: 'xxxxx',
|
|
742
|
-
})
|
|
743
|
-
);
|
|
651
|
+
});
|
|
744
652
|
|
|
745
653
|
// create condition to also show the feedback
|
|
746
654
|
el.prefilled = true;
|
|
747
|
-
|
|
748
655
|
mimicSelectFile(el, [fileWrongType]);
|
|
749
656
|
await el.updateComplete;
|
|
750
657
|
expect(el.hasFeedbackFor).to.deep.equals(['error'], 'hasFeedbackFor');
|
|
@@ -757,17 +664,22 @@ describe('lion-input-file', () => {
|
|
|
757
664
|
expect(el.showsFeedbackFor).to.deep.equals([]);
|
|
758
665
|
});
|
|
759
666
|
});
|
|
760
|
-
|
|
761
667
|
describe('validations when used with lion-form', () => {
|
|
762
668
|
it('should throw error with Required validator', async () => {
|
|
763
669
|
const el = await fixture(html`
|
|
764
670
|
<lion-input-file
|
|
765
671
|
name="myFileInput"
|
|
766
|
-
.validators="${[
|
|
672
|
+
.validators="${[
|
|
673
|
+
new Required(
|
|
674
|
+
{},
|
|
675
|
+
{
|
|
676
|
+
getMessage: () => 'FooBar',
|
|
677
|
+
},
|
|
678
|
+
),
|
|
679
|
+
]}"
|
|
767
680
|
>
|
|
768
681
|
</lion-input-file>
|
|
769
682
|
`);
|
|
770
|
-
|
|
771
683
|
el.touched = true;
|
|
772
684
|
el.dirty = true;
|
|
773
685
|
await el.updateComplete;
|
|
@@ -777,7 +689,6 @@ describe('lion-input-file', () => {
|
|
|
777
689
|
expect(_feedbackNode.feedbackData?.[0].message).to.equal('FooBar');
|
|
778
690
|
expect(el.hasFeedbackFor.includes('error')).to.be.true;
|
|
779
691
|
});
|
|
780
|
-
|
|
781
692
|
it('reset method should remove File from modelValue but keep uploadResponse', async () => {
|
|
782
693
|
const uploadResponse = [
|
|
783
694
|
{
|
|
@@ -794,17 +705,14 @@ describe('lion-input-file', () => {
|
|
|
794
705
|
// @ts-expect-error [allow-protected-in-test]
|
|
795
706
|
el.uploadResponse = uploadResponse;
|
|
796
707
|
await el.updateComplete;
|
|
797
|
-
|
|
798
708
|
mimicSelectFile(el, [file]);
|
|
799
709
|
await el.updateComplete;
|
|
800
|
-
|
|
801
710
|
await el.reset();
|
|
802
711
|
expect(el.modelValue).to.deep.equal([]);
|
|
803
712
|
// @ts-expect-error [allow-protected-in-test]
|
|
804
713
|
expect(el._selectedFilesMetaData).to.deep.equal([]);
|
|
805
714
|
expect(el.uploadResponse).to.deep.equal(uploadResponse);
|
|
806
715
|
});
|
|
807
|
-
|
|
808
716
|
it('clear method should remove File from modelValue and uploadResponse', async () => {
|
|
809
717
|
const uploadResponse = [
|
|
810
718
|
{
|
|
@@ -818,7 +726,6 @@ describe('lion-input-file', () => {
|
|
|
818
726
|
|
|
819
727
|
// @ts-expect-error [allow-protected-in-test]
|
|
820
728
|
el.uploadResponse = uploadResponse;
|
|
821
|
-
|
|
822
729
|
setTimeout(() => {
|
|
823
730
|
mimicSelectFile(el, [file]);
|
|
824
731
|
});
|
|
@@ -830,7 +737,6 @@ describe('lion-input-file', () => {
|
|
|
830
737
|
expect(el._selectedFilesMetaData).to.deep.equal([]);
|
|
831
738
|
});
|
|
832
739
|
});
|
|
833
|
-
|
|
834
740
|
describe('file select component with prefilled state', () => {
|
|
835
741
|
/**
|
|
836
742
|
* @type {LionInputFile}
|
|
@@ -849,7 +755,6 @@ describe('lion-input-file', () => {
|
|
|
849
755
|
errorMessage: 'something went wrong',
|
|
850
756
|
},
|
|
851
757
|
];
|
|
852
|
-
|
|
853
758
|
beforeEach(async () => {
|
|
854
759
|
el = await fixture(html`
|
|
855
760
|
<lion-input-file name="myFiles" multiple="${true}"> </lion-input-file>
|
|
@@ -857,10 +762,8 @@ describe('lion-input-file', () => {
|
|
|
857
762
|
|
|
858
763
|
// @ts-expect-error [allow-protected-in-test]
|
|
859
764
|
el.uploadResponse = uploadResponse;
|
|
860
|
-
|
|
861
765
|
await el.updateComplete;
|
|
862
766
|
});
|
|
863
|
-
|
|
864
767
|
it('should update the _selectedFilesMetaData according to uploadResponse', () => {
|
|
865
768
|
// @ts-expect-error [allow-protected-in-test]
|
|
866
769
|
expect(el._selectedFilesMetaData.length).to.equal(2);
|
|
@@ -875,7 +778,6 @@ describe('lion-input-file', () => {
|
|
|
875
778
|
'something went wrong',
|
|
876
779
|
);
|
|
877
780
|
});
|
|
878
|
-
|
|
879
781
|
it('should remove file on click of cross button', async () => {
|
|
880
782
|
/**
|
|
881
783
|
* @type {Partial<InputFile>}
|
|
@@ -883,8 +785,13 @@ describe('lion-input-file', () => {
|
|
|
883
785
|
const removedFile = {
|
|
884
786
|
name: 'file2.txt',
|
|
885
787
|
status: 'FAIL',
|
|
886
|
-
systemFile: {
|
|
887
|
-
|
|
788
|
+
systemFile: {
|
|
789
|
+
name: 'file2.txt',
|
|
790
|
+
},
|
|
791
|
+
response: {
|
|
792
|
+
name: 'file2.txt',
|
|
793
|
+
status: 'FAIL',
|
|
794
|
+
},
|
|
888
795
|
};
|
|
889
796
|
// @ts-expect-error [allow-protected-in-test]
|
|
890
797
|
const removeFileSpy = sinon.spy(el, '_removeFile');
|
|
@@ -905,14 +812,12 @@ describe('lion-input-file', () => {
|
|
|
905
812
|
},
|
|
906
813
|
}),
|
|
907
814
|
);
|
|
908
|
-
|
|
909
815
|
await el.updateComplete;
|
|
910
816
|
expect(removeFileSpy).have.been.calledOnce;
|
|
911
817
|
// @ts-expect-error [allow-protected-in-test]
|
|
912
818
|
expect(el._selectedFilesMetaData.length).to.equal(1);
|
|
913
819
|
removeFileSpy.restore();
|
|
914
820
|
});
|
|
915
|
-
|
|
916
821
|
it('should fire file-removed event with uploadResponse in the details', async () => {
|
|
917
822
|
/**
|
|
918
823
|
* @type {Partial<InputFile>}
|
|
@@ -920,17 +825,19 @@ describe('lion-input-file', () => {
|
|
|
920
825
|
const removedFile = {
|
|
921
826
|
name: 'file2.txt',
|
|
922
827
|
status: 'FAIL',
|
|
923
|
-
systemFile: {
|
|
924
|
-
|
|
828
|
+
systemFile: {
|
|
829
|
+
name: 'file2.txt',
|
|
830
|
+
},
|
|
831
|
+
response: {
|
|
832
|
+
name: 'file2.txt',
|
|
833
|
+
status: 'FAIL',
|
|
834
|
+
},
|
|
925
835
|
};
|
|
926
|
-
|
|
927
836
|
setTimeout(() => {
|
|
928
837
|
// @ts-ignore ignore file typing
|
|
929
838
|
el._removeFile(removedFile);
|
|
930
839
|
});
|
|
931
|
-
|
|
932
840
|
await el.updateComplete;
|
|
933
|
-
|
|
934
841
|
const removeFileEvent = await oneEvent(el, 'file-removed');
|
|
935
842
|
|
|
936
843
|
// assertion for event data
|
|
@@ -953,7 +860,6 @@ describe('lion-input-file', () => {
|
|
|
953
860
|
});
|
|
954
861
|
});
|
|
955
862
|
});
|
|
956
|
-
|
|
957
863
|
describe('drag and drop', () => {
|
|
958
864
|
/**
|
|
959
865
|
* @type {LionInputFile}
|
|
@@ -963,44 +869,60 @@ describe('lion-input-file', () => {
|
|
|
963
869
|
el = await fixture(html`
|
|
964
870
|
<lion-input-file name="myFiles" multiple enable-drop-zone></lion-input-file>
|
|
965
871
|
`);
|
|
966
|
-
|
|
967
872
|
await el.updateComplete;
|
|
968
873
|
});
|
|
969
|
-
|
|
970
874
|
it('should set "is-dragging" on dragenter', async () => {
|
|
971
875
|
const dropzone = el.shadowRoot?.querySelector('.input-file__drop-zone');
|
|
972
|
-
dropzone?.dispatchEvent(
|
|
876
|
+
dropzone?.dispatchEvent(
|
|
877
|
+
new Event('dragenter', {
|
|
878
|
+
bubbles: true,
|
|
879
|
+
}),
|
|
880
|
+
);
|
|
973
881
|
await el.updateComplete;
|
|
974
882
|
expect(el.hasAttribute('is-dragging')).to.equal(true);
|
|
975
883
|
});
|
|
976
|
-
|
|
977
884
|
it('should set "is-dragging" on dragover', async () => {
|
|
978
885
|
const dropzone = el.shadowRoot?.querySelector('.input-file__drop-zone');
|
|
979
|
-
dropzone?.dispatchEvent(
|
|
886
|
+
dropzone?.dispatchEvent(
|
|
887
|
+
new Event('dragover', {
|
|
888
|
+
bubbles: true,
|
|
889
|
+
}),
|
|
890
|
+
);
|
|
980
891
|
await el.updateComplete;
|
|
981
892
|
expect(el.hasAttribute('is-dragging')).to.equal(true);
|
|
982
893
|
});
|
|
983
|
-
|
|
984
894
|
it('should remove "is-dragging" on dragleave', async () => {
|
|
985
895
|
const dropzone = el.shadowRoot?.querySelector('.input-file__drop-zone');
|
|
986
|
-
dropzone?.dispatchEvent(
|
|
896
|
+
dropzone?.dispatchEvent(
|
|
897
|
+
new Event('dragenter', {
|
|
898
|
+
bubbles: true,
|
|
899
|
+
}),
|
|
900
|
+
);
|
|
987
901
|
await el.updateComplete;
|
|
988
|
-
|
|
989
|
-
|
|
902
|
+
dropzone?.dispatchEvent(
|
|
903
|
+
new Event('dragleave', {
|
|
904
|
+
bubbles: true,
|
|
905
|
+
}),
|
|
906
|
+
);
|
|
990
907
|
await el.updateComplete;
|
|
991
908
|
expect(el.hasAttribute('is-dragging')).to.equal(false);
|
|
992
909
|
});
|
|
993
|
-
|
|
994
910
|
it('should remove "is-dragging" on drop', async () => {
|
|
995
911
|
const dropzone = el.shadowRoot?.querySelector('.input-file__drop-zone');
|
|
996
|
-
dropzone?.dispatchEvent(
|
|
912
|
+
dropzone?.dispatchEvent(
|
|
913
|
+
new Event('dragenter', {
|
|
914
|
+
bubbles: true,
|
|
915
|
+
}),
|
|
916
|
+
);
|
|
997
917
|
await el.updateComplete;
|
|
998
|
-
|
|
999
|
-
|
|
918
|
+
window.dispatchEvent(
|
|
919
|
+
new Event('drop', {
|
|
920
|
+
bubbles: true,
|
|
921
|
+
}),
|
|
922
|
+
);
|
|
1000
923
|
await el.updateComplete;
|
|
1001
924
|
expect(el.hasAttribute('is-dragging')).to.equal(false);
|
|
1002
925
|
});
|
|
1003
|
-
|
|
1004
926
|
it('should update modelValue on drop', async () => {
|
|
1005
927
|
const list = new DataTransfer();
|
|
1006
928
|
// @ts-ignore
|
|
@@ -1010,13 +932,18 @@ describe('lion-input-file', () => {
|
|
|
1010
932
|
// @ts-expect-error [allow-protected-in-test]
|
|
1011
933
|
await el._processDroppedFiles({
|
|
1012
934
|
// @ts-ignore
|
|
1013
|
-
dataTransfer: {
|
|
935
|
+
dataTransfer: {
|
|
936
|
+
files: droppedFiles,
|
|
937
|
+
items: [
|
|
938
|
+
{
|
|
939
|
+
name: 'test.txt',
|
|
940
|
+
},
|
|
941
|
+
],
|
|
942
|
+
},
|
|
1014
943
|
preventDefault: () => {},
|
|
1015
944
|
});
|
|
1016
945
|
await el.updateComplete;
|
|
1017
|
-
|
|
1018
946
|
expect(el.modelValue.length).to.equal(1);
|
|
1019
|
-
|
|
1020
947
|
const list2 = new DataTransfer();
|
|
1021
948
|
// @ts-ignore
|
|
1022
949
|
list2.items.add(file2);
|
|
@@ -1024,14 +951,19 @@ describe('lion-input-file', () => {
|
|
|
1024
951
|
// @ts-expect-error [allow-protected-in-test]
|
|
1025
952
|
await el._processDroppedFiles({
|
|
1026
953
|
// @ts-ignore
|
|
1027
|
-
dataTransfer: {
|
|
954
|
+
dataTransfer: {
|
|
955
|
+
files: list2.files,
|
|
956
|
+
items: [
|
|
957
|
+
{
|
|
958
|
+
name: 'test2.txt',
|
|
959
|
+
},
|
|
960
|
+
],
|
|
961
|
+
},
|
|
1028
962
|
preventDefault: () => {},
|
|
1029
963
|
});
|
|
1030
964
|
await el.updateComplete;
|
|
1031
|
-
|
|
1032
965
|
expect(el.modelValue.length).to.equal(2);
|
|
1033
966
|
});
|
|
1034
|
-
|
|
1035
967
|
it('should call _processFiles method', async () => {
|
|
1036
968
|
const list = new DataTransfer();
|
|
1037
969
|
// @ts-ignore
|
|
@@ -1043,15 +975,20 @@ describe('lion-input-file', () => {
|
|
|
1043
975
|
// @ts-expect-error [allow-protected-in-test]
|
|
1044
976
|
await el._processDroppedFiles({
|
|
1045
977
|
// @ts-ignore
|
|
1046
|
-
dataTransfer: {
|
|
978
|
+
dataTransfer: {
|
|
979
|
+
files: droppedFiles,
|
|
980
|
+
items: [
|
|
981
|
+
{
|
|
982
|
+
name: 'test.txt',
|
|
983
|
+
},
|
|
984
|
+
],
|
|
985
|
+
},
|
|
1047
986
|
preventDefault: () => {},
|
|
1048
987
|
});
|
|
1049
|
-
|
|
1050
988
|
expect(_processFilesSpy).have.been.calledOnce;
|
|
1051
989
|
_processFilesSpy.restore();
|
|
1052
990
|
});
|
|
1053
991
|
});
|
|
1054
|
-
|
|
1055
992
|
describe('uploadOnSelect as true', () => {
|
|
1056
993
|
it('should not remove file on click of cross button and fire file-removed event', async () => {
|
|
1057
994
|
/**
|
|
@@ -1060,24 +997,24 @@ describe('lion-input-file', () => {
|
|
|
1060
997
|
const removeFile = {
|
|
1061
998
|
name: 'foo.txt',
|
|
1062
999
|
status: 'SUCCESS',
|
|
1063
|
-
systemFile: {
|
|
1064
|
-
|
|
1000
|
+
systemFile: {
|
|
1001
|
+
name: 'foo.txt',
|
|
1002
|
+
},
|
|
1003
|
+
response: {
|
|
1004
|
+
name: 'foo.txt',
|
|
1005
|
+
status: 'SUCCESS',
|
|
1006
|
+
},
|
|
1065
1007
|
};
|
|
1066
|
-
|
|
1067
1008
|
const el = await fixture(html`
|
|
1068
1009
|
<lion-input-file .uploadOnSelect="${true}"> </lion-input-file>
|
|
1069
1010
|
`);
|
|
1070
|
-
|
|
1071
1011
|
el.modelValue = [file];
|
|
1072
1012
|
mimicSelectFile(el, [file]);
|
|
1073
|
-
|
|
1074
1013
|
await el.updateComplete;
|
|
1075
|
-
|
|
1076
1014
|
setTimeout(() => {
|
|
1077
1015
|
// @ts-ignore ignore file typing
|
|
1078
1016
|
el._removeFile(removeFile);
|
|
1079
1017
|
});
|
|
1080
|
-
|
|
1081
1018
|
const removeFileEvent = await oneEvent(el, 'file-removed');
|
|
1082
1019
|
|
|
1083
1020
|
// assertion for displayed file list to be same
|
|
@@ -1105,7 +1042,6 @@ describe('lion-input-file', () => {
|
|
|
1105
1042
|
status: 'SUCCESS',
|
|
1106
1043
|
});
|
|
1107
1044
|
});
|
|
1108
|
-
|
|
1109
1045
|
it('should remove file from displayed list if not available in uploadResponse array', async () => {
|
|
1110
1046
|
const uploadResponse = [
|
|
1111
1047
|
{
|
|
@@ -1120,14 +1056,12 @@ describe('lion-input-file', () => {
|
|
|
1120
1056
|
errorMessage: 'something went wrong',
|
|
1121
1057
|
},
|
|
1122
1058
|
];
|
|
1123
|
-
|
|
1124
1059
|
const el = await fixture(html`
|
|
1125
1060
|
<lion-input-file label="Select" .uploadOnSelect="${true}"> </lion-input-file>
|
|
1126
1061
|
`);
|
|
1127
1062
|
|
|
1128
1063
|
// @ts-expect-error [allow-protected-in-test]
|
|
1129
1064
|
el.uploadResponse = uploadResponse;
|
|
1130
|
-
|
|
1131
1065
|
await el.updateComplete;
|
|
1132
1066
|
// assertion for displayed file list to be same
|
|
1133
1067
|
// @ts-expect-error [allow-protected-in-test]
|
|
@@ -1150,13 +1084,11 @@ describe('lion-input-file', () => {
|
|
|
1150
1084
|
expect(el._inputNode.value).to.equal('');
|
|
1151
1085
|
});
|
|
1152
1086
|
});
|
|
1153
|
-
|
|
1154
1087
|
describe('Accessibility', async () => {
|
|
1155
1088
|
it('is accessible', async () => {
|
|
1156
1089
|
const el = await fixture(html`<lion-input-file label="Select"></lion-input-file>`);
|
|
1157
1090
|
await expect(el).to.be.accessible();
|
|
1158
1091
|
});
|
|
1159
|
-
|
|
1160
1092
|
it('is accessible when a file is selected', async () => {
|
|
1161
1093
|
const uploadResponse = [
|
|
1162
1094
|
{
|
|
@@ -1170,10 +1102,8 @@ describe('lion-input-file', () => {
|
|
|
1170
1102
|
|
|
1171
1103
|
// @ts-expect-error [allow-protected-in-test]
|
|
1172
1104
|
el.uploadResponse = uploadResponse;
|
|
1173
|
-
|
|
1174
1105
|
await expect(el).to.be.accessible();
|
|
1175
1106
|
});
|
|
1176
|
-
|
|
1177
1107
|
it('is accessible with an selected file and disabled', async () => {
|
|
1178
1108
|
const uploadResponse = [
|
|
1179
1109
|
{
|
|
@@ -1183,15 +1113,12 @@ describe('lion-input-file', () => {
|
|
|
1183
1113
|
downloadUrl: '/downloadFile',
|
|
1184
1114
|
},
|
|
1185
1115
|
];
|
|
1186
|
-
|
|
1187
1116
|
const el = await fixture(html` <lion-input-file label="Select" disabled></lion-input-file> `);
|
|
1188
1117
|
|
|
1189
1118
|
// @ts-expect-error [allow-protected-in-test]
|
|
1190
1119
|
el.uploadResponse = uploadResponse;
|
|
1191
|
-
|
|
1192
1120
|
await expect(el).to.be.accessible();
|
|
1193
1121
|
});
|
|
1194
|
-
|
|
1195
1122
|
describe('has correct aria-roles', async () => {
|
|
1196
1123
|
it('select-button has aria-labelledby set to itself and the label', async () => {
|
|
1197
1124
|
const el = await fixture(html` <lion-input-file label="Select"></lion-input-file> `);
|
|
@@ -1206,7 +1133,6 @@ describe('lion-input-file', () => {
|
|
|
1206
1133
|
`label-${el._inputId}`,
|
|
1207
1134
|
);
|
|
1208
1135
|
});
|
|
1209
|
-
|
|
1210
1136
|
it('select-button has aria-describedby set to the help-text, after and the feedback message', async () => {
|
|
1211
1137
|
const uploadResponse = [
|
|
1212
1138
|
{
|
|
@@ -1239,7 +1165,6 @@ describe('lion-input-file', () => {
|
|
|
1239
1165
|
`after-${el._inputId}`,
|
|
1240
1166
|
);
|
|
1241
1167
|
});
|
|
1242
|
-
|
|
1243
1168
|
it('after contains upload name of file when uploadOnSelect is true and status is SUCCESS', async () => {
|
|
1244
1169
|
const uploadResponse = [
|
|
1245
1170
|
{
|
|
@@ -1252,7 +1177,6 @@ describe('lion-input-file', () => {
|
|
|
1252
1177
|
const el = await fixture(html`
|
|
1253
1178
|
<lion-input-file label="Select" upload-on-select></lion-input-file>
|
|
1254
1179
|
`);
|
|
1255
|
-
|
|
1256
1180
|
expect(el.querySelector('[slot="after"]')?.textContent).to.equal('No files uploaded.');
|
|
1257
1181
|
// @ts-expect-error
|
|
1258
1182
|
el.uploadResponse = uploadResponse;
|
|
@@ -1261,7 +1185,6 @@ describe('lion-input-file', () => {
|
|
|
1261
1185
|
'Uploaded file: file1.txt',
|
|
1262
1186
|
);
|
|
1263
1187
|
});
|
|
1264
|
-
|
|
1265
1188
|
it('after contains upload name of file when uploadOnSelect is false and status is SUCCESS', async () => {
|
|
1266
1189
|
const uploadResponse = [
|
|
1267
1190
|
{
|
|
@@ -1272,7 +1195,6 @@ describe('lion-input-file', () => {
|
|
|
1272
1195
|
},
|
|
1273
1196
|
];
|
|
1274
1197
|
const el = await fixture(html` <lion-input-file label="Select"></lion-input-file> `);
|
|
1275
|
-
|
|
1276
1198
|
expect(el.querySelector('[slot="after"]')?.textContent).to.equal('No files selected.');
|
|
1277
1199
|
// @ts-expect-error
|
|
1278
1200
|
el.uploadResponse = uploadResponse;
|
|
@@ -1281,7 +1203,6 @@ describe('lion-input-file', () => {
|
|
|
1281
1203
|
'Selected file: file1.txt',
|
|
1282
1204
|
);
|
|
1283
1205
|
});
|
|
1284
|
-
|
|
1285
1206
|
it('after contains upload validator message of file when FAIL', async () => {
|
|
1286
1207
|
const uploadResponse = [
|
|
1287
1208
|
{
|
|
@@ -1292,14 +1213,12 @@ describe('lion-input-file', () => {
|
|
|
1292
1213
|
},
|
|
1293
1214
|
];
|
|
1294
1215
|
const el = await fixture(html` <lion-input-file label="Select"></lion-input-file> `);
|
|
1295
|
-
|
|
1296
1216
|
expect(el.querySelector('[slot="after"]')?.textContent).to.equal('No files selected.');
|
|
1297
1217
|
// @ts-expect-error
|
|
1298
1218
|
el.uploadResponse = uploadResponse;
|
|
1299
1219
|
await el.updateComplete;
|
|
1300
1220
|
expect(el.querySelector('[slot="after"]')?.textContent).to.equal('something went wrong');
|
|
1301
1221
|
});
|
|
1302
|
-
|
|
1303
1222
|
it('after contains upload status of files when uploadOnSelect is true and multiple files have been selected', async () => {
|
|
1304
1223
|
const uploadResponse = [
|
|
1305
1224
|
{
|
|
@@ -1320,13 +1239,11 @@ describe('lion-input-file', () => {
|
|
|
1320
1239
|
`);
|
|
1321
1240
|
// @ts-expect-error
|
|
1322
1241
|
el.uploadResponse = uploadResponse;
|
|
1323
|
-
|
|
1324
1242
|
await el.updateComplete;
|
|
1325
1243
|
expect(el.querySelector('[slot="after"]')?.textContent?.trim()).to.equal(
|
|
1326
1244
|
'Uploaded files: 2 files. "something went wrong", for file2.txt.',
|
|
1327
1245
|
);
|
|
1328
1246
|
});
|
|
1329
|
-
|
|
1330
1247
|
it('after contains upload status of files when uploadOnSelect is false and multiple files have been selected', async () => {
|
|
1331
1248
|
const uploadResponse = [
|
|
1332
1249
|
{
|
|
@@ -1347,7 +1264,6 @@ describe('lion-input-file', () => {
|
|
|
1347
1264
|
`);
|
|
1348
1265
|
// @ts-expect-error
|
|
1349
1266
|
el.uploadResponse = uploadResponse;
|
|
1350
|
-
|
|
1351
1267
|
await el.updateComplete;
|
|
1352
1268
|
expect(el.querySelector('[slot="after"]')?.textContent?.trim()).to.equal(
|
|
1353
1269
|
'Selected files: 2 files. "something went wrong", for file2.txt.',
|