@lion/ui 0.20.0-menu-system.0 → 0.21.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/calendar-suites.js +1 -0
- package/collapsible.js +0 -1
- package/components/button/src/LionButton.js +0 -4
- package/components/button/test-suites/LionButton.suite.js +0 -1
- package/components/calendar/src/LionCalendar.js +1 -3
- package/components/calendar/test/lion-calendar.test.js +67 -47
- package/components/calendar/test-suites/LionCalendar.suite.js +79 -0
- package/components/combobox/test/lion-combobox.test.js +0 -1
- package/components/form-core/src/FormatMixin.js +17 -7
- package/components/form-core/src/form-group/FormGroupMixin.js +0 -7
- package/components/form-core/src/registration/FormRegistrarMixin.js +0 -11
- package/components/form-core/test/FormControlMixin.test.js +0 -1
- package/components/form-core/test/FormatMixin.test.js +4 -1
- package/components/form-core/test/validate/Validator.test.js +0 -2
- package/components/form-core/test-helpers/mimicUserInput.js +1 -0
- package/components/form-core/test-suites/FormatMixin.suite.js +273 -79
- package/components/form-core/test-suites/ValidateMixin.suite.js +0 -2
- package/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.js +0 -1
- package/components/input/test/input-integrations.test.js +3 -2
- package/components/input/test/lion-input-integrations.test.js +2 -1
- package/components/input-amount/test/lion-input-amount-integrations.test.js +1 -1
- package/components/input-amount-dropdown/src/LionInputAmountDropdown.js +72 -11
- package/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.js +27 -0
- package/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.js +60 -3
- package/components/input-date/test/lion-input-date-integrations.test.js +1 -1
- package/components/input-datepicker/src/LionInputDatepicker.js +4 -0
- package/components/input-datepicker/src/localizeNamespaceLoader.js +0 -1
- package/components/input-datepicker/test/lion-input-datepicker-integrations.test.js +1 -1
- package/components/input-datepicker/test/lion-input-datepicker.test.js +74 -9
- package/components/input-datepicker/test-suites/LionInputDatepicker.suite.js +35 -0
- package/components/input-email/src/LionInputEmail.js +2 -0
- package/components/input-email/test/lion-input-email-integrations.test.js +1 -1
- package/components/input-email/test/lion-input-email.test.js +6 -0
- package/components/input-file/src/validators.js +31 -1
- package/components/input-file/test/FileValidators.test.js +31 -0
- package/components/input-file/translations/bg.js +1 -0
- package/components/input-file/translations/cs.js +1 -0
- package/components/input-file/translations/de.js +2 -0
- package/components/input-file/translations/en.js +1 -0
- package/components/input-file/translations/es.js +1 -0
- package/components/input-file/translations/fr.js +1 -0
- package/components/input-file/translations/hu.js +1 -0
- package/components/input-file/translations/id.js +1 -0
- package/components/input-file/translations/it.js +1 -0
- package/components/input-file/translations/nl.js +1 -0
- package/components/input-file/translations/pl.js +1 -0
- package/components/input-file/translations/ro.js +1 -0
- package/components/input-file/translations/ru.js +1 -0
- package/components/input-file/translations/sk.js +1 -0
- package/components/input-file/translations/uk.js +1 -0
- package/components/input-file/translations/zh.js +1 -0
- package/components/input-iban/test/lion-input-iban-integrations.test.js +1 -1
- package/components/input-range/src/LionInputRange.js +51 -8
- package/components/input-range/test/lion-input-range.test.js +114 -0
- package/components/input-stepper/test-suites/lion-input-stepper.integration.suite.js +2 -2
- package/components/input-tel/src/LionInputTel.js +1 -1
- package/components/input-tel/test-suites/LionInputTel.suite.js +7 -0
- package/components/localize/test/date/formatDate.test.js +0 -1
- package/components/overlays/src/OverlayController.js +110 -278
- package/components/overlays/src/OverlayMixin.js +11 -58
- package/components/overlays/src/OverlaysManager.js +2 -2
- package/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.js +41 -9
- package/components/overlays/src/utils/adopt-styles.js +2 -3
- package/components/overlays/src/utils/get-focusable-elements.js +0 -4
- package/components/overlays/src/utils/is-equal-config.js +6 -10
- package/components/overlays/test/OverlayController.test.js +14 -127
- package/components/overlays/test/utils-tests/is-equal-config.test.js +1 -1
- package/components/overlays/test-suites/OverlayMixin.suite.js +8 -8
- package/components/overlays/test-suites/WithHoverInteraction.suite.js +212 -0
- package/components/overlays/types/ArrowMixinTypes.ts +1 -3
- package/components/overlays/types/OverlayConfig.ts +5 -20
- package/components/overlays/types/OverlayMixinTypes.ts +0 -2
- package/components/select-rich/test/lion-select-rich.test.js +0 -3
- package/components/textarea/test/lion-textarea-integrations.test.js +2 -1
- package/components/tooltip/test/lion-tooltip.test.js +9 -1
- package/custom-elements.json +20629 -32907
- package/dist-types/components/button/src/LionButton.d.ts +0 -1
- package/dist-types/components/button/src/LionButton.d.ts.map +1 -1
- package/dist-types/components/button/test-suites/LionButton.suite.d.ts.map +1 -1
- package/dist-types/components/calendar/src/LionCalendar.d.ts.map +1 -1
- package/dist-types/components/calendar/test/lion-calendar.test.d.ts.map +1 -1
- package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts +5 -0
- package/dist-types/components/calendar/test-suites/LionCalendar.suite.d.ts.map +1 -0
- package/dist-types/components/combobox/src/LionCombobox.d.ts +1 -1
- package/dist-types/components/dialog/src/LionDialog.d.ts +2 -6
- package/dist-types/components/dialog/src/LionDialog.d.ts.map +1 -1
- package/dist-types/components/form-core/src/FormatMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/src/form-group/FormGroupMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/src/registration/FormRegistrarMixin.d.ts.map +1 -1
- package/dist-types/components/form-core/test-helpers/mimicUserInput.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/FormatMixin.suite.d.ts +58 -5
- package/dist-types/components/form-core/test-suites/FormatMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixin.suite.d.ts.map +1 -1
- package/dist-types/components/form-core/test-suites/ValidateMixinFeedbackPart.suite.d.ts.map +1 -1
- package/dist-types/components/icon/src/LionIcon.d.ts +2 -2
- package/dist-types/components/input-amount-dropdown/src/LionInputAmountDropdown.d.ts +24 -6
- package/dist-types/components/input-amount-dropdown/src/LionInputAmountDropdown.d.ts.map +1 -1
- package/dist-types/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.d.ts +2 -0
- package/dist-types/components/input-amount-dropdown/test/lion-input-amount-dropdown-integrations.test.d.ts.map +1 -0
- package/dist-types/components/input-amount-dropdown/test-suites/LionInputAmountDropdown.suite.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts +2 -1
- package/dist-types/components/input-datepicker/src/LionInputDatepicker.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/src/localizeNamespaceLoader.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/test/lion-input-datepicker.test.d.ts.map +1 -1
- package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts +7 -0
- package/dist-types/components/input-datepicker/test-suites/LionInputDatepicker.suite.d.ts.map +1 -0
- package/dist-types/components/input-email/src/LionInputEmail.d.ts.map +1 -1
- package/dist-types/components/input-file/src/validators.d.ts +11 -0
- package/dist-types/components/input-file/src/validators.d.ts.map +1 -1
- package/dist-types/components/input-file/translations/bg-BG.d.ts +1 -0
- package/dist-types/components/input-file/translations/bg.d.ts +1 -0
- package/dist-types/components/input-file/translations/cs-CZ.d.ts +1 -0
- package/dist-types/components/input-file/translations/cs.d.ts +1 -0
- package/dist-types/components/input-file/translations/de-DE.d.ts +1 -0
- package/dist-types/components/input-file/translations/de.d.ts +1 -0
- package/dist-types/components/input-file/translations/en-AU.d.ts +1 -0
- package/dist-types/components/input-file/translations/en-GB.d.ts +1 -0
- package/dist-types/components/input-file/translations/en-PH.d.ts +1 -0
- package/dist-types/components/input-file/translations/en-US.d.ts +1 -0
- package/dist-types/components/input-file/translations/en.d.ts +1 -0
- package/dist-types/components/input-file/translations/es-ES.d.ts +1 -0
- package/dist-types/components/input-file/translations/es.d.ts +1 -0
- package/dist-types/components/input-file/translations/fr-BE.d.ts +1 -0
- package/dist-types/components/input-file/translations/fr-FR.d.ts +1 -0
- package/dist-types/components/input-file/translations/fr.d.ts +1 -0
- package/dist-types/components/input-file/translations/hu-HU.d.ts +1 -0
- package/dist-types/components/input-file/translations/hu.d.ts +1 -0
- package/dist-types/components/input-file/translations/id-ID.d.ts +1 -0
- package/dist-types/components/input-file/translations/id.d.ts +1 -0
- package/dist-types/components/input-file/translations/it-IT.d.ts +1 -0
- package/dist-types/components/input-file/translations/it.d.ts +1 -0
- package/dist-types/components/input-file/translations/nl-BE.d.ts +1 -0
- package/dist-types/components/input-file/translations/nl-NL.d.ts +1 -0
- package/dist-types/components/input-file/translations/nl.d.ts +1 -0
- package/dist-types/components/input-file/translations/pl-PL.d.ts +1 -0
- package/dist-types/components/input-file/translations/pl.d.ts +1 -0
- package/dist-types/components/input-file/translations/ro-RO.d.ts +1 -0
- package/dist-types/components/input-file/translations/ro.d.ts +1 -0
- package/dist-types/components/input-file/translations/ru-RU.d.ts +1 -0
- package/dist-types/components/input-file/translations/ru.d.ts +1 -0
- package/dist-types/components/input-file/translations/sk-SK.d.ts +1 -0
- package/dist-types/components/input-file/translations/sk.d.ts +1 -0
- package/dist-types/components/input-file/translations/uk-UA.d.ts +1 -0
- package/dist-types/components/input-file/translations/uk.d.ts +1 -0
- package/dist-types/components/input-file/translations/zh-CN.d.ts +1 -0
- package/dist-types/components/input-file/translations/zh.d.ts +1 -0
- package/dist-types/components/input-range/src/LionInputRange.d.ts +11 -0
- package/dist-types/components/input-range/src/LionInputRange.d.ts.map +1 -1
- package/dist-types/components/input-tel/src/LionInputTel.d.ts.map +1 -1
- package/dist-types/components/input-tel/test-suites/LionInputTel.suite.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayController.d.ts +12 -24
- package/dist-types/components/overlays/src/OverlayController.d.ts.map +1 -1
- package/dist-types/components/overlays/src/OverlayMixin.d.ts.map +1 -1
- package/dist-types/components/overlays/src/configurations/visibility-trigger-partials/withHoverInteraction.d.ts.map +1 -1
- package/dist-types/components/overlays/src/utils/get-focusable-elements.d.ts.map +1 -1
- package/dist-types/components/overlays/src/utils/is-equal-config.d.ts.map +1 -1
- package/dist-types/components/overlays/test-suites/WithHoverInteraction.suite.d.ts +17 -0
- package/dist-types/components/overlays/test-suites/WithHoverInteraction.suite.d.ts.map +1 -0
- package/dist-types/components/overlays/types/ArrowMixinTypes.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayConfig.d.ts +2 -12
- package/dist-types/components/overlays/types/OverlayConfig.d.ts.map +1 -1
- package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts +0 -1
- package/dist-types/components/overlays/types/OverlayMixinTypes.d.ts.map +1 -1
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts +3 -11
- package/dist-types/components/select-rich/src/LionSelectRich.d.ts.map +1 -1
- package/dist-types/components/tooltip/src/LionTooltip.d.ts +1 -1
- package/dist-types/components/tooltip/test/lion-tooltip.test.d.ts.map +1 -1
- package/dist-types/exports/calendar-suites.d.ts +2 -0
- package/dist-types/exports/calendar-suites.d.ts.map +1 -0
- package/dist-types/exports/input-datepicker-suites.d.ts +2 -0
- package/dist-types/exports/input-datepicker-suites.d.ts.map +1 -0
- package/dist-types/exports/input-file.d.ts +1 -1
- package/dist-types/exports/overlays-test-suites.d.ts +1 -0
- package/dist-types/exports/overlays.d.ts +0 -3
- package/dist-types/exports/overlays.d.ts.map +1 -1
- package/dist-types/tsconfig.tsbuildinfo +1 -1
- package/docs/components/checkbox-group/api-table.md +4 -2
- package/docs/components/checkbox-group/overview.md +2 -2
- package/docs/components/collapsible/overview.md +1 -1
- package/docs/components/combobox/api-table.md +8 -21
- package/docs/components/combobox/overview.md +1 -1
- package/docs/components/combobox/use-cases.md +1 -1
- package/docs/components/dialog/api-table.md +6 -31
- package/docs/components/dialog/overview.md +1 -1
- package/docs/components/fieldset/overview.md +5 -5
- package/docs/components/form/overview.md +3 -3
- package/docs/components/form/use-cases.md +2 -2
- package/docs/components/icon/use-cases.md +1 -1
- package/docs/components/input/api-table.md +2 -1
- package/docs/components/input/overview.md +1 -1
- package/docs/components/input-amount/api-table.md +2 -1
- package/docs/components/input-amount/overview.md +3 -3
- package/docs/components/input-amount-dropdown/api-table.md +3 -2
- package/docs/components/input-date/api-table.md +2 -1
- package/docs/components/input-date/overview.md +3 -3
- package/docs/components/input-datepicker/api-table.md +6 -22
- package/docs/components/input-datepicker/overview.md +5 -5
- package/docs/components/input-email/api-table.md +3 -2
- package/docs/components/input-email/overview.md +2 -2
- package/docs/components/input-file/api-table.md +2 -1
- package/docs/components/input-file/overview.md +1 -1
- package/docs/components/input-file/use-cases.md +18 -0
- package/docs/components/input-iban/api-table.md +2 -1
- package/docs/components/input-iban/overview.md +2 -2
- package/docs/components/input-range/api-table.md +7 -1
- package/docs/components/input-range/overview.md +2 -2
- package/docs/components/input-range/use-cases.md +14 -0
- package/docs/components/input-stepper/api-table.md +2 -1
- package/docs/components/input-stepper/overview.md +1 -1
- package/docs/components/input-tel/api-table.md +3 -2
- package/docs/components/input-tel/overview.md +1 -1
- package/docs/components/input-tel/use-cases.md +6 -6
- package/docs/components/input-tel-dropdown/api-table.md +3 -2
- package/docs/components/input-tel-dropdown/overview.md +1 -1
- package/docs/components/listbox/api-table.md +2 -1
- package/docs/components/listbox/use-cases.md +1 -1
- package/docs/components/radio-group/api-table.md +2 -1
- package/docs/components/radio-group/overview.md +3 -3
- package/docs/components/select/api-table.md +2 -1
- package/docs/components/select/use-cases.md +1 -1
- package/docs/components/select-rich/api-table.md +5 -21
- package/docs/components/select-rich/use-cases.md +2 -2
- package/docs/components/switch/api-table.md +2 -1
- package/docs/components/tabs/examples.md +1 -1
- package/docs/components/textarea/api-table.md +2 -1
- package/docs/components/tooltip/api-table.md +11 -36
- package/docs/components/tooltip/use-cases.md +34 -1
- package/docs/fundamentals/index.md +4 -4
- package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
- package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
- package/docs/fundamentals/rationales/accessibility.md +1 -1
- package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
- package/docs/fundamentals/systems/core/overview.md +1 -1
- package/docs/fundamentals/systems/form/api-table.md +2 -1
- package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
- package/docs/fundamentals/systems/form/model-value.md +1 -1
- package/docs/fundamentals/systems/form/overview.md +28 -28
- package/docs/fundamentals/systems/form/validate.md +2 -2
- package/docs/fundamentals/systems/localize/overview.md +4 -4
- package/docs/fundamentals/systems/overlays/api-table.md +34 -36
- package/docs/fundamentals/systems/overlays/configuration.md +2 -2
- package/docs/fundamentals/systems/overlays/overview.md +5 -5
- package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
- package/docs/fundamentals/tools/helpers/overview.md +1 -1
- package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
- package/docs/guides/how-to/create-a-custom-field.md +5 -5
- package/docs/guides/how-to/create-a-form.md +4 -4
- package/docs/guides/how-to/extend-a-native-input.md +2 -2
- package/docs/guides/how-to/index.md +1 -1
- package/docs/guides/index.md +8 -8
- package/docs/guides/principles/index.md +5 -5
- package/docs/guides/principles/styling.md +1 -1
- package/exports/calendar-suites.js +1 -0
- package/exports/collapsible.js +0 -1
- package/exports/input-datepicker-suites.js +1 -0
- package/exports/input-file.js +5 -1
- package/exports/overlays-test-suites.js +1 -0
- package/exports/overlays.js +0 -6
- package/input-datepicker-suites.js +1 -0
- package/input-file.js +5 -1
- package/overlays-test-suites.js +1 -0
- package/overlays.js +0 -6
- package/package.json +2 -2
- package/components/collapsible/src/DisclosureMixin.js +0 -313
- package/components/collapsible/test-suites/DisclosureMixin.suite.js +0 -30
- package/components/collapsible/types/DisclosureMixinTypes.ts +0 -48
- package/components/menu/CHANGELOG.md +0 -37
- package/components/menu/README.md +0 -335
- package/components/menu/index.js +0 -2
- package/components/menu/lion-menu-overlay.js +0 -3
- package/components/menu/lion-menu.js +0 -3
- package/components/menu/lion-spinbutton.js +0 -3
- package/components/menu/lion-toolbar.js +0 -3
- package/components/menu/lion-tree.js +0 -3
- package/components/menu/package.json +0 -46
- package/components/menu/requirements.temp.md +0 -12
- package/components/menu/src/InteractiveListMixin.js +0 -840
- package/components/menu/src/LionMenu.js +0 -250
- package/components/menu/src/LionMenuHybrid.js +0 -46
- package/components/menu/src/LionMenuOverlay.js +0 -155
- package/components/menu/src/LionSpinbutton.js +0 -213
- package/components/menu/src/LionToolbar.js +0 -94
- package/components/menu/src/LionTree.js +0 -52
- package/components/menu/src/MoreButtonMenuMixin.js +0 -278
- package/components/menu/src/MultiLevelListMixin.js +0 -311
- package/components/menu/src/utils/isInView.js +0 -26
- package/components/menu/src/utils/listItemInteractions.js +0 -124
- package/components/menu/test/InteractiveListMixin.test.js +0 -3
- package/components/menu/test/MoreButtonMenuMixin.test.js +0 -4
- package/components/menu/test/MultiLevelListMixin.test.js +0 -3
- package/components/menu/test/lion-menu-hybrid.test.js +0 -3
- package/components/menu/test/lion-menu.test.js +0 -11
- package/components/menu/test/lion-toolbar.test.js +0 -8
- package/components/menu/test/lion-tree.test.js +0 -7
- package/components/menu/test-helpers/mimicKeyPress.js +0 -9
- package/components/menu/test-suites/InteractiveListMixin.suite.js +0 -454
- package/components/menu/test-suites/LionMenu.suite.js +0 -113
- package/components/menu/test-suites/LionMenuHybrid.suite.js +0 -583
- package/components/menu/test-suites/MoreButtonMenuMixin.suite.js +0 -372
- package/components/menu/test-suites/MultiLevelListMixin.suite.js +0 -303
- package/components/menu/types/InteractiveListMixinTypes.d.ts +0 -84
- package/components/navigation-bar/README.md +0 -1
- package/components/navigation-bar/src/LionNavigationBar.js +0 -439
- package/components/navigation-bar/src/types.js +0 -41
- package/components/overlays/NEXT.md +0 -49
- package/components/overlays/test/withHoverInteraction.test.js +0 -90
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts +0 -3
- package/dist-types/components/collapsible/src/DisclosureMixin.d.ts.map +0 -1
- package/dist-types/components/collapsible/test-suites/DisclosureMixin.suite.d.ts +0 -2
- package/dist-types/components/collapsible/test-suites/DisclosureMixin.suite.d.ts.map +0 -1
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts +0 -24
- package/dist-types/components/collapsible/types/DisclosureMixinTypes.d.ts.map +0 -1
- package/dist-types/components/menu/index.d.ts +0 -3
- package/dist-types/components/menu/index.d.ts.map +0 -1
- package/dist-types/components/menu/lion-menu-overlay.d.ts +0 -2
- package/dist-types/components/menu/lion-menu-overlay.d.ts.map +0 -1
- package/dist-types/components/menu/lion-menu.d.ts +0 -2
- package/dist-types/components/menu/lion-menu.d.ts.map +0 -1
- package/dist-types/components/menu/lion-spinbutton.d.ts +0 -2
- package/dist-types/components/menu/lion-spinbutton.d.ts.map +0 -1
- package/dist-types/components/menu/lion-toolbar.d.ts +0 -2
- package/dist-types/components/menu/lion-toolbar.d.ts.map +0 -1
- package/dist-types/components/menu/lion-tree.d.ts +0 -2
- package/dist-types/components/menu/lion-tree.d.ts.map +0 -1
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts +0 -617
- package/dist-types/components/menu/src/InteractiveListMixin.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenu.d.ts +0 -635
- package/dist-types/components/menu/src/LionMenu.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts +0 -19
- package/dist-types/components/menu/src/LionMenuHybrid.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts +0 -1015
- package/dist-types/components/menu/src/LionMenuOverlay.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionSpinbutton.d.ts +0 -58
- package/dist-types/components/menu/src/LionSpinbutton.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionToolbar.d.ts +0 -8
- package/dist-types/components/menu/src/LionToolbar.d.ts.map +0 -1
- package/dist-types/components/menu/src/LionTree.d.ts +0 -447
- package/dist-types/components/menu/src/LionTree.d.ts.map +0 -1
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts +0 -39
- package/dist-types/components/menu/src/MoreButtonMenuMixin.d.ts.map +0 -1
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts +0 -503
- package/dist-types/components/menu/src/MultiLevelListMixin.d.ts.map +0 -1
- package/dist-types/components/menu/src/utils/isInView.d.ts +0 -9
- package/dist-types/components/menu/src/utils/isInView.d.ts.map +0 -1
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts +0 -48
- package/dist-types/components/menu/src/utils/listItemInteractions.d.ts.map +0 -1
- package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts +0 -2
- package/dist-types/components/menu/test/InteractiveListMixin.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts +0 -2
- package/dist-types/components/menu/test/MoreButtonMenuMixin.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts +0 -2
- package/dist-types/components/menu/test/MultiLevelListMixin.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-menu-hybrid.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-menu-hybrid.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-menu.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-menu.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-toolbar.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-toolbar.test.d.ts.map +0 -1
- package/dist-types/components/menu/test/lion-tree.test.d.ts +0 -2
- package/dist-types/components/menu/test/lion-tree.test.d.ts.map +0 -1
- package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts +0 -7
- package/dist-types/components/menu/test-helpers/mimicKeyPress.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts +0 -14
- package/dist-types/components/menu/test-suites/InteractiveListMixin.suite.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts +0 -9
- package/dist-types/components/menu/test-suites/LionMenu.suite.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/LionMenuHybrid.suite.d.ts +0 -5
- package/dist-types/components/menu/test-suites/LionMenuHybrid.suite.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts +0 -14
- package/dist-types/components/menu/test-suites/MoreButtonMenuMixin.suite.d.ts.map +0 -1
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts +0 -11
- package/dist-types/components/menu/test-suites/MultiLevelListMixin.suite.d.ts.map +0 -1
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts +0 -238
- package/dist-types/components/navigation-bar/src/LionNavigationBar.d.ts.map +0 -1
- package/dist-types/components/navigation-bar/src/types.d.ts +0 -85
- package/dist-types/components/navigation-bar/src/types.d.ts.map +0 -1
- package/dist-types/components/overlays/test/withHoverInteraction.test.d.ts +0 -2
- package/dist-types/components/overlays/test/withHoverInteraction.test.d.ts.map +0 -1
- package/dist-types/exports/define/lion-item.d.ts +0 -2
- package/dist-types/exports/define/lion-item.d.ts.map +0 -1
- package/dist-types/exports/define/lion-menu-overlay.d.ts +0 -2
- package/dist-types/exports/define/lion-menu-overlay.d.ts.map +0 -1
- package/dist-types/exports/define/lion-menu.d.ts +0 -2
- package/dist-types/exports/define/lion-menu.d.ts.map +0 -1
- package/dist-types/exports/define/lion-navigation-bar.d.ts +0 -2
- package/dist-types/exports/define/lion-navigation-bar.d.ts.map +0 -1
- package/dist-types/exports/define/lion-toolbar.d.ts +0 -2
- package/dist-types/exports/define/lion-toolbar.d.ts.map +0 -1
- package/dist-types/exports/define/lion-tree.d.ts +0 -2
- package/dist-types/exports/define/lion-tree.d.ts.map +0 -1
- package/dist-types/exports/menu-test-suites.d.ts +0 -4
- package/dist-types/exports/menu-test-suites.d.ts.map +0 -1
- package/dist-types/exports/menu.d.ts +0 -7
- package/dist-types/exports/menu.d.ts.map +0 -1
- package/dist-types/exports/navigation-bar.d.ts +0 -2
- package/dist-types/exports/navigation-bar.d.ts.map +0 -1
- package/docs/components/menu/api-table.md +0 -460
- package/docs/components/menu/applyMenuDemoStyles.js +0 -173
- package/docs/components/menu/extensions.md +0 -262
- package/docs/components/menu/index.md +0 -13
- package/docs/components/menu/overview.md +0 -422
- package/docs/components/menu/use-cases.md +0 -77
- package/exports/define/lion-item.js +0 -3
- package/exports/define/lion-menu-overlay.js +0 -3
- package/exports/define/lion-menu.js +0 -3
- package/exports/define/lion-navigation-bar.js +0 -3
- package/exports/define/lion-toolbar.js +0 -3
- package/exports/define/lion-tree.js +0 -3
- package/exports/menu-test-suites.js +0 -4
- package/exports/menu.js +0 -7
- package/exports/navigation-bar.js +0 -1
- package/menu-test-suites.js +0 -4
- package/menu.js +0 -7
- package/navigation-bar.js +0 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { runFormatMixinSuite } from '@lion/ui/form-core-test-suites.js';
|
|
2
|
+
|
|
3
|
+
import '@lion/ui/define/lion-input-amount-dropdown.js';
|
|
4
|
+
|
|
5
|
+
const tagString = 'lion-input-amount-dropdown';
|
|
6
|
+
|
|
7
|
+
describe('<lion-input-amount-dropdown> integrations', () => {
|
|
8
|
+
runFormatMixinSuite({
|
|
9
|
+
tagString,
|
|
10
|
+
modelValueType: Object,
|
|
11
|
+
parser: value => value.replace('foo: ', ''),
|
|
12
|
+
valueToggler: ({ toggleValue, viewValue }) => {
|
|
13
|
+
if (viewValue) {
|
|
14
|
+
return !toggleValue ? '123' : '456';
|
|
15
|
+
}
|
|
16
|
+
return !toggleValue ? { amount: 123, currency: 'EUR' } : { amount: 456, currency: 'EUR' };
|
|
17
|
+
},
|
|
18
|
+
getExpectedInitialModelValue: el => ({ currency: /** @type {any} */ (el).currency }),
|
|
19
|
+
getExpectedInitialFormattedValue: el => ({ currency: /** @type {any} */ (el).currency }),
|
|
20
|
+
getExpectedInitialSerializedValue: el => ({ currency: /** @type {any} */ (el).currency }),
|
|
21
|
+
getExpectedModelValueForEmptyInputNode: el => ({
|
|
22
|
+
currency: /** @type {any} */ (el).currency,
|
|
23
|
+
amount: '',
|
|
24
|
+
}),
|
|
25
|
+
valueChangeCounterOffset: 0,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { LionInputAmountDropdown } from '@lion/ui/input-amount-dropdown.js';
|
|
2
|
-
import sinon from 'sinon';
|
|
3
2
|
import {
|
|
4
|
-
fixtureSync as _fixtureSync,
|
|
5
3
|
fixture as _fixture,
|
|
6
|
-
|
|
4
|
+
fixtureSync as _fixtureSync,
|
|
7
5
|
aTimeout,
|
|
8
6
|
defineCE,
|
|
9
7
|
expect,
|
|
10
8
|
html,
|
|
9
|
+
unsafeStatic,
|
|
11
10
|
} from '@open-wc/testing';
|
|
11
|
+
import sinon from 'sinon';
|
|
12
12
|
|
|
13
13
|
import { isActiveElement } from '../../core/test-helpers/isActiveElement.js';
|
|
14
14
|
import { mimicUserChangingDropdown } from '../test-helpers/mimicUserChangingDropdown.js';
|
|
@@ -100,6 +100,62 @@ export function runInputAmountDropdownSuite({ klass } = { klass: LionInputAmount
|
|
|
100
100
|
expect(el.prefilled).to.be.true;
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
+
it('does not fire model-value-changed for semantically equal modelValue objects', async () => {
|
|
104
|
+
const el = await fixture(
|
|
105
|
+
html` <${tag} .modelValue="${{ currency: 'EUR', amount: 123 }}"></${tag}> `,
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
const spy = sinon.spy();
|
|
109
|
+
el.addEventListener('model-value-changed', spy);
|
|
110
|
+
|
|
111
|
+
el.modelValue = { currency: 'EUR', amount: 123 };
|
|
112
|
+
await el.updateComplete;
|
|
113
|
+
|
|
114
|
+
expect(spy.callCount).to.equal(0);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it('does fire model-value-changed when amount is updated', async () => {
|
|
118
|
+
const el = await fixture(
|
|
119
|
+
html` <${tag} .modelValue="${{ currency: 'EUR', amount: 126 }}"></${tag}> `,
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
const spy = sinon.spy();
|
|
123
|
+
el.addEventListener('model-value-changed', spy);
|
|
124
|
+
|
|
125
|
+
el.modelValue = { currency: 'EUR', amount: 123 };
|
|
126
|
+
await el.updateComplete;
|
|
127
|
+
|
|
128
|
+
expect(spy.callCount).to.equal(1);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('does fire model-value-changed when currency is updated', async () => {
|
|
132
|
+
const el = await fixture(
|
|
133
|
+
html` <${tag} .modelValue="${{ currency: 'GBP', amount: 123 }}"></${tag}> `,
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
const spy = sinon.spy();
|
|
137
|
+
el.addEventListener('model-value-changed', spy);
|
|
138
|
+
|
|
139
|
+
el.modelValue = { currency: 'EUR', amount: 123 };
|
|
140
|
+
await el.updateComplete;
|
|
141
|
+
|
|
142
|
+
expect(spy.callCount).to.equal(1);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it('does fire model-value-changed when currency & amount are updated', async () => {
|
|
146
|
+
const el = await fixture(
|
|
147
|
+
html` <${tag} .modelValue="${{ currency: 'GBP', amount: 100 }}"></${tag}> `,
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
const spy = sinon.spy();
|
|
151
|
+
el.addEventListener('model-value-changed', spy);
|
|
152
|
+
|
|
153
|
+
el.modelValue = { currency: 'EUR', amount: 123 };
|
|
154
|
+
await el.updateComplete;
|
|
155
|
+
|
|
156
|
+
expect(spy.callCount).to.equal(1);
|
|
157
|
+
});
|
|
158
|
+
|
|
103
159
|
describe('Dropdown display', () => {
|
|
104
160
|
it('calls `templates.dropdown` with TemplateDataForDropdownInputAmount object', async () => {
|
|
105
161
|
const modelValue = { currency: 'EUR', amount: 123 };
|
|
@@ -336,6 +392,7 @@ export function runInputAmountDropdownSuite({ klass } = { klass: LionInputAmount
|
|
|
336
392
|
// @ts-ignore
|
|
337
393
|
expect(el._isEmpty(), 'missing amount property').to.be.true;
|
|
338
394
|
|
|
395
|
+
// @ts-ignore
|
|
339
396
|
el.modelValue = null;
|
|
340
397
|
await el.updateComplete;
|
|
341
398
|
// @ts-ignore
|
|
@@ -6,7 +6,6 @@ async function combineLocalizeImports(importPromises) {
|
|
|
6
6
|
const combinedResult = localizeObjects[0];
|
|
7
7
|
for (const localizeObject of localizeObjects.slice(1)) {
|
|
8
8
|
Object.entries(localizeObject.default).forEach(([key, val]) => {
|
|
9
|
-
// @ts-ignore - dynamic property access
|
|
10
9
|
combinedResult.default[key] = val;
|
|
11
10
|
});
|
|
12
11
|
}
|
|
@@ -3,12 +3,15 @@ import { html, LitElement } from 'lit';
|
|
|
3
3
|
import { IsDateDisabled, MaxDate, MinDate, MinMaxDate } from '@lion/ui/form-core.js';
|
|
4
4
|
import { aTimeout, defineCE, expect, fixture as _fixture, nextFrame } from '@open-wc/testing';
|
|
5
5
|
import { mimicClick } from '@lion/ui/overlays-test-helpers.js';
|
|
6
|
+
import { parseDate } from '@lion/ui/localize.js';
|
|
6
7
|
import sinon from 'sinon';
|
|
7
|
-
import { setViewport } from '@web/test-runner-commands';
|
|
8
|
+
import { sendKeys, setViewport } from '@web/test-runner-commands';
|
|
9
|
+
import { AlwaysInvalid } from '@lion/ui/form-core-test-helpers.js';
|
|
8
10
|
import { DatepickerInputObject } from '@lion/ui/input-datepicker-test-helpers.js';
|
|
9
11
|
import { LionInputDatepicker } from '@lion/ui/input-datepicker.js';
|
|
10
12
|
|
|
11
13
|
import '@lion/ui/define/lion-input-datepicker.js';
|
|
14
|
+
import { runDatepickerSuite } from '../test-suites/LionInputDatepicker.suite.js';
|
|
12
15
|
|
|
13
16
|
/**
|
|
14
17
|
* @typedef {import('lit').TemplateResult} TemplateResult
|
|
@@ -454,6 +457,59 @@ describe('<lion-input-datepicker>', () => {
|
|
|
454
457
|
expect(el.validationStates.error).to.have.property('IsDate');
|
|
455
458
|
});
|
|
456
459
|
|
|
460
|
+
it('syncs view value from calendar if custom validator is in error state', async () => {
|
|
461
|
+
const el = await fixture(html`
|
|
462
|
+
<lion-input-datepicker .validators=${[new AlwaysInvalid()]}></lion-input-datepicker>
|
|
463
|
+
`);
|
|
464
|
+
|
|
465
|
+
const elObj = new DatepickerInputObject(el);
|
|
466
|
+
await elObj.openCalendar();
|
|
467
|
+
await elObj.selectMonthDay(12);
|
|
468
|
+
await el.updateComplete; // safari take a little longer
|
|
469
|
+
|
|
470
|
+
expect(el.hasFeedbackFor).to.include('error');
|
|
471
|
+
expect(el.validationStates).to.have.property('error');
|
|
472
|
+
expect(el.validationStates.error).to.have.property('AlwaysInvalid');
|
|
473
|
+
expect(isSameDate(/** @type {Date} */ (parseDate(el.value)), elObj.calendarEl.selectedDate))
|
|
474
|
+
.to.be.true;
|
|
475
|
+
expect(
|
|
476
|
+
isSameDate(
|
|
477
|
+
// @ts-ignore [allow-protected] in test
|
|
478
|
+
/** @type {Date} */ (parseDate(el._inputNode.value)),
|
|
479
|
+
elObj.calendarEl.selectedDate,
|
|
480
|
+
),
|
|
481
|
+
).to.be.true;
|
|
482
|
+
});
|
|
483
|
+
|
|
484
|
+
it('syncs view value from calendar if custom validator is in error state, when there was a previous modelValue', async () => {
|
|
485
|
+
const modelValue = new Date('2022/12/30');
|
|
486
|
+
const el = await fixture(html`
|
|
487
|
+
<lion-input-datepicker
|
|
488
|
+
.modelValue="${modelValue}"
|
|
489
|
+
.validators=${[new AlwaysInvalid()]}
|
|
490
|
+
></lion-input-datepicker>
|
|
491
|
+
`);
|
|
492
|
+
expect(isSameDate(/** @type {Date} */ (parseDate(el.value)), modelValue)).to.be.true;
|
|
493
|
+
|
|
494
|
+
const elObj = new DatepickerInputObject(el);
|
|
495
|
+
await elObj.openCalendar();
|
|
496
|
+
await elObj.selectMonthDay(12);
|
|
497
|
+
await el.updateComplete; // safari take a little longer
|
|
498
|
+
|
|
499
|
+
expect(el.hasFeedbackFor).to.include('error');
|
|
500
|
+
expect(el.validationStates).to.have.property('error');
|
|
501
|
+
expect(el.validationStates.error).to.have.property('AlwaysInvalid');
|
|
502
|
+
expect(isSameDate(/** @type {Date} */ (parseDate(el.value)), elObj.calendarEl.selectedDate))
|
|
503
|
+
.to.be.true;
|
|
504
|
+
expect(
|
|
505
|
+
isSameDate(
|
|
506
|
+
// @ts-ignore [allow-protected] in test
|
|
507
|
+
/** @type {Date} */ (parseDate(el._inputNode.value)),
|
|
508
|
+
elObj.calendarEl.selectedDate,
|
|
509
|
+
),
|
|
510
|
+
).to.be.true;
|
|
511
|
+
});
|
|
512
|
+
|
|
457
513
|
/**
|
|
458
514
|
* Not in scope:
|
|
459
515
|
* - min/max attr (like platform has): could be added in future if observers needed
|
|
@@ -479,10 +535,14 @@ describe('<lion-input-datepicker>', () => {
|
|
|
479
535
|
// Open the calendar
|
|
480
536
|
await elObj.openCalendar();
|
|
481
537
|
|
|
538
|
+
const selectedDateEl = calendarEl?.shadowRoot?.querySelector(
|
|
539
|
+
'.calendar__day-button[selected]',
|
|
540
|
+
);
|
|
541
|
+
// @ts-ignore
|
|
542
|
+
selectedDateEl?.focus();
|
|
543
|
+
|
|
482
544
|
// Move focus to 18th of December
|
|
483
|
-
|
|
484
|
-
?.querySelector('#js-content-wrapper')
|
|
485
|
-
?.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight' }));
|
|
545
|
+
await sendKeys({ press: 'ArrowRight' });
|
|
486
546
|
|
|
487
547
|
expect(/** @type {Date} */ (calendarEl.focusedDate).getTime()).to.equal(
|
|
488
548
|
new Date('December 18, 2020 03:24:00 GMT+0000').getTime(),
|
|
@@ -597,11 +657,12 @@ describe('<lion-input-datepicker>', () => {
|
|
|
597
657
|
<lion-input-datepicker label="End date" name="endDate"></lion-input-datepicker>
|
|
598
658
|
`);
|
|
599
659
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
660
|
+
// @ts-expect-error
|
|
661
|
+
const elements = el.parentElement.children;
|
|
662
|
+
// @ts-expect-error
|
|
663
|
+
const startLabel = elements.startDate.querySelector('button').ariaLabel;
|
|
664
|
+
// @ts-expect-error
|
|
665
|
+
const endLabel = elements.endDate.querySelector('button').ariaLabel;
|
|
605
666
|
|
|
606
667
|
expect(startLabel).to.not.equal(endLabel);
|
|
607
668
|
});
|
|
@@ -833,4 +894,8 @@ describe('<lion-input-datepicker>', () => {
|
|
|
833
894
|
).to.be.true;
|
|
834
895
|
});
|
|
835
896
|
});
|
|
897
|
+
|
|
898
|
+
describe('Run suite', () => {
|
|
899
|
+
runDatepickerSuite();
|
|
900
|
+
});
|
|
836
901
|
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { expect, html, fixture, waitUntil, unsafeStatic } from '@open-wc/testing';
|
|
2
|
+
import { sendKeys } from '@web/test-runner-commands';
|
|
3
|
+
|
|
4
|
+
/** @typedef {import('@lion/ui/input-datepicker.js').LionInputDatepicker} LionInputDatepicker */
|
|
5
|
+
|
|
6
|
+
export function runDatepickerSuite({
|
|
7
|
+
datepickerTagName = 'lion-input-datepicker',
|
|
8
|
+
calendarTagName = 'lion-calendar',
|
|
9
|
+
} = {}) {
|
|
10
|
+
const tag = unsafeStatic(datepickerTagName);
|
|
11
|
+
|
|
12
|
+
it('should not reopen the datepicker popup when the date is selected by keyboard', async () => {
|
|
13
|
+
/** @type {LionInputDatepicker} */
|
|
14
|
+
const el = await fixture(html`<${tag} .modelValue="${new Date('2018/05/30')}"></${tag}>`);
|
|
15
|
+
await el.updateComplete;
|
|
16
|
+
|
|
17
|
+
// @ts-ignore
|
|
18
|
+
const openDatepickerButton = el._invokerNode;
|
|
19
|
+
openDatepickerButton?.focus();
|
|
20
|
+
openDatepickerButton?.click();
|
|
21
|
+
/**
|
|
22
|
+
* @returns {HTMLElement | null | undefined}
|
|
23
|
+
*/
|
|
24
|
+
const getSelectedDateEl = () =>
|
|
25
|
+
el?.shadowRoot
|
|
26
|
+
?.querySelector(calendarTagName)
|
|
27
|
+
?.shadowRoot?.querySelector('.calendar__day-button[selected]');
|
|
28
|
+
await waitUntil(getSelectedDateEl);
|
|
29
|
+
getSelectedDateEl()?.focus();
|
|
30
|
+
await sendKeys({ press: 'ArrowLeft' });
|
|
31
|
+
await sendKeys({ press: 'Enter' });
|
|
32
|
+
|
|
33
|
+
expect(el.opened).to.be.false;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
@@ -10,6 +10,8 @@ import { LocalizeMixin } from '@lion/ui/localize-no-side-effects.js';
|
|
|
10
10
|
export class LionInputEmail extends LocalizeMixin(LionInput) {
|
|
11
11
|
constructor() {
|
|
12
12
|
super();
|
|
13
|
+
this.autocomplete = 'email';
|
|
14
|
+
|
|
13
15
|
// local-part@domain where the local part may be up to 64 characters long
|
|
14
16
|
// and the domain may have a maximum of 255 characters.
|
|
15
17
|
// @see https://www.wikiwand.com/en/Email_address
|
|
@@ -15,6 +15,12 @@ describe('<lion-input-email>', () => {
|
|
|
15
15
|
expect(_inputNode.type).to.equal('text');
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
+
it('sets autocomplete to "email"', async () => {
|
|
19
|
+
const el = await fixture(`<lion-input-email></lion-input-email>`);
|
|
20
|
+
// @ts-expect-error [allow-protected] inside tests
|
|
21
|
+
expect(el._inputNode.getAttribute('autocomplete')).to.equal('email');
|
|
22
|
+
});
|
|
23
|
+
|
|
18
24
|
it('has validator "IsEmail" applied by default', async () => {
|
|
19
25
|
// More elaborate tests can be found in lion-validate/test/StringValidators.test.js
|
|
20
26
|
const el = await fixture(`<lion-input-email></lion-input-email>`);
|
|
@@ -2,13 +2,14 @@ import { Validator } from '@lion/ui/form-core.js';
|
|
|
2
2
|
import { getLocalizeManager } from '@lion/ui/localize-no-side-effects.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
+
* @typedef {import('../../form-core/types/validate/index.js').FeedbackMessageData} FeedbackMessageData
|
|
5
6
|
* @typedef {import('../../form-core/types/validate/validate.js').ValidatorConfig} ValidatorConfig
|
|
6
7
|
* @typedef {import('../../form-core/types/validate/validate.js').ValidatorParam} ValidatorParam
|
|
7
8
|
* @typedef {import('../../form-core/types/validate/validate.js').ValidatorOutcome} ValidatorOutcome
|
|
8
9
|
* @typedef {import('../types/input-file.js').InputFile} InputFile
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
|
-
/* eslint max-classes-per-file: ["error",
|
|
12
|
+
/* eslint max-classes-per-file: ["error", 3] */
|
|
12
13
|
export class IsAcceptedFile extends Validator {
|
|
13
14
|
static validatorName = 'IsAcceptedFile';
|
|
14
15
|
|
|
@@ -112,3 +113,32 @@ export class DuplicateFileNames extends Validator {
|
|
|
112
113
|
return localizeManager.msg('lion-input-file:uploadTextDuplicateFileName');
|
|
113
114
|
}
|
|
114
115
|
}
|
|
116
|
+
|
|
117
|
+
export class MaxFileCount extends Validator {
|
|
118
|
+
static get validatorName() {
|
|
119
|
+
return 'MaxFileCount';
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @param {Partial<FeedbackMessageData>} [data]
|
|
124
|
+
* @returns {Promise<string|Element>}
|
|
125
|
+
*/
|
|
126
|
+
static async getMessage(data) {
|
|
127
|
+
const localizeManager = getLocalizeManager();
|
|
128
|
+
if (!data?.params || typeof data.params !== 'number' || data.params <= 0) {
|
|
129
|
+
return 'Invalid MaxFileCount parameter. Please provide a valid number greater than 0.';
|
|
130
|
+
}
|
|
131
|
+
return localizeManager.msg('lion-input-file:maxFileCountExceeded', {
|
|
132
|
+
maxFileCount: data.params,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* @param {File[]} value
|
|
138
|
+
* @param {number} maxFiles
|
|
139
|
+
* @returns {boolean}
|
|
140
|
+
*/
|
|
141
|
+
execute(value, maxFiles = this.param || 0) {
|
|
142
|
+
return maxFiles > 0 && value.length > maxFiles;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { expect } from '@open-wc/testing';
|
|
2
|
+
import { MaxFileCount } from '@lion/ui/input-file.js';
|
|
2
3
|
import { IsAcceptedFile } from '../src/validators.js';
|
|
3
4
|
|
|
4
5
|
describe('lion-input-file: IsAcceptedFile', () => {
|
|
@@ -167,4 +168,34 @@ describe('lion-input-file: IsAcceptedFile', () => {
|
|
|
167
168
|
expect(returnVal).to.be.true;
|
|
168
169
|
});
|
|
169
170
|
});
|
|
171
|
+
|
|
172
|
+
describe('Max File Count', () => {
|
|
173
|
+
/**
|
|
174
|
+
*
|
|
175
|
+
* @param {string} filename
|
|
176
|
+
* @returns {File}
|
|
177
|
+
*/
|
|
178
|
+
const newFile = filename => new File([], filename);
|
|
179
|
+
|
|
180
|
+
it('Allow up to 2 files', () => {
|
|
181
|
+
const validator = new MaxFileCount(2);
|
|
182
|
+
expect(MaxFileCount.validatorName).to.equal('MaxFileCount');
|
|
183
|
+
|
|
184
|
+
let isEnabled = validator.execute([newFile('file1.txt'), newFile('file2.txt')]);
|
|
185
|
+
expect(isEnabled).to.be.false;
|
|
186
|
+
|
|
187
|
+
isEnabled = validator.execute([
|
|
188
|
+
newFile('file1.txt'),
|
|
189
|
+
newFile('file2.txt'),
|
|
190
|
+
newFile('file3.txt'),
|
|
191
|
+
]);
|
|
192
|
+
expect(isEnabled).to.be.true;
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it('Allow any number of files with empty param', () => {
|
|
196
|
+
const validator = new MaxFileCount();
|
|
197
|
+
const isEnabled = validator.execute([newFile('file1.txt'), newFile('file2.txt')]);
|
|
198
|
+
expect(isEnabled).to.be.false;
|
|
199
|
+
});
|
|
200
|
+
});
|
|
170
201
|
});
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Файл със същото име на файл вече е налице.',
|
|
18
18
|
selectTextMultipleFile: 'Избор на файлове',
|
|
19
19
|
selectTextSingleFile: 'Избор на файл',
|
|
20
|
+
maxFileCountExceeded: 'Броят на качените файлове не може да надвишава {maxFileCount}.',
|
|
20
21
|
};
|
|
@@ -18,4 +18,5 @@ export default {
|
|
|
18
18
|
selectTextDuplicateFileName: 'Soubor se stejným názvem byl již přítomen.',
|
|
19
19
|
selectTextMultipleFile: 'Vybrat soubory',
|
|
20
20
|
selectTextSingleFile: 'Vybrat soubor',
|
|
21
|
+
maxFileCountExceeded: 'Počet nahraných souborů nesmí překročit {maxFileCount}.',
|
|
21
22
|
};
|
|
@@ -17,4 +17,6 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Eine Datei mit demselben Dateinamen war bereits vorhanden.',
|
|
18
18
|
selectTextMultipleFile: 'Dateien auswählen',
|
|
19
19
|
selectTextSingleFile: 'Datei auswählen',
|
|
20
|
+
maxFileCountExceeded:
|
|
21
|
+
'Die Anzahl der hochgeladenen Dateien darf {maxFileCount} nicht überschreiten.',
|
|
20
22
|
};
|
|
@@ -16,4 +16,5 @@ export default {
|
|
|
16
16
|
selectTextDuplicateFileName: 'A file with same filename was already present.',
|
|
17
17
|
selectTextMultipleFile: 'Select files',
|
|
18
18
|
selectTextSingleFile: 'Select file',
|
|
19
|
+
maxFileCountExceeded: 'The number of uploaded files must not exceed {maxFileCount}.',
|
|
19
20
|
};
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Ya había un archivo con el mismo nombre de archivo.',
|
|
18
18
|
selectTextMultipleFile: 'Seleccionar archivos',
|
|
19
19
|
selectTextSingleFile: 'Seleccionar archivo',
|
|
20
|
+
maxFileCountExceeded: 'El número de archivos cargados no puede superar {maxFileCount}.',
|
|
20
21
|
};
|
|
@@ -18,4 +18,5 @@ export default {
|
|
|
18
18
|
selectTextDuplicateFileName: 'Un fichier portant le même nom de fichier était déjà présent.',
|
|
19
19
|
selectTextMultipleFile: 'Sélectionnez des fichiers',
|
|
20
20
|
selectTextSingleFile: 'Sélectionnez un fichier',
|
|
21
|
+
maxFileCountExceeded: 'Le nombre de fichiers téléchargés ne peut pas dépasser {maxFileCount}.',
|
|
21
22
|
};
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Már volt ilyen nevű fájl.',
|
|
18
18
|
selectTextMultipleFile: 'Fájl(ok) kiválasztása',
|
|
19
19
|
selectTextSingleFile: 'Fájl kiválasztása',
|
|
20
|
+
maxFileCountExceeded: 'A feltöltött fájlok száma nem haladhatja meg a {maxFileCount}-ot.',
|
|
20
21
|
};
|
|
@@ -16,4 +16,5 @@ export default {
|
|
|
16
16
|
selectTextDuplicateFileName: 'File dengan nama file yang sama sudah ada.',
|
|
17
17
|
selectTextMultipleFile: 'Pilih beberapa file',
|
|
18
18
|
selectTextSingleFile: 'Pilih berkas',
|
|
19
|
+
maxFileCountExceeded: 'Jumlah file yang diunggah tidak boleh melebihi {maxFileCount}.',
|
|
19
20
|
};
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Un file con lo stesso nome file era già presente.',
|
|
18
18
|
selectTextMultipleFile: 'Seleziona file',
|
|
19
19
|
selectTextSingleFile: 'Seleziona file',
|
|
20
|
+
maxFileCountExceeded: 'Il numero di file caricati non può superare {maxFileCount}.',
|
|
20
21
|
};
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Er bestaat al een bestand met dezelfde bestandsnaam.',
|
|
18
18
|
selectTextMultipleFile: 'Selecteer bestanden',
|
|
19
19
|
selectTextSingleFile: 'Selecteer bestand',
|
|
20
|
+
maxFileCountExceeded: 'Het aantal geüploade bestanden mag niet meer dan {maxFileCount} zijn.',
|
|
20
21
|
};
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Plik o tej samej nazwie już istnieje.',
|
|
18
18
|
selectTextMultipleFile: 'Wybierz pliki',
|
|
19
19
|
selectTextSingleFile: 'Wybierz plik',
|
|
20
|
+
maxFileCountExceeded: 'Liczba przesłanych plików nie może przekraczać {maxFileCount}.',
|
|
20
21
|
};
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Există deja un fişier cu acelaşi nume de fişier.',
|
|
18
18
|
selectTextMultipleFile: 'Selectare fișiere',
|
|
19
19
|
selectTextSingleFile: 'Selectare fișier',
|
|
20
|
+
maxFileCountExceeded: 'Numărul de fișiere încărcate nu poate depăși {maxFileCount}.',
|
|
20
21
|
};
|
|
@@ -16,4 +16,5 @@ export default {
|
|
|
16
16
|
selectTextDuplicateFileName: 'Файл с таким названием уже существует.',
|
|
17
17
|
selectTextMultipleFile: 'Выберите файлы',
|
|
18
18
|
selectTextSingleFile: 'Выберите файл',
|
|
19
|
+
maxFileCountExceeded: 'Количество загруженных файлов не может превышать {maxFileCount}.',
|
|
19
20
|
};
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Súbor s rovnakým názvom súboru už existoval.',
|
|
18
18
|
selectTextMultipleFile: 'Vybrať súbory',
|
|
19
19
|
selectTextSingleFile: 'Vybrať súbor',
|
|
20
|
+
maxFileCountExceeded: 'Počet nahratých súborov nesmie prekročiť {maxFileCount}.',
|
|
20
21
|
};
|
|
@@ -17,4 +17,5 @@ export default {
|
|
|
17
17
|
selectTextDuplicateFileName: 'Файл із такою назвою вже існував.',
|
|
18
18
|
selectTextMultipleFile: 'Виберіть файли',
|
|
19
19
|
selectTextSingleFile: 'Виберіть файл',
|
|
20
|
+
maxFileCountExceeded: 'Кількість завантажених файлів не може перевищувати {maxFileCount}.',
|
|
20
21
|
};
|