@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
290 lines (289 loc) • 10.9 kB
JavaScript
"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_use_styles = require("../../core/styles-api/use-styles/use-styles.cjs");
const require_extract_style_props = require("../../core/Box/style-props/extract-style-props/extract-style-props.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");
const require_Pill = require("../Pill/Pill.cjs");
const require_PillsInput = require("../PillsInput/PillsInput.cjs");
const require_filter_picked_values = require("./filter-picked-values.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/MultiSelect/MultiSelect.tsx
const clearSectionOffset = {
xs: 41,
sm: 50,
md: 60,
lg: 72,
xl: 89
};
const defaultProps = {
maxValues: Infinity,
withCheckIcon: true,
checkIconPosition: "left",
hiddenInputValuesDivider: ",",
clearSearchOnChange: true,
openOnFocus: true,
size: "sm"
};
const MultiSelect = require_factory.genericFactory((_props) => {
const props = require_use_props.useProps("MultiSelect", defaultProps, _props);
const { classNames, className, style, styles, unstyled, vars, size, value, defaultValue, onChange, onKeyDown, variant, data, dropdownOpened, defaultDropdownOpened, onDropdownOpen, onDropdownClose, selectFirstOptionOnChange, selectFirstOptionOnDropdownOpen, onOptionSubmit, comboboxProps, filter, limit, withScrollArea, maxDropdownHeight, searchValue, defaultSearchValue, onSearchChange, readOnly, disabled, onFocus, onBlur, radius, rightSection, rightSectionWidth, rightSectionPointerEvents, rightSectionProps, leftSection, leftSectionWidth, leftSectionPointerEvents, leftSectionProps, inputContainer, inputWrapperOrder, withAsterisk, labelProps, descriptionProps, errorProps, wrapperProps, description, label, error, maxValues, searchable, nothingFoundMessage, withCheckIcon, withAlignedLabels, checkIconPosition, hidePickedOptions, withErrorStyles, name, form, id, clearable, clearSectionMode, clearButtonProps, hiddenInputProps, placeholder, hiddenInputValuesDivider, required, mod, renderOption, renderPill, onRemove, onClear, onMaxValues, scrollAreaProps, chevronColor, attributes, clearSearchOnChange, openOnFocus, ...others } = props;
const _id = (0, _mantine_hooks.useId)(id);
const parsedData = require_get_parsed_combobox_data.getParsedComboboxData(data);
const optionsLockup = require_get_options_lockup.getOptionsLockup(parsedData);
const retainedSelectedOptions = (0, react.useRef)({});
const combobox = require_use_combobox.useCombobox({
opened: dropdownOpened,
defaultOpened: defaultDropdownOpened,
onDropdownOpen: () => {
onDropdownOpen?.();
if (selectFirstOptionOnDropdownOpen) combobox.selectFirstOption();
},
onDropdownClose: () => {
onDropdownClose?.();
combobox.resetSelectedOption();
}
});
const { styleProps, rest: { type, autoComplete, ...rest } } = require_extract_style_props.extractStyleProps(others);
const [_value, setValue] = (0, _mantine_hooks.useUncontrolled)({
value,
defaultValue,
finalValue: [],
onChange
});
const [_searchValue, setSearchValue] = (0, _mantine_hooks.useUncontrolled)({
value: searchValue,
defaultValue: defaultSearchValue,
finalValue: "",
onChange: onSearchChange
});
const handleSearchChange = (value) => {
setSearchValue(value);
combobox.resetSelectedOption();
};
const getStyles = require_use_styles.useStyles({
name: "MultiSelect",
classes: {},
props,
classNames,
styles,
unstyled,
attributes
});
const { resolvedClassNames, resolvedStyles } = require_use_resolved_styles_api.useResolvedStylesApi({
props,
styles,
classNames
});
const handleInputKeydown = (event) => {
onKeyDown?.(event);
if (event.key === " " && !searchable) {
event.preventDefault();
combobox.toggleDropdown();
}
if (event.key === "Backspace" && _searchValue.length === 0 && _value.length > 0) {
onRemove?.(_value[_value.length - 1]);
setValue(_value.slice(0, _value.length - 1));
}
};
const values = _value.map((item, index) => {
const optionData = optionsLockup[`${item}`] || retainedSelectedOptions.current[`${item}`];
if (renderPill) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react.Fragment, { children: renderPill({
option: optionData,
value: item,
onRemove: () => {
setValue(_value.filter((i) => item !== i));
onRemove?.(item);
},
disabled
}) }, `${item}-${index}`);
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Pill.Pill, {
withRemoveButton: !readOnly && !optionsLockup[`${item}`]?.disabled,
onRemove: () => {
setValue(_value.filter((i) => item !== i));
onRemove?.(item);
},
unstyled,
disabled,
...getStyles("pill"),
children: optionData?.label || item
}, `${item}-${index}`);
});
(0, react.useEffect)(() => {
if (selectFirstOptionOnChange) combobox.selectFirstOption();
}, [selectFirstOptionOnChange, _searchValue]);
(0, react.useEffect)(() => {
_value.forEach((val) => {
if (`${val}` in optionsLockup) retainedSelectedOptions.current[`${val}`] = optionsLockup[`${val}`];
});
}, [optionsLockup, _value]);
const clearButton = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Combobox.Combobox.ClearButton, {
...clearButtonProps,
onClear: () => {
onClear?.();
setValue([]);
handleSearchChange("");
}
});
const filteredData = require_filter_picked_values.filterPickedValues({
data: parsedData,
value: _value
});
const _clearable = clearable && _value.length > 0 && !disabled && !readOnly;
const pillsListStyle = _clearable ? { paddingInlineEnd: clearSectionOffset[size] ?? clearSectionOffset.sm } : void 0;
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Combobox.Combobox, {
store: combobox,
classNames: resolvedClassNames,
styles: resolvedStyles,
unstyled,
size,
readOnly,
__staticSelector: "MultiSelect",
attributes,
onOptionSubmit: (val) => {
onOptionSubmit?.(val);
if (clearSearchOnChange) handleSearchChange("");
combobox.updateSelectedOptionIndex("selected");
if (_value.includes(optionsLockup[`${val}`].value)) {
setValue(_value.filter((v) => v !== optionsLockup[`${val}`].value));
onRemove?.(optionsLockup[`${val}`].value);
} else if (_value.length < maxValues) setValue([..._value, optionsLockup[`${val}`].value]);
else onMaxValues?.();
},
...comboboxProps,
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Combobox.Combobox.DropdownTarget, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PillsInput.PillsInput, {
...styleProps,
__staticSelector: "MultiSelect",
classNames: resolvedClassNames,
styles: resolvedStyles,
unstyled,
size,
className,
style,
variant,
disabled,
radius,
__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",
rightSectionWidth,
rightSectionProps,
leftSection,
leftSectionWidth,
leftSectionPointerEvents,
leftSectionProps,
inputContainer,
inputWrapperOrder,
withAsterisk,
labelProps,
descriptionProps,
errorProps,
wrapperProps,
description,
label,
error,
withErrorStyles,
__stylesApiProps: {
...props,
rightSectionPointerEvents: rightSectionPointerEvents || "none",
multiline: true
},
pointer: !searchable,
onClick: () => searchable ? combobox.openDropdown() : combobox.toggleDropdown(),
"data-expanded": combobox.dropdownOpened || void 0,
id: _id,
required,
mod,
attributes,
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_Pill.Pill.Group, {
attributes,
disabled,
unstyled,
...getStyles("pillsList", { style: pillsListStyle }),
children: [values, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Combobox.Combobox.EventsTarget, {
autoComplete,
withExpandedAttribute: true,
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PillsInput.PillsInput.Field, {
...rest,
id: _id,
placeholder,
type: !searchable && !placeholder ? "hidden" : "visible",
...getStyles("inputField"),
unstyled,
onFocus: (event) => {
onFocus?.(event);
openOnFocus && searchable && combobox.openDropdown();
},
onBlur: (event) => {
onBlur?.(event);
combobox.closeDropdown();
handleSearchChange("");
},
onKeyDown: handleInputKeydown,
value: _searchValue,
onChange: (event) => {
handleSearchChange(event.currentTarget.value);
searchable && combobox.openDropdown();
selectFirstOptionOnChange && combobox.selectFirstOption();
},
disabled,
readOnly: readOnly || !searchable,
pointer: !searchable
})
})]
})
}) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_OptionsDropdown.OptionsDropdown, {
data: hidePickedOptions ? filteredData : parsedData,
hidden: readOnly || disabled,
filter,
search: _searchValue,
limit,
hiddenWhenEmpty: !nothingFoundMessage,
withScrollArea,
maxDropdownHeight,
filterOptions: searchable,
value: _value,
checkIconPosition,
withCheckIcon,
withAlignedLabels,
nothingFoundMessage,
unstyled,
labelId: label ? `${_id}-label` : void 0,
"aria-label": label ? void 0 : others["aria-label"],
renderOption,
scrollAreaProps
})]
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Combobox.Combobox.HiddenInput, {
name,
valuesDivider: hiddenInputValuesDivider,
value: _value,
form,
disabled,
...hiddenInputProps
})] });
});
MultiSelect.classes = {
...require_InputBase.InputBase.classes,
...require_Combobox.Combobox.classes
};
MultiSelect.displayName = "@mantine/core/MultiSelect";
//#endregion
exports.MultiSelect = MultiSelect;
//# sourceMappingURL=MultiSelect.cjs.map