From 55ae9908d18be839b88d7bc083649f00b5422f85 Mon Sep 17 00:00:00 2001 From: tugcekucukoglu Date: Thu, 18 Apr 2024 17:17:41 +0300 Subject: [PATCH] Refactor #5612 - Dropdown / Select --- components/lib/dropdown/Dropdown.d.ts | 693 +----------- components/lib/dropdown/Dropdown.vue | 986 +---------------- .../lib/dropdown/style/DropdownStyle.d.ts | 4 +- .../lib/dropdown/style/DropdownStyle.js | 55 +- .../BaseSelect.vue} | 6 +- components/lib/select/Select.d.ts | 762 ++++++++++++++ .../Select.spec.js} | 66 +- components/lib/select/Select.vue | 991 ++++++++++++++++++ components/lib/select/package.json | 9 + components/lib/select/style/SelectStyle.d.ts | 3 + components/lib/select/style/SelectStyle.js | 58 + components/lib/select/style/package.json | 6 + .../base/{dropdown => select}/index.js | 54 +- .../base/{dropdown => select}/package.json | 0 .../aura/{dropdown => select}/index.js | 0 .../aura/{dropdown => select}/package.json | 0 16 files changed, 1915 insertions(+), 1778 deletions(-) rename components/lib/{dropdown/BaseDropdown.vue => select/BaseSelect.vue} (97%) create mode 100755 components/lib/select/Select.d.ts rename components/lib/{dropdown/Dropdown.spec.js => select/Select.spec.js} (82%) create mode 100755 components/lib/select/Select.vue create mode 100644 components/lib/select/package.json create mode 100644 components/lib/select/style/SelectStyle.d.ts create mode 100644 components/lib/select/style/SelectStyle.js create mode 100644 components/lib/select/style/package.json rename components/lib/themes/primeone/base/{dropdown => select}/index.js (72%) rename components/lib/themes/primeone/base/{dropdown => select}/package.json (100%) rename components/lib/themes/primeone/presets/aura/{dropdown => select}/index.js (100%) rename components/lib/themes/primeone/presets/aura/{dropdown => select}/package.json (100%) diff --git a/components/lib/dropdown/Dropdown.d.ts b/components/lib/dropdown/Dropdown.d.ts index ad078cb1c..adc9d7891 100755 --- a/components/lib/dropdown/Dropdown.d.ts +++ b/components/lib/dropdown/Dropdown.d.ts @@ -2,735 +2,76 @@ * * Dropdown also known as Select, is used to choose an item from a collection of options. * - * [Live Demo](https://www.primevue.org/dropdown/) + * [Live Demo](https://www.primevue.org/select/) * * @module dropdown * */ -import { TransitionProps, VNode } from 'vue'; -import { ComponentHooks } from '../basecomponent'; -import { PassThroughOptions } from '../passthrough'; -import { ClassComponent, DesignToken, GlobalComponentConstructor, HintedString, PassThrough } from '../ts-helpers'; -import { VirtualScrollerItemOptions, VirtualScrollerPassThroughOptionType, VirtualScrollerProps } from '../virtualscroller'; - -export declare type DropdownPassThroughOptionType = DropdownPassThroughAttributes | ((options: DropdownPassThroughMethodOptions) => DropdownPassThroughAttributes | string) | string | null | undefined; - -export declare type DropdownPassThroughTransitionType = TransitionProps | ((options: DropdownPassThroughMethodOptions) => TransitionProps) | undefined; +import 'vue'; +import * as Select from '../select'; +import { ClassComponent, GlobalComponentConstructor } from '../ts-helpers'; /** * Custom passthrough(pt) option method. */ -export interface DropdownPassThroughMethodOptions { - /** - * Defines instance. - */ - instance: any; - /** - * Defines valid properties. - */ - props: DropdownProps; - /** - * Defines current inline state. - */ - state: DropdownState; - /** - * Defines parent instance. - */ - parent: T | any; - /** - * Defines current options. - */ - context: DropdownContext; - /** - * Defines passthrough(pt) options in global config. - */ - global: object | undefined; -} +export interface DropdownPassThroughMethodOptions extends Select.SelectPassThroughMethodOptions {} /** * Custom change event. * @see {@link DropdownEmits.change} */ -export interface DropdownChangeEvent { - /** - * Browser event. - */ - originalEvent: Event; - /** - * Selected option value - */ - value: any; -} +export interface DropdownChangeEvent extends Select.SelectChangeEvent {} /** * Custom filter event. * @see {@link DropdownEmits.filter} */ -export interface DropdownFilterEvent { - /** - * Browser event. - */ - originalEvent: Event; - /** - * Filter value - */ - value: any; -} +export interface DropdownFilterEvent extends Select.SelectFilterEvent {} /** * Custom passthrough(pt) options. * @see {@link DropdownProps.pt} */ -export interface DropdownPassThroughOptions { - /** - * Used to pass attributes to the root's DOM element. - */ - root?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the input's DOM element. - */ - input?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the clear icon's DOM element. - */ - clearIcon?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the trigger' DOM element. - */ - trigger?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the loading icon's DOM element. - */ - loadingIcon?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the panel's DOM element. - */ - panel?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the header's DOM element. - */ - header?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the filter container's DOM element. - */ - filterContainer?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the filter input's DOM element. - */ - filterInput?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the filter icon's DOM element. - */ - filterIcon?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the wrapper's DOM element. - */ - wrapper?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the VirtualScroller component. - * @see {@link VirtualScrollerPassThroughOptionType} - */ - virtualScroller?: VirtualScrollerPassThroughOptionType; - /** - * Used to pass attributes to the list's DOM element. - */ - list?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the item group's DOM element. - */ - itemGroup?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the item group label's DOM element. - */ - itemGroupLabel?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the item's DOM element. - */ - item?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the item label's DOM element. - */ - itemLabel?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the check icon's DOM element. - */ - checkIcon?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the bank icon's DOM element. - */ - blankIcon?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the empty message's DOM element. - */ - emptyMessage?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the hidden first focusable element's DOM element. - */ - hiddenFirstFocusableEl?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the hidden filter result's DOM element. - */ - hiddenFilterResult?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the hidden empty message's DOM element. - */ - hiddenEmptyMessage?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the hidden selected message's DOM element. - */ - hiddenSelectedMessage?: DropdownPassThroughOptionType; - /** - * Used to pass attributes to the hidden last focusable element's DOM element. - */ - hiddenLastFocusableEl?: DropdownPassThroughOptionType; - /** - * Used to manage all lifecycle hooks. - * @see {@link BaseComponent.ComponentHooks} - */ - hooks?: ComponentHooks; - /** - * Used to control Vue Transition API. - */ - transition?: DropdownPassThroughTransitionType; -} +export interface DropdownPassThroughOptions extends Select.SelectPassThroughOptions {} /** * Custom passthrough attributes for each DOM elements */ -export interface DropdownPassThroughAttributes { - [key: string]: any; -} +export interface DropdownPassThroughAttributes extends Select.SelectPassThroughAttributes {} /** * Defines current inline state in Dropdown component. */ -export interface DropdownState { - /** - * Current id state as a string. - */ - id: string; - /** - * Current focused state as a boolean. - * @defaultValue false - */ - focused: boolean; - /** - * Current focused item index as a number. - * @defaultValue -1 - */ - focusedOptionIndex: number; - /** - * Current filter value state as a string. - */ - filterValue: string; - /** - * Current overlay visible state as a boolean. - * @defaultValue false - */ - overlayVisible: boolean; -} +export interface DropdownState extends Select.SelectState {} /** * Defines current options in Dropdown component. */ -export interface DropdownContext { - /** - * Current item option. - */ - option: any; - /** - * Current item index. - */ - index: number; - /** - * Current selection state of the item as a boolean. - * @defaultValue false - */ - selected: boolean; - /** - * Current focus state of the item as a boolean. - * @defaultValue false - */ - focused: boolean; - /** - * Current disabled state of the item as a boolean. - * @defaultValue false - */ - disabled: boolean; -} +export interface DropdownContext extends Select.SelectContext {} /** * Defines valid properties in Dropdown component. */ -export interface DropdownProps { - /** - * Value of the component. - */ - modelValue?: any; - /** - * An array of select items to display as the available options. - */ - options?: any[]; - /** - * Property name or getter function to use as the label of an option. - */ - optionLabel?: string | ((data: any) => string) | undefined; - /** - * Property name or getter function to use as the value of an option, defaults to the option itself when not defined. - */ - optionValue?: string | ((data: any) => any) | undefined; - /** - * Property name or getter function to use as the disabled flag of an option, defaults to false when not defined. - */ - optionDisabled?: string | ((data: any) => boolean) | undefined; - /** - * Property name or getter function to use as the label of an option group. - */ - optionGroupLabel?: string | ((data: any) => string) | undefined; - /** - * Property name or getter function that refers to the children options of option group. - */ - optionGroupChildren?: string | ((data: any) => any[]) | undefined; - /** - * Height of the viewport, a scrollbar is defined if height of list exceeds this value. - * @defaultValue 14rem - */ - scrollHeight?: string | undefined; - /** - * When specified, displays a filter input at header. - * @defaultValue false - */ - filter?: boolean | undefined; - /** - * Placeholder text to show when filter input is empty. - */ - filterPlaceholder?: string | undefined; - /** - * Locale to use in filtering. The default locale is the host environment's current locale. - */ - filterLocale?: string | undefined; - /** - * Defines the filtering algorithm to use when searching the options. - * @defaultValue contains - */ - filterMatchMode?: HintedString<'contains' | 'startsWith' | 'endsWith'> | undefined; - /** - * Fields used when filtering the options, defaults to optionLabel. - */ - filterFields?: string[] | undefined; - /** - * When present, custom value instead of predefined options can be entered using the editable input field. - * @defaultValue false - */ - editable?: boolean | undefined; - /** - * Default text to display when no option is selected. - */ - placeholder?: string | undefined; - /** - * When present, it specifies that the component should have invalid state style. - * @defaultValue false - */ - invalid?: boolean | undefined; - /** - * When present, it specifies that the component should be disabled. - * @defaultValue false - */ - disabled?: boolean | undefined; - /** - * Specifies the input variant of the component. - * @defaultValue outlined - */ - variant?: 'outlined' | 'filled' | undefined; - /** - * A property to uniquely identify an option. - */ - dataKey?: string | undefined; - /** - * When enabled, a clear icon is displayed to clear the value. - * @defaultValue false - */ - showClear?: boolean | undefined; - /** - * Identifier of the underlying input element. - */ - inputId?: string | undefined; - /** - * Inline style of the input field. - */ - inputStyle?: object | undefined; - /** - * Style class of the input field. - */ - inputClass?: string | object | undefined; - /** - * Inline style of the overlay panel. - */ - panelStyle?: object | undefined; - /** - * Style class of the overlay panel. - */ - panelClass?: string | object | undefined; - /** - * A valid query selector or an HTMLElement to specify where the overlay gets attached. - * @defaultValue body - */ - appendTo?: HintedString<'body' | 'self'> | undefined | HTMLElement; - /** - * Whether the dropdown is in loading state. - * @defaultValue false - */ - loading?: boolean | undefined; - /** - * Icon to display in clear button. - * @deprecated since v3.27.0. Use 'clearicon' slot. - */ - clearIcon?: string | undefined; - /** - * Icon to display in the dropdown. - * @deprecated since v3.27.0. Use 'dropdownicon' slot. - */ - dropdownIcon?: string | undefined; - /** - * Icon to display in filter input. - * @deprecated since v3.27.0. Use 'filtericon' slot. - */ - filterIcon?: string | undefined; - /** - * Icon to display in loading state. - * @deprecated since v3.27.0. Use 'loadingicon' slot. - */ - loadingIcon?: string | undefined; - /** - * Clears the filter value when hiding the dropdown. - * @defaultValue false - */ - resetFilterOnHide?: boolean; - /** - * Clears the filter value when clicking on the clear icon. - * @defaultValue false - */ - resetFilterOnClear?: boolean; - /** - * Whether to use the virtualScroller feature. The properties of VirtualScroller component can be used like an object in it. - */ - virtualScrollerOptions?: VirtualScrollerProps; - /** - * Whether to focus on the first visible or selected element when the overlay panel is shown. - * @defaultValue false - */ - autoOptionFocus?: boolean | undefined; - /** - * Whether to focus on the filter element when the overlay panel is shown. - * @defaultValue false - */ - autoFilterFocus?: boolean | undefined; - /** - * When enabled, the focused option is selected. - * @defaultValue false - */ - selectOnFocus?: boolean | undefined; - /** - * When enabled, the focus is placed on the hovered option. - * @defaultValue true - */ - focusOnHover?: boolean | undefined; - /** - * Whether the selected option will be add highlight class. - * @defaultValue true - */ - highlightOnSelect?: boolean | undefined; - /** - * Whether the selected option will be shown with a check mark. - * @defaultValue false - */ - checkmark?: boolean | undefined; - /** - * Text to be displayed in hidden accessible field when filtering returns any results. Defaults to value from PrimeVue locale configuration. - * @defaultValue '{0} results are available' - */ - filterMessage?: string | undefined; - /** - * Text to be displayed in hidden accessible field when options are selected. Defaults to value from PrimeVue locale configuration. - * @defaultValue '{0} items selected' - */ - selectionMessage?: string | undefined; - /** - * Text to be displayed in hidden accessible field when any option is not selected. Defaults to value from PrimeVue locale configuration. - * @defaultValue No selected item - */ - emptySelectionMessage?: string | undefined; - /** - * Text to display when filtering does not return any results. Defaults to value from PrimeVue locale configuration. - * @defaultValue No results found - */ - emptyFilterMessage?: string | undefined; - /** - * Text to display when there are no options available. Defaults to value from PrimeVue locale configuration. - * @defaultValue No results found - */ - emptyMessage?: string | undefined; - /** - * Index of the element in tabbing order. - */ - tabindex?: number | string | undefined; - /** - * Defines a string value that labels an interactive element. - */ - ariaLabel?: string | undefined; - /** - * Identifier of the underlying input element. - */ - ariaLabelledby?: string | undefined; - /** - * It generates scoped CSS variables using design tokens for the component. - */ - dt?: DesignToken; - /** - * Used to pass attributes to DOM elements inside the component. - * @type {DropdownPassThroughOptions} - */ - pt?: PassThrough; - /** - * Used to configure passthrough(pt) options of the component. - * @type {PassThroughOptions} - */ - ptOptions?: PassThroughOptions; - /** - * When enabled, it removes component related styles in the core. - * @defaultValue false - */ - unstyled?: boolean; -} +export interface DropdownProps extends Select.SelectProps {} /** * Defines valid slots in Dropdown component. */ -export interface DropdownSlots { - /** - * Custom value template. - * @param {Object} scope - value slot's params. - */ - value(scope: { - /** - * Value of the component - */ - value: any; - /** - * Placeholder prop value - */ - placeholder: string; - }): VNode[]; - /** - * Custom indicator template. - * @deprecated since v3.27.0. Use 'dropdownicon or loadingicon' slots. - */ - indicator(): VNode[]; - /** - * Custom header template of panel. - * @param {Object} scope - header slot's params. - */ - header(scope: { - /** - * Value of the component - */ - value: any; - /** - * Displayed options - */ - options: any[]; - }): VNode[]; - /** - * Custom footer template of panel. - * @param {Object} scope - footer slot's params. - */ - footer(scope: { - /** - * Value of the component - */ - value: any; - /** - * Displayed options - */ - options: any[]; - }): VNode[]; - /** - * Custom option template. - * @param {Object} scope - option slot's params. - */ - option(scope: { - /** - * Option instance - */ - option: any; - /** - * Index of the option - */ - index: number; - }): VNode[]; - /** - * Custom option group template. - * @param {Object} scope - option group slot's params. - */ - optiongroup(scope: { - /** - * Option instance - */ - option: any; - /** - * Index of the option - */ - index: number; - }): VNode[]; - /** - * Custom empty filter template. - */ - emptyfilter(): VNode[]; - /** - * Custom empty template. - */ - empty(): VNode[]; - /** - * Custom content template. - * @param {Object} scope - content slot's params. - */ - content(scope: { - /** - * An array of objects to display for virtualscroller - */ - items: any; - /** - * Style class of the component - */ - styleClass: string; - /** - * Referance of the content - * @param {HTMLElement} el - Element of 'ref' property - */ - contentRef: (el: any) => void; - /** - * Options of the items - * @param {number} index - Rendered index - * @return {@link VirtualScrollerItemOptions} - */ - getItemOptions: (index: number) => VirtualScrollerItemOptions; - }): VNode[]; - /** - * Custom loader template. - * @param {Object} scope - loader slot's params. - */ - loader(scope: { - /** - * Options of the loader items for virtualscroller - */ - options: any[]; - }): VNode[]; - /** - * Custom clear icon template. - * @param {Object} scope - clear icon slot's params. - */ - clearicon(scope: { - /** - * Style class of the clear icon - */ - class: any; - /** - * Clear icon click function. - * @param {Event} event - Browser event - * @deprecated since v3.39.0. Use 'clearCallback' property instead. - */ - onClick: (event: Event) => void; - /** - * Clear icon click function. - * @param {Event} event - Browser event - */ - clearCallback: (event: Event) => void; - }): VNode[]; - /** - * Custom dropdown icon template. - * @param {Object} scope - dropdown icon slot's params. - */ - dropdownicon(scope: { - /** - * Style class of the dropdown icon - */ - class: any; - }): VNode[]; - /** - * Custom loading icon template. - * @param {Object} scope - loading icon slot's params. - */ - loadingicon(scope: { - /** - * Style class of the loading icon - */ - class: any; - }): VNode[]; - /** - * Custom filter icon template. - * @param {Object} scope - filter icon slot's params. - */ - filtericon(scope: { - /** - * Style class of the filter icon - */ - class: any; - }): VNode[]; -} +export interface DropdownSlots extends Select.SelectSlots {} /** * Defines valid emits in Dropdown component. */ -export interface DropdownEmits { - /** - * Emitted when the value changes. - * @param {*} value - New value. - */ - 'update:modelValue'(value: any): void; - /** - * Callback to invoke on value change. - * @param {DropdownChangeEvent} event - Custom change event. - */ - change(event: DropdownChangeEvent): void; - /** - * Callback to invoke when the component receives focus. - * @param {Event} event - Browser event. - */ - focus(event: Event): void; - /** - * Callback to invoke when the component loses focus. - * @param {Event} event - Browser event. - */ - blur(event: Event): void; - /** - * Callback to invoke before the overlay is shown. - */ - 'before-show'(): void; - /** - * Callback to invoke before the overlay is hidden. - */ - 'before-hide'(): void; - /** - * Callback to invoke when the overlay is shown. - */ - show(): void; - /** - * Callback to invoke when the overlay is hidden. - */ - hide(): void; - /** - * Callback to invoke on filter input. - * @param {DropdownFilterEvent} event - Custom filter event. - */ - filter(event: DropdownFilterEvent): void; -} +export interface DropdownEmits extends Select.SelectEmits {} /** + * @deprecated Deprecated since v4. Use Select component instead. + * * **PrimeVue - Dropdown** * * _Dropdown also known as Select, is used to choose an item from a collection of options._ * - * [Live Demo](https://www.primevue.org/dropdown/) + * [Live Demo](https://www.primevue.org/select/) * --- --- * ![PrimeVue](https://primefaces.org/cdn/primevue/images/logo-100.png) * diff --git a/components/lib/dropdown/Dropdown.vue b/components/lib/dropdown/Dropdown.vue index 2e443b546..8a5e194d6 100755 --- a/components/lib/dropdown/Dropdown.vue +++ b/components/lib/dropdown/Dropdown.vue @@ -1,991 +1,11 @@ - - diff --git a/components/lib/dropdown/style/DropdownStyle.d.ts b/components/lib/dropdown/style/DropdownStyle.d.ts index 284a2e50f..b6b31a960 100644 --- a/components/lib/dropdown/style/DropdownStyle.d.ts +++ b/components/lib/dropdown/style/DropdownStyle.d.ts @@ -1,3 +1,3 @@ -import { BaseStyle } from '../../base/style'; +import { SelectStyle } from '../../select/style/SelectStyle'; -export interface DropdownStyle extends BaseStyle {} +export interface DropdownStyle extends SelectStyle {} diff --git a/components/lib/dropdown/style/DropdownStyle.js b/components/lib/dropdown/style/DropdownStyle.js index 3b62ce22d..ff5bcd0af 100644 --- a/components/lib/dropdown/style/DropdownStyle.js +++ b/components/lib/dropdown/style/DropdownStyle.js @@ -1,58 +1,5 @@ import BaseStyle from 'primevue/base/style'; -const classes = { - root: ({ instance, props, state }) => [ - 'p-select p-component p-inputwrapper', - { - 'p-disabled': props.disabled, - 'p-invalid': props.invalid, - 'p-variant-filled': props.variant ? props.variant === 'filled' : instance.$primevue.config.inputStyle === 'filled', - 'p-focus': state.focused, - 'p-inputwrapper-filled': instance.hasSelectedOption, - 'p-inputwrapper-focus': state.focused || state.overlayVisible, - 'p-select-open': state.overlayVisible - } - ], - input: ({ instance, props }) => [ - 'p-select-label', - { - 'p-placeholder': !props.editable && instance.label === props.placeholder, - 'p-select-label-empty': !props.editable && !instance.$slots['value'] && (instance.label === 'p-emptylabel' || instance.label.length === 0) - } - ], - clearIcon: 'p-select-clear-icon', - trigger: 'p-select-dropdown', - loadingicon: 'p-select-loading-icon', - dropdownIcon: 'p-select-dropdown-icon', - panel: ({ instance }) => [ - 'p-select-overlay p-component', - { - 'p-ripple-disabled': instance.$primevue.config.ripple === false - } - ], - header: 'p-select-header', - filterContainer: 'p-select-filter-container', - filterInput: 'p-select-filter', - filterIcon: 'p-select-filter-icon', - wrapper: 'p-select-list-container', - list: 'p-select-list', - itemGroup: 'p-select-option-group', - itemGroupLabel: 'p-select-option-group-label', - item: ({ instance, props, state, option, focusedOption }) => [ - 'p-select-option', - { - 'p-select-option-selected': instance.isSelected(option) && props.highlightOnSelect, - 'p-focus': state.focusedOptionIndex === focusedOption, - 'p-disabled': instance.isOptionDisabled(option) - } - ], - itemLabel: 'p-select-option-label', - checkIcon: 'p-select-option-check-icon', - blankIcon: 'p-select-option-blank-icon', - emptyMessage: 'p-select-empty-message' -}; - export default BaseStyle.extend({ - name: 'dropdown', - classes + name: 'dropdown' }); diff --git a/components/lib/dropdown/BaseDropdown.vue b/components/lib/select/BaseSelect.vue similarity index 97% rename from components/lib/dropdown/BaseDropdown.vue rename to components/lib/select/BaseSelect.vue index beb515f91..a4751097c 100644 --- a/components/lib/dropdown/BaseDropdown.vue +++ b/components/lib/select/BaseSelect.vue @@ -1,9 +1,9 @@ diff --git a/components/lib/select/package.json b/components/lib/select/package.json new file mode 100644 index 000000000..6d0df21f8 --- /dev/null +++ b/components/lib/select/package.json @@ -0,0 +1,9 @@ +{ + "main": "./select.cjs.js", + "module": "./select.esm.js", + "unpkg": "./select.min.js", + "types": "./Select.d.ts", + "browser": { + "./sfc": "./Select.vue" + } +} diff --git a/components/lib/select/style/SelectStyle.d.ts b/components/lib/select/style/SelectStyle.d.ts new file mode 100644 index 000000000..89deac6fb --- /dev/null +++ b/components/lib/select/style/SelectStyle.d.ts @@ -0,0 +1,3 @@ +import { BaseStyle } from '../../base/style'; + +export interface SelectStyle extends BaseStyle {} diff --git a/components/lib/select/style/SelectStyle.js b/components/lib/select/style/SelectStyle.js new file mode 100644 index 000000000..9112aeba3 --- /dev/null +++ b/components/lib/select/style/SelectStyle.js @@ -0,0 +1,58 @@ +import BaseStyle from 'primevue/base/style'; + +const classes = { + root: ({ instance, props, state }) => [ + 'p-select p-component p-inputwrapper', + { + 'p-disabled': props.disabled, + 'p-invalid': props.invalid, + 'p-variant-filled': props.variant ? props.variant === 'filled' : instance.$primevue.config.inputStyle === 'filled', + 'p-focus': state.focused, + 'p-inputwrapper-filled': instance.hasSelectedOption, + 'p-inputwrapper-focus': state.focused || state.overlayVisible, + 'p-select-open': state.overlayVisible + } + ], + input: ({ instance, props }) => [ + 'p-select-label', + { + 'p-placeholder': !props.editable && instance.label === props.placeholder, + 'p-select-label-empty': !props.editable && !instance.$slots['value'] && (instance.label === 'p-emptylabel' || instance.label.length === 0) + } + ], + clearIcon: 'p-select-clear-icon', + trigger: 'p-select-dropdown', + loadingicon: 'p-select-loading-icon', + dropdownIcon: 'p-select-dropdown-icon', + panel: ({ instance }) => [ + 'p-select-overlay p-component', + { + 'p-ripple-disabled': instance.$primevue.config.ripple === false + } + ], + header: 'p-select-header', + filterContainer: 'p-select-filter-container', + filterInput: 'p-select-filter', + filterIcon: 'p-select-filter-icon', + wrapper: 'p-select-list-container', + list: 'p-select-list', + itemGroup: 'p-select-option-group', + itemGroupLabel: 'p-select-option-group-label', + item: ({ instance, props, state, option, focusedOption }) => [ + 'p-select-option', + { + 'p-select-option-selected': instance.isSelected(option) && props.highlightOnSelect, + 'p-focus': state.focusedOptionIndex === focusedOption, + 'p-disabled': instance.isOptionDisabled(option) + } + ], + itemLabel: 'p-select-option-label', + checkIcon: 'p-select-option-check-icon', + blankIcon: 'p-select-option-blank-icon', + emptyMessage: 'p-select-empty-message' +}; + +export default BaseStyle.extend({ + name: 'select', + classes +}); diff --git a/components/lib/select/style/package.json b/components/lib/select/style/package.json new file mode 100644 index 000000000..096c0d24c --- /dev/null +++ b/components/lib/select/style/package.json @@ -0,0 +1,6 @@ +{ + "main": "./selectstyle.cjs.js", + "module": "./selectstyle.esm.js", + "unpkg": "./selectstyle.min.js", + "types": "./SelectStyle.d.ts" +} diff --git a/components/lib/themes/primeone/base/dropdown/index.js b/components/lib/themes/primeone/base/select/index.js similarity index 72% rename from components/lib/themes/primeone/base/dropdown/index.js rename to components/lib/themes/primeone/base/select/index.js index f917cac70..6d0235ad7 100644 --- a/components/lib/themes/primeone/base/dropdown/index.js +++ b/components/lib/themes/primeone/base/select/index.js @@ -5,38 +5,38 @@ export default { cursor: pointer; position: relative; user-select: none; - background: ${dt('dropdown.background')}; - border: 1px solid ${dt('dropdown.border.color')}; + background: ${dt('select.background')}; + border: 1px solid ${dt('select.border.color')}; transition: background-color ${dt('transition.duration')}, color ${dt('transition.duration')}, border-color ${dt('transition.duration')}, outline-color ${dt('transition.duration')}; border-radius: ${dt('rounded.base')}; outline-color: transparent; - box-shadow: ${dt('dropdown.box.shadow')}; + box-shadow: ${dt('select.box.shadow')}; } .p-select:not(.p-disabled):hover { - border-color: ${dt('dropdown.hover.border.color')}; + border-color: ${dt('select.hover.border.color')}; } .p-select:not(.p-disabled).p-focus { - border-color:${dt('dropdown.focus.border.color')}; + border-color:${dt('select.focus.border.color')}; outline: 0 none; } .p-select.p-variant-filled { - background: ${dt('dropdown.filled.background')}; + background: ${dt('select.filled.background')}; } .p-select.p-variant-filled.p-focus { - background: ${dt('dropdown.filled.focus.background')}; + background: ${dt('select.filled.focus.background')}; } .p-select.p-invalid { - border-color: ${dt('dropdown.invalid.border.color')}; + border-color: ${dt('select.invalid.border.color')}; } .p-select.p-disabled { opacity: 1; - background: ${dt('dropdown.disabled.background')}; + background: ${dt('select.disabled.background')}; } .p-select-clear-icon { @@ -53,7 +53,7 @@ export default { justify-content: center; flex-shrink: 0; background: transparent; - color: ${dt('dropdown.toggle.color')}; + color: ${dt('select.toggle.color')}; width: 2.5rem; border-top-right-radius: ${dt('rounded.base')}; border-bottom-right-radius: ${dt('rounded.base')}; @@ -68,14 +68,14 @@ export default { padding: 0.5rem 0.75rem; text-overflow: ellipsis; cursor: pointer; - color: ${dt('dropdown.color')}; + color: ${dt('select.color')}; background: transparent; border: 0 none; outline: 0 none; } .p-select-label.p-placeholder { - color: ${dt('dropdown.placeholder.color')}; + color: ${dt('select.placeholder.color')}; } .p-select:has(.p-select-clear-icon) .p-select-label { @@ -83,7 +83,7 @@ export default { } .p-select.p-disabled .p-select-label { - color: ${dt('dropdown.disabled.color')}; + color: ${dt('select.disabled.color')}; } .p-select-label-empty { @@ -103,9 +103,9 @@ input.p-select-label { position: absolute; top: 0; left: 0; - background: ${dt('dropdown.overlay.background')}; - color: ${dt('dropdown.overlay.color')}; - border: 1px solid ${dt('dropdown.overlay.border.color')}; + background: ${dt('select.overlay.background')}; + color: ${dt('select.overlay.color')}; + border: 1px solid ${dt('select.overlay.border.color')}; border-radius: ${dt('rounded.base')}; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); } @@ -129,7 +129,7 @@ input.p-select-label { top: 50%; margin-top: -0.5rem; right: 0.75rem; - color: ${dt('dropdown.filter.icon.color')}; + color: ${dt('select.filter.icon.color')}; } .p-select-list-container { @@ -140,8 +140,8 @@ input.p-select-label { cursor: auto; margin: 0; padding: 0.5rem 0.75rem; - background: ${dt('dropdown.item.group.background')}; - color: ${dt('dropdown.item.group.color')}; + background: ${dt('select.item.group.background')}; + color: ${dt('select.item.group.color')}; font-weight: 600; } @@ -163,7 +163,7 @@ input.p-select-label { margin: 2px 0; padding: 0.5rem 0.75rem; border: 0 none; - color: ${dt('dropdown.item.color')}; + color: ${dt('select.item.color')}; background: transparent; transition: background-color ${dt('transition.duration')}, color ${dt('transition.duration')}, border-color ${dt('transition.duration')}, box-shadow ${dt('transition.duration')}, outline-color ${dt('transition.duration')}; border-radius: ${dt('rounded.sm')}; @@ -178,25 +178,25 @@ input.p-select-label { } .p-select-option:not(.p-select-option-selected):not(.p-disabled).p-focus { - background: ${dt('dropdown.item.focus.background')}; - color: ${dt('dropdown.item.focus.color')}; + background: ${dt('select.item.focus.background')}; + color: ${dt('select.item.focus.color')}; } .p-select-option.p-select-option-selected { - background: ${dt('dropdown.item.selected.background')}; - color: ${dt('dropdown.item.selected.color')}; + background: ${dt('select.item.selected.background')}; + color: ${dt('select.item.selected.color')}; } .p-select-option.p-select-option-selected.p-focus { - background: ${dt('dropdown.item.selected.focus.background')}; - color: ${dt('dropdown.item.selected.focus.color')}; + background: ${dt('select.item.selected.focus.background')}; + color: ${dt('select.item.selected.focus.color')}; } .p-select-option-check-icon { position: relative; margin-left: -0.375rem; margin-right: 0.375rem; - color: ${dt('dropdown.checkmark.color')}; + color: ${dt('select.checkmark.color')}; } .p-select-empty-message { diff --git a/components/lib/themes/primeone/base/dropdown/package.json b/components/lib/themes/primeone/base/select/package.json similarity index 100% rename from components/lib/themes/primeone/base/dropdown/package.json rename to components/lib/themes/primeone/base/select/package.json diff --git a/components/lib/themes/primeone/presets/aura/dropdown/index.js b/components/lib/themes/primeone/presets/aura/select/index.js similarity index 100% rename from components/lib/themes/primeone/presets/aura/dropdown/index.js rename to components/lib/themes/primeone/presets/aura/select/index.js diff --git a/components/lib/themes/primeone/presets/aura/dropdown/package.json b/components/lib/themes/primeone/presets/aura/select/package.json similarity index 100% rename from components/lib/themes/primeone/presets/aura/dropdown/package.json rename to components/lib/themes/primeone/presets/aura/select/package.json