@bigbinary/neeto-atoms 1.0.66 → 1.0.68
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/{Select-C_lRHyd6.js → Select-DKN7RRzu.js} +74 -16
- package/dist/Select-DKN7RRzu.js.map +1 -0
- package/dist/cjs/{Select-OWg5FZzx.js → Select-CxaYzbvK.js} +74 -16
- package/dist/cjs/Select-CxaYzbvK.js.map +1 -0
- package/dist/cjs/components/Select.js +1 -1
- package/dist/cjs/components/index.js +1 -1
- package/dist/cjs/formik/Select.js +1 -1
- package/dist/cjs/formik/index.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/components/Select/hooks/useCreatableItems.d.ts +1 -0
- package/dist/components/Select/types.d.ts +15 -0
- package/dist/components/Select/utils.d.ts +4 -0
- package/dist/components/Select.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/formik/Select.js +1 -1
- package/dist/formik/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/Select-C_lRHyd6.js.map +0 -1
- package/dist/cjs/Select-OWg5FZzx.js.map +0 -1
|
@@ -115,6 +115,7 @@ function useLazyLoadSentinel({
|
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
const CREATE_PREFIX = "__create__:";
|
|
118
|
+
const isCreateValue = (val) => typeof val === "string" && val.startsWith(CREATE_PREFIX);
|
|
118
119
|
function useCreatableItems({
|
|
119
120
|
isCreatable,
|
|
120
121
|
isGrouped,
|
|
@@ -154,7 +155,7 @@ function useCreatableItems({
|
|
|
154
155
|
);
|
|
155
156
|
const creatableFilter = useCallback(
|
|
156
157
|
(itemValue, query, itemToString) => {
|
|
157
|
-
if (itemValue
|
|
158
|
+
if (isCreateValue(itemValue)) return true;
|
|
158
159
|
const label = itemToString?.(itemValue) ?? itemValue;
|
|
159
160
|
return label.toLowerCase().includes(query.toLowerCase());
|
|
160
161
|
},
|
|
@@ -163,7 +164,7 @@ function useCreatableItems({
|
|
|
163
164
|
const handleValueChange = useCallback(
|
|
164
165
|
(next) => {
|
|
165
166
|
const raw = next ?? [];
|
|
166
|
-
const createEntry = raw.find((v) => v
|
|
167
|
+
const createEntry = raw.find((v) => isCreateValue(v));
|
|
167
168
|
if (createEntry) {
|
|
168
169
|
const newValue = createEntry.slice(CREATE_PREFIX.length);
|
|
169
170
|
const withNewValue = raw.map((v) => v === createEntry ? newValue : v);
|
|
@@ -189,6 +190,26 @@ function isOptionGroup(opt) {
|
|
|
189
190
|
return "options" in opt && Array.isArray(opt.options);
|
|
190
191
|
}
|
|
191
192
|
|
|
193
|
+
function normalizeOption(option, getValue, getLabel) {
|
|
194
|
+
if (!getValue && !getLabel) return option;
|
|
195
|
+
return {
|
|
196
|
+
...option,
|
|
197
|
+
value: getValue ? getValue(option) : option?.value,
|
|
198
|
+
label: getLabel ? getLabel(option) : option?.label
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function normalizeOptions(options, getValue, getLabel) {
|
|
202
|
+
if (!options) return options;
|
|
203
|
+
if (!getValue && !getLabel) return options;
|
|
204
|
+
return options.map(
|
|
205
|
+
(opt) => opt && Array.isArray(opt.options) ? {
|
|
206
|
+
...opt,
|
|
207
|
+
options: opt.options.map(
|
|
208
|
+
(o) => normalizeOption(o, getValue, getLabel)
|
|
209
|
+
)
|
|
210
|
+
} : normalizeOption(opt, getValue, getLabel)
|
|
211
|
+
);
|
|
212
|
+
}
|
|
192
213
|
function flattenOptions(options) {
|
|
193
214
|
return options.flatMap((opt) => isOptionGroup(opt) ? opt.options : [opt]);
|
|
194
215
|
}
|
|
@@ -369,7 +390,7 @@ function useSelectState(props) {
|
|
|
369
390
|
]);
|
|
370
391
|
const creatableFilter = useCallback(
|
|
371
392
|
(itemValue, query, itemToString) => {
|
|
372
|
-
if (itemValue
|
|
393
|
+
if (isCreateValue(itemValue)) return true;
|
|
373
394
|
const label2 = itemToString?.(itemValue) ?? itemValue;
|
|
374
395
|
return label2.toLowerCase().includes(query.toLowerCase());
|
|
375
396
|
},
|
|
@@ -389,16 +410,16 @@ function useSelectState(props) {
|
|
|
389
410
|
);
|
|
390
411
|
const labelForValue = useCallback(
|
|
391
412
|
(val) => {
|
|
392
|
-
if (val
|
|
413
|
+
if (isCreateValue(val)) {
|
|
393
414
|
return formatCreateLabel(val.slice(CREATE_PREFIX.length));
|
|
394
415
|
}
|
|
395
|
-
return flatOptionsMap.get(val)?.label ?? val;
|
|
416
|
+
return flatOptionsMap.get(val)?.label ?? val ?? "";
|
|
396
417
|
},
|
|
397
418
|
[flatOptionsMap, formatCreateLabel]
|
|
398
419
|
);
|
|
399
420
|
const renderOption = useCallback(
|
|
400
421
|
(val) => {
|
|
401
|
-
if (formatOptionLabel && !val
|
|
422
|
+
if (formatOptionLabel && !isCreateValue(val)) {
|
|
402
423
|
const option = flatOptionsMap.get(val);
|
|
403
424
|
if (option) return formatOptionLabel(option);
|
|
404
425
|
}
|
|
@@ -408,7 +429,7 @@ function useSelectState(props) {
|
|
|
408
429
|
);
|
|
409
430
|
const renderTrigger = useCallback(
|
|
410
431
|
(val) => {
|
|
411
|
-
if (formatTriggerLabel && !val
|
|
432
|
+
if (formatTriggerLabel && !isCreateValue(val)) {
|
|
412
433
|
const option = flatOptionsMap.get(val);
|
|
413
434
|
if (option) return formatTriggerLabel(option);
|
|
414
435
|
}
|
|
@@ -515,16 +536,16 @@ function useMultiSelectState(props) {
|
|
|
515
536
|
);
|
|
516
537
|
const labelForValue = useCallback(
|
|
517
538
|
(val) => {
|
|
518
|
-
if (val
|
|
539
|
+
if (isCreateValue(val)) {
|
|
519
540
|
return formatCreateLabel(val.slice(CREATE_PREFIX.length));
|
|
520
541
|
}
|
|
521
|
-
return flatOptionsMap.get(val)?.label ?? val;
|
|
542
|
+
return flatOptionsMap.get(val)?.label ?? val ?? "";
|
|
522
543
|
},
|
|
523
544
|
[flatOptionsMap, formatCreateLabel]
|
|
524
545
|
);
|
|
525
546
|
const renderOption = useCallback(
|
|
526
547
|
(val) => {
|
|
527
|
-
if (formatOptionLabel && !val
|
|
548
|
+
if (formatOptionLabel && !isCreateValue(val)) {
|
|
528
549
|
const option = flatOptionsMap.get(val);
|
|
529
550
|
if (option) return formatOptionLabel(option);
|
|
530
551
|
}
|
|
@@ -562,12 +583,13 @@ function OptionItem({
|
|
|
562
583
|
renderOption,
|
|
563
584
|
testIdPrefix
|
|
564
585
|
}) {
|
|
586
|
+
const isCreateItem = isCreateValue(val);
|
|
565
587
|
return /* @__PURE__ */ jsx(
|
|
566
588
|
ComboboxItem,
|
|
567
589
|
{
|
|
568
590
|
value: val,
|
|
569
|
-
disabled: !
|
|
570
|
-
className:
|
|
591
|
+
disabled: !isCreateItem && flatOptionsMap.get(val)?.disabled,
|
|
592
|
+
className: isCreateItem ? "text-primary" : void 0,
|
|
571
593
|
...testIdPrefix ? { "data-testid": `${testIdPrefix}-select-option` } : {},
|
|
572
594
|
children: renderOption(val)
|
|
573
595
|
},
|
|
@@ -1134,12 +1156,48 @@ const MultiSelectInner = forwardRef(
|
|
|
1134
1156
|
);
|
|
1135
1157
|
MultiSelectInner.displayName = "MultiSelectInner";
|
|
1136
1158
|
const Select = forwardRef((props, ref) => {
|
|
1137
|
-
|
|
1138
|
-
|
|
1159
|
+
const {
|
|
1160
|
+
getOptionValue,
|
|
1161
|
+
getOptionLabel,
|
|
1162
|
+
options,
|
|
1163
|
+
defaultOptions,
|
|
1164
|
+
loadOptions,
|
|
1165
|
+
...rest
|
|
1166
|
+
} = props;
|
|
1167
|
+
const hasAccessors = Boolean(getOptionValue || getOptionLabel);
|
|
1168
|
+
const normalizedOptions = useMemo(
|
|
1169
|
+
() => hasAccessors ? normalizeOptions(options, getOptionValue, getOptionLabel) : options,
|
|
1170
|
+
[hasAccessors, options, getOptionValue, getOptionLabel]
|
|
1171
|
+
);
|
|
1172
|
+
const normalizedDefaultOptions = useMemo(() => {
|
|
1173
|
+
if (!hasAccessors || !Array.isArray(defaultOptions)) {
|
|
1174
|
+
return defaultOptions;
|
|
1175
|
+
}
|
|
1176
|
+
return defaultOptions.map(
|
|
1177
|
+
(o) => normalizeOption(o, getOptionValue, getOptionLabel)
|
|
1178
|
+
);
|
|
1179
|
+
}, [hasAccessors, defaultOptions, getOptionValue, getOptionLabel]);
|
|
1180
|
+
const normalizedLoadOptions = useMemo(() => {
|
|
1181
|
+
if (!hasAccessors || !loadOptions) return loadOptions;
|
|
1182
|
+
return async (input) => {
|
|
1183
|
+
const result = await loadOptions(input);
|
|
1184
|
+
return result.map(
|
|
1185
|
+
(o) => normalizeOption(o, getOptionValue, getOptionLabel)
|
|
1186
|
+
);
|
|
1187
|
+
};
|
|
1188
|
+
}, [hasAccessors, loadOptions, getOptionValue, getOptionLabel]);
|
|
1189
|
+
const nextProps = {
|
|
1190
|
+
...rest,
|
|
1191
|
+
options: normalizedOptions,
|
|
1192
|
+
defaultOptions: normalizedDefaultOptions,
|
|
1193
|
+
loadOptions: normalizedLoadOptions
|
|
1194
|
+
};
|
|
1195
|
+
if (nextProps.isMulti === true) {
|
|
1196
|
+
return /* @__PURE__ */ jsx(MultiSelectInner, { ...nextProps, ref });
|
|
1139
1197
|
}
|
|
1140
|
-
return /* @__PURE__ */ jsx(SingleSelectInner, { ...
|
|
1198
|
+
return /* @__PURE__ */ jsx(SingleSelectInner, { ...nextProps, ref });
|
|
1141
1199
|
});
|
|
1142
1200
|
Select.displayName = "Select";
|
|
1143
1201
|
|
|
1144
1202
|
export { Select as S };
|
|
1145
|
-
//# sourceMappingURL=Select-
|
|
1203
|
+
//# sourceMappingURL=Select-DKN7RRzu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Select-DKN7RRzu.js","sources":["../src/utils/hyphenize.ts","../src/utils/fieldIds.ts","../src/components/Select/hooks/useAsyncOptions.ts","../src/components/Select/hooks/useLazyLoadSentinel.ts","../src/components/Select/hooks/useCreatableItems.ts","../src/components/Select/types.ts","../src/components/Select/utils.ts","../src/components/Select/hooks/useMultiSelectOptions.ts","../src/components/Select/constants.ts","../src/components/Select/hooks/useSelectState.ts","../src/components/Select/hooks/useMultiSelectState.ts","../src/components/Select/OptionItem.tsx","../src/components/Select/MultiSelectDropdown.tsx","../src/components/Select/SelectAnchor.tsx","../src/components/Select/SelectCombobox.tsx","../src/components/Select/MultiSelectCombobox.tsx","../src/components/Select/Select.tsx"],"sourcesContent":["export function hyphenize(str: string): string {\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .toLowerCase();\n}\n","import { hyphenize } from \"./hyphenize\";\n\nexport function buildAriaDescribedBy(\n error: string,\n errorId: string,\n helpText: React.ReactNode,\n helpTextId: string\n): string | undefined {\n return (\n [error ? errorId : null, helpText ? helpTextId : null]\n .filter(Boolean)\n .join(\" \") || undefined\n );\n}\n\nexport function buildTestIdPrefix(\n dataTestId: string | undefined,\n label: string\n): string | undefined {\n return dataTestId ?? (label ? hyphenize(label) : undefined);\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport type { SelectOptionBase } from \"src/components/Select/types\";\n\ninterface UseAsyncOptionsConfig {\n loadOptions?: (inputValue: string) => Promise<SelectOptionBase[]>;\n defaultOptions?: boolean | SelectOptionBase[];\n cacheOptions?: boolean;\n}\n\ninterface UseAsyncOptionsReturn {\n asyncOptions: SelectOptionBase[];\n isLoading: boolean;\n handleAsyncInputChange: (value: string) => void;\n}\n\nexport function useAsyncOptions({\n loadOptions,\n defaultOptions = false,\n cacheOptions = false,\n}: UseAsyncOptionsConfig): UseAsyncOptionsReturn {\n const [asyncOptions, setAsyncOptions] = useState<SelectOptionBase[]>(() =>\n Array.isArray(defaultOptions) ? defaultOptions : []\n );\n const [isLoading, setIsLoading] = useState(false);\n const cacheRef = useRef<Record<string, SelectOptionBase[]>>({});\n const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const latestRequestRef = useRef(0);\n const mountedRef = useRef(true);\n\n // Load default options on mount when `defaultOptions === true`\n useEffect(() => {\n if (!loadOptions || defaultOptions !== true) return;\n let cancelled = false;\n setIsLoading(true);\n loadOptions(\"\")\n .then(results => {\n if (cancelled) return;\n setAsyncOptions(results);\n if (cacheOptions) cacheRef.current[\"\"] = results;\n setIsLoading(false);\n })\n .catch(() => {\n if (!cancelled) setIsLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, []);\n\n // Clean up debounce timer and mark unmounted\n useEffect(() => {\n return () => {\n mountedRef.current = false;\n if (debounceRef.current) clearTimeout(debounceRef.current);\n };\n }, []);\n\n const handleAsyncInputChange = useCallback(\n (value: string) => {\n if (!loadOptions) return;\n\n const query = value.trim();\n\n // Check cache first\n if (cacheOptions && query in cacheRef.current) {\n setAsyncOptions(cacheRef.current[query]);\n return;\n }\n\n // Debounce the fetch\n if (debounceRef.current) clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => {\n const requestId = ++latestRequestRef.current;\n setIsLoading(true);\n loadOptions(query)\n .then(results => {\n if (requestId !== latestRequestRef.current || !mountedRef.current)\n return;\n setAsyncOptions(results);\n if (cacheOptions) cacheRef.current[query] = results;\n setIsLoading(false);\n })\n .catch(() => {\n if (requestId === latestRequestRef.current && mountedRef.current) {\n setIsLoading(false);\n }\n });\n }, 300);\n },\n [loadOptions, cacheOptions]\n );\n\n return { asyncOptions, isLoading, handleAsyncInputChange };\n}\n","import { useCallback, useEffect, useRef } from \"react\";\n\ninterface UseLazyLoadSentinelConfig {\n fetchMore?: () => void;\n isEnabled: boolean;\n}\n\nexport function useLazyLoadSentinel({\n fetchMore,\n isEnabled,\n}: UseLazyLoadSentinelConfig) {\n const observerRef = useRef<IntersectionObserver | null>(null);\n const fetchMoreRef = useRef(fetchMore);\n fetchMoreRef.current = fetchMore;\n\n const sentinelRef = useCallback(\n (node: HTMLDivElement | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n\n if (!node || !isEnabled) return;\n\n const observer = new IntersectionObserver(\n entries => {\n if (entries[0]?.isIntersecting) fetchMoreRef.current?.();\n },\n { root: null, rootMargin: \"0px\", threshold: 0.1 }\n );\n observer.observe(node);\n observerRef.current = observer;\n },\n [isEnabled]\n );\n\n // Clean up observer on unmount\n useEffect(() => {\n return () => {\n observerRef.current?.disconnect();\n };\n }, []);\n\n return sentinelRef;\n}\n","import React, { useCallback, useMemo, useState } from \"react\";\n\nimport { computeEffectiveItems } from \"src/components/Select/utils\";\nimport type { SelectOptionBase as MultiSelectOptionBase } from \"src/components/Select/types\";\n\nexport const CREATE_PREFIX = \"__create__:\";\n\nexport const isCreateValue = (val: unknown): val is string =>\n typeof val === \"string\" && val.startsWith(CREATE_PREFIX);\n\ninterface UseCreatableItemsConfig {\n isCreatable: boolean;\n isGrouped: boolean;\n flatOptions: MultiSelectOptionBase[];\n selectedValues: string[];\n baseUiItems?: string[] | { label: string; items: string[] }[];\n onCreateOption?: (inputValue: string) => void;\n onChange?: (values: string[]) => void;\n onAsyncInputChange?: (value: string) => void;\n children?: React.ReactNode;\n}\n\ninterface UseCreatableItemsReturn {\n inputValue: string;\n showCreateOption: boolean;\n effectiveItems: string[] | { label: string; items: string[] }[] | undefined;\n creatableFilter: (\n itemValue: string,\n query: string,\n itemToString?: (v: string) => string\n ) => boolean;\n handleInputValueChange: (value: string) => void;\n handleValueChange: (next: string[] | null) => void;\n}\n\nexport function useCreatableItems({\n isCreatable,\n isGrouped,\n flatOptions,\n selectedValues,\n baseUiItems,\n onCreateOption,\n onChange,\n onAsyncInputChange,\n children,\n}: UseCreatableItemsConfig): UseCreatableItemsReturn {\n const [inputValue, setInputValue] = useState(\"\");\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n onAsyncInputChange?.(value);\n },\n [onAsyncInputChange]\n );\n\n const trimmedInput = inputValue.trim();\n const showCreateOption = useMemo(() => {\n if (!isCreatable || trimmedInput.length === 0) return false;\n const lower = trimmedInput.toLowerCase();\n return (\n !flatOptions.some(\n o => o.label.toLowerCase() === lower || o.value.toLowerCase() === lower\n ) && !selectedValues.includes(trimmedInput)\n );\n }, [isCreatable, trimmedInput, flatOptions, selectedValues]);\n\n const effectiveItems = React.useMemo(\n () =>\n computeEffectiveItems(\n children,\n baseUiItems,\n showCreateOption,\n isGrouped,\n trimmedInput\n ),\n [baseUiItems, children, isGrouped, showCreateOption, trimmedInput]\n );\n\n // Custom filter: always pass the \"Create\" item through\n const creatableFilter = useCallback(\n (\n itemValue: string,\n query: string,\n itemToString?: (v: string) => string\n ) => {\n if (isCreateValue(itemValue)) return true;\n const label = itemToString?.(itemValue) ?? itemValue;\n return label.toLowerCase().includes(query.toLowerCase());\n },\n []\n );\n\n const handleValueChange = useCallback(\n (next: string[] | null) => {\n const raw = next ?? [];\n\n const createEntry = raw.find(v => isCreateValue(v));\n if (createEntry) {\n const newValue = createEntry.slice(CREATE_PREFIX.length);\n const withNewValue = raw.map(v => (v === createEntry ? newValue : v));\n onCreateOption?.(newValue);\n onChange?.(withNewValue);\n return;\n }\n\n onChange?.(raw);\n },\n [onChange, onCreateOption]\n );\n\n return {\n inputValue,\n showCreateOption,\n effectiveItems,\n creatableFilter,\n handleInputValueChange,\n handleValueChange,\n };\n}\n","import type React from \"react\";\n\nimport type { ComboboxContent } from \"src/primitives/Combobox\";\nimport type { FieldLabel } from \"src/primitives/Field\";\n\nexport interface OptionBase {\n /** Display text for the option. */\n label: string;\n /** Unique value for the option. */\n value: string;\n /** Whether the option is disabled. */\n disabled?: boolean;\n}\n\nexport interface OptionGroup {\n /** Group heading text. */\n label: string;\n /** Options within this group. */\n options: OptionBase[];\n}\n\nexport type Option = OptionBase | OptionGroup;\n\nexport function isOptionGroup(opt: Option): opt is OptionGroup {\n return \"options\" in opt && Array.isArray(opt.options);\n}\n\nexport type SelectOptionBase = OptionBase;\nexport type SelectOptionGroup = OptionGroup;\nexport type SelectOption = Option;\n\ntype SelectSize = \"small\" | \"medium\" | \"large\";\n\ninterface SelectSharedProps {\n /** Unique identifier for the select. Auto-generated if omitted. */\n id?: string;\n /** Name attribute forwarded to the underlying input. */\n name?: string;\n /** Size of the trigger. */\n size?: SelectSize;\n /** Label displayed above the select. */\n label?: string;\n /** Error message displayed below the select. */\n error?: string;\n /** Help text displayed below the select. */\n helpText?: React.ReactNode;\n /** Placeholder text when no value is selected. */\n placeholder?: string;\n /** Flat or grouped option list. */\n options?: SelectOption[];\n /** Disable the select. */\n isDisabled?: boolean;\n /** Mark as required. */\n required?: boolean;\n /**\n * Enable search/filtering of options by typing in the input.\n * When false, the input is hidden and the trigger shows the selected label.\n * @default true\n */\n isSearchable?: boolean;\n /** Whether the first matching item is highlighted automatically. @default true */\n autoHighlight?: boolean;\n /** Callback fired when the dropdown opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Positioning strategy for the dropdown content.\n * @deprecated The Combobox primitive always uses popper-style positioning.\n * Use `contentProps.side` and `contentProps.align` for positioning control.\n */\n position?: \"item-aligned\" | \"popper\";\n /** Show a clear/reset button when a value is selected. */\n isClearable?: boolean;\n /**\n * Allow creating new options by typing a value that doesn't exist.\n * Works in both single and multi mode.\n */\n isCreatable?: boolean;\n /**\n * Callback fired when a new option is created via the \"Create X\" item.\n * The parent should update the `options` list to include the new value.\n */\n onCreateOption?: (inputValue: string) => void;\n /**\n * Customize the label for the \"Create\" option in the dropdown.\n * @default (inputValue) => `Create \"${inputValue}\"`\n */\n formatCreateLabel?: (inputValue: string) => string;\n /**\n * Async function that fetches options based on the current input value.\n * Works in both single and multi mode.\n */\n loadOptions?: (inputValue: string) => Promise<SelectOptionBase[]>;\n /**\n * Options to show before the user types anything.\n * When `true`, `loadOptions(\"\")` is called on mount.\n * @default false\n */\n defaultOptions?: boolean | SelectOptionBase[];\n /**\n * Cache results from `loadOptions` so repeated queries are instant.\n * @default false\n */\n cacheOptions?: boolean;\n /** Text shown while `loadOptions` is fetching. @default \"Loading…\" */\n loadingMessage?: string;\n /** Text displayed when no options match. @default \"No results found.\" */\n emptyMessage?: string;\n /**\n * Enable lazy loading of options as the user scrolls.\n * @default false\n */\n isAsyncLoadOptionEnabled?: boolean;\n /** Callback to load the next batch of options (lazy loading). */\n fetchMore?: () => void;\n /** Total number of options on the server (lazy loading). */\n totalOptionsCount?: number;\n /** Custom data-testid prefix for the component tree. */\n dataTestId?: string;\n /** Props forwarded to the FieldLabel. */\n labelProps?: Omit<\n React.ComponentProps<typeof FieldLabel>,\n \"htmlFor\" | \"children\"\n >;\n /** Props forwarded to the ComboboxContent. */\n contentProps?: Omit<\n React.ComponentProps<typeof ComboboxContent>,\n \"anchor\" | \"children\"\n >;\n /** Additional CSS class names for the outermost wrapper. */\n className?: string;\n /** Additional CSS class names for the input/trigger element. */\n inputClassName?: string;\n /** Children rendered inside the dropdown (overrides `options`). */\n children?: React.ReactNode;\n /**\n * Customize how each option is rendered. Receives the matched option (looked\n * up from `options` by value) and returns a ReactNode. Used in the dropdown\n * list and in the trigger (single-select label / multi-select chips).\n * String filtering still uses `option.label` for searchable behavior.\n */\n formatOptionLabel?: (option: SelectOptionBase) => React.ReactNode;\n /**\n * Extract the value string from a raw option object. Use when your options\n * are not already in `{ value, label }` shape (for example `{ id, name }`).\n * Called for each entry in `options`, each group child, `defaultOptions`, and\n * the array returned from `loadOptions`. Without this prop the option must\n * already have a `value` field.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getOptionValue?: (option: any) => string;\n /**\n * Extract the label string from a raw option object. Pairs with\n * `getOptionValue` to support custom option shapes without forcing\n * call-site `.map` boilerplate. Without this prop the option must already\n * have a `label` field.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getOptionLabel?: (option: any) => string;\n /**\n * Customize how the selected value is rendered in the trigger only. When\n * provided, takes precedence over `formatOptionLabel` for the trigger;\n * dropdown rows still use `formatOptionLabel` (or the default label).\n * Single-select only. Useful when the trigger needs a compact representation\n * (e.g. flag-only) while options show fuller content (flag + name).\n */\n formatTriggerLabel?: (option: SelectOptionBase) => React.ReactNode;\n}\n\ninterface SingleSelectProps extends SelectSharedProps {\n /** When true, multiple values can be selected and the trigger shows chips. @default false */\n isMulti?: false;\n /** Controlled selected value. */\n value?: string;\n /** Default selected value (uncontrolled). */\n defaultValue?: string;\n /** Callback fired when value changes. */\n onChange?: (value: string) => void;\n}\n\ninterface MultiSelectVariantProps extends SelectSharedProps {\n /** When true, multiple values can be selected and the trigger shows chips. */\n isMulti: true;\n /** Controlled selected values. */\n value?: string[];\n /** Default selected values (uncontrolled). */\n defaultValue?: string[];\n /** Callback fired when selected values change. */\n onChange?: (values: string[]) => void;\n /** Additional CSS class names for the chips container. */\n chipsClassName?: string;\n /** Hide the remove button on individual chips. */\n hideChipRemove?: boolean;\n}\n\nexport type SelectProps = SingleSelectProps | MultiSelectVariantProps;\n\nexport type MultiSelectProps = Extract<SelectProps, { isMulti: true }>;\n","import { CREATE_PREFIX } from \"./hooks/useCreatableItems\";\nimport { isOptionGroup } from \"./types\";\nimport type {\n SelectOption as MultiSelectOption,\n SelectOptionBase as MultiSelectOptionBase,\n} from \"./types\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AccessorFn = (option: any) => string;\n\nexport function normalizeOption(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n option: any,\n getValue?: AccessorFn,\n getLabel?: AccessorFn\n): MultiSelectOptionBase {\n if (!getValue && !getLabel) return option as MultiSelectOptionBase;\n return {\n ...option,\n value: getValue ? getValue(option) : option?.value,\n label: getLabel ? getLabel(option) : option?.label,\n };\n}\n\nexport function normalizeOptions(\n options: MultiSelectOption[] | undefined,\n getValue?: AccessorFn,\n getLabel?: AccessorFn\n): MultiSelectOption[] | undefined {\n if (!options) return options;\n if (!getValue && !getLabel) return options;\n return options.map(opt =>\n opt && Array.isArray((opt as { options?: unknown[] }).options)\n ? {\n ...opt,\n options: (opt as { options: unknown[] }).options.map(o =>\n normalizeOption(o, getValue, getLabel)\n ),\n }\n : normalizeOption(opt, getValue, getLabel)\n );\n}\n\n/** Flatten grouped options into a flat lookup array. */\nexport function flattenOptions(\n options: MultiSelectOption[]\n): MultiSelectOptionBase[] {\n return options.flatMap(opt => (isOptionGroup(opt) ? opt.options : [opt]));\n}\n\n/** Check if any option is a group. */\nexport function hasGroups(options: MultiSelectOption[]): boolean {\n return options.some(isOptionGroup);\n}\n\n/** Convert options to base-ui `items` format for filtering support. */\nexport function toBaseUiItems(\n options: MultiSelectOption[]\n): string[] | { label: string; items: string[] }[] {\n if (hasGroups(options)) {\n return options.filter(isOptionGroup).map(g => ({\n label: g.label,\n items: g.options.map(o => o.value),\n }));\n }\n return (options as MultiSelectOptionBase[]).map(o => o.value);\n}\n\n/** Build the effective items array, appending a \"Create\" entry when needed. */\nexport function computeEffectiveItems(\n children: unknown,\n baseUiItems: string[] | { label: string; items: string[] }[] | undefined,\n showCreateOption: boolean,\n isGrouped: boolean,\n trimmedInput: string\n): string[] | { label: string; items: string[] }[] | undefined {\n if (children) return undefined;\n\n const createValue = showCreateOption\n ? `${CREATE_PREFIX}${trimmedInput}`\n : null;\n\n if (!baseUiItems && !createValue) return undefined;\n\n const base = baseUiItems ?? ([] as string[]);\n\n if (!createValue) return base;\n\n if (!isGrouped) {\n return [...(base as string[]), createValue];\n }\n\n return [\n ...(base as { label: string; items: string[] }[]),\n { label: \"\", items: [createValue] },\n ];\n}\n","import React from \"react\";\n\nimport { useAsyncOptions } from \"./useAsyncOptions\";\nimport { useLazyLoadSentinel } from \"./useLazyLoadSentinel\";\nimport {\n flattenOptions,\n hasGroups,\n toBaseUiItems,\n} from \"src/components/Select/utils\";\nimport type { SelectOption as MultiSelectOption } from \"src/components/Select/types\";\n\ninterface UseMultiSelectOptionsConfig {\n options?: MultiSelectOption[];\n loadOptions?: (\n inputValue: string\n ) => Promise<{ label: string; value: string; disabled?: boolean }[]>;\n defaultOptions?:\n | boolean\n | { label: string; value: string; disabled?: boolean }[];\n cacheOptions?: boolean;\n isAsyncLoadOptionEnabled?: boolean;\n fetchMore?: () => void;\n totalOptionsCount?: number;\n}\n\nexport function useMultiSelectOptions(props: UseMultiSelectOptionsConfig) {\n const isAsync = !!props.loadOptions;\n\n const { asyncOptions, isLoading, handleAsyncInputChange } = useAsyncOptions({\n loadOptions: props.loadOptions,\n defaultOptions: props.defaultOptions ?? false,\n cacheOptions: props.cacheOptions ?? false,\n });\n\n const resolvedOptions: MultiSelectOption[] = isAsync\n ? asyncOptions\n : (props.options ?? []);\n const flatOptions = flattenOptions(resolvedOptions);\n const isGrouped = hasGroups(resolvedOptions);\n\n const baseUiItems = React.useMemo(\n () =>\n resolvedOptions.length > 0 ? toBaseUiItems(resolvedOptions) : undefined,\n [resolvedOptions]\n );\n\n const hasMoreLazy =\n (props.isAsyncLoadOptionEnabled ?? false) &&\n typeof props.totalOptionsCount === \"number\" &&\n flatOptions.length < props.totalOptionsCount;\n\n const loaderCallbackRef = useLazyLoadSentinel({\n fetchMore: props.fetchMore,\n isEnabled: props.isAsyncLoadOptionEnabled ?? false,\n });\n\n return {\n isAsync,\n resolvedOptions,\n flatOptions,\n isGrouped,\n isLoading,\n handleAsyncInputChange,\n baseUiItems,\n hasMoreLazy,\n loaderCallbackRef,\n };\n}\n","// SIZE_CONFIG is shared by both SelectCombobox (single-select) and\n// MultiSelectCombobox (multi-select). Keys mirror the MultiSelect constants\n// that previously lived in MultiSelect.constants.ts.\n//\n// Mobile (<768px) uses 16px input font-size to prevent iOS Safari auto-zoom\n// on focus. Desktop (md+) keeps the original text sizes. Chip sizing is\n// unchanged because chips are non-interactive badges that don't trigger\n// iOS zoom.\nexport const SIZE_CONFIG: Record<\n \"small\" | \"medium\" | \"large\",\n { chips: string; input: string; chip: string; icon: string }\n> = {\n small: {\n chips: \"min-h-8 md:min-h-7 text-base md:text-xs gap-0.5 px-1 py-0.5\",\n input: \"text-base md:text-xs\",\n chip: \"h-4.5 text-[0.6875rem] px-1\",\n icon: \"size-3.5\",\n },\n medium: {\n chips: \"min-h-8 text-base md:text-sm gap-1 px-2.5 py-1\",\n input: \"text-base md:text-sm\",\n chip: \"h-5.25 text-xs px-1.5\",\n icon: \"size-4\",\n },\n large: {\n chips: \"min-h-10 text-base md:text-sm gap-1 px-2.5 py-1.5\",\n input: \"text-base md:text-sm\",\n chip: \"h-6 text-xs px-2\",\n icon: \"size-5\",\n },\n};\n","import { useCallback, useId, useMemo, useState } from \"react\";\nimport type React from \"react\";\n\nimport { buildAriaDescribedBy, buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport { useMultiSelectOptions } from \"./useMultiSelectOptions\";\nimport { CREATE_PREFIX, isCreateValue } from \"./useCreatableItems\";\nimport { SIZE_CONFIG } from \"src/components/Select/constants\";\nimport type { SelectProps } from \"src/components/Select/types\";\n\ntype SingleSelectProps = Extract<SelectProps, { isMulti?: false }>;\n\nconst defaultFormatCreateLabel = (v: string) => `Create \"${v}\"`;\n\nexport function useSelectState(props: SingleSelectProps) {\n const {\n id: idProp,\n size = \"medium\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n value: valueProp,\n defaultValue,\n onChange,\n dataTestId,\n isCreatable = false,\n onCreateOption,\n formatCreateLabel = defaultFormatCreateLabel,\n formatOptionLabel,\n formatTriggerLabel,\n isClearable = false,\n isDisabled = false,\n required = false,\n isSearchable = true,\n autoHighlight = true,\n onOpenChange,\n children,\n } = props;\n\n const opt = useMultiSelectOptions(props);\n\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n const sizeConfig = SIZE_CONFIG[size];\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string>(\n defaultValue ?? \"\"\n );\n const currentValue = isControlled ? (valueProp ?? \"\") : internalValue;\n\n const applyValue = useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n const handleValueChange = useCallback(\n (next: string | null) => {\n const raw = next ?? \"\";\n\n // Handle the creatable \"Create X\" option\n if (raw.startsWith(CREATE_PREFIX)) {\n const newValue = raw.slice(CREATE_PREFIX.length);\n onCreateOption?.(newValue);\n applyValue(newValue);\n return;\n }\n\n applyValue(raw);\n },\n [applyValue, onCreateOption]\n );\n\n const [inputValue, setInputValueState] = useState(\"\");\n const trimmedInput = inputValue.trim();\n\n const combinedHandleInputValueChange = useCallback(\n (value: string) => {\n setInputValueState(value);\n if (opt.isAsync) opt.handleAsyncInputChange(value);\n },\n [opt.isAsync, opt.handleAsyncInputChange]\n );\n\n const handleClear = useCallback(() => {\n applyValue(\"\");\n }, [applyValue]);\n\n const showCreateOption = useMemo(() => {\n if (\n !isCreatable ||\n trimmedInput.length === 0 ||\n currentValue === trimmedInput\n )\n return false;\n\n const lower = trimmedInput.toLowerCase();\n return !opt.flatOptions.some(\n o => o.label.toLowerCase() === lower || o.value.toLowerCase() === lower\n );\n }, [isCreatable, trimmedInput, currentValue, opt.flatOptions]);\n\n const effectiveItems = useMemo(() => {\n if (children) return undefined;\n const base = opt.baseUiItems;\n if (!showCreateOption) return base;\n const createValue = `${CREATE_PREFIX}${trimmedInput}`;\n if (!opt.isGrouped) {\n return [...((base as string[]) ?? []), createValue];\n }\n return [\n ...((base as { label: string; items: string[] }[]) ?? []),\n { label: \"\", items: [createValue] },\n ];\n }, [\n children,\n opt.baseUiItems,\n opt.isGrouped,\n showCreateOption,\n trimmedInput,\n ]);\n\n const creatableFilter = useCallback(\n (\n itemValue: string,\n query: string,\n itemToString?: (v: string) => string\n ) => {\n if (isCreateValue(itemValue)) return true;\n const label = itemToString?.(itemValue) ?? itemValue;\n return label.toLowerCase().includes(query.toLowerCase());\n },\n []\n );\n\n const ariaDescribedBy = buildAriaDescribedBy(\n error,\n errorId,\n helpText,\n helpTextId\n );\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n const showClearButton = isClearable && !!currentValue && !isDisabled;\n\n const flatOptionsMap = useMemo(\n () => new Map(opt.flatOptions.map(o => [o.value, o])),\n [opt.flatOptions]\n );\n\n const labelForValue = useCallback(\n (val: string) => {\n if (isCreateValue(val)) {\n return formatCreateLabel(val.slice(CREATE_PREFIX.length));\n }\n return flatOptionsMap.get(val)?.label ?? val ?? \"\";\n },\n [flatOptionsMap, formatCreateLabel]\n );\n\n const renderOption = useCallback<(val: string) => React.ReactNode>(\n val => {\n if (formatOptionLabel && !isCreateValue(val)) {\n const option = flatOptionsMap.get(val);\n if (option) return formatOptionLabel(option);\n }\n return labelForValue(val);\n },\n [formatOptionLabel, flatOptionsMap, labelForValue]\n );\n\n const renderTrigger = useCallback<(val: string) => React.ReactNode>(\n val => {\n if (formatTriggerLabel && !isCreateValue(val)) {\n const option = flatOptionsMap.get(val);\n if (option) return formatTriggerLabel(option);\n }\n return renderOption(val);\n },\n [formatTriggerLabel, flatOptionsMap, renderOption]\n );\n\n return {\n ...opt,\n id,\n errorId,\n helpTextId,\n sizeConfig,\n isControlled,\n currentValue,\n effectiveItems,\n creatableFilter,\n handleValueChange,\n handleInputValueChange: combinedHandleInputValueChange,\n handleClear,\n showCreateOption,\n showClearButton,\n ariaDescribedBy,\n testIdPrefix,\n labelForValue,\n renderOption,\n renderTrigger,\n flatOptionsMap,\n label,\n error,\n helpText,\n isDisabled,\n required,\n isSearchable,\n autoHighlight,\n onOpenChange,\n isClearable,\n };\n}\n","import { useCallback, useId, useMemo, useState } from \"react\";\nimport type React from \"react\";\n\nconst defaultFormatCreateLabel = (v: string) => `Create \"${v}\"`;\n\nimport { buildAriaDescribedBy, buildTestIdPrefix } from \"src/utils/fieldIds\";\nimport {\n useCreatableItems,\n CREATE_PREFIX,\n isCreateValue,\n} from \"./useCreatableItems\";\nimport { useMultiSelectOptions } from \"./useMultiSelectOptions\";\nimport { SIZE_CONFIG } from \"src/components/Select/constants\";\nimport type { MultiSelectProps } from \"src/components/Select/types\";\n\nexport function useMultiSelectState(props: MultiSelectProps) {\n const {\n id: idProp,\n size = \"medium\",\n label = \"\",\n error = \"\",\n helpText = \"\",\n value: valueProp,\n defaultValue,\n onChange,\n dataTestId,\n isCreatable = false,\n onCreateOption,\n formatCreateLabel = defaultFormatCreateLabel,\n formatOptionLabel,\n children,\n } = props;\n\n const opt = useMultiSelectOptions(props);\n\n const generatedId = useId();\n const id = idProp ?? generatedId;\n const errorId = `error_${id}`;\n const helpTextId = `helpText_${id}`;\n const sizeConfig = SIZE_CONFIG[size];\n\n const isControlled = valueProp !== undefined;\n const [internalValue, setInternalValue] = useState<string[]>(\n defaultValue ?? []\n );\n const selectedValues = isControlled ? valueProp : internalValue;\n\n const handleChange = useCallback(\n (values: string[]) => {\n setInternalValue(values);\n onChange?.(values);\n },\n [onChange]\n );\n\n const {\n showCreateOption,\n effectiveItems,\n creatableFilter,\n handleInputValueChange,\n handleValueChange,\n } = useCreatableItems({\n isCreatable,\n isGrouped: opt.isGrouped,\n flatOptions: opt.flatOptions,\n selectedValues,\n baseUiItems: opt.baseUiItems,\n onCreateOption,\n onChange: handleChange,\n onAsyncInputChange: opt.isAsync ? opt.handleAsyncInputChange : undefined,\n children,\n });\n\n const ariaDescribedBy = buildAriaDescribedBy(\n error,\n errorId,\n helpText,\n helpTextId\n );\n const testIdPrefix = buildTestIdPrefix(dataTestId, label);\n\n const flatOptionsMap = useMemo(\n () => new Map(opt.flatOptions.map(o => [o.value, o])),\n [opt.flatOptions]\n );\n\n const labelForValue = useCallback(\n (val: string) => {\n if (isCreateValue(val)) {\n return formatCreateLabel(val.slice(CREATE_PREFIX.length));\n }\n return flatOptionsMap.get(val)?.label ?? val ?? \"\";\n },\n [flatOptionsMap, formatCreateLabel]\n );\n\n const renderOption = useCallback<(val: string) => React.ReactNode>(\n val => {\n if (formatOptionLabel && !isCreateValue(val)) {\n const option = flatOptionsMap.get(val);\n if (option) return formatOptionLabel(option);\n }\n return labelForValue(val);\n },\n [formatOptionLabel, flatOptionsMap, labelForValue]\n );\n\n return {\n ...opt,\n id,\n errorId,\n helpTextId,\n sizeConfig,\n isControlled,\n selectedValues,\n effectiveItems,\n creatableFilter,\n handleInputValueChange,\n handleValueChange,\n showCreateOption,\n ariaDescribedBy,\n testIdPrefix,\n labelForValue,\n renderOption,\n flatOptionsMap,\n label,\n error,\n helpText,\n };\n}\n","import type React from \"react\";\n\nimport { ComboboxItem } from \"src/primitives/Combobox\";\nimport { isCreateValue } from \"./hooks/useCreatableItems\";\nimport type { OptionBase } from \"./types\";\n\ninterface OptionItemProps {\n val: string;\n flatOptionsMap: Map<string, OptionBase>;\n renderOption: (val: string) => React.ReactNode;\n testIdPrefix?: string;\n}\n\nexport function OptionItem({\n val,\n flatOptionsMap,\n renderOption,\n testIdPrefix,\n}: OptionItemProps) {\n const isCreateItem = isCreateValue(val);\n\n return (\n <ComboboxItem\n key={val}\n value={val}\n disabled={!isCreateItem && flatOptionsMap.get(val)?.disabled}\n className={isCreateItem ? \"text-primary\" : undefined}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-option` }\n : {})}\n >\n {renderOption(val)}\n </ComboboxItem>\n );\n}\n","import type React from \"react\";\n\nimport {\n ComboboxList,\n ComboboxGroup,\n ComboboxLabel,\n ComboboxCollection,\n ComboboxEmpty,\n} from \"src/primitives/Combobox\";\nimport { Spinner } from \"src/primitives/Spinner\";\nimport { OptionItem } from \"./OptionItem\";\nimport type { DropdownPassthroughProps } from \"./MultiSelectCombobox.types\";\n\ninterface MultiSelectDropdownProps extends DropdownPassthroughProps {\n renderOption: (val: string) => React.ReactNode;\n testIdPrefix?: string;\n children?: React.ReactNode;\n}\n\nexport function MultiSelectDropdown({\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n loadingMessage,\n emptyMessage,\n showCreateOption,\n renderOption,\n testIdPrefix,\n hasMoreLazy,\n loaderCallbackRef,\n children,\n}: MultiSelectDropdownProps) {\n return (\n <ComboboxList\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-menu` }\n : {})}\n >\n {isLoading && (\n <div className=\"flex w-full justify-center py-2 text-center text-sm text-muted-foreground\">\n {loadingMessage}\n </div>\n )}\n {!isLoading && !showCreateOption && (\n <ComboboxEmpty>{emptyMessage}</ComboboxEmpty>\n )}\n {children ??\n (resolvedOptions.length > 0 || showCreateOption ? (\n isGrouped ? (\n <ComboboxCollection>\n {(group: { label: string; items: string[] }) => (\n <ComboboxGroup\n key={group.label || \"__create__\"}\n items={group.items}\n >\n {group.label && <ComboboxLabel>{group.label}</ComboboxLabel>}\n <ComboboxCollection>\n {(val: string) => (\n <OptionItem\n key={val}\n val={val}\n flatOptionsMap={flatOptionsMap}\n renderOption={renderOption}\n testIdPrefix={testIdPrefix}\n />\n )}\n </ComboboxCollection>\n </ComboboxGroup>\n )}\n </ComboboxCollection>\n ) : (\n <ComboboxCollection>\n {(val: string) => (\n <OptionItem\n key={val}\n val={val}\n flatOptionsMap={flatOptionsMap}\n renderOption={renderOption}\n testIdPrefix={testIdPrefix}\n />\n )}\n </ComboboxCollection>\n )\n ) : null)}\n {hasMoreLazy && (\n <div\n ref={loaderCallbackRef}\n className=\"flex w-full items-center justify-center py-3\"\n data-testid={\n testIdPrefix ? `${testIdPrefix}-lazy-loader` : \"lazy-loader\"\n }\n >\n <Spinner />\n </div>\n )}\n </ComboboxList>\n );\n}\n","import { forwardRef } from \"react\";\n\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\";\n\ninterface SelectAnchorProps {\n isSearchable: boolean;\n className?: string;\n dataTestId?: string;\n children: React.ReactNode;\n}\n\nexport const SelectAnchor = forwardRef<HTMLDivElement, SelectAnchorProps>(\n ({ isSearchable, className, dataTestId, children }, ref) => {\n if (isSearchable) {\n return (\n <div\n ref={ref}\n className={className}\n {...(dataTestId ? { \"data-testid\": dataTestId } : {})}\n >\n {children}\n </div>\n );\n }\n\n return (\n <ComboboxPrimitive.Trigger\n nativeButton={false}\n render={props => (\n <div\n {...props}\n ref={ref}\n className={className}\n {...(dataTestId ? { \"data-testid\": dataTestId } : {})}\n />\n )}\n >\n {children}\n </ComboboxPrimitive.Trigger>\n );\n }\n);\n\nSelectAnchor.displayName = \"SelectAnchor\";\n","import { forwardRef, useCallback, useState } from \"react\";\nimport { ChevronDownIcon, XIcon } from \"lucide-react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Combobox,\n ComboboxContent,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxTrigger,\n} from \"src/primitives/Combobox\";\nimport { MultiSelectDropdown } from \"./MultiSelectDropdown\";\nimport { SelectAnchor } from \"./SelectAnchor\";\nimport type { SelectComboboxProps } from \"./SelectCombobox.types\";\n\nexport const SelectCombobox = forwardRef<HTMLInputElement, SelectComboboxProps>(\n (\n {\n name,\n id,\n effectiveItems,\n labelForValue,\n renderOption,\n renderTrigger,\n isSearchable,\n isAsync,\n isCreatable,\n creatableFilter,\n currentValue,\n handleValueChange,\n handleInputValueChange,\n handleClear,\n onOpenChange,\n isDisabled,\n autoHighlight,\n required,\n showClearButton,\n sizeConfig,\n error,\n placeholder,\n ariaDescribedBy,\n testIdPrefix,\n inputClassName,\n contentProps,\n dropdownProps,\n children,\n },\n ref\n ) => {\n const [anchorEl, setAnchorEl] = useState<HTMLDivElement | null>(null);\n\n const handleClearClick = useCallback(\n (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n handleClear();\n },\n [handleClear]\n );\n\n return (\n // @ts-expect-error — conditional spread creates a union that TS cannot narrow to the Combobox discriminated-union props\n <Combobox\n name={name}\n {...(effectiveItems && !children\n ? {\n items: effectiveItems,\n itemToStringLabel: labelForValue as (val: unknown) => string,\n ...(!isSearchable || isAsync\n ? { filter: null }\n : isCreatable\n ? { filter: creatableFilter }\n : {}),\n }\n : {})}\n value={currentValue}\n onValueChange={handleValueChange as (next: unknown) => void}\n {...(isCreatable || isAsync\n ? { onInputValueChange: handleInputValueChange }\n : {})}\n onOpenChange={onOpenChange}\n disabled={isDisabled}\n autoHighlight={autoHighlight}\n >\n <SelectAnchor\n ref={setAnchorEl}\n isSearchable={isSearchable}\n dataTestId={testIdPrefix}\n className={!isSearchable ? \"cursor-pointer\" : undefined}\n >\n <ComboboxChips\n className={cn(\n sizeConfig.chips,\n !!error &&\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\",\n inputClassName\n )}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-container` }\n : {})}\n >\n {!isSearchable &&\n (currentValue ? (\n <span className=\"flex-1 truncate\">\n {renderTrigger(currentValue)}\n </span>\n ) : (\n <span className=\"flex-1 truncate text-muted-foreground\">\n {placeholder}\n </span>\n ))}\n <ComboboxChipsInput\n ref={ref}\n id={id}\n placeholder={\n isSearchable && !currentValue ? placeholder : undefined\n }\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n aria-required={required || undefined}\n className={cn(\n sizeConfig.input,\n !isSearchable && \"w-0 min-w-0 overflow-hidden p-0 opacity-0\"\n )}\n disabled={isDisabled}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-input` }\n : {})}\n />\n {showClearButton && (\n <button\n type=\"button\"\n tabIndex={-1}\n aria-label=\"Clear selection\"\n className=\"shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={handleClearClick}\n >\n <XIcon className={sizeConfig.icon} />\n </button>\n )}\n {isSearchable ? (\n <ComboboxTrigger\n className={cn(\n \"shrink-0 bg-transparent p-0 text-muted-foreground hover:bg-transparent\",\n sizeConfig.icon\n )}\n />\n ) : (\n <ChevronDownIcon\n aria-hidden\n className={cn(\n \"pointer-events-none shrink-0 text-muted-foreground\",\n sizeConfig.icon\n )}\n />\n )}\n </ComboboxChips>\n </SelectAnchor>\n\n <ComboboxContent anchor={anchorEl} {...contentProps}>\n <MultiSelectDropdown\n {...dropdownProps}\n renderOption={renderOption}\n testIdPrefix={testIdPrefix}\n >\n {children}\n </MultiSelectDropdown>\n </ComboboxContent>\n </Combobox>\n );\n }\n);\n\nSelectCombobox.displayName = \"SelectCombobox\";\n","import { forwardRef, useState } from \"react\";\nimport { cn } from \"src/shadcn/lib/utils\";\nimport {\n Combobox,\n ComboboxContent,\n ComboboxChips,\n ComboboxChip,\n ComboboxChipsInput,\n} from \"src/primitives/Combobox\";\nimport { MultiSelectDropdown } from \"./MultiSelectDropdown\";\nimport { SelectAnchor } from \"./SelectAnchor\";\nimport type { MultiSelectComboboxProps } from \"./MultiSelectCombobox.types\";\n\nexport const MultiSelectCombobox = forwardRef<\n HTMLInputElement,\n MultiSelectComboboxProps\n>(\n (\n {\n name,\n id,\n effectiveItems,\n labelForValue,\n renderOption,\n isSearchable,\n isAsync,\n isCreatable,\n creatableFilter,\n isControlled,\n valueProp,\n defaultValue,\n selectedValues,\n handleValueChange,\n handleInputValueChange,\n onOpenChange,\n isDisabled,\n autoHighlight,\n required,\n sizeConfig,\n error,\n chipsClassName,\n inputClassName,\n placeholder,\n hideChipRemove,\n ariaDescribedBy,\n testIdPrefix,\n contentProps,\n dropdownProps,\n children,\n },\n ref\n ) => {\n const [anchorEl, setAnchorEl] = useState<HTMLDivElement | null>(null);\n\n return (\n // @ts-expect-error — conditional spread creates a union that TS cannot narrow to the Combobox discriminated-union props\n <Combobox\n multiple\n name={name}\n {...(effectiveItems && !children\n ? {\n items: effectiveItems,\n itemToStringLabel: labelForValue as (val: unknown) => string,\n ...(!isSearchable || isAsync\n ? { filter: null }\n : isCreatable\n ? { filter: creatableFilter }\n : {}),\n }\n : {})}\n {...(isControlled ? { value: valueProp } : { defaultValue })}\n onValueChange={handleValueChange as (...args: unknown[]) => void}\n {...(isCreatable || isAsync\n ? { onInputValueChange: handleInputValueChange }\n : {})}\n onOpenChange={onOpenChange}\n disabled={isDisabled}\n autoHighlight={autoHighlight}\n >\n <SelectAnchor\n ref={setAnchorEl}\n isSearchable={isSearchable}\n className={!isSearchable ? \"cursor-pointer\" : undefined}\n >\n <ComboboxChips\n className={cn(\n sizeConfig.chips,\n !!error &&\n \"border-destructive ring-3 ring-destructive/20 dark:border-destructive/50 dark:ring-destructive/40\",\n chipsClassName,\n inputClassName\n )}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-container` }\n : {})}\n >\n {selectedValues.map(val => (\n <ComboboxChip\n key={val}\n className={sizeConfig.chip}\n showRemove={!hideChipRemove}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-chip` }\n : {})}\n >\n {renderOption(val)}\n </ComboboxChip>\n ))}\n <ComboboxChipsInput\n ref={ref}\n id={id}\n placeholder={\n isSearchable && selectedValues.length === 0\n ? placeholder\n : undefined\n }\n aria-invalid={!!error || undefined}\n aria-describedby={ariaDescribedBy}\n aria-required={required || undefined}\n className={cn(\n sizeConfig.input,\n !isSearchable && \"w-0 min-w-0 overflow-hidden p-0 opacity-0\"\n )}\n disabled={isDisabled}\n {...(testIdPrefix\n ? { \"data-testid\": `${testIdPrefix}-select-input` }\n : {})}\n />\n </ComboboxChips>\n </SelectAnchor>\n <ComboboxContent anchor={anchorEl} {...contentProps}>\n <MultiSelectDropdown\n {...dropdownProps}\n renderOption={renderOption}\n testIdPrefix={testIdPrefix}\n >\n {children}\n </MultiSelectDropdown>\n </ComboboxContent>\n </Combobox>\n );\n }\n);\nMultiSelectCombobox.displayName = \"MultiSelectCombobox\";\n","import { forwardRef, useMemo } from \"react\";\n\nimport { useSelectState } from \"./hooks/useSelectState\";\nimport { useMultiSelectState } from \"./hooks/useMultiSelectState\";\nimport { SelectFieldWrapper } from \"./SelectFieldWrapper\";\nimport { SelectCombobox } from \"./SelectCombobox\";\nimport { MultiSelectCombobox } from \"./MultiSelectCombobox\";\nimport type { SelectProps, MultiSelectProps, SelectOptionBase } from \"./types\";\nimport { normalizeOption, normalizeOptions } from \"./utils\";\n\nexport type {\n SelectProps,\n SelectOption,\n SelectOptionBase,\n SelectOptionGroup,\n} from \"./types\";\n\ntype SingleSelectProps = Extract<SelectProps, { isMulti?: false }>;\n\nconst SingleSelectInner = forwardRef<HTMLInputElement, SingleSelectProps>(\n (props, ref) => {\n const {\n id,\n label,\n error,\n helpText,\n errorId,\n helpTextId,\n isDisabled,\n required,\n testIdPrefix,\n effectiveItems,\n labelForValue,\n renderOption,\n renderTrigger,\n isSearchable,\n isAsync,\n creatableFilter,\n isControlled,\n currentValue,\n handleValueChange,\n handleInputValueChange,\n handleClear,\n autoHighlight,\n showClearButton,\n sizeConfig,\n ariaDescribedBy,\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n showCreateOption,\n hasMoreLazy,\n loaderCallbackRef,\n } = useSelectState(props);\n\n return (\n <SelectFieldWrapper\n id={id}\n label={label}\n error={error}\n helpText={helpText}\n errorId={errorId}\n helpTextId={helpTextId}\n isDisabled={isDisabled}\n required={required}\n testIdPrefix={testIdPrefix}\n labelProps={props.labelProps}\n className={props.className}\n >\n <SelectCombobox\n ref={ref}\n name={props.name}\n id={id}\n effectiveItems={effectiveItems}\n labelForValue={labelForValue}\n renderOption={renderOption}\n renderTrigger={renderTrigger}\n isSearchable={isSearchable}\n isAsync={isAsync}\n isCreatable={props.isCreatable ?? false}\n creatableFilter={creatableFilter}\n isControlled={isControlled}\n valueProp={props.value}\n defaultValue={props.defaultValue}\n currentValue={currentValue}\n handleValueChange={handleValueChange}\n handleInputValueChange={handleInputValueChange}\n handleClear={handleClear}\n onOpenChange={props.onOpenChange}\n isDisabled={isDisabled}\n autoHighlight={autoHighlight}\n required={required}\n isClearable={props.isClearable ?? false}\n showClearButton={showClearButton}\n sizeConfig={sizeConfig}\n error={error}\n placeholder={props.placeholder ?? \"\"}\n ariaDescribedBy={ariaDescribedBy}\n testIdPrefix={testIdPrefix}\n inputClassName={props.inputClassName}\n contentProps={props.contentProps}\n dropdownProps={{\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n loadingMessage: props.loadingMessage ?? \"Loading\\u2026\",\n emptyMessage: props.emptyMessage ?? \"No results found.\",\n showCreateOption,\n hasMoreLazy,\n loaderCallbackRef,\n }}\n >\n {props.children}\n </SelectCombobox>\n </SelectFieldWrapper>\n );\n }\n);\nSingleSelectInner.displayName = \"SingleSelectInner\";\n\nconst MultiSelectInner = forwardRef<HTMLInputElement, MultiSelectProps>(\n (props, ref) => {\n const {\n id,\n label,\n error,\n helpText,\n errorId,\n helpTextId,\n testIdPrefix,\n effectiveItems,\n labelForValue,\n renderOption,\n isAsync,\n creatableFilter,\n isControlled,\n selectedValues,\n handleValueChange,\n handleInputValueChange,\n sizeConfig,\n ariaDescribedBy,\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n showCreateOption,\n hasMoreLazy,\n loaderCallbackRef,\n } = useMultiSelectState(props);\n const { isDisabled = false, required = false } = props;\n\n return (\n <SelectFieldWrapper\n id={id}\n label={label}\n error={error}\n helpText={helpText}\n errorId={errorId}\n helpTextId={helpTextId}\n isDisabled={isDisabled}\n required={required}\n testIdPrefix={testIdPrefix}\n labelProps={props.labelProps}\n className={props.className}\n >\n <MultiSelectCombobox\n ref={ref}\n name={props.name}\n id={id}\n effectiveItems={effectiveItems}\n labelForValue={labelForValue}\n renderOption={renderOption}\n isSearchable={props.isSearchable ?? true}\n isAsync={isAsync}\n isCreatable={props.isCreatable ?? false}\n creatableFilter={creatableFilter}\n isControlled={isControlled}\n valueProp={props.value}\n defaultValue={props.defaultValue}\n selectedValues={selectedValues}\n handleValueChange={handleValueChange as (...args: unknown[]) => void}\n handleInputValueChange={\n handleInputValueChange as (...args: unknown[]) => void\n }\n onOpenChange={props.onOpenChange}\n isDisabled={isDisabled}\n autoHighlight={props.autoHighlight ?? true}\n sizeConfig={sizeConfig}\n error={error}\n chipsClassName={props.chipsClassName}\n inputClassName={props.inputClassName}\n placeholder={props.placeholder ?? \"\"}\n hideChipRemove={props.hideChipRemove ?? false}\n ariaDescribedBy={ariaDescribedBy}\n required={required}\n testIdPrefix={testIdPrefix}\n contentProps={props.contentProps}\n dropdownProps={{\n resolvedOptions,\n flatOptionsMap,\n isGrouped,\n isLoading,\n loadingMessage: props.loadingMessage ?? \"Loading\\u2026\",\n emptyMessage: props.emptyMessage ?? \"No results found.\",\n showCreateOption,\n hasMoreLazy,\n loaderCallbackRef,\n }}\n >\n {props.children}\n </MultiSelectCombobox>\n </SelectFieldWrapper>\n );\n }\n);\nMultiSelectInner.displayName = \"MultiSelectInner\";\n\nconst Select = forwardRef<HTMLInputElement, SelectProps>((props, ref) => {\n const {\n getOptionValue,\n getOptionLabel,\n options,\n defaultOptions,\n loadOptions,\n ...rest\n } = props;\n const hasAccessors = Boolean(getOptionValue || getOptionLabel);\n\n const normalizedOptions = useMemo(\n () =>\n hasAccessors\n ? normalizeOptions(options, getOptionValue, getOptionLabel)\n : options,\n [hasAccessors, options, getOptionValue, getOptionLabel]\n );\n\n const normalizedDefaultOptions = useMemo(() => {\n if (!hasAccessors || !Array.isArray(defaultOptions)) {\n return defaultOptions;\n }\n return defaultOptions.map(o =>\n normalizeOption(o, getOptionValue, getOptionLabel)\n );\n }, [hasAccessors, defaultOptions, getOptionValue, getOptionLabel]);\n\n const normalizedLoadOptions = useMemo(() => {\n if (!hasAccessors || !loadOptions) return loadOptions;\n return async (input: string): Promise<SelectOptionBase[]> => {\n const result = await loadOptions(input);\n return result.map(o =>\n normalizeOption(o, getOptionValue, getOptionLabel)\n );\n };\n }, [hasAccessors, loadOptions, getOptionValue, getOptionLabel]);\n\n const nextProps = {\n ...rest,\n options: normalizedOptions,\n defaultOptions: normalizedDefaultOptions,\n loadOptions: normalizedLoadOptions,\n } as SelectProps;\n\n if (nextProps.isMulti === true) {\n return <MultiSelectInner {...(nextProps as MultiSelectProps)} ref={ref} />;\n }\n return <SingleSelectInner {...(nextProps as SingleSelectProps)} ref={ref} />;\n});\n\nSelect.displayName = \"Select\";\n\nexport { Select };\n"],"names":["React","defaultFormatCreateLabel","label","ComboboxPrimitive.Trigger","XIcon","ComboboxTrigger","ChevronDownIcon"],"mappings":"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"}
|
|
@@ -121,6 +121,7 @@ function useLazyLoadSentinel({
|
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
const CREATE_PREFIX = "__create__:";
|
|
124
|
+
const isCreateValue = (val) => typeof val === "string" && val.startsWith(CREATE_PREFIX);
|
|
124
125
|
function useCreatableItems({
|
|
125
126
|
isCreatable,
|
|
126
127
|
isGrouped,
|
|
@@ -160,7 +161,7 @@ function useCreatableItems({
|
|
|
160
161
|
);
|
|
161
162
|
const creatableFilter = React.useCallback(
|
|
162
163
|
(itemValue, query, itemToString) => {
|
|
163
|
-
if (itemValue
|
|
164
|
+
if (isCreateValue(itemValue)) return true;
|
|
164
165
|
const label = itemToString?.(itemValue) ?? itemValue;
|
|
165
166
|
return label.toLowerCase().includes(query.toLowerCase());
|
|
166
167
|
},
|
|
@@ -169,7 +170,7 @@ function useCreatableItems({
|
|
|
169
170
|
const handleValueChange = React.useCallback(
|
|
170
171
|
(next) => {
|
|
171
172
|
const raw = next ?? [];
|
|
172
|
-
const createEntry = raw.find((v) => v
|
|
173
|
+
const createEntry = raw.find((v) => isCreateValue(v));
|
|
173
174
|
if (createEntry) {
|
|
174
175
|
const newValue = createEntry.slice(CREATE_PREFIX.length);
|
|
175
176
|
const withNewValue = raw.map((v) => v === createEntry ? newValue : v);
|
|
@@ -195,6 +196,26 @@ function isOptionGroup(opt) {
|
|
|
195
196
|
return "options" in opt && Array.isArray(opt.options);
|
|
196
197
|
}
|
|
197
198
|
|
|
199
|
+
function normalizeOption(option, getValue, getLabel) {
|
|
200
|
+
if (!getValue && !getLabel) return option;
|
|
201
|
+
return {
|
|
202
|
+
...option,
|
|
203
|
+
value: getValue ? getValue(option) : option?.value,
|
|
204
|
+
label: getLabel ? getLabel(option) : option?.label
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function normalizeOptions(options, getValue, getLabel) {
|
|
208
|
+
if (!options) return options;
|
|
209
|
+
if (!getValue && !getLabel) return options;
|
|
210
|
+
return options.map(
|
|
211
|
+
(opt) => opt && Array.isArray(opt.options) ? {
|
|
212
|
+
...opt,
|
|
213
|
+
options: opt.options.map(
|
|
214
|
+
(o) => normalizeOption(o, getValue, getLabel)
|
|
215
|
+
)
|
|
216
|
+
} : normalizeOption(opt, getValue, getLabel)
|
|
217
|
+
);
|
|
218
|
+
}
|
|
198
219
|
function flattenOptions(options) {
|
|
199
220
|
return options.flatMap((opt) => isOptionGroup(opt) ? opt.options : [opt]);
|
|
200
221
|
}
|
|
@@ -375,7 +396,7 @@ function useSelectState(props) {
|
|
|
375
396
|
]);
|
|
376
397
|
const creatableFilter = React.useCallback(
|
|
377
398
|
(itemValue, query, itemToString) => {
|
|
378
|
-
if (itemValue
|
|
399
|
+
if (isCreateValue(itemValue)) return true;
|
|
379
400
|
const label2 = itemToString?.(itemValue) ?? itemValue;
|
|
380
401
|
return label2.toLowerCase().includes(query.toLowerCase());
|
|
381
402
|
},
|
|
@@ -395,16 +416,16 @@ function useSelectState(props) {
|
|
|
395
416
|
);
|
|
396
417
|
const labelForValue = React.useCallback(
|
|
397
418
|
(val) => {
|
|
398
|
-
if (val
|
|
419
|
+
if (isCreateValue(val)) {
|
|
399
420
|
return formatCreateLabel(val.slice(CREATE_PREFIX.length));
|
|
400
421
|
}
|
|
401
|
-
return flatOptionsMap.get(val)?.label ?? val;
|
|
422
|
+
return flatOptionsMap.get(val)?.label ?? val ?? "";
|
|
402
423
|
},
|
|
403
424
|
[flatOptionsMap, formatCreateLabel]
|
|
404
425
|
);
|
|
405
426
|
const renderOption = React.useCallback(
|
|
406
427
|
(val) => {
|
|
407
|
-
if (formatOptionLabel && !val
|
|
428
|
+
if (formatOptionLabel && !isCreateValue(val)) {
|
|
408
429
|
const option = flatOptionsMap.get(val);
|
|
409
430
|
if (option) return formatOptionLabel(option);
|
|
410
431
|
}
|
|
@@ -414,7 +435,7 @@ function useSelectState(props) {
|
|
|
414
435
|
);
|
|
415
436
|
const renderTrigger = React.useCallback(
|
|
416
437
|
(val) => {
|
|
417
|
-
if (formatTriggerLabel && !val
|
|
438
|
+
if (formatTriggerLabel && !isCreateValue(val)) {
|
|
418
439
|
const option = flatOptionsMap.get(val);
|
|
419
440
|
if (option) return formatTriggerLabel(option);
|
|
420
441
|
}
|
|
@@ -521,16 +542,16 @@ function useMultiSelectState(props) {
|
|
|
521
542
|
);
|
|
522
543
|
const labelForValue = React.useCallback(
|
|
523
544
|
(val) => {
|
|
524
|
-
if (val
|
|
545
|
+
if (isCreateValue(val)) {
|
|
525
546
|
return formatCreateLabel(val.slice(CREATE_PREFIX.length));
|
|
526
547
|
}
|
|
527
|
-
return flatOptionsMap.get(val)?.label ?? val;
|
|
548
|
+
return flatOptionsMap.get(val)?.label ?? val ?? "";
|
|
528
549
|
},
|
|
529
550
|
[flatOptionsMap, formatCreateLabel]
|
|
530
551
|
);
|
|
531
552
|
const renderOption = React.useCallback(
|
|
532
553
|
(val) => {
|
|
533
|
-
if (formatOptionLabel && !val
|
|
554
|
+
if (formatOptionLabel && !isCreateValue(val)) {
|
|
534
555
|
const option = flatOptionsMap.get(val);
|
|
535
556
|
if (option) return formatOptionLabel(option);
|
|
536
557
|
}
|
|
@@ -568,12 +589,13 @@ function OptionItem({
|
|
|
568
589
|
renderOption,
|
|
569
590
|
testIdPrefix
|
|
570
591
|
}) {
|
|
592
|
+
const isCreateItem = isCreateValue(val);
|
|
571
593
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
572
594
|
primitives_Combobox.ComboboxItem,
|
|
573
595
|
{
|
|
574
596
|
value: val,
|
|
575
|
-
disabled: !
|
|
576
|
-
className:
|
|
597
|
+
disabled: !isCreateItem && flatOptionsMap.get(val)?.disabled,
|
|
598
|
+
className: isCreateItem ? "text-primary" : void 0,
|
|
577
599
|
...testIdPrefix ? { "data-testid": `${testIdPrefix}-select-option` } : {},
|
|
578
600
|
children: renderOption(val)
|
|
579
601
|
},
|
|
@@ -1140,12 +1162,48 @@ const MultiSelectInner = React.forwardRef(
|
|
|
1140
1162
|
);
|
|
1141
1163
|
MultiSelectInner.displayName = "MultiSelectInner";
|
|
1142
1164
|
const Select = React.forwardRef((props, ref) => {
|
|
1143
|
-
|
|
1144
|
-
|
|
1165
|
+
const {
|
|
1166
|
+
getOptionValue,
|
|
1167
|
+
getOptionLabel,
|
|
1168
|
+
options,
|
|
1169
|
+
defaultOptions,
|
|
1170
|
+
loadOptions,
|
|
1171
|
+
...rest
|
|
1172
|
+
} = props;
|
|
1173
|
+
const hasAccessors = Boolean(getOptionValue || getOptionLabel);
|
|
1174
|
+
const normalizedOptions = React.useMemo(
|
|
1175
|
+
() => hasAccessors ? normalizeOptions(options, getOptionValue, getOptionLabel) : options,
|
|
1176
|
+
[hasAccessors, options, getOptionValue, getOptionLabel]
|
|
1177
|
+
);
|
|
1178
|
+
const normalizedDefaultOptions = React.useMemo(() => {
|
|
1179
|
+
if (!hasAccessors || !Array.isArray(defaultOptions)) {
|
|
1180
|
+
return defaultOptions;
|
|
1181
|
+
}
|
|
1182
|
+
return defaultOptions.map(
|
|
1183
|
+
(o) => normalizeOption(o, getOptionValue, getOptionLabel)
|
|
1184
|
+
);
|
|
1185
|
+
}, [hasAccessors, defaultOptions, getOptionValue, getOptionLabel]);
|
|
1186
|
+
const normalizedLoadOptions = React.useMemo(() => {
|
|
1187
|
+
if (!hasAccessors || !loadOptions) return loadOptions;
|
|
1188
|
+
return async (input) => {
|
|
1189
|
+
const result = await loadOptions(input);
|
|
1190
|
+
return result.map(
|
|
1191
|
+
(o) => normalizeOption(o, getOptionValue, getOptionLabel)
|
|
1192
|
+
);
|
|
1193
|
+
};
|
|
1194
|
+
}, [hasAccessors, loadOptions, getOptionValue, getOptionLabel]);
|
|
1195
|
+
const nextProps = {
|
|
1196
|
+
...rest,
|
|
1197
|
+
options: normalizedOptions,
|
|
1198
|
+
defaultOptions: normalizedDefaultOptions,
|
|
1199
|
+
loadOptions: normalizedLoadOptions
|
|
1200
|
+
};
|
|
1201
|
+
if (nextProps.isMulti === true) {
|
|
1202
|
+
return /* @__PURE__ */ jsxRuntime.jsx(MultiSelectInner, { ...nextProps, ref });
|
|
1145
1203
|
}
|
|
1146
|
-
return /* @__PURE__ */ jsxRuntime.jsx(SingleSelectInner, { ...
|
|
1204
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SingleSelectInner, { ...nextProps, ref });
|
|
1147
1205
|
});
|
|
1148
1206
|
Select.displayName = "Select";
|
|
1149
1207
|
|
|
1150
1208
|
exports.Select = Select;
|
|
1151
|
-
//# sourceMappingURL=Select-
|
|
1209
|
+
//# sourceMappingURL=Select-CxaYzbvK.js.map
|