UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

195 lines (194 loc) 8.47 kB
"use client"; require("../../_virtual/_rolldown/runtime.cjs"); const require_use_props = require("../../core/MantineProvider/use-props/use-props.cjs"); const require_use_resolved_styles_api = require("../../core/styles-api/use-resolved-styles-api/use-resolved-styles-api.cjs"); const require_factory = require("../../core/factory/factory.cjs"); const require_InputBase = require("../InputBase/InputBase.cjs"); const require_get_parsed_combobox_data = require("../Combobox/get-parsed-combobox-data/get-parsed-combobox-data.cjs"); const require_get_options_lockup = require("../Combobox/get-options-lockup/get-options-lockup.cjs"); const require_use_combobox = require("../Combobox/use-combobox/use-combobox.cjs"); const require_Combobox = require("../Combobox/Combobox.cjs"); const require_OptionsDropdown = require("../Combobox/OptionsDropdown/OptionsDropdown.cjs"); let react = require("react"); let _mantine_hooks = require("@mantine/hooks"); let react_jsx_runtime = require("react/jsx-runtime"); //#region packages/@mantine/core/src/components/Select/Select.tsx const defaultProps = { withCheckIcon: true, allowDeselect: true, checkIconPosition: "left", openOnFocus: true }; const Select = require_factory.genericFactory((_props) => { const props = require_use_props.useProps("Select", defaultProps, _props); const { classNames, styles, unstyled, vars, dropdownOpened, defaultDropdownOpened, onDropdownClose, onDropdownOpen, onFocus, onBlur, onClick, onChange, data, value, defaultValue, selectFirstOptionOnChange, selectFirstOptionOnDropdownOpen, onOptionSubmit, comboboxProps, readOnly, disabled, filter, limit, withScrollArea, maxDropdownHeight, size, searchable, rightSection, checkIconPosition, withCheckIcon, withAlignedLabels, nothingFoundMessage, name, form, searchValue, defaultSearchValue, onSearchChange, allowDeselect, error, rightSectionPointerEvents, id, clearable, clearSectionMode, clearButtonProps, hiddenInputProps, renderOption, onClear, autoComplete, scrollAreaProps, __defaultRightSection, __clearSection, __clearable, chevronColor, autoSelectOnBlur, openOnFocus, attributes, ...others } = props; const parsedData = (0, react.useMemo)(() => require_get_parsed_combobox_data.getParsedComboboxData(data), [data]); const retainedSelectedOptions = (0, react.useRef)({}); const optionsLockup = (0, react.useMemo)(() => require_get_options_lockup.getOptionsLockup(parsedData), [parsedData]); const _id = (0, _mantine_hooks.useId)(id); const [_value, setValue, controlled] = (0, _mantine_hooks.useUncontrolled)({ value, defaultValue, finalValue: null, onChange }); const selectedOption = _value != null ? `${_value}` in optionsLockup ? optionsLockup[`${_value}`] : retainedSelectedOptions.current[`${_value}`] : void 0; const previousSelectedOption = (0, _mantine_hooks.usePrevious)(selectedOption); const [search, setSearch, searchControlled] = (0, _mantine_hooks.useUncontrolled)({ value: searchValue, defaultValue: defaultSearchValue, finalValue: selectedOption ? selectedOption.label : "", onChange: onSearchChange }); const combobox = require_use_combobox.useCombobox({ opened: dropdownOpened, defaultOpened: defaultDropdownOpened, onDropdownOpen: () => { onDropdownOpen?.(); if (selectFirstOptionOnDropdownOpen) combobox.selectFirstOption(); else combobox.updateSelectedOptionIndex("active", { scrollIntoView: true }); }, onDropdownClose: () => { onDropdownClose?.(); setTimeout(combobox.resetSelectedOption, 0); } }); const handleSearchChange = (value) => { setSearch(value); combobox.resetSelectedOption(); }; const { resolvedClassNames, resolvedStyles } = require_use_resolved_styles_api.useResolvedStylesApi({ props, styles, classNames }); (0, react.useEffect)(() => { if (selectFirstOptionOnChange) combobox.selectFirstOption(); }, [selectFirstOptionOnChange, search]); (0, react.useEffect)(() => { if (value === null) handleSearchChange(""); if (value != null && selectedOption && (previousSelectedOption?.value !== selectedOption.value || previousSelectedOption?.label !== selectedOption.label)) handleSearchChange(selectedOption.label); }, [value, selectedOption]); (0, react.useEffect)(() => { if (!controlled && !searchControlled) handleSearchChange(_value != null ? `${_value}` in optionsLockup ? optionsLockup[`${_value}`]?.label : retainedSelectedOptions.current[`${_value}`]?.label || "" : ""); }, [optionsLockup, _value]); (0, react.useEffect)(() => { if (_value) { if (`${_value}` in optionsLockup) retainedSelectedOptions.current[`${_value}`] = optionsLockup[`${_value}`]; } }, [optionsLockup, _value]); const clearButton = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Combobox.Combobox.ClearButton, { ...clearButtonProps, onClear: () => { setValue(null, null); handleSearchChange(""); onClear?.(); } }); const _clearable = clearable && !!_value && !disabled && !readOnly; return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Combobox.Combobox, { store: combobox, __staticSelector: "Select", classNames: resolvedClassNames, styles: resolvedStyles, unstyled, readOnly, size, attributes, keepMounted: autoSelectOnBlur, onOptionSubmit: (val) => { onOptionSubmit?.(val); const optionLockup = allowDeselect ? `${optionsLockup[val].value}` === `${_value}` ? null : optionsLockup[val] : optionsLockup[val]; const nextValue = optionLockup ? optionLockup.value : null; nextValue !== _value && setValue(nextValue, optionLockup); !controlled && handleSearchChange(nextValue != null ? optionLockup?.label || "" : ""); combobox.closeDropdown(); }, ...comboboxProps, children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Combobox.Combobox.Target, { targetType: searchable ? "input" : "button", autoComplete, withExpandedAttribute: true, children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_InputBase.InputBase, { id: _id, __defaultRightSection: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Combobox.Combobox.Chevron, { size, error, unstyled, color: chevronColor }), __clearSection: clearButton, __clearable: _clearable, __clearSectionMode: clearSectionMode, rightSection, rightSectionPointerEvents: rightSectionPointerEvents || "none", ...others, size, __staticSelector: "Select", disabled, readOnly: readOnly || !searchable, value: search, onChange: (event) => { handleSearchChange(event.currentTarget.value); combobox.openDropdown(); selectFirstOptionOnChange && combobox.selectFirstOption(); }, onFocus: (event) => { openOnFocus && searchable && combobox.openDropdown(); onFocus?.(event); }, onBlur: (event) => { if (autoSelectOnBlur) combobox.clickSelectedOption(); searchable && combobox.closeDropdown(); const optionLockup = _value != null && (`${_value}` in optionsLockup ? optionsLockup[`${_value}`] : retainedSelectedOptions.current[`${_value}`]); handleSearchChange(optionLockup ? optionLockup.label || "" : ""); onBlur?.(event); }, onClick: (event) => { searchable ? combobox.openDropdown() : combobox.toggleDropdown(); onClick?.(event); }, classNames: resolvedClassNames, styles: resolvedStyles, unstyled, pointer: !searchable, error, attributes }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_OptionsDropdown.OptionsDropdown, { data: parsedData, hidden: readOnly || disabled, filter, search, limit, hiddenWhenEmpty: !nothingFoundMessage, withScrollArea, maxDropdownHeight, filterOptions: !!searchable && selectedOption?.label !== search, value: _value, checkIconPosition, withCheckIcon, withAlignedLabels, nothingFoundMessage, unstyled, labelId: others.label ? `${_id}-label` : void 0, "aria-label": others.label ? void 0 : others["aria-label"], renderOption, scrollAreaProps })] }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Combobox.Combobox.HiddenInput, { value: _value, name, form, disabled, ...hiddenInputProps })] }); }); Select.classes = { ...require_InputBase.InputBase.classes, ...require_Combobox.Combobox.classes }; Select.displayName = "@mantine/core/Select"; //#endregion exports.Select = Select; //# sourceMappingURL=Select.cjs.map