@rotki/ui-library 2.8.1 → 2.8.3
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/dist/README.md +276 -0
- package/dist/_virtual/_plugin-vue_export-helper.js +11 -0
- package/dist/_virtual/_plugin-vue_export-helper.js.map +1 -0
- package/dist/components/accordions/accordion/RuiAccordion.vue.js +11 -0
- package/dist/components/accordions/accordion/RuiAccordion.vue.js.map +1 -0
- package/dist/components/accordions/accordion/RuiAccordion.vue2.js +66 -0
- package/dist/components/accordions/accordion/RuiAccordion.vue2.js.map +1 -0
- package/dist/components/accordions/accordion/RuiAccordion.vue3.js +18 -0
- package/dist/components/accordions/accordion/RuiAccordion.vue3.js.map +1 -0
- package/dist/components/accordions/accordions/RuiAccordions.vue.js +78 -0
- package/dist/components/accordions/accordions/RuiAccordions.vue.js.map +1 -0
- package/dist/components/accordions/accordions/RuiAccordions.vue2.js +5 -0
- package/dist/components/accordions/accordions/RuiAccordions.vue2.js.map +1 -0
- package/dist/components/alerts/RuiAlert.vue.d.ts +2 -2
- package/dist/components/alerts/RuiAlert.vue.js +11 -0
- package/dist/components/alerts/RuiAlert.vue.js.map +1 -0
- package/dist/components/alerts/RuiAlert.vue2.js +123 -0
- package/dist/components/alerts/RuiAlert.vue2.js.map +1 -0
- package/dist/components/alerts/RuiAlert.vue3.js +50 -0
- package/dist/components/alerts/RuiAlert.vue3.js.map +1 -0
- package/dist/components/buttons/button/RuiButton.vue.d.ts +1 -1
- package/dist/components/buttons/button/RuiButton.vue.js +11 -0
- package/dist/components/buttons/button/RuiButton.vue.js.map +1 -0
- package/dist/components/buttons/button/RuiButton.vue2.js +94 -0
- package/dist/components/buttons/button/RuiButton.vue2.js.map +1 -0
- package/dist/components/buttons/button/RuiButton.vue3.js +74 -0
- package/dist/components/buttons/button/RuiButton.vue3.js.map +1 -0
- package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.vue.js +11 -0
- package/dist/components/buttons/button-group/RuiButtonGroup.vue.js.map +1 -0
- package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js +112 -0
- package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js.map +1 -0
- package/dist/components/buttons/button-group/RuiButtonGroup.vue3.js +58 -0
- package/dist/components/buttons/button-group/RuiButtonGroup.vue3.js.map +1 -0
- package/dist/components/calendar/RuiCalendar.vue.js +128 -0
- package/dist/components/calendar/RuiCalendar.vue.js.map +1 -0
- package/dist/components/calendar/RuiCalendar.vue3.js +6 -0
- package/dist/components/calendar/RuiCalendar.vue3.js.map +1 -0
- package/dist/components/calendar/RuiCalendarGrid.vue.js +8 -0
- package/dist/components/calendar/RuiCalendarGrid.vue.js.map +1 -0
- package/dist/components/calendar/RuiCalendarGrid.vue2.js +149 -0
- package/dist/components/calendar/RuiCalendarGrid.vue2.js.map +1 -0
- package/dist/components/calendar/RuiCalendarHeader.vue.d.ts +1 -1
- package/dist/components/calendar/RuiCalendarHeader.vue.js +8 -0
- package/dist/components/calendar/RuiCalendarHeader.vue.js.map +1 -0
- package/dist/components/calendar/RuiCalendarHeader.vue2.js +112 -0
- package/dist/components/calendar/RuiCalendarHeader.vue2.js.map +1 -0
- package/dist/components/calendar/RuiCalendarMenu.vue.d.ts +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue.js +8 -0
- package/dist/components/calendar/RuiCalendarMenu.vue.js.map +1 -0
- package/dist/components/calendar/RuiCalendarMenu.vue2.js +261 -0
- package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -0
- package/dist/components/calendar/state.js +25 -0
- package/dist/components/calendar/state.js.map +1 -0
- package/dist/components/cards/RuiCard.vue.js +11 -0
- package/dist/components/cards/RuiCard.vue.js.map +1 -0
- package/dist/components/cards/RuiCard.vue2.js +88 -0
- package/dist/components/cards/RuiCard.vue2.js.map +1 -0
- package/dist/components/cards/RuiCard.vue3.js +40 -0
- package/dist/components/cards/RuiCard.vue3.js.map +1 -0
- package/dist/components/cards/RuiCardHeader.vue.js +11 -0
- package/dist/components/cards/RuiCardHeader.vue.js.map +1 -0
- package/dist/components/cards/RuiCardHeader.vue2.js +51 -0
- package/dist/components/cards/RuiCardHeader.vue2.js.map +1 -0
- package/dist/components/cards/RuiCardHeader.vue3.js +27 -0
- package/dist/components/cards/RuiCardHeader.vue3.js.map +1 -0
- package/dist/components/chips/RuiChip.vue.d.ts +2 -2
- package/dist/components/chips/RuiChip.vue.js +11 -0
- package/dist/components/chips/RuiChip.vue.js.map +1 -0
- package/dist/components/chips/RuiChip.vue2.js +95 -0
- package/dist/components/chips/RuiChip.vue2.js.map +1 -0
- package/dist/components/chips/RuiChip.vue3.js +88 -0
- package/dist/components/chips/RuiChip.vue3.js.map +1 -0
- package/dist/components/color-picker/RuiColorBoard.vue.d.ts +1 -1
- package/dist/components/color-picker/RuiColorBoard.vue.js +11 -0
- package/dist/components/color-picker/RuiColorBoard.vue.js.map +1 -0
- package/dist/components/color-picker/RuiColorBoard.vue2.js +102 -0
- package/dist/components/color-picker/RuiColorBoard.vue2.js.map +1 -0
- package/dist/components/color-picker/RuiColorBoard.vue3.js +18 -0
- package/dist/components/color-picker/RuiColorBoard.vue3.js.map +1 -0
- package/dist/components/color-picker/RuiColorDisplay.vue.js +49 -0
- package/dist/components/color-picker/RuiColorDisplay.vue.js.map +1 -0
- package/dist/components/color-picker/RuiColorDisplay.vue2.js +5 -0
- package/dist/components/color-picker/RuiColorDisplay.vue2.js.map +1 -0
- package/dist/components/color-picker/RuiColorHue.vue.js +11 -0
- package/dist/components/color-picker/RuiColorHue.vue.js.map +1 -0
- package/dist/components/color-picker/RuiColorHue.vue2.js +89 -0
- package/dist/components/color-picker/RuiColorHue.vue2.js.map +1 -0
- package/dist/components/color-picker/RuiColorHue.vue3.js +12 -0
- package/dist/components/color-picker/RuiColorHue.vue3.js.map +1 -0
- package/dist/components/color-picker/RuiColorInput.vue.d.ts +1 -1
- package/dist/components/color-picker/RuiColorInput.vue.js +139 -0
- package/dist/components/color-picker/RuiColorInput.vue.js.map +1 -0
- package/dist/components/color-picker/RuiColorInput.vue2.js +5 -0
- package/dist/components/color-picker/RuiColorInput.vue2.js.map +1 -0
- package/dist/components/color-picker/RuiColorPicker.vue.js +72 -0
- package/dist/components/color-picker/RuiColorPicker.vue.js.map +1 -0
- package/dist/components/color-picker/RuiColorPicker.vue2.js +5 -0
- package/dist/components/color-picker/RuiColorPicker.vue2.js.map +1 -0
- package/dist/components/color-picker/utils.js +182 -0
- package/dist/components/color-picker/utils.js.map +1 -0
- package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.vue.js +11 -0
- package/dist/components/date-time-picker/RuiDateTimePicker.vue.js.map +1 -0
- package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +570 -0
- package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -0
- package/dist/components/date-time-picker/RuiDateTimePicker.vue3.js +66 -0
- package/dist/components/date-time-picker/RuiDateTimePicker.vue3.js.map +1 -0
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.d.ts +2 -2
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.js +120 -0
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.js.map +1 -0
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue2.js +5 -0
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue2.js.map +1 -0
- package/dist/components/date-time-picker/timezones.js +601 -0
- package/dist/components/date-time-picker/timezones.js.map +1 -0
- package/dist/components/date-time-picker/types.js +17 -0
- package/dist/components/date-time-picker/types.js.map +1 -0
- package/dist/components/date-time-picker/use-input-handler.d.ts +2 -2
- package/dist/components/date-time-picker/use-input-handler.js +31 -0
- package/dist/components/date-time-picker/use-input-handler.js.map +1 -0
- package/dist/components/date-time-picker/use-keyboard-handler.d.ts +2 -2
- package/dist/components/date-time-picker/use-keyboard-handler.js +308 -0
- package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -0
- package/dist/components/date-time-picker/utils.d.ts +1 -1
- package/dist/components/date-time-picker/utils.js +19 -0
- package/dist/components/date-time-picker/utils.js.map +1 -0
- package/dist/components/divider/RuiDivider.vue.js +22 -0
- package/dist/components/divider/RuiDivider.vue.js.map +1 -0
- package/dist/components/divider/RuiDivider.vue2.js +5 -0
- package/dist/components/divider/RuiDivider.vue2.js.map +1 -0
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +2 -2
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.js +11 -0
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.js.map +1 -0
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +585 -0
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -0
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue3.js +60 -0
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue3.js.map +1 -0
- package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.vue.js +11 -0
- package/dist/components/forms/checkbox/RuiCheckbox.vue.js.map +1 -0
- package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +137 -0
- package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -0
- package/dist/components/forms/checkbox/RuiCheckbox.vue3.js +54 -0
- package/dist/components/forms/checkbox/RuiCheckbox.vue3.js.map +1 -0
- package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue.js +11 -0
- package/dist/components/forms/radio-button/radio/RuiRadio.vue.js.map +1 -0
- package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +115 -0
- package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -0
- package/dist/components/forms/radio-button/radio/RuiRadio.vue3.js +54 -0
- package/dist/components/forms/radio-button/radio/RuiRadio.vue3.js.map +1 -0
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +1 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.js +11 -0
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.js.map +1 -0
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js +78 -0
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js.map +1 -0
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue3.js +9 -0
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue3.js.map +1 -0
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +5 -5
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js +82 -0
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js.map +1 -0
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue2.js +5 -0
- package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue2.js.map +1 -0
- package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +2 -2
- package/dist/components/forms/select/RuiMenuSelect.vue.js +11 -0
- package/dist/components/forms/select/RuiMenuSelect.vue.js.map +1 -0
- package/dist/components/forms/select/RuiMenuSelect.vue2.js +297 -0
- package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -0
- package/dist/components/forms/select/RuiMenuSelect.vue3.js +60 -0
- package/dist/components/forms/select/RuiMenuSelect.vue3.js.map +1 -0
- package/dist/components/forms/select/RuiSimpleSelect.vue.js +11 -0
- package/dist/components/forms/select/RuiSimpleSelect.vue.js.map +1 -0
- package/dist/components/forms/select/RuiSimpleSelect.vue2.js +67 -0
- package/dist/components/forms/select/RuiSimpleSelect.vue2.js.map +1 -0
- package/dist/components/forms/select/RuiSimpleSelect.vue3.js +21 -0
- package/dist/components/forms/select/RuiSimpleSelect.vue3.js.map +1 -0
- package/dist/components/forms/slider/RuiSlider.vue.d.ts +1 -1
- package/dist/components/forms/slider/RuiSlider.vue.js +11 -0
- package/dist/components/forms/slider/RuiSlider.vue.js.map +1 -0
- package/dist/components/forms/slider/RuiSlider.vue2.js +165 -0
- package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -0
- package/dist/components/forms/slider/RuiSlider.vue3.js +80 -0
- package/dist/components/forms/slider/RuiSlider.vue3.js.map +1 -0
- package/dist/components/forms/switch/RuiSwitch.vue.d.ts +1 -1
- package/dist/components/forms/switch/RuiSwitch.vue.js +11 -0
- package/dist/components/forms/switch/RuiSwitch.vue.js.map +1 -0
- package/dist/components/forms/switch/RuiSwitch.vue2.js +89 -0
- package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -0
- package/dist/components/forms/switch/RuiSwitch.vue3.js +54 -0
- package/dist/components/forms/switch/RuiSwitch.vue3.js.map +1 -0
- package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +2 -2
- package/dist/components/forms/text-area/RuiTextArea.vue.js +11 -0
- package/dist/components/forms/text-area/RuiTextArea.vue.js.map +1 -0
- package/dist/components/forms/text-area/RuiTextArea.vue2.js +252 -0
- package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -0
- package/dist/components/forms/text-area/RuiTextArea.vue3.js +92 -0
- package/dist/components/forms/text-area/RuiTextArea.vue3.js.map +1 -0
- package/dist/components/forms/text-field/RuiTextField.vue.d.ts +2 -2
- package/dist/components/forms/text-field/RuiTextField.vue.js +11 -0
- package/dist/components/forms/text-field/RuiTextField.vue.js.map +1 -0
- package/dist/components/forms/text-field/RuiTextField.vue2.js +220 -0
- package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -0
- package/dist/components/forms/text-field/RuiTextField.vue3.js +89 -0
- package/dist/components/forms/text-field/RuiTextField.vue3.js.map +1 -0
- package/dist/components/helpers/RuiFormTextDetail.vue.js +54 -0
- package/dist/components/helpers/RuiFormTextDetail.vue.js.map +1 -0
- package/dist/components/helpers/RuiFormTextDetail.vue2.js +5 -0
- package/dist/components/helpers/RuiFormTextDetail.vue2.js.map +1 -0
- package/dist/components/icons/RuiIcon.vue.d.ts +2 -2
- package/dist/components/icons/RuiIcon.vue.js +11 -0
- package/dist/components/icons/RuiIcon.vue.js.map +1 -0
- package/dist/components/icons/RuiIcon.vue2.js +60 -0
- package/dist/components/icons/RuiIcon.vue2.js.map +1 -0
- package/dist/components/icons/RuiIcon.vue3.js +29 -0
- package/dist/components/icons/RuiIcon.vue3.js.map +1 -0
- package/dist/components/index.d.ts +45 -45
- package/dist/components/index.js +92 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/loaders/RuiSkeletonBase.vue.js +11 -0
- package/dist/components/loaders/RuiSkeletonBase.vue.js.map +1 -0
- package/dist/components/loaders/RuiSkeletonBase.vue2.js +22 -0
- package/dist/components/loaders/RuiSkeletonBase.vue2.js.map +1 -0
- package/dist/components/loaders/RuiSkeletonBase.vue3.js +12 -0
- package/dist/components/loaders/RuiSkeletonBase.vue3.js.map +1 -0
- package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +1 -1
- package/dist/components/loaders/RuiSkeletonLoader.vue.js +11 -0
- package/dist/components/loaders/RuiSkeletonLoader.vue.js.map +1 -0
- package/dist/components/loaders/RuiSkeletonLoader.vue2.js +47 -0
- package/dist/components/loaders/RuiSkeletonLoader.vue2.js.map +1 -0
- package/dist/components/loaders/RuiSkeletonLoader.vue3.js +33 -0
- package/dist/components/loaders/RuiSkeletonLoader.vue3.js.map +1 -0
- package/dist/components/logos/RuiLogo.vue.js +114 -0
- package/dist/components/logos/RuiLogo.vue.js.map +1 -0
- package/dist/components/logos/RuiLogo.vue2.js +5 -0
- package/dist/components/logos/RuiLogo.vue2.js.map +1 -0
- package/dist/components/logos/logo.svg.js +5 -0
- package/dist/components/logos/logo.svg.js.map +1 -0
- package/dist/components/overlays/badge/RuiBadge.vue.d.ts +2 -2
- package/dist/components/overlays/badge/RuiBadge.vue.js +11 -0
- package/dist/components/overlays/badge/RuiBadge.vue.js.map +1 -0
- package/dist/components/overlays/badge/RuiBadge.vue2.js +95 -0
- package/dist/components/overlays/badge/RuiBadge.vue2.js.map +1 -0
- package/dist/components/overlays/badge/RuiBadge.vue3.js +77 -0
- package/dist/components/overlays/badge/RuiBadge.vue3.js.map +1 -0
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js +34 -0
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js.map +1 -0
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue2.js +5 -0
- package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue2.js.map +1 -0
- package/dist/components/overlays/dialog/RuiDialog.vue.js +11 -0
- package/dist/components/overlays/dialog/RuiDialog.vue.js.map +1 -0
- package/dist/components/overlays/dialog/RuiDialog.vue2.js +172 -0
- package/dist/components/overlays/dialog/RuiDialog.vue2.js.map +1 -0
- package/dist/components/overlays/dialog/RuiDialog.vue3.js +18 -0
- package/dist/components/overlays/dialog/RuiDialog.vue3.js.map +1 -0
- package/dist/components/overlays/menu/RuiMenu.vue.d.ts +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue.js +11 -0
- package/dist/components/overlays/menu/RuiMenu.vue.js.map +1 -0
- package/dist/components/overlays/menu/RuiMenu.vue2.js +221 -0
- package/dist/components/overlays/menu/RuiMenu.vue2.js.map +1 -0
- package/dist/components/overlays/menu/RuiMenu.vue3.js +21 -0
- package/dist/components/overlays/menu/RuiMenu.vue3.js.map +1 -0
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.js +11 -0
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.js.map +1 -0
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js +112 -0
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js.map +1 -0
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue3.js +28 -0
- package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue3.js.map +1 -0
- package/dist/components/overlays/notification/RuiNotification.vue.js +74 -0
- package/dist/components/overlays/notification/RuiNotification.vue.js.map +1 -0
- package/dist/components/overlays/notification/RuiNotification.vue2.js +5 -0
- package/dist/components/overlays/notification/RuiNotification.vue2.js.map +1 -0
- package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +1 -1
- package/dist/components/overlays/tooltip/RuiTooltip.vue.js +11 -0
- package/dist/components/overlays/tooltip/RuiTooltip.vue.js.map +1 -0
- package/dist/components/overlays/tooltip/RuiTooltip.vue2.js +105 -0
- package/dist/components/overlays/tooltip/RuiTooltip.vue2.js.map +1 -0
- package/dist/components/overlays/tooltip/RuiTooltip.vue3.js +27 -0
- package/dist/components/overlays/tooltip/RuiTooltip.vue3.js.map +1 -0
- package/dist/components/progress/RuiProgress.vue.d.ts +1 -1
- package/dist/components/progress/RuiProgress.vue.js +11 -0
- package/dist/components/progress/RuiProgress.vue.js.map +1 -0
- package/dist/components/progress/RuiProgress.vue2.js +98 -0
- package/dist/components/progress/RuiProgress.vue2.js.map +1 -0
- package/dist/components/progress/RuiProgress.vue3.js +48 -0
- package/dist/components/progress/RuiProgress.vue3.js.map +1 -0
- package/dist/components/steppers/RuiFooterStepper.vue.js +11 -0
- package/dist/components/steppers/RuiFooterStepper.vue.js.map +1 -0
- package/dist/components/steppers/RuiFooterStepper.vue2.js +143 -0
- package/dist/components/steppers/RuiFooterStepper.vue2.js.map +1 -0
- package/dist/components/steppers/RuiFooterStepper.vue3.js +31 -0
- package/dist/components/steppers/RuiFooterStepper.vue3.js.map +1 -0
- package/dist/components/steppers/RuiStepper.vue.d.ts +1 -1
- package/dist/components/steppers/RuiStepper.vue.js +11 -0
- package/dist/components/steppers/RuiStepper.vue.js.map +1 -0
- package/dist/components/steppers/RuiStepper.vue2.js +130 -0
- package/dist/components/steppers/RuiStepper.vue2.js.map +1 -0
- package/dist/components/steppers/RuiStepper.vue3.js +58 -0
- package/dist/components/steppers/RuiStepper.vue3.js.map +1 -0
- package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +1 -1
- package/dist/components/steppers/RuiStepperCustomIcon.vue.js +11 -0
- package/dist/components/steppers/RuiStepperCustomIcon.vue.js.map +1 -0
- package/dist/components/steppers/RuiStepperCustomIcon.vue2.js +38 -0
- package/dist/components/steppers/RuiStepperCustomIcon.vue2.js.map +1 -0
- package/dist/components/steppers/RuiStepperCustomIcon.vue3.js +15 -0
- package/dist/components/steppers/RuiStepperCustomIcon.vue3.js.map +1 -0
- package/dist/components/steppers/RuiStepperIcon.vue.d.ts +1 -1
- package/dist/components/steppers/RuiStepperIcon.vue.js +11 -0
- package/dist/components/steppers/RuiStepperIcon.vue.js.map +1 -0
- package/dist/components/steppers/RuiStepperIcon.vue2.js +43 -0
- package/dist/components/steppers/RuiStepperIcon.vue2.js.map +1 -0
- package/dist/components/steppers/RuiStepperIcon.vue3.js +21 -0
- package/dist/components/steppers/RuiStepperIcon.vue3.js.map +1 -0
- package/dist/components/tables/RuiDataTable.vue.d.ts +2 -2
- package/dist/components/tables/RuiDataTable.vue.js +11 -0
- package/dist/components/tables/RuiDataTable.vue.js.map +1 -0
- package/dist/components/tables/RuiDataTable.vue2.js +943 -0
- package/dist/components/tables/RuiDataTable.vue2.js.map +1 -0
- package/dist/components/tables/RuiDataTable.vue3.js +79 -0
- package/dist/components/tables/RuiDataTable.vue3.js.map +1 -0
- package/dist/components/tables/RuiExpandButton.vue.d.ts +1 -1
- package/dist/components/tables/RuiExpandButton.vue.js +11 -0
- package/dist/components/tables/RuiExpandButton.vue.js.map +1 -0
- package/dist/components/tables/RuiExpandButton.vue2.js +42 -0
- package/dist/components/tables/RuiExpandButton.vue2.js.map +1 -0
- package/dist/components/tables/RuiExpandButton.vue3.js +15 -0
- package/dist/components/tables/RuiExpandButton.vue3.js.map +1 -0
- package/dist/components/tables/RuiTableHead.vue.js +11 -0
- package/dist/components/tables/RuiTableHead.vue.js.map +1 -0
- package/dist/components/tables/RuiTableHead.vue2.js +195 -0
- package/dist/components/tables/RuiTableHead.vue2.js.map +1 -0
- package/dist/components/tables/RuiTableHead.vue3.js +69 -0
- package/dist/components/tables/RuiTableHead.vue3.js.map +1 -0
- package/dist/components/tables/RuiTablePagination.vue.js +11 -0
- package/dist/components/tables/RuiTablePagination.vue.js.map +1 -0
- package/dist/components/tables/RuiTablePagination.vue2.js +196 -0
- package/dist/components/tables/RuiTablePagination.vue2.js.map +1 -0
- package/dist/components/tables/RuiTablePagination.vue3.js +28 -0
- package/dist/components/tables/RuiTablePagination.vue3.js.map +1 -0
- package/dist/components/tables/table_no_data_placeholder.svg.js +5 -0
- package/dist/components/tables/table_no_data_placeholder.svg.js.map +1 -0
- package/dist/components/tables/table_no_data_placeholder_dark.svg.js +5 -0
- package/dist/components/tables/table_no_data_placeholder_dark.svg.js.map +1 -0
- package/dist/components/tabs/tab/RuiTab.vue.d.ts +1 -1
- package/dist/components/tabs/tab/RuiTab.vue.js +11 -0
- package/dist/components/tabs/tab/RuiTab.vue.js.map +1 -0
- package/dist/components/tabs/tab/RuiTab.vue2.js +135 -0
- package/dist/components/tabs/tab/RuiTab.vue2.js.map +1 -0
- package/dist/components/tabs/tab/RuiTab.vue3.js +17 -0
- package/dist/components/tabs/tab/RuiTab.vue3.js.map +1 -0
- package/dist/components/tabs/tab-item/RuiTabItem.vue.js +11 -0
- package/dist/components/tabs/tab-item/RuiTabItem.vue.js.map +1 -0
- package/dist/components/tabs/tab-item/RuiTabItem.vue2.js +51 -0
- package/dist/components/tabs/tab-item/RuiTabItem.vue2.js.map +1 -0
- package/dist/components/tabs/tab-item/RuiTabItem.vue3.js +9 -0
- package/dist/components/tabs/tab-item/RuiTabItem.vue3.js.map +1 -0
- package/dist/components/tabs/tab-items/RuiTabItems.vue.js +11 -0
- package/dist/components/tabs/tab-items/RuiTabItems.vue.js.map +1 -0
- package/dist/components/tabs/tab-items/RuiTabItems.vue2.js +90 -0
- package/dist/components/tabs/tab-items/RuiTabItems.vue2.js.map +1 -0
- package/dist/components/tabs/tab-items/RuiTabItems.vue3.js +9 -0
- package/dist/components/tabs/tab-items/RuiTabItems.vue3.js.map +1 -0
- package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +1 -1
- package/dist/components/tabs/tabs/RuiTabs.vue.js +11 -0
- package/dist/components/tabs/tabs/RuiTabs.vue.js.map +1 -0
- package/dist/components/tabs/tabs/RuiTabs.vue2.js +281 -0
- package/dist/components/tabs/tabs/RuiTabs.vue2.js.map +1 -0
- package/dist/components/tabs/tabs/RuiTabs.vue3.js +20 -0
- package/dist/components/tabs/tabs/RuiTabs.vue3.js.map +1 -0
- package/dist/components/time-picker/RuiTimePicker.vue.d.ts +1 -1
- package/dist/components/time-picker/RuiTimePicker.vue.js +11 -0
- package/dist/components/time-picker/RuiTimePicker.vue.js.map +1 -0
- package/dist/components/time-picker/RuiTimePicker.vue2.js +414 -0
- package/dist/components/time-picker/RuiTimePicker.vue2.js.map +1 -0
- package/dist/components/time-picker/RuiTimePicker.vue3.js +21 -0
- package/dist/components/time-picker/RuiTimePicker.vue3.js.map +1 -0
- package/dist/composables/breakpoint.js +49 -0
- package/dist/composables/breakpoint.js.map +1 -0
- package/dist/composables/defaults/table.js +23 -0
- package/dist/composables/defaults/table.js.map +1 -0
- package/dist/composables/dropdown-menu.js +218 -0
- package/dist/composables/dropdown-menu.js.map +1 -0
- package/dist/composables/forms/auto-complete/focus.js +71 -0
- package/dist/composables/forms/auto-complete/focus.js.map +1 -0
- package/dist/composables/forms/auto-complete/index.d.ts +4 -4
- package/dist/composables/forms/auto-complete/keyboard-navigation.js +133 -0
- package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -0
- package/dist/composables/forms/auto-complete/search.js +93 -0
- package/dist/composables/forms/auto-complete/search.js.map +1 -0
- package/dist/composables/forms/auto-complete/value.js +129 -0
- package/dist/composables/forms/auto-complete/value.js.map +1 -0
- package/dist/composables/icons.js +60 -0
- package/dist/composables/icons.js.map +1 -0
- package/dist/composables/index.d.ts +3 -3
- package/dist/composables/index.js +9 -0
- package/dist/composables/index.js.map +1 -0
- package/dist/composables/popper.js +164 -0
- package/dist/composables/popper.js.map +1 -0
- package/dist/composables/sticky-header.js +105 -0
- package/dist/composables/sticky-header.js.map +1 -0
- package/dist/composables/theme.d.ts +1 -1
- package/dist/composables/theme.js +75 -0
- package/dist/composables/theme.js.map +1 -0
- package/dist/composables/timeout-manager.js +21 -0
- package/dist/composables/timeout-manager.js.map +1 -0
- package/dist/composables/use-rui-i18n.js +24 -0
- package/dist/composables/use-rui-i18n.js.map +1 -0
- package/dist/consts/colors.js +50 -0
- package/dist/consts/colors.js.map +1 -0
- package/dist/consts/time-accuracy.js +9 -0
- package/dist/consts/time-accuracy.js.map +1 -0
- package/dist/i18n/keys.js +20 -0
- package/dist/i18n/keys.js.map +1 -0
- package/dist/icons/icons_1.js +2503 -0
- package/dist/icons/icons_1.js.map +1 -0
- package/dist/icons/icons_2.js +2503 -0
- package/dist/icons/icons_2.js.map +1 -0
- package/dist/icons/icons_3.js +2503 -0
- package/dist/icons/icons_3.js.map +1 -0
- package/dist/icons/icons_4.js +923 -0
- package/dist/icons/icons_4.js.map +1 -0
- package/dist/icons/index.d.ts +4 -4
- package/dist/icons/index.js +9 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/index.d.ts +11 -11
- package/dist/index.js +1852 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +12852 -1
- package/dist/theme/index.js +185 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/types/stepper.js +17 -0
- package/dist/types/stepper.js.map +1 -0
- package/dist/types/theme.js +27 -0
- package/dist/types/theme.js.map +1 -0
- package/dist/utils/assert.js +14 -0
- package/dist/utils/assert.js.map +1 -0
- package/dist/utils/blockie.js +79 -0
- package/dist/utils/blockie.js.map +1 -0
- package/dist/utils/form-text-detail.js +31 -0
- package/dist/utils/form-text-detail.js.map +1 -0
- package/dist/utils/generate-id.js +21 -0
- package/dist/utils/generate-id.js.map +1 -0
- package/dist/utils/helpers.js +51 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/is-equal.js +33 -0
- package/dist/utils/is-equal.js.map +1 -0
- package/dist/web-types.json +1 -1
- package/package.json +16 -14
- package/dist/components/index.es.js +0 -8030
- package/dist/composables/index-CC7A7CEh.js +0 -737
- package/dist/composables/index.es.js +0 -7
- package/dist/consts/colors-D563Ic3q.js +0 -48
- package/dist/consts/forms/auto-complete/index-l0sNRNKZ.js +0 -2
- package/dist/consts/time-accuracy-BnKA5GyT.js +0 -9
- package/dist/i18n/keys-CNGXWOJX.js +0 -20
- package/dist/icons/icons_1.es.js +0 -2004
- package/dist/icons/icons_2.es.js +0 -2004
- package/dist/icons/icons_3.es.js +0 -2004
- package/dist/icons/icons_4.es.js +0 -740
- package/dist/icons/index.es.js +0 -1697
- package/dist/index-D7l4d7N2.js +0 -54
- package/dist/index.es.js +0 -1757
- package/dist/theme/index.es.js +0 -177
- package/dist/types/index-CN6Ip1GL.js +0 -39
- package/dist/utils/index-DJ-ueLCs.js +0 -158
- package/dist/vendor-Hqbg5uCG.js +0 -1931
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { computed, ref, watch, nextTick } from "vue";
|
|
2
|
+
import { get, set } from "@vueuse/shared";
|
|
3
|
+
import { useVirtualList, useArrayMap, watchOnce } from "@vueuse/core";
|
|
4
|
+
function useDropdownOptionProperty({
|
|
5
|
+
keyAttr,
|
|
6
|
+
textAttr
|
|
7
|
+
}) {
|
|
8
|
+
function getText(item) {
|
|
9
|
+
if (textAttr) {
|
|
10
|
+
if (typeof textAttr === "function")
|
|
11
|
+
return textAttr(item);
|
|
12
|
+
else
|
|
13
|
+
return item[textAttr]?.toString();
|
|
14
|
+
}
|
|
15
|
+
return item?.toString();
|
|
16
|
+
}
|
|
17
|
+
function getIdentifier(item) {
|
|
18
|
+
if (keyAttr)
|
|
19
|
+
return item[keyAttr];
|
|
20
|
+
return item;
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
getIdentifier,
|
|
24
|
+
getText
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function useDropdownMenu({
|
|
28
|
+
appendWidth,
|
|
29
|
+
autoFocus,
|
|
30
|
+
autoSelectFirst,
|
|
31
|
+
dense,
|
|
32
|
+
disabled = ref(false),
|
|
33
|
+
hideSelected,
|
|
34
|
+
itemHeight = 48,
|
|
35
|
+
keyAttr,
|
|
36
|
+
menuRef,
|
|
37
|
+
options: allOptions,
|
|
38
|
+
overscan = 5,
|
|
39
|
+
prependWidth,
|
|
40
|
+
setValue,
|
|
41
|
+
textAttr,
|
|
42
|
+
value
|
|
43
|
+
}) {
|
|
44
|
+
const options = computed(() => {
|
|
45
|
+
const options2 = get(allOptions);
|
|
46
|
+
if (!hideSelected)
|
|
47
|
+
return options2;
|
|
48
|
+
return options2.filter((item) => !isActiveItem(item));
|
|
49
|
+
});
|
|
50
|
+
const { getIdentifier, getText } = useDropdownOptionProperty({
|
|
51
|
+
keyAttr,
|
|
52
|
+
textAttr
|
|
53
|
+
});
|
|
54
|
+
const { containerProps, list, scrollTo, wrapperProps } = useVirtualList(
|
|
55
|
+
options,
|
|
56
|
+
{
|
|
57
|
+
itemHeight,
|
|
58
|
+
overscan
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
const renderedData = useArrayMap(list, ({ data, index: _index }) => ({ _index, item: data }));
|
|
62
|
+
const isOpen = ref(false);
|
|
63
|
+
const valueKey = computed(() => {
|
|
64
|
+
const selected = get(value);
|
|
65
|
+
if (!keyAttr || !selected)
|
|
66
|
+
return selected;
|
|
67
|
+
return Array.isArray(selected) ? selected.map((item) => item[keyAttr]) : selected[keyAttr];
|
|
68
|
+
});
|
|
69
|
+
const highlightedIndex = ref(get(autoSelectFirst) ? 0 : -1);
|
|
70
|
+
const menuWidth = computed(() => {
|
|
71
|
+
const widths = { max: 0, min: 0 };
|
|
72
|
+
const maxWidth = 30;
|
|
73
|
+
const paddingX = 1.5;
|
|
74
|
+
const fontMultiplier = get(dense) ? 12 : 13;
|
|
75
|
+
get(options).forEach((option) => {
|
|
76
|
+
const length = getText(option)?.toString()?.length ?? 0;
|
|
77
|
+
if (widths.min === 0 && widths.max === 0) {
|
|
78
|
+
widths.min = length;
|
|
79
|
+
widths.max = length;
|
|
80
|
+
} else if (length < widths.min) {
|
|
81
|
+
widths.min = length;
|
|
82
|
+
} else if (length > widths.max) {
|
|
83
|
+
widths.max = length;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
const difference = widths.max - widths.min;
|
|
87
|
+
function computeValue(width) {
|
|
88
|
+
const additionalWidths = (prependWidth ? prependWidth + 0.5 : 0) + (appendWidth ? appendWidth + 0.5 : 0);
|
|
89
|
+
return `${Math.min(width * fontMultiplier / 16 + paddingX + additionalWidths, maxWidth)}rem`;
|
|
90
|
+
}
|
|
91
|
+
if (difference <= 5)
|
|
92
|
+
return computeValue(widths.max);
|
|
93
|
+
return computeValue(widths.min + difference / 2);
|
|
94
|
+
});
|
|
95
|
+
function toggle(state = false) {
|
|
96
|
+
set(isOpen, state);
|
|
97
|
+
}
|
|
98
|
+
function itemIndexInValue(item) {
|
|
99
|
+
const val = get(value);
|
|
100
|
+
const selected = Array.isArray(val) ? val : val ? [val] : [];
|
|
101
|
+
if (selected.length === 0)
|
|
102
|
+
return -1;
|
|
103
|
+
return selected.findIndex((selectedItem) => {
|
|
104
|
+
if (keyAttr)
|
|
105
|
+
return selectedItem[keyAttr] === item[keyAttr];
|
|
106
|
+
return selectedItem === item;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
function isActiveItem(item) {
|
|
110
|
+
return itemIndexInValue(item) !== -1;
|
|
111
|
+
}
|
|
112
|
+
async function adjustScrollByHighlightedIndex(smooth = false) {
|
|
113
|
+
const index = get(highlightedIndex);
|
|
114
|
+
if (index > -1) {
|
|
115
|
+
await nextTick(() => {
|
|
116
|
+
const container = get(menuRef)?.parentElement;
|
|
117
|
+
if (container) {
|
|
118
|
+
const highlightedElem = get(menuRef).getElementsByClassName("highlighted")[0];
|
|
119
|
+
if (highlightedElem) {
|
|
120
|
+
highlightedElem.scrollIntoView?.({ behavior: smooth ? "smooth" : "auto", block: "nearest" });
|
|
121
|
+
if (get(autoFocus) && "focus" in highlightedElem && typeof highlightedElem.focus === "function")
|
|
122
|
+
highlightedElem?.focus();
|
|
123
|
+
} else {
|
|
124
|
+
scrollTo(index);
|
|
125
|
+
if (get(autoFocus)) {
|
|
126
|
+
const elem = get(menuRef).getElementsByClassName("highlighted")[0];
|
|
127
|
+
if (elem && "focus" in elem && typeof elem.focus === "function")
|
|
128
|
+
elem.focus();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function updateOpen(open) {
|
|
136
|
+
await nextTick(() => {
|
|
137
|
+
if (open) {
|
|
138
|
+
const val = get(value);
|
|
139
|
+
if (Array.isArray(val) && val.length > 0 || !!val) {
|
|
140
|
+
const index = get(options).findIndex(isActiveItem);
|
|
141
|
+
if (index > -1)
|
|
142
|
+
set(highlightedIndex, index);
|
|
143
|
+
}
|
|
144
|
+
watchOnce(list, async () => {
|
|
145
|
+
await adjustScrollByHighlightedIndex();
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
watch([isOpen, disabled], async ([open, _]) => {
|
|
151
|
+
await updateOpen(open);
|
|
152
|
+
});
|
|
153
|
+
watch(highlightedIndex, async (curr, prev) => {
|
|
154
|
+
if (curr !== prev)
|
|
155
|
+
await adjustScrollByHighlightedIndex(true);
|
|
156
|
+
});
|
|
157
|
+
watch(options, async () => {
|
|
158
|
+
if (get(highlightedIndex) !== -1) {
|
|
159
|
+
if (get(autoSelectFirst)) {
|
|
160
|
+
set(highlightedIndex, 0);
|
|
161
|
+
await adjustScrollByHighlightedIndex();
|
|
162
|
+
} else {
|
|
163
|
+
set(highlightedIndex, -1);
|
|
164
|
+
scrollTo(0);
|
|
165
|
+
}
|
|
166
|
+
} else {
|
|
167
|
+
scrollTo(0);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
const moveHighlight = (up) => {
|
|
171
|
+
if (!get(isOpen)) {
|
|
172
|
+
toggle(true);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
let position = get(highlightedIndex);
|
|
176
|
+
const move = up ? -1 : 1;
|
|
177
|
+
position += move;
|
|
178
|
+
const total = get(options).length;
|
|
179
|
+
if (position >= total)
|
|
180
|
+
set(highlightedIndex, 0);
|
|
181
|
+
else if (position < 0)
|
|
182
|
+
set(highlightedIndex, total - 1);
|
|
183
|
+
else
|
|
184
|
+
set(highlightedIndex, position);
|
|
185
|
+
};
|
|
186
|
+
const applyHighlighted = () => {
|
|
187
|
+
if (!setValue || !get(isOpen))
|
|
188
|
+
return;
|
|
189
|
+
const highlightedIndexVal = get(highlightedIndex);
|
|
190
|
+
if (highlightedIndexVal === -1)
|
|
191
|
+
return;
|
|
192
|
+
const entry = get(options).find((_data, index) => highlightedIndexVal === index);
|
|
193
|
+
if (entry)
|
|
194
|
+
setValue(entry);
|
|
195
|
+
};
|
|
196
|
+
return {
|
|
197
|
+
applyHighlighted,
|
|
198
|
+
containerProps,
|
|
199
|
+
getIdentifier,
|
|
200
|
+
getText,
|
|
201
|
+
highlightedIndex,
|
|
202
|
+
isActiveItem,
|
|
203
|
+
isOpen,
|
|
204
|
+
itemIndexInValue,
|
|
205
|
+
menuWidth,
|
|
206
|
+
moveHighlight,
|
|
207
|
+
optionsWithSelectedHidden: options,
|
|
208
|
+
renderedData,
|
|
209
|
+
toggle,
|
|
210
|
+
valueKey,
|
|
211
|
+
wrapperProps
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
export {
|
|
215
|
+
useDropdownMenu,
|
|
216
|
+
useDropdownOptionProperty
|
|
217
|
+
};
|
|
218
|
+
//# sourceMappingURL=dropdown-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dropdown-menu.js","sources":["../../src/composables/dropdown-menu.ts"],"sourcesContent":["import type { Ref } from 'vue';\n\nexport type KeyOfType<T, V> = T extends string | number | boolean | symbol | null | undefined\n ? never\n : V extends object\n ? keyof T\n : keyof {\n [P in keyof T as T[P] extends V\n ? P\n : V extends T[P]\n ? P\n : never]: any\n };\n\nexport interface DropdownItemAttr<TValue, TItem> {\n keyAttr?: KeyOfType<TItem, TValue extends Array<infer U> ? U : TValue>;\n textAttr?: keyof TItem | ((item: TItem) => string);\n}\n\nexport interface DropdownOptions<TValue, TItem> {\n options: Ref<TItem[]>;\n dense?: Ref<boolean>;\n disabled?: Ref<boolean>;\n value: Ref<TItem | TItem[] | undefined>;\n menuRef: Ref<HTMLElement>;\n keyAttr?: KeyOfType<TItem, TValue extends Array<infer U> ? U : TValue>;\n textAttr?: keyof TItem | ((item: TItem) => string);\n appendWidth?: number;\n prependWidth?: number;\n itemHeight?: number;\n overscan?: number;\n autoSelectFirst?: boolean;\n autoFocus?: boolean;\n setValue?: (val: TItem) => void;\n hideSelected?: boolean;\n}\n\nexport function useDropdownOptionProperty<TValue, TItem>({\n keyAttr,\n textAttr,\n}: DropdownItemAttr<TValue, TItem>) {\n function getText(item: TItem): string | undefined {\n if (textAttr) {\n if (typeof textAttr === 'function')\n return textAttr(item);\n\n else\n return item[textAttr]?.toString();\n }\n\n return item?.toString();\n }\n\n function getIdentifier(item: TItem): TItem | TItem[KeyOfType<TItem, TValue extends Array<infer U> ? U : TValue>] {\n if (keyAttr)\n return item[keyAttr];\n\n return item;\n }\n\n return {\n getIdentifier,\n getText,\n };\n}\n\nexport function useDropdownMenu<TValue, TItem>({\n appendWidth,\n autoFocus,\n autoSelectFirst,\n dense,\n disabled = ref(false),\n hideSelected,\n itemHeight = 48,\n keyAttr,\n menuRef,\n options: allOptions,\n overscan = 5,\n prependWidth,\n setValue,\n textAttr,\n value,\n}: DropdownOptions<TValue, TItem>) {\n const options = computed(() => {\n const options = get(allOptions);\n if (!hideSelected)\n return options;\n\n return options.filter(item => !isActiveItem(item));\n });\n\n const { getIdentifier, getText } = useDropdownOptionProperty({\n keyAttr,\n textAttr,\n });\n\n const { containerProps, list, scrollTo, wrapperProps } = useVirtualList<TItem>(\n options,\n {\n itemHeight,\n overscan,\n },\n );\n\n const renderedData = useArrayMap(list, ({ data, index: _index }) => ({ _index, item: data }));\n\n const isOpen = ref(false);\n\n const valueKey = computed(() => {\n const selected = get(value);\n if (!keyAttr || !selected)\n return selected;\n return Array.isArray(selected) ? selected.map(item => item[keyAttr]) : selected[keyAttr];\n });\n\n const highlightedIndex: Ref<number> = ref(get(autoSelectFirst) ? 0 : -1);\n\n const menuWidth = computed(() => {\n const widths = { max: 0, min: 0 };\n const maxWidth = 30;\n const paddingX = 1.5;\n const fontMultiplier = get(dense) ? 12 : 13;\n\n get(options).forEach((option) => {\n const length = getText(option)?.toString()?.length ?? 0;\n if (widths.min === 0 && widths.max === 0) {\n widths.min = length;\n widths.max = length;\n }\n else if (length < widths.min) {\n widths.min = length;\n }\n else if (length > widths.max) {\n widths.max = length;\n }\n });\n\n const difference = widths.max - widths.min;\n\n function computeValue(width: number) {\n const additionalWidths = (prependWidth ? prependWidth + 0.5 : 0) + (appendWidth ? appendWidth + 0.5 : 0);\n return `${Math.min((width * fontMultiplier) / 16 + paddingX + additionalWidths, maxWidth)}rem`;\n }\n\n if (difference <= 5)\n return computeValue(widths.max);\n\n return computeValue(widths.min + difference / 2);\n });\n\n function toggle(state: boolean = false) {\n set(isOpen, state);\n }\n\n function itemIndexInValue(item: TItem): number {\n const val = get(value);\n const selected: TItem[] = Array.isArray(val) ? val : (val ? [val] : []);\n\n if (selected.length === 0)\n return -1;\n\n return selected.findIndex((selectedItem) => {\n if (keyAttr)\n return selectedItem[keyAttr] === item[keyAttr];\n return selectedItem === item;\n });\n }\n\n function isActiveItem(item: TItem): boolean {\n return itemIndexInValue(item) !== -1;\n }\n\n async function adjustScrollByHighlightedIndex(smooth: boolean = false) {\n const index = get(highlightedIndex);\n if (index > -1) {\n await nextTick(() => {\n const container = get(menuRef)?.parentElement;\n if (container) {\n const highlightedElem = get(menuRef).getElementsByClassName('highlighted')[0];\n\n if (highlightedElem) {\n highlightedElem.scrollIntoView?.({ behavior: smooth ? 'smooth' : 'auto', block: 'nearest' });\n if (get(autoFocus) && 'focus' in highlightedElem && typeof highlightedElem.focus === 'function')\n highlightedElem?.focus();\n }\n else {\n scrollTo(index);\n if (get(autoFocus)) {\n const elem = get(menuRef).getElementsByClassName('highlighted')[0];\n if (elem && 'focus' in elem && typeof elem.focus === 'function')\n elem.focus();\n }\n }\n }\n });\n }\n }\n\n async function updateOpen(open: boolean) {\n await nextTick(() => {\n if (open) {\n const val = get(value);\n\n // set highlighted index to active item\n if ((Array.isArray(val) && val.length > 0) || !!val) {\n const index = get(options).findIndex(isActiveItem);\n if (index > -1)\n set(highlightedIndex, index);\n }\n\n watchOnce(list, async () => {\n await adjustScrollByHighlightedIndex();\n });\n }\n });\n }\n\n watch([isOpen, disabled], async ([open, _]) => {\n await updateOpen(open);\n });\n\n watch(highlightedIndex, async (curr, prev) => {\n if (curr !== prev)\n await adjustScrollByHighlightedIndex(true);\n });\n\n watch(options, async () => {\n if (get(highlightedIndex) !== -1) {\n if (get(autoSelectFirst)) {\n set(highlightedIndex, 0);\n await adjustScrollByHighlightedIndex();\n }\n else {\n set(highlightedIndex, -1);\n scrollTo(0);\n }\n }\n else {\n scrollTo(0);\n }\n });\n\n const moveHighlight = (up: boolean) => {\n if (!get(isOpen)) {\n toggle(true);\n return;\n }\n\n let position = get(highlightedIndex);\n const move = up ? -1 : 1;\n\n position += move;\n\n const total = get(options).length;\n\n if (position >= total)\n set(highlightedIndex, 0);\n else if (position < 0)\n set(highlightedIndex, total - 1);\n else\n set(highlightedIndex, position);\n };\n\n const applyHighlighted = () => {\n if (!setValue || !get(isOpen))\n return;\n\n const highlightedIndexVal = get(highlightedIndex);\n if (highlightedIndexVal === -1)\n return;\n\n const entry = get(options).find((_data, index) => highlightedIndexVal === index);\n if (entry)\n setValue(entry);\n };\n\n return {\n applyHighlighted,\n containerProps,\n getIdentifier,\n getText,\n highlightedIndex,\n isActiveItem,\n isOpen,\n itemIndexInValue,\n menuWidth,\n moveHighlight,\n optionsWithSelectedHidden: options,\n renderedData,\n toggle,\n valueKey,\n wrapperProps,\n };\n}\n"],"names":["options"],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { computed, nextTick } from "vue";
|
|
2
|
+
import { get, set } from "@vueuse/shared";
|
|
3
|
+
import { watchDebounced } from "@vueuse/core";
|
|
4
|
+
function useAutoCompleteFocus(options, deps) {
|
|
5
|
+
const anyFocused = computed(
|
|
6
|
+
() => get(deps.activatorFocusedWithin) || get(deps.menuWrapperFocusedWithin)
|
|
7
|
+
);
|
|
8
|
+
const inputClass = computed(() => {
|
|
9
|
+
const isFocused = get(anyFocused);
|
|
10
|
+
const isDisabled = get(options.disabled);
|
|
11
|
+
const shouldApply = get(options.shouldApplyValueAsSearch);
|
|
12
|
+
const hasSearch = get(deps.internalSearch);
|
|
13
|
+
if ((!isFocused || isDisabled) && !shouldApply)
|
|
14
|
+
return "w-0 h-0";
|
|
15
|
+
if (hasSearch)
|
|
16
|
+
return "flex-1 min-w-[4rem]";
|
|
17
|
+
return "flex-1 min-w-0";
|
|
18
|
+
});
|
|
19
|
+
async function setInputFocus() {
|
|
20
|
+
await nextTick(() => {
|
|
21
|
+
set(deps.searchInputFocused, true);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async function onActivatorFocused() {
|
|
25
|
+
await nextTick(() => {
|
|
26
|
+
if (!get(deps.activatorFocused)) {
|
|
27
|
+
set(deps.searchInputFocused, true);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function onInputFocused() {
|
|
32
|
+
set(deps.focusedValueIndex, -1);
|
|
33
|
+
const shouldApply = get(options.shouldApplyValueAsSearch);
|
|
34
|
+
if (shouldApply) {
|
|
35
|
+
const textInput = get(deps.textInput);
|
|
36
|
+
textInput?.select();
|
|
37
|
+
}
|
|
38
|
+
if (!get(deps.isOpen)) {
|
|
39
|
+
set(deps.justOpened, true);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
watchDebounced(anyFocused, (focused) => {
|
|
43
|
+
if (!focused) {
|
|
44
|
+
set(deps.isOpen, false);
|
|
45
|
+
const customValue = get(options.customValue);
|
|
46
|
+
const filteredOptions = get(deps.filteredOptions);
|
|
47
|
+
const internalSearch = get(deps.internalSearch);
|
|
48
|
+
if (customValue && filteredOptions.length === 0 && internalSearch) {
|
|
49
|
+
deps.setSearchAsValue();
|
|
50
|
+
}
|
|
51
|
+
const shouldApply = get(options.shouldApplyValueAsSearch);
|
|
52
|
+
if (!shouldApply) {
|
|
53
|
+
deps.updateInternalSearch();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}, {
|
|
57
|
+
debounce: 200,
|
|
58
|
+
maxWait: 400
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
anyFocused,
|
|
62
|
+
inputClass,
|
|
63
|
+
onActivatorFocused,
|
|
64
|
+
onInputFocused,
|
|
65
|
+
setInputFocus
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
useAutoCompleteFocus
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=focus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus.js","sources":["../../../../src/composables/forms/auto-complete/focus.ts"],"sourcesContent":["import type { ComputedRef, MaybeRef, Ref } from 'vue';\n\nexport interface UseAutoCompleteFocusOptions {\n customValue: MaybeRef<boolean>;\n shouldApplyValueAsSearch: MaybeRef<boolean>;\n disabled: MaybeRef<boolean>;\n}\n\nexport interface UseAutoCompleteFocusDeps<TItem> {\n activatorFocused: Ref<boolean>;\n activatorFocusedWithin: Ref<boolean>;\n focusedValueIndex: Ref<number>;\n filteredOptions: Ref<TItem[]>;\n internalSearch: Ref<string>;\n isOpen: Ref<boolean>;\n justOpened: Ref<boolean>;\n menuWrapperFocusedWithin: Ref<boolean>;\n searchInputFocused: Ref<boolean>;\n textInput: Ref<HTMLInputElement | undefined>;\n setSearchAsValue: () => void;\n updateInternalSearch: (value?: string) => void;\n}\n\nexport interface UseAutoCompleteFocusReturn {\n anyFocused: ComputedRef<boolean>;\n inputClass: ComputedRef<string>;\n onActivatorFocused: () => Promise<void>;\n onInputFocused: () => void;\n setInputFocus: () => Promise<void>;\n}\n\nexport function useAutoCompleteFocus<TItem>(\n options: UseAutoCompleteFocusOptions,\n deps: UseAutoCompleteFocusDeps<TItem>,\n): UseAutoCompleteFocusReturn {\n const anyFocused = computed<boolean>(() =>\n get(deps.activatorFocusedWithin) || get(deps.menuWrapperFocusedWithin),\n );\n\n const inputClass = computed<string>(() => {\n const isFocused = get(anyFocused);\n const isDisabled = get(options.disabled);\n const shouldApply = get(options.shouldApplyValueAsSearch);\n const hasSearch = get(deps.internalSearch);\n\n if ((!isFocused || isDisabled) && !shouldApply)\n return 'w-0 h-0';\n if (hasSearch)\n return 'flex-1 min-w-[4rem]';\n return 'flex-1 min-w-0';\n });\n\n async function setInputFocus(): Promise<void> {\n await nextTick(() => {\n set(deps.searchInputFocused, true);\n });\n }\n\n async function onActivatorFocused(): Promise<void> {\n await nextTick(() => {\n if (!get(deps.activatorFocused)) {\n set(deps.searchInputFocused, true);\n }\n });\n }\n\n function onInputFocused(): void {\n set(deps.focusedValueIndex, -1);\n\n const shouldApply = get(options.shouldApplyValueAsSearch);\n if (shouldApply) {\n const textInput = get(deps.textInput);\n textInput?.select();\n }\n\n if (!get(deps.isOpen)) {\n set(deps.justOpened, true);\n }\n }\n\n // Close menu if the activator is not focused anymore\n // Using debounced to avoid the menu closing momentarily while focus switches.\n watchDebounced(anyFocused, (focused) => {\n if (!focused) {\n set(deps.isOpen, false);\n\n const customValue = get(options.customValue);\n const filteredOptions = get(deps.filteredOptions);\n const internalSearch = get(deps.internalSearch);\n\n if (customValue && filteredOptions.length === 0 && internalSearch) {\n deps.setSearchAsValue();\n }\n\n const shouldApply = get(options.shouldApplyValueAsSearch);\n if (!shouldApply) {\n deps.updateInternalSearch();\n }\n }\n }, {\n debounce: 200,\n maxWait: 400,\n });\n\n return {\n anyFocused,\n inputClass,\n onActivatorFocused,\n onInputFocused,\n setInputFocus,\n };\n}\n"],"names":[],"mappings":";;;AA+BO,SAAS,qBACd,SACA,MAC4B;AAC5B,QAAM,aAAa;AAAA,IAAkB,MACnC,IAAI,KAAK,sBAAsB,KAAK,IAAI,KAAK,wBAAwB;AAAA,EAAA;AAGvE,QAAM,aAAa,SAAiB,MAAM;AACxC,UAAM,YAAY,IAAI,UAAU;AAChC,UAAM,aAAa,IAAI,QAAQ,QAAQ;AACvC,UAAM,cAAc,IAAI,QAAQ,wBAAwB;AACxD,UAAM,YAAY,IAAI,KAAK,cAAc;AAEzC,SAAK,CAAC,aAAa,eAAe,CAAC;AACjC,aAAO;AACT,QAAI;AACF,aAAO;AACT,WAAO;AAAA,EACT,CAAC;AAED,iBAAe,gBAA+B;AAC5C,UAAM,SAAS,MAAM;AACnB,UAAI,KAAK,oBAAoB,IAAI;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,iBAAe,qBAAoC;AACjD,UAAM,SAAS,MAAM;AACnB,UAAI,CAAC,IAAI,KAAK,gBAAgB,GAAG;AAC/B,YAAI,KAAK,oBAAoB,IAAI;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,iBAAuB;AAC9B,QAAI,KAAK,mBAAmB,EAAE;AAE9B,UAAM,cAAc,IAAI,QAAQ,wBAAwB;AACxD,QAAI,aAAa;AACf,YAAM,YAAY,IAAI,KAAK,SAAS;AACpC,iBAAW,OAAA;AAAA,IACb;AAEA,QAAI,CAAC,IAAI,KAAK,MAAM,GAAG;AACrB,UAAI,KAAK,YAAY,IAAI;AAAA,IAC3B;AAAA,EACF;AAIA,iBAAe,YAAY,CAAC,YAAY;AACtC,QAAI,CAAC,SAAS;AACZ,UAAI,KAAK,QAAQ,KAAK;AAEtB,YAAM,cAAc,IAAI,QAAQ,WAAW;AAC3C,YAAM,kBAAkB,IAAI,KAAK,eAAe;AAChD,YAAM,iBAAiB,IAAI,KAAK,cAAc;AAE9C,UAAI,eAAe,gBAAgB,WAAW,KAAK,gBAAgB;AACjE,aAAK,iBAAA;AAAA,MACP;AAEA,YAAM,cAAc,IAAI,QAAQ,wBAAwB;AACxD,UAAI,CAAC,aAAa;AAChB,aAAK,qBAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD,UAAU;AAAA,IACV,SAAS;AAAA,EAAA,CACV;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
|
|
@@ -7,7 +7,7 @@ export declare function useAutoCompleteProps<T extends object>(props: {
|
|
|
7
7
|
getTextValue: (item: T) => string | undefined;
|
|
8
8
|
isItemDisabled: (item: T) => boolean;
|
|
9
9
|
};
|
|
10
|
-
export * from './focus';
|
|
11
|
-
export * from './keyboard-navigation';
|
|
12
|
-
export * from './search';
|
|
13
|
-
export * from './value';
|
|
10
|
+
export * from './focus.js';
|
|
11
|
+
export * from './keyboard-navigation.js';
|
|
12
|
+
export * from './search.js';
|
|
13
|
+
export * from './value.js';
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { get, set } from "@vueuse/shared";
|
|
2
|
+
import { ref, watch, nextTick } from "vue";
|
|
3
|
+
function useAutoCompleteKeyboardNavigation(options, deps) {
|
|
4
|
+
const focusedValueIndex = ref(-1);
|
|
5
|
+
const chipElementsCache = ref(/* @__PURE__ */ new Map());
|
|
6
|
+
function setValueFocus(index) {
|
|
7
|
+
set(focusedValueIndex, index);
|
|
8
|
+
}
|
|
9
|
+
function moveSelectedValueHighlight(event, next) {
|
|
10
|
+
const multiple = get(options.multiple);
|
|
11
|
+
const internalSearchValue = get(deps.internalSearch);
|
|
12
|
+
if (!multiple || internalSearchValue.length > 0)
|
|
13
|
+
return;
|
|
14
|
+
event.preventDefault();
|
|
15
|
+
const total = get(deps.value).length;
|
|
16
|
+
let current = get(focusedValueIndex);
|
|
17
|
+
if (current === -1) {
|
|
18
|
+
set(focusedValueIndex, next ? 0 : total - 1);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const move = next ? 1 : -1;
|
|
22
|
+
current += move;
|
|
23
|
+
if (current < 0 || current >= total) {
|
|
24
|
+
set(focusedValueIndex, -1);
|
|
25
|
+
set(deps.searchInputFocused, true);
|
|
26
|
+
} else {
|
|
27
|
+
set(focusedValueIndex, current);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function onEnter(event) {
|
|
31
|
+
const filteredOptions = get(deps.filteredOptions);
|
|
32
|
+
const highlightedIndex = get(deps.highlightedIndex);
|
|
33
|
+
const isOpen = get(deps.isOpen);
|
|
34
|
+
const customValue = get(options.customValue);
|
|
35
|
+
const multiple = get(options.multiple);
|
|
36
|
+
const value = get(deps.value);
|
|
37
|
+
const internalSearch = get(deps.internalSearch);
|
|
38
|
+
if (customValue && internalSearch && isOpen) {
|
|
39
|
+
let hasExactMatch = false;
|
|
40
|
+
if (highlightedIndex > -1 && highlightedIndex < filteredOptions.length) {
|
|
41
|
+
const highlightedOption = filteredOptions[highlightedIndex];
|
|
42
|
+
if (typeof highlightedOption === "string") {
|
|
43
|
+
hasExactMatch = highlightedOption === internalSearch;
|
|
44
|
+
} else if (highlightedOption && typeof highlightedOption === "object") {
|
|
45
|
+
const label = highlightedOption.label || highlightedOption.value || "";
|
|
46
|
+
hasExactMatch = label === internalSearch;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!hasExactMatch) {
|
|
50
|
+
deps.setSearchAsValue();
|
|
51
|
+
if (!multiple)
|
|
52
|
+
set(deps.isOpen, false);
|
|
53
|
+
event.preventDefault();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (filteredOptions.length > 0 && highlightedIndex > -1 && isOpen) {
|
|
58
|
+
deps.applyHighlighted();
|
|
59
|
+
event.preventDefault();
|
|
60
|
+
} else if (filteredOptions.length === 0 && customValue && internalSearch) {
|
|
61
|
+
deps.setSearchAsValue();
|
|
62
|
+
if (!multiple)
|
|
63
|
+
set(deps.isOpen, false);
|
|
64
|
+
event.preventDefault();
|
|
65
|
+
} else if (!isOpen && value.length === 0) {
|
|
66
|
+
set(deps.isOpen, true);
|
|
67
|
+
event.preventDefault();
|
|
68
|
+
} else {
|
|
69
|
+
const activator = get(deps.activator);
|
|
70
|
+
const form = activator?.closest("form");
|
|
71
|
+
if (form) {
|
|
72
|
+
form.dispatchEvent(new Event("submit"));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function onTab(event) {
|
|
77
|
+
const isOpen = get(deps.isOpen);
|
|
78
|
+
const filteredOptions = get(deps.filteredOptions);
|
|
79
|
+
const highlightedIndex = get(deps.highlightedIndex);
|
|
80
|
+
const multiple = get(options.multiple);
|
|
81
|
+
if (isOpen && filteredOptions.length > 0 && highlightedIndex > -1 && !multiple) {
|
|
82
|
+
deps.applyHighlighted();
|
|
83
|
+
event.preventDefault();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function onInputDeletePressed() {
|
|
87
|
+
const internalSearch = get(deps.internalSearch);
|
|
88
|
+
const value = get(deps.value);
|
|
89
|
+
const total = value.length;
|
|
90
|
+
const multiple = get(options.multiple);
|
|
91
|
+
if (!internalSearch && total > 0) {
|
|
92
|
+
if (multiple)
|
|
93
|
+
set(focusedValueIndex, total - 1);
|
|
94
|
+
else
|
|
95
|
+
deps.clear();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
watch(deps.value, () => {
|
|
99
|
+
setValueFocus(-1);
|
|
100
|
+
get(chipElementsCache).clear();
|
|
101
|
+
});
|
|
102
|
+
watch(focusedValueIndex, async (index) => {
|
|
103
|
+
const multiple = get(options.multiple);
|
|
104
|
+
if (index === -1 || !multiple)
|
|
105
|
+
return;
|
|
106
|
+
await nextTick(() => {
|
|
107
|
+
const cache = get(chipElementsCache);
|
|
108
|
+
let activeChip = cache.get(index);
|
|
109
|
+
if (!activeChip) {
|
|
110
|
+
const activator = get(deps.activator);
|
|
111
|
+
const element = activator?.querySelector(`[data-index="${index}"]`);
|
|
112
|
+
if (element) {
|
|
113
|
+
activeChip = element;
|
|
114
|
+
cache.set(index, element);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (activeChip && "focus" in activeChip && typeof activeChip.focus === "function")
|
|
118
|
+
activeChip.focus();
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
focusedValueIndex,
|
|
123
|
+
moveSelectedValueHighlight,
|
|
124
|
+
onEnter,
|
|
125
|
+
onInputDeletePressed,
|
|
126
|
+
onTab,
|
|
127
|
+
setValueFocus
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
export {
|
|
131
|
+
useAutoCompleteKeyboardNavigation
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=keyboard-navigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyboard-navigation.js","sources":["../../../../src/composables/forms/auto-complete/keyboard-navigation.ts"],"sourcesContent":["import type { MaybeRef, Ref } from 'vue';\nimport { get, set } from '@vueuse/shared';\n\nexport interface UseAutoCompleteKeyboardNavigationOptions {\n multiple: MaybeRef<boolean>;\n customValue: MaybeRef<boolean>;\n}\n\nexport interface UseAutoCompleteKeyboardNavigationDeps<TItem> {\n internalSearch: Ref<string>;\n value: Ref<TItem[]>;\n filteredOptions: Ref<TItem[]>;\n options: Ref<TItem[]>;\n isOpen: Ref<boolean>;\n highlightedIndex: Ref<number>;\n searchInputFocused: Ref<boolean>;\n applyHighlighted: () => void;\n clear: () => void;\n setSearchAsValue: () => void;\n activator: Ref<HTMLElement | undefined>;\n}\n\nexport interface UseAutoCompleteKeyboardNavigationReturn {\n focusedValueIndex: Ref<number>;\n moveSelectedValueHighlight: (event: KeyboardEvent, next: boolean) => void;\n onEnter: (event: KeyboardEvent) => void;\n onTab: (event: KeyboardEvent) => void;\n onInputDeletePressed: () => void;\n setValueFocus: (index: number) => void;\n}\n\nexport function useAutoCompleteKeyboardNavigation<TItem>(\n options: UseAutoCompleteKeyboardNavigationOptions,\n deps: UseAutoCompleteKeyboardNavigationDeps<TItem>,\n): UseAutoCompleteKeyboardNavigationReturn {\n const focusedValueIndex = ref<number>(-1);\n const chipElementsCache = ref<Map<number, HTMLElement>>(new Map());\n\n function setValueFocus(index: number): void {\n set(focusedValueIndex, index);\n }\n\n function moveSelectedValueHighlight(event: KeyboardEvent, next: boolean): void {\n const multiple = get(options.multiple);\n const internalSearchValue = get(deps.internalSearch);\n\n if (!multiple || internalSearchValue.length > 0)\n return;\n\n event.preventDefault();\n const total = get(deps.value).length;\n\n let current = get(focusedValueIndex);\n\n if (current === -1) {\n set(focusedValueIndex, next ? 0 : total - 1);\n return;\n }\n\n const move = next ? 1 : -1;\n current += move;\n\n if (current < 0 || current >= total) {\n set(focusedValueIndex, -1);\n set(deps.searchInputFocused, true);\n }\n else {\n set(focusedValueIndex, current);\n }\n }\n\n function onEnter(event: KeyboardEvent): void {\n const filteredOptions = get(deps.filteredOptions);\n const highlightedIndex = get(deps.highlightedIndex);\n const isOpen = get(deps.isOpen);\n const customValue = get(options.customValue);\n const multiple = get(options.multiple);\n const value = get(deps.value);\n const internalSearch = get(deps.internalSearch);\n\n // Check if we should use custom value\n if (customValue && internalSearch && isOpen) {\n // Check if any option exactly matches the search term\n let hasExactMatch = false;\n\n if (highlightedIndex > -1 && highlightedIndex < filteredOptions.length) {\n const highlightedOption = filteredOptions[highlightedIndex];\n if (typeof highlightedOption === 'string') {\n hasExactMatch = highlightedOption === internalSearch;\n }\n else if (highlightedOption && typeof highlightedOption === 'object') {\n const label = (highlightedOption as any).label || (highlightedOption as any).value || '';\n hasExactMatch = label === internalSearch;\n }\n }\n\n // If no exact match with highlighted option, use custom value\n if (!hasExactMatch) {\n deps.setSearchAsValue();\n if (!multiple)\n set(deps.isOpen, false);\n event.preventDefault();\n return;\n }\n }\n\n if (filteredOptions.length > 0 && highlightedIndex > -1 && isOpen) {\n deps.applyHighlighted();\n event.preventDefault();\n }\n else if (filteredOptions.length === 0 && customValue && internalSearch) {\n deps.setSearchAsValue();\n if (!multiple)\n set(deps.isOpen, false);\n event.preventDefault();\n }\n else if (!isOpen && value.length === 0) {\n set(deps.isOpen, true);\n event.preventDefault();\n }\n else {\n const activator = get(deps.activator);\n const form = activator?.closest('form');\n if (form) {\n form.dispatchEvent(new Event('submit'));\n }\n }\n }\n\n function onTab(event: KeyboardEvent): void {\n const isOpen = get(deps.isOpen);\n const filteredOptions = get(deps.filteredOptions);\n const highlightedIndex = get(deps.highlightedIndex);\n const multiple = get(options.multiple);\n\n if (isOpen && filteredOptions.length > 0 && highlightedIndex > -1 && !multiple) {\n deps.applyHighlighted();\n event.preventDefault();\n }\n }\n\n function onInputDeletePressed(): void {\n const internalSearch = get(deps.internalSearch);\n const value = get(deps.value);\n const total = value.length;\n const multiple = get(options.multiple);\n\n if (!internalSearch && total > 0) {\n if (multiple)\n set(focusedValueIndex, total - 1);\n else\n deps.clear();\n }\n }\n\n // Watch value changes to reset focused index and clear cache\n watch(deps.value, () => {\n setValueFocus(-1);\n get(chipElementsCache).clear();\n });\n\n // Watch focused value index to handle chip focus\n watch(focusedValueIndex, async (index) => {\n const multiple = get(options.multiple);\n if (index === -1 || !multiple)\n return;\n\n await nextTick(() => {\n const cache = get(chipElementsCache);\n let activeChip = cache.get(index);\n\n if (!activeChip) {\n const activator = get(deps.activator);\n const element = activator?.querySelector(`[data-index=\"${index}\"]`) as HTMLElement | null;\n if (element) {\n activeChip = element;\n cache.set(index, element);\n }\n }\n\n if (activeChip && 'focus' in activeChip && typeof activeChip.focus === 'function')\n activeChip.focus();\n });\n });\n\n return {\n focusedValueIndex,\n moveSelectedValueHighlight,\n onEnter,\n onInputDeletePressed,\n onTab,\n setValueFocus,\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { get, set } from "@vueuse/shared";
|
|
2
|
+
import { getTextToken } from "../../../utils/helpers.js";
|
|
3
|
+
import { ref, computed, watch, onUnmounted } from "vue";
|
|
4
|
+
import { refDebounced } from "@vueuse/core";
|
|
5
|
+
function useAutoCompleteSearch(options, searchModel, opts) {
|
|
6
|
+
const internalSearch = ref("");
|
|
7
|
+
const debouncedInternalSearch = refDebounced(internalSearch, 50);
|
|
8
|
+
const justOpened = ref(false);
|
|
9
|
+
const tokenCache = /* @__PURE__ */ new Map();
|
|
10
|
+
const getCachedTextToken = (text) => {
|
|
11
|
+
if (tokenCache.has(text)) {
|
|
12
|
+
return tokenCache.get(text);
|
|
13
|
+
}
|
|
14
|
+
const token = getTextToken(text);
|
|
15
|
+
tokenCache.set(text, token);
|
|
16
|
+
return token;
|
|
17
|
+
};
|
|
18
|
+
const filteredOptions = computed(() => {
|
|
19
|
+
const search = get(debouncedInternalSearch);
|
|
20
|
+
const optionsValue = get(options);
|
|
21
|
+
const noFilter = get(opts.noFilter);
|
|
22
|
+
if (noFilter || !search || get(justOpened))
|
|
23
|
+
return optionsValue;
|
|
24
|
+
const keyAttr = get(opts.keyAttr);
|
|
25
|
+
const textAttr = get(opts.textAttr);
|
|
26
|
+
const filter = get(opts.filter);
|
|
27
|
+
const searchToken = getCachedTextToken(search);
|
|
28
|
+
const usedFilter = filter || ((item) => {
|
|
29
|
+
if (!item)
|
|
30
|
+
return false;
|
|
31
|
+
const keywords = [keyAttr ? getCachedTextToken(item[keyAttr]) : item.toString()];
|
|
32
|
+
if (textAttr && typeof item === "object")
|
|
33
|
+
keywords.push(getCachedTextToken(item[textAttr]));
|
|
34
|
+
return keywords.some((keyword) => getCachedTextToken(keyword).includes(searchToken));
|
|
35
|
+
});
|
|
36
|
+
const filtered = optionsValue.filter((item) => usedFilter(item, search));
|
|
37
|
+
const customValue = get(opts.customValue);
|
|
38
|
+
const hideCustomValue = get(opts.hideCustomValue);
|
|
39
|
+
if (!customValue || hideCustomValue || !search) {
|
|
40
|
+
return filtered;
|
|
41
|
+
}
|
|
42
|
+
const isCustomValueIncluded = filtered.some((item) => {
|
|
43
|
+
if (!item) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const val = textAttr ? item[textAttr] : item.toString();
|
|
47
|
+
return val === search;
|
|
48
|
+
});
|
|
49
|
+
if (isCustomValueIncluded) {
|
|
50
|
+
return filtered;
|
|
51
|
+
}
|
|
52
|
+
return [textValueToProperValue(search, {
|
|
53
|
+
keyAttr,
|
|
54
|
+
returnObject: get(opts.returnObject),
|
|
55
|
+
textAttr
|
|
56
|
+
}), ...filtered];
|
|
57
|
+
});
|
|
58
|
+
function textValueToProperValue(val, options2) {
|
|
59
|
+
const { keyAttr, returnObject, textAttr } = options2;
|
|
60
|
+
if (!keyAttr || returnObject)
|
|
61
|
+
return val;
|
|
62
|
+
return {
|
|
63
|
+
[keyAttr]: val,
|
|
64
|
+
...textAttr ? { [textAttr]: val } : {}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function updateInternalSearch(value = "") {
|
|
68
|
+
set(searchModel, value);
|
|
69
|
+
set(internalSearch, value);
|
|
70
|
+
}
|
|
71
|
+
watch(searchModel, (search) => {
|
|
72
|
+
set(internalSearch, search);
|
|
73
|
+
}, { immediate: true });
|
|
74
|
+
onUnmounted(() => {
|
|
75
|
+
tokenCache.clear();
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
debouncedInternalSearch,
|
|
79
|
+
filteredOptions,
|
|
80
|
+
internalSearch,
|
|
81
|
+
justOpened,
|
|
82
|
+
textValueToProperValue: (val, returnObjectOverride = false) => textValueToProperValue(val, {
|
|
83
|
+
keyAttr: get(opts.keyAttr),
|
|
84
|
+
returnObject: returnObjectOverride || get(opts.returnObject),
|
|
85
|
+
textAttr: get(opts.textAttr)
|
|
86
|
+
}),
|
|
87
|
+
updateInternalSearch
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export {
|
|
91
|
+
useAutoCompleteSearch
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sources":["../../../../src/composables/forms/auto-complete/search.ts"],"sourcesContent":["import type { MaybeRef, Ref } from 'vue';\nimport { get, set } from '@vueuse/shared';\nimport { getTextToken } from '@/utils/helpers';\n\nexport interface UseAutoCompleteSearchOptions<TItem> {\n keyAttr?: MaybeRef<keyof TItem | undefined>;\n textAttr?: MaybeRef<keyof TItem | undefined>;\n noFilter?: MaybeRef<boolean>;\n filter?: MaybeRef<((item: TItem, queryText: string) => boolean) | undefined>;\n customValue?: MaybeRef<boolean>;\n hideCustomValue?: MaybeRef<boolean>;\n returnObject?: MaybeRef<boolean>;\n}\n\nexport interface UseAutoCompleteSearchReturn<TItem> {\n internalSearch: Ref<string>;\n debouncedInternalSearch: Readonly<Ref<string>>;\n filteredOptions: Readonly<Ref<TItem[]>>;\n justOpened: Ref<boolean>;\n updateInternalSearch: (value?: string) => void;\n textValueToProperValue: (val: any, returnObject?: boolean) => TItem;\n}\n\nexport function useAutoCompleteSearch<TItem>(\n options: MaybeRef<TItem[]>,\n searchModel: Ref<string>,\n opts: UseAutoCompleteSearchOptions<TItem>,\n): UseAutoCompleteSearchReturn<TItem> {\n const internalSearch = ref<string>('');\n const debouncedInternalSearch = refDebounced(internalSearch, 50);\n const justOpened = ref<boolean>(false);\n\n // Memoize token computation to avoid repeated string processing\n const tokenCache = new Map<string, string>();\n const getCachedTextToken = (text: string): string => {\n if (tokenCache.has(text)) {\n return tokenCache.get(text)!;\n }\n const token = getTextToken(text);\n tokenCache.set(text, token);\n return token;\n };\n\n const filteredOptions = computed<TItem[]>(() => {\n const search = get(debouncedInternalSearch);\n const optionsValue = get(options);\n\n const noFilter = get(opts.noFilter);\n if (noFilter || !search || get(justOpened))\n return optionsValue;\n\n const keyAttr = get(opts.keyAttr);\n const textAttr = get(opts.textAttr);\n const filter = get(opts.filter);\n\n // Cache the search token once\n const searchToken = getCachedTextToken(search);\n\n const usedFilter = filter || ((item) => {\n if (!item)\n return false;\n\n const keywords: string[] = [keyAttr ? getCachedTextToken((item as any)[keyAttr]) : item.toString()];\n\n if (textAttr && typeof item === 'object')\n keywords.push(getCachedTextToken((item as any)[textAttr]));\n\n return keywords.some(keyword => getCachedTextToken(keyword).includes(searchToken));\n });\n\n const filtered = optionsValue.filter(item => usedFilter(item, search));\n\n const customValue = get(opts.customValue);\n const hideCustomValue = get(opts.hideCustomValue);\n if (!customValue || hideCustomValue || !search) {\n return filtered;\n }\n\n // Use a more efficient check for custom value inclusion\n const isCustomValueIncluded = filtered.some((item) => {\n if (!item) {\n return false;\n }\n\n const val = textAttr ? (item as any)[textAttr] : item.toString();\n return val === search;\n });\n\n if (isCustomValueIncluded) {\n return filtered;\n }\n\n return [textValueToProperValue(search, {\n keyAttr,\n returnObject: get(opts.returnObject),\n textAttr,\n }), ...filtered];\n });\n\n function textValueToProperValue(val: any, options: { keyAttr?: keyof TItem; textAttr?: keyof TItem; returnObject?: boolean }): TItem {\n const { keyAttr, returnObject, textAttr } = options;\n if (!keyAttr || returnObject)\n return val;\n\n return {\n [keyAttr]: val,\n ...(\n textAttr\n ? { [textAttr]: val }\n : {}\n ),\n } as TItem;\n }\n\n function updateInternalSearch(value: string = ''): void {\n set(searchModel, value);\n set(internalSearch, value);\n }\n\n watch(searchModel, (search) => {\n set(internalSearch, search);\n }, { immediate: true });\n\n // Clear token cache when component unmounts to prevent memory leaks\n onUnmounted(() => {\n tokenCache.clear();\n });\n\n return {\n debouncedInternalSearch,\n filteredOptions,\n internalSearch,\n justOpened,\n textValueToProperValue: (val: any, returnObjectOverride: boolean = false) => textValueToProperValue(val, {\n keyAttr: get(opts.keyAttr),\n returnObject: returnObjectOverride || get(opts.returnObject),\n textAttr: get(opts.textAttr),\n }),\n updateInternalSearch,\n };\n}\n"],"names":["options"],"mappings":"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"}
|