@chayns-components/core 5.5.40 → 5.5.41
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/AGENTS.md +1 -1
- package/lib/cjs/components/search-box/SearchBox.js +10 -9
- package/lib/cjs/components/search-box/SearchBox.js.map +1 -1
- package/lib/cjs/utils/searchBox.test.js +20 -0
- package/lib/cjs/utils/searchBox.test.js.map +1 -1
- package/lib/esm/components/search-box/SearchBox.js +9 -9
- package/lib/esm/components/search-box/SearchBox.js.map +1 -1
- package/lib/esm/utils/searchBox.test.js +20 -0
- package/lib/esm/utils/searchBox.test.js.map +1 -1
- package/lib/types/components/search-box/SearchBox.d.ts +10 -1
- package/package.json +2 -2
package/AGENTS.md
CHANGED
|
@@ -4736,7 +4736,7 @@ import { SearchBox } from '@chayns-components/core';
|
|
|
4736
4736
|
| name | type | required | description |
|
|
4737
4737
|
| --- | --- | --- | --- |
|
|
4738
4738
|
| `container` | `Element \| undefined` | no | The element where the content of the `ComboBox` should be rendered via React Portal. |
|
|
4739
|
-
| `customFilter` | `((item: ISearchBoxItem) => boolean) \| undefined` | no | An optional callback function to filter the elements to be displayed |
|
|
4739
|
+
| `customFilter` | `((item: ISearchBoxItem, value: string) => boolean) \| undefined` | no | An optional callback function to filter the elements to be displayed |
|
|
4740
4740
|
| `customSortFunction` | `SearchBoxSortFunction \| undefined` | no | An optional callback function to sort the filtered elements to be displayed |
|
|
4741
4741
|
| `dropdownDirection` | `DropdownDirection \| undefined` | no | The direction in which the dropdown should be displayed. By default, it is displayed below the input. |
|
|
4742
4742
|
| `hintText` | `string \| undefined` | no | A text that should be displayed if no results are found. |
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
6
|
+
exports.filterSearchBoxItems = exports.default = void 0;
|
|
7
7
|
var _chaynsApi = require("chayns-api");
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
var _styledComponents = require("styled-components");
|
|
@@ -29,18 +29,18 @@ const filterSearchBoxItems = ({
|
|
|
29
29
|
searchString,
|
|
30
30
|
shouldUseCustomFilterOnly
|
|
31
31
|
}) => {
|
|
32
|
-
if (
|
|
33
|
-
|
|
32
|
+
if (shouldUseCustomFilterOnly) {
|
|
33
|
+
const filteredItems = typeof customFilter === 'function' ? items.filter(item => customFilter(item, searchString)) : items;
|
|
34
|
+
return (0, _searchBox.sortSearchBoxItems)({
|
|
34
35
|
customSortFunction,
|
|
35
|
-
items,
|
|
36
|
+
items: filteredItems,
|
|
36
37
|
searchString
|
|
37
38
|
});
|
|
38
39
|
}
|
|
39
|
-
if (
|
|
40
|
-
|
|
41
|
-
return (0, _searchBox.sortSearchBoxItems)({
|
|
40
|
+
if (typeof customFilter !== 'function') {
|
|
41
|
+
return (0, _searchBox.searchList)({
|
|
42
42
|
customSortFunction,
|
|
43
|
-
items
|
|
43
|
+
items,
|
|
44
44
|
searchString
|
|
45
45
|
});
|
|
46
46
|
}
|
|
@@ -48,8 +48,9 @@ const filterSearchBoxItems = ({
|
|
|
48
48
|
customSortFunction,
|
|
49
49
|
items,
|
|
50
50
|
searchString
|
|
51
|
-
}).filter(customFilter);
|
|
51
|
+
}).filter(item => customFilter(item, searchString));
|
|
52
52
|
};
|
|
53
|
+
exports.filterSearchBoxItems = filterSearchBoxItems;
|
|
53
54
|
const getDropdownSearchString = ({
|
|
54
55
|
selectedId,
|
|
55
56
|
shouldKeepSelectedItemPosition,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBox.js","names":["_chaynsApi","require","_react","_interopRequireWildcard","_styledComponents","_calculate","_searchBox","_Icon","_interopRequireDefault","_Input","_GroupName","_SearchBoxBody","_SearchBoxItem","_SearchBoxItem2","_SearchBox","_uuid","_DropdownBodyWrapper","_TagInput","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","filterSearchBoxItems","customFilter","customSortFunction","items","searchString","shouldUseCustomFilterOnly","searchList","filteredItems","filter","sortSearchBoxItems","getDropdownSearchString","selectedId","shouldKeepSelectedItemPosition","value","SearchBox","forwardRef","container","dropdownDirection","inputProps","isInvalid","leftIcons","lists","maxHeight","onBlur","onChange","onKeyDown","onSelect","placeholder","presetValue","hintText","shouldAddInputToList","shouldHideFilterButtons","shouldShowContentOnEmptyInput","shouldShowSmallItems","shouldShowRoundImage","shouldShowToggleIcon","tagInputSettings","shouldEnableKeyboardHighlighting","ref","matchingListsItems","setMatchingListsItems","useState","selectedImage","setSelectedImage","internalValue","setInternalValue","inputValue","setValue","useCallback","nextValue","height","setHeight","focusedIndex","setFocusedIndex","hasMultipleGroups","setHasMultipleGroups","filteredChildrenArray","setFilteredChildrenArray","inputToListValue","setInputToListValue","groups","setGroups","shouldShowBody","setShouldShowBody","uuid","useUuid","boxRef","useRef","contentRef","inputRef","tagInputRef","hasFocusRef","isAnimatingRef","shouldShowPresetValue","theme","useTheme","dropdownSearchString","isTouch","useDevice","useEffect","filterButtons","useMemo","forEach","groupName","push","id","text","activeList","newLists","list","includes","newMatchingItems","newList","undefined","filteredMatchingListItems","map","item","handleOpen","handleClose","handleFilterButtonsGroupSelect","keys","textArray","calculateContentHeight","selectedItem","find","imageUrl","createElement","StyledSearchBoxItemImage","src","$shouldShowRoundImage","current","handleFocus","event","onFocus","handleKeyDown","toLowerCase","handleClick","rightElement","StyledSearchBoxIcon","onClick","icons","color","leftElement","StyledSearchBoxLeftWrapper","handleChange","filteredLists","target","handleBlur","handleDropdownOutsideClick","_tagInputRef$current","blur","handleContainerBlur","_contentRef$current","nextFocusedElement","relatedTarget","currentContainer","currentTarget","contains","handleSelect","newItem","replace","_tagInputRef$current2","resetValue","content","StyledSearchBoxHintText","index","key","name","listIndex","tabIndex","_contentRef$current2","_childrenArray$find","children","childrenArray","Array","from","newChildren","child","startsWith","filteredChildren","dataset","isgroupname","preventDefault","newIndex","prevElement","newElement","stopPropagation","_element$children$","element","textContent","attributes","_element$children$2","nodeValue","newId","document","addEventListener","removeEventListener","handleKeyPress","keyCode","useImperativeHandle","clear","shouldShowDropdown","trim","StyledSearchBox","onAdd","onRemove","size","shouldAllowMultiple","shouldPreventEnter","tags","anchorElement","direction","onClose","onOutsideClick","shouldShow","onGroupSelect","selectedGroups","displayName","_default","exports"],"sources":["../../../../src/components/search-box/SearchBox.tsx"],"sourcesContent":["import { useDevice } from 'chayns-api';\nimport React, {\n ChangeEvent,\n ChangeEventHandler,\n FC,\n FocusEvent,\n FocusEventHandler,\n forwardRef,\n KeyboardEventHandler,\n ReactElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTheme } from 'styled-components';\nimport type { IFilterButtonItem } from '../../types/filterButtons';\nimport type { ISearchBoxItem, ISearchBoxItems } from '../../types/searchBox';\nimport { calculateContentHeight } from '../../utils/calculate';\nimport { searchList, sortSearchBoxItems, type SearchBoxSortFunction } from '../../utils/searchBox';\nimport type { Theme } from '../color-scheme-provider/ColorSchemeProvider';\nimport Icon from '../icon/Icon';\nimport Input, { type InputProps } from '../input/Input';\nimport GroupName from './group-name/GroupName';\nimport SearchBoxBody from './search-box-body/SearchBoxBody';\nimport SearchBoxItem from './search-box-item/SearchBoxItem';\nimport { StyledSearchBoxItemImage } from './search-box-item/SearchBoxItem.styles';\nimport {\n StyledSearchBox,\n StyledSearchBoxHintText,\n StyledSearchBoxIcon,\n StyledSearchBoxLeftWrapper,\n} from './SearchBox.styles';\nimport { useUuid } from '../../hooks/uuid';\nimport DropdownBodyWrapper from '../dropdown-body-wrapper/DropdownBodyWrapper';\nimport TagInput, { TagInputProps, TagInputRef } from '../tag-input/TagInput';\nimport type { DropdownDirection } from '../../types/dropdown';\n\nexport interface SearchBoxRef {\n clear: VoidFunction;\n}\n\nexport interface TagInputSettings {\n onAdd?: TagInputProps['onAdd'];\n onRemove?: TagInputProps['onRemove'];\n size?: TagInputProps['size'];\n shouldAllowMultiple?: TagInputProps['shouldAllowMultiple'];\n tags?: TagInputProps['tags'];\n}\n\nconst filterSearchBoxItems = ({\n customFilter,\n customSortFunction,\n items,\n searchString,\n shouldUseCustomFilterOnly,\n}: {\n customFilter?: (item: ISearchBoxItem) => boolean;\n customSortFunction?: SearchBoxSortFunction;\n items: ISearchBoxItem[];\n searchString: string;\n shouldUseCustomFilterOnly?: boolean;\n}) => {\n if (typeof customFilter !== 'function') {\n return searchList({ customSortFunction, items, searchString });\n }\n\n if (shouldUseCustomFilterOnly) {\n const filteredItems = items.filter(customFilter);\n\n return sortSearchBoxItems({ customSortFunction, items: filteredItems, searchString });\n }\n\n return searchList({ customSortFunction, items, searchString }).filter(customFilter);\n};\n\nconst getDropdownSearchString = ({\n selectedId,\n shouldKeepSelectedItemPosition,\n value,\n}: {\n selectedId?: string;\n shouldKeepSelectedItemPosition?: boolean;\n value: string;\n}) => (shouldKeepSelectedItemPosition && selectedId ? '' : value);\n\nexport type SearchBoxProps = {\n /**\n * The element where the content of the `ComboBox` should be rendered via React Portal.\n */\n container?: Element;\n /**\n * An optional callback function to filter the elements to be displayed\n */\n customFilter?: (item: ISearchBoxItem) => boolean;\n /**\n * An optional callback function to sort the filtered elements to be displayed\n */\n customSortFunction?: SearchBoxSortFunction;\n /**\n * If true, the custom filter replaces the built-in text search instead of narrowing its results.\n */\n shouldUseCustomFilterOnly?: boolean;\n /**\n * The direction in which the dropdown should be displayed. By default, it is displayed below the input.\n */\n dropdownDirection?: DropdownDirection;\n /**\n * If true, the input field is marked as invalid\n */\n isInvalid?: boolean;\n /**\n * An optional icon that is displayed inside the left side of the input.\n */\n leftIcons?: string[];\n /**\n * Props that are passed to the underlying Input component.\n */\n inputProps?: InputProps;\n /**\n * List of groups with items that can be searched. It is possible to give only one list; if multiple lists are provided, the 'group name' parameter becomes mandatory.\n */\n lists: ISearchBoxItems[];\n /**\n * The maximum height of the dropdown body in pixels.\n */\n maxHeight?: number;\n /**\n * Function to be executed when the input lost focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Function to be executed when the input is changed.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Function that is executed when a letter is pressed\n */\n onKeyDown?: KeyboardEventHandler<HTMLInputElement>;\n /**\n * Function to be executed when an item is selected.\n */\n onSelect?: (item: ISearchBoxItem) => void;\n /**\n * The placeholder that should be displayed.\n */\n placeholder?: string;\n /**\n * Set an input for the search box - it is not an item of a list, just a string.\n */\n presetValue?: string;\n /**\n * Control the selected item. If you use this prop, make sure to update it when the user selects an item.\n */\n selectedId?: string;\n /**\n * If true, the selected item keeps its original position in the dropdown list.\n */\n shouldKeepSelectedItemPosition?: boolean;\n /**\n * If true, the value in the Input is displayed in the list.\n */\n shouldAddInputToList: boolean;\n /**\n * If true, the filter buttons are hidden.\n */\n shouldHideFilterButtons?: boolean;\n /**\n * Whether the full list of items should be displayed if the input is empty.\n */\n shouldShowContentOnEmptyInput?: boolean;\n /**\n * If true, the dropdown items are displayed more compactly.\n */\n shouldShowSmallItems?: boolean;\n /**\n * If true, the images of the items are displayed in a round shape.\n */\n shouldShowRoundImage?: boolean;\n /**\n * Whether the icon to open and close the list should be displayed.\n */\n shouldShowToggleIcon?: boolean;\n /**\n * Settings for the TagInput.\n */\n tagInputSettings?: TagInputSettings;\n /**\n * Enables keyboard-only focus highlighting.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n /**\n * A text that should be displayed if no results are found.\n */\n hintText?: string;\n};\n\nconst SearchBox: FC<SearchBoxProps> = forwardRef<SearchBoxRef, SearchBoxProps>(\n (\n {\n container,\n customFilter,\n customSortFunction,\n dropdownDirection,\n inputProps,\n isInvalid = false,\n leftIcons,\n lists,\n maxHeight = 300,\n onBlur,\n onChange,\n onKeyDown,\n onSelect,\n placeholder,\n presetValue,\n hintText,\n selectedId,\n shouldAddInputToList = true,\n shouldKeepSelectedItemPosition = false,\n shouldUseCustomFilterOnly = false,\n shouldHideFilterButtons = false,\n shouldShowContentOnEmptyInput = true,\n shouldShowSmallItems = false,\n shouldShowRoundImage,\n shouldShowToggleIcon = false,\n tagInputSettings,\n shouldEnableKeyboardHighlighting,\n },\n ref,\n ) => {\n const [matchingListsItems, setMatchingListsItems] = useState<ISearchBoxItems[]>(lists);\n const [selectedImage, setSelectedImage] = useState<ReactElement>();\n const [internalValue, setInternalValue] = useState(\n typeof presetValue === 'string' && presetValue !== '' ? presetValue : '',\n );\n const inputValue = inputProps?.value;\n const value = inputValue ?? internalValue;\n const setValue = useCallback(\n (nextValue: string) => {\n if (typeof inputValue !== 'string') {\n setInternalValue(nextValue);\n }\n },\n [inputValue],\n );\n const [height, setHeight] = useState<number>(0);\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const [hasMultipleGroups, setHasMultipleGroups] = useState<boolean>(lists.length > 1);\n const [filteredChildrenArray, setFilteredChildrenArray] = useState<Element[]>();\n const [inputToListValue, setInputToListValue] = useState<string>('');\n const [groups, setGroups] = useState<string[]>(['all']);\n const [shouldShowBody, setShouldShowBody] = useState(false);\n\n const uuid = useUuid();\n\n const boxRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const tagInputRef = useRef<TagInputRef>(null);\n\n const hasFocusRef = useRef<boolean>(false);\n const isAnimatingRef = useRef<boolean>(false);\n const shouldShowPresetValue = useRef<boolean>(\n typeof presetValue === 'string' && presetValue !== '',\n );\n\n const theme = useTheme() as Theme;\n const dropdownSearchString = getDropdownSearchString({\n selectedId,\n shouldKeepSelectedItemPosition,\n value,\n });\n\n const { isTouch } = useDevice();\n\n /**\n * Checks if there are multiple groups in the lists\n */\n useEffect(() => {\n setHasMultipleGroups(lists.length > 1);\n }, [lists]);\n\n const filterButtons = useMemo(() => {\n const items: IFilterButtonItem[] = [];\n\n if (lists.length <= 1) {\n return items;\n }\n\n lists.forEach(({ groupName }) => {\n if (groupName) {\n items.push({\n id: groupName,\n text: groupName,\n });\n }\n });\n\n return items;\n }, [lists]);\n\n /**\n * Filters the lists by the FilterButtons\n */\n const activeList = useMemo(() => {\n let newLists: ISearchBoxItems[] = [];\n\n if (groups[0] === 'all') {\n newLists = lists;\n } else {\n lists.forEach((list) => {\n if (list.groupName && groups.includes(list.groupName)) {\n newLists.push(list);\n }\n });\n }\n\n const newMatchingItems: ISearchBoxItems[] = [];\n\n newLists.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n const filteredMatchingListItems = newMatchingItems.map(({ list, groupName }) => ({\n groupName,\n list: list.filter((item) => {\n if (typeof customFilter === 'function' && shouldUseCustomFilterOnly) {\n return true;\n }\n\n return !(newMatchingItems.length === 1 && item.text === dropdownSearchString);\n }),\n }));\n\n setMatchingListsItems(filteredMatchingListItems);\n\n return newLists;\n }, [\n groups,\n lists,\n customFilter,\n customSortFunction,\n dropdownSearchString,\n shouldAddInputToList,\n shouldUseCustomFilterOnly,\n ]);\n\n const handleOpen = useCallback(() => {\n setShouldShowBody(true);\n }, []);\n\n const handleClose = useCallback(() => {\n setShouldShowBody(false);\n }, []);\n\n const handleFilterButtonsGroupSelect = (keys: string[]) => {\n setGroups(keys.length === 0 ? ['all'] : keys);\n };\n\n /**\n * This hook calculates the height\n */\n useEffect(() => {\n const textArray: string[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n list.forEach(({ text }) => textArray.push(text));\n if (!groupName) {\n return;\n }\n textArray.push(groupName);\n });\n\n if (shouldAddInputToList && inputToListValue !== '') {\n textArray.push(inputToListValue);\n }\n\n setHeight(calculateContentHeight(textArray));\n }, [inputToListValue, activeList, placeholder, shouldAddInputToList]);\n\n useEffect(() => {\n if (selectedId) {\n activeList.forEach(({ list }) => {\n const selectedItem = list.find(({ id }) => id === selectedId);\n if (selectedItem) {\n setValue(selectedItem.text);\n\n if (selectedItem.imageUrl) {\n setSelectedImage(\n <StyledSearchBoxItemImage\n src={selectedItem.imageUrl}\n $shouldShowRoundImage={shouldShowRoundImage}\n />,\n );\n }\n }\n });\n }\n }, [activeList, selectedId, shouldShowRoundImage]);\n\n /**\n * This hook resets the value if the selectedId changes to undefined. This is an own useEffect because the value\n * should not be reset if the list changes and the selectedId is still undefined.\n */\n useEffect(() => {\n if (!selectedId && !shouldShowPresetValue.current) {\n setValue('');\n }\n }, [selectedId]);\n\n useEffect(() => {\n isAnimatingRef.current = shouldShowBody;\n }, [shouldShowBody]);\n\n useEffect(() => {\n if (\n (matchingListsItems.length !== 0 || hintText) &&\n !isAnimatingRef.current &&\n hasFocusRef.current\n ) {\n handleOpen();\n }\n }, [handleOpen, hintText, matchingListsItems.length]);\n\n /**\n * This function handles the focus event of the input and opens the dropdown if the input\n * should show content on an empty input\n */\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n hasFocusRef.current = true;\n\n if (typeof inputProps?.onFocus === 'function') {\n inputProps.onFocus(event);\n }\n\n if (shouldShowContentOnEmptyInput) {\n const newMatchingItems: ISearchBoxItems[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n const filteredMatchingListItems = newMatchingItems.map(\n ({ list, groupName }) => ({\n groupName,\n list: list.filter((item) => {\n if (\n typeof customFilter === 'function' &&\n shouldUseCustomFilterOnly\n ) {\n return true;\n }\n\n return !(\n newMatchingItems.length === 1 &&\n item.text === dropdownSearchString\n );\n }),\n }),\n );\n\n setMatchingListsItems(filteredMatchingListItems);\n\n if (filteredMatchingListItems.length !== 0 || hintText) {\n handleOpen();\n }\n }\n },\n [\n shouldShowContentOnEmptyInput,\n activeList,\n shouldAddInputToList,\n hintText,\n dropdownSearchString,\n customFilter,\n customSortFunction,\n shouldUseCustomFilterOnly,\n handleOpen,\n inputProps,\n ],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLInputElement>>(\n (event) => {\n if (typeof onKeyDown === 'function') {\n onKeyDown(event);\n }\n\n if (typeof inputProps?.onKeyDown === 'function') {\n inputProps.onKeyDown(event);\n }\n },\n [inputProps, onKeyDown],\n );\n\n /**\n * This function filters the lists by input\n */\n\n useEffect(() => {\n const newMatchingItems: ISearchBoxItems[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n if (shouldAddInputToList && inputToListValue !== '') {\n newMatchingItems.forEach(({ list }) => {\n list.forEach(({ text }) => {\n if (text.toLowerCase() === inputToListValue.toLowerCase()) {\n setInputToListValue('');\n }\n });\n });\n }\n }, [\n inputToListValue,\n activeList,\n shouldAddInputToList,\n shouldShowContentOnEmptyInput,\n dropdownSearchString,\n customFilter,\n customSortFunction,\n shouldUseCustomFilterOnly,\n ]);\n\n const handleClick = useCallback(() => {\n if (shouldShowBody) {\n handleClose();\n } else {\n handleOpen();\n }\n }, [handleClose, handleOpen, shouldShowBody]);\n\n const rightElement = useMemo(() => {\n if (!shouldShowToggleIcon) {\n return undefined;\n }\n\n return (\n <StyledSearchBoxIcon onClick={handleClick}>\n <Icon icons={['fa fa-chevron-down']} color={theme['006'] as string} />\n </StyledSearchBoxIcon>\n );\n }, [handleClick, shouldShowToggleIcon, theme]);\n\n const leftElement = useMemo(\n () =>\n (leftIcons || selectedImage) && (\n <StyledSearchBoxLeftWrapper>\n {leftIcons && <Icon icons={leftIcons} />}\n {selectedImage && selectedImage}\n </StyledSearchBoxLeftWrapper>\n ),\n [leftIcons, selectedImage],\n );\n\n /**\n * This function handles changes of the input\n */\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const filteredLists: ISearchBoxItems[] = [];\n shouldShowPresetValue.current = false;\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: event.target.value,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n filteredLists.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (filteredLists.length === 0 && shouldAddInputToList) {\n filteredLists.push({\n groupName: undefined,\n list: [],\n });\n }\n\n setSelectedImage(undefined);\n\n if (!shouldShowContentOnEmptyInput && !event.target.value) {\n setMatchingListsItems([]);\n } else {\n setMatchingListsItems(filteredLists);\n }\n\n if (filteredLists.length !== 0) {\n handleOpen();\n }\n\n setValue(event.target.value);\n setInputToListValue(event.target.value);\n\n if (typeof onChange === 'function') {\n onChange(event);\n }\n\n if (typeof inputProps?.onChange === 'function') {\n inputProps.onChange(event);\n }\n },\n [\n activeList,\n customFilter,\n customSortFunction,\n handleOpen,\n inputProps,\n onChange,\n shouldAddInputToList,\n shouldShowContentOnEmptyInput,\n shouldUseCustomFilterOnly,\n ],\n );\n\n /**\n * This function handles the blur event of the input\n */\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n hasFocusRef.current = false;\n\n if (typeof onBlur === 'function') {\n onBlur(event);\n }\n\n if (typeof inputProps?.onBlur === 'function') {\n inputProps.onBlur(event);\n }\n },\n [inputProps, onBlur],\n );\n\n const handleDropdownOutsideClick = useCallback(() => {\n tagInputRef.current?.blur();\n\n return hasFocusRef.current && isTouch;\n }, [isTouch]);\n\n const handleContainerBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n const nextFocusedElement = event.relatedTarget as Node | null;\n const currentContainer = event.currentTarget as HTMLElement;\n\n // Check if focus is moving outside the SearchBox container\n // Also check the dropdown content (contentRef) since it's rendered in a portal\n if (\n !nextFocusedElement ||\n (!currentContainer.contains(nextFocusedElement) &&\n !contentRef.current?.contains(nextFocusedElement))\n ) {\n handleClose();\n }\n },\n [handleClose],\n );\n\n /**\n * This function handles the item selection\n */\n const handleSelect = useCallback(\n (item: ISearchBoxItem) => {\n const newItem = {\n ...item,\n text: item.text.replace('<b>', '').replace('</b>', '').replace('</b', ''),\n };\n\n if (tagInputSettings) {\n setValue('');\n setInputToListValue('');\n tagInputRef.current?.resetValue();\n } else {\n setValue(newItem.text);\n }\n\n handleClose();\n\n setSelectedImage(\n newItem.imageUrl ? (\n <StyledSearchBoxItemImage\n src={newItem.imageUrl}\n $shouldShowRoundImage={shouldShowRoundImage}\n />\n ) : undefined,\n );\n\n setMatchingListsItems([]);\n\n if (typeof onSelect === 'function') {\n onSelect(newItem);\n }\n },\n [handleClose, onSelect, shouldShowRoundImage, tagInputSettings],\n );\n\n const content = useMemo(() => {\n if (hintText && matchingListsItems.length === 0) {\n return (\n <StyledSearchBoxHintText>\n {hintText.replace('##value##', value)}\n </StyledSearchBoxHintText>\n );\n }\n\n const items: ReactElement[] = [];\n\n matchingListsItems.forEach(({ groupName, list }, index) => {\n if (hasMultipleGroups) {\n if (list.length <= 0) {\n return;\n }\n\n if (index !== 0) {\n items.push(<GroupName key={groupName} name={groupName ?? ''} />);\n }\n }\n\n list.forEach(({ id, text, imageUrl }, listIndex) => {\n items.push(\n <SearchBoxItem\n key={`${id}_${groupName ?? ''}`}\n id={id}\n text={text}\n imageUrl={imageUrl}\n shouldShowSmallItems={shouldShowSmallItems}\n shouldShowRoundImage={shouldShowRoundImage}\n onSelect={handleSelect}\n groupName={groupName}\n tabIndex={index === 0 && listIndex === 0 ? 0 : -1}\n />,\n );\n });\n });\n\n if (shouldAddInputToList && inputToListValue !== '') {\n items.push(\n <SearchBoxItem\n id=\"input-value\"\n onSelect={handleSelect}\n shouldShowSmallItems={shouldShowSmallItems}\n text={`<b>${inputToListValue}</b`}\n tabIndex={items.length === 0 ? 0 : -1}\n />,\n );\n }\n\n return items;\n }, [\n hintText,\n matchingListsItems,\n shouldAddInputToList,\n inputToListValue,\n value,\n hasMultipleGroups,\n shouldShowSmallItems,\n shouldShowRoundImage,\n handleSelect,\n ]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!shouldShowBody || matchingListsItems.length === 0) {\n return;\n }\n\n const children = contentRef.current?.children;\n\n if (!children) {\n return;\n }\n\n const childrenArray = Array.from(children);\n\n const newChildren = childrenArray.find((child) =>\n child.id.startsWith('searchBoxContent__'),\n )?.children;\n\n if (!(newChildren && newChildren.length > 0)) {\n return;\n }\n\n const filteredChildren = Array.from(newChildren).filter(\n (child) => (child as HTMLElement).dataset.isgroupname !== 'true',\n );\n\n setFilteredChildrenArray(filteredChildren);\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n\n if (newChildren && newChildren.length > 0) {\n const newIndex =\n focusedIndex !== null\n ? (focusedIndex +\n (e.key === 'ArrowUp' ? -1 : 1) +\n filteredChildren.length) %\n filteredChildren.length\n : 0;\n\n if (focusedIndex !== null) {\n const prevElement = filteredChildren[focusedIndex] as HTMLDivElement;\n prevElement.tabIndex = -1;\n }\n\n setFocusedIndex(newIndex);\n\n const newElement = filteredChildren[newIndex] as HTMLDivElement;\n\n newElement.tabIndex = 0;\n }\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n\n if (filteredChildren) {\n const element = filteredChildren[focusedIndex ?? 0];\n\n if (!element) {\n return;\n }\n\n const { id, textContent } = element;\n\n let imageUrl: string | undefined;\n\n // Just Ignore, it works\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (element.children[0]?.attributes.src) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n imageUrl = element.children[0]?.attributes.src.nodeValue as string;\n }\n\n const newId = id.replace('search-box-item__', '');\n\n handleSelect({\n id: newId === 'input-value' ? textContent : newId,\n text: textContent ?? '',\n imageUrl,\n });\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [\n filteredChildrenArray,\n focusedIndex,\n handleSelect,\n matchingListsItems.length,\n shouldShowBody,\n ]);\n\n const handleKeyPress = useCallback((event: KeyboardEvent) => {\n if (event.keyCode === 27) {\n setMatchingListsItems([]);\n }\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n clear: () => setValue(''),\n }),\n [setValue],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyPress);\n\n return () => {\n document.addEventListener('keydown', handleKeyPress);\n };\n }, [handleKeyPress]);\n\n /**\n * Update the value if preset value changes\n */\n useEffect(() => {\n if (presetValue) {\n setValue(presetValue);\n }\n }, [presetValue, setValue]);\n\n const shouldShowDropdown =\n shouldShowBody &&\n (matchingListsItems.length !== 0 || !!hintText) &&\n (value.trim() !== '' || shouldShowContentOnEmptyInput);\n\n return useMemo(\n () => (\n <StyledSearchBox\n ref={boxRef}\n key={`search-box-${uuid}`}\n onBlur={handleContainerBlur}\n >\n <div id={`search_box_input${uuid}`}>\n {tagInputSettings ? (\n <TagInput\n leftElement={leftElement}\n onAdd={tagInputSettings.onAdd}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={handleFocus}\n onRemove={tagInputSettings.onRemove}\n placeholder={placeholder}\n ref={tagInputRef}\n size={tagInputSettings.size}\n shouldAllowMultiple={tagInputSettings.shouldAllowMultiple}\n shouldEnableKeyboardHighlighting={shouldEnableKeyboardHighlighting}\n shouldPreventEnter\n tags={tagInputSettings.tags}\n />\n ) : (\n <Input\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...inputProps}\n isInvalid={isInvalid}\n leftElement={leftElement}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={inputRef}\n rightElement={rightElement}\n shouldEnableKeyboardHighlighting={\n inputProps?.shouldEnableKeyboardHighlighting ??\n shouldEnableKeyboardHighlighting\n }\n value={value}\n />\n )}\n </div>\n {boxRef.current && (\n <DropdownBodyWrapper\n anchorElement={boxRef.current}\n container={container}\n direction={dropdownDirection}\n onClose={handleClose}\n onOutsideClick={handleDropdownOutsideClick}\n shouldShowDropdown={shouldShowDropdown}\n >\n <SearchBoxBody\n filterButtons={filterButtons}\n height={height}\n maxHeight={maxHeight}\n shouldShow={shouldShowDropdown}\n key={`search-box-body-${uuid}`}\n onGroupSelect={handleFilterButtonsGroupSelect}\n ref={contentRef}\n selectedGroups={groups}\n shouldHideFilterButtons={shouldHideFilterButtons}\n >\n {content}\n </SearchBoxBody>\n </DropdownBodyWrapper>\n )}\n </StyledSearchBox>\n ),\n [\n container,\n content,\n dropdownDirection,\n filterButtons,\n groups,\n handleBlur,\n handleChange,\n handleClose,\n handleDropdownOutsideClick,\n handleFocus,\n handleKeyDown,\n height,\n inputProps,\n isInvalid,\n leftElement,\n maxHeight,\n onKeyDown,\n placeholder,\n rightElement,\n shouldHideFilterButtons,\n shouldShowDropdown,\n shouldEnableKeyboardHighlighting,\n tagInputSettings,\n uuid,\n value,\n ],\n );\n },\n);\n\nSearchBox.displayName = 'SearchBox';\n\nexport default SearchBox;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SearchBox.js","names":["_chaynsApi","require","_react","_interopRequireWildcard","_styledComponents","_calculate","_searchBox","_Icon","_interopRequireDefault","_Input","_GroupName","_SearchBoxBody","_SearchBoxItem","_SearchBoxItem2","_SearchBox","_uuid","_DropdownBodyWrapper","_TagInput","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_extends","assign","bind","arguments","length","apply","filterSearchBoxItems","customFilter","customSortFunction","items","searchString","shouldUseCustomFilterOnly","filteredItems","filter","item","sortSearchBoxItems","searchList","exports","getDropdownSearchString","selectedId","shouldKeepSelectedItemPosition","value","SearchBox","forwardRef","container","dropdownDirection","inputProps","isInvalid","leftIcons","lists","maxHeight","onBlur","onChange","onKeyDown","onSelect","placeholder","presetValue","hintText","shouldAddInputToList","shouldHideFilterButtons","shouldShowContentOnEmptyInput","shouldShowSmallItems","shouldShowRoundImage","shouldShowToggleIcon","tagInputSettings","shouldEnableKeyboardHighlighting","ref","matchingListsItems","setMatchingListsItems","useState","selectedImage","setSelectedImage","internalValue","setInternalValue","inputValue","setValue","useCallback","nextValue","height","setHeight","focusedIndex","setFocusedIndex","hasMultipleGroups","setHasMultipleGroups","filteredChildrenArray","setFilteredChildrenArray","inputToListValue","setInputToListValue","groups","setGroups","shouldShowBody","setShouldShowBody","uuid","useUuid","boxRef","useRef","contentRef","inputRef","tagInputRef","hasFocusRef","isAnimatingRef","shouldShowPresetValue","theme","useTheme","dropdownSearchString","isTouch","useDevice","useEffect","filterButtons","useMemo","forEach","groupName","push","id","text","activeList","newLists","list","includes","newMatchingItems","newList","undefined","filteredMatchingListItems","map","handleOpen","handleClose","handleFilterButtonsGroupSelect","keys","textArray","calculateContentHeight","selectedItem","find","imageUrl","createElement","StyledSearchBoxItemImage","src","$shouldShowRoundImage","current","handleFocus","event","onFocus","handleKeyDown","toLowerCase","handleClick","rightElement","StyledSearchBoxIcon","onClick","icons","color","leftElement","StyledSearchBoxLeftWrapper","handleChange","filteredLists","target","handleBlur","handleDropdownOutsideClick","_tagInputRef$current","blur","handleContainerBlur","_contentRef$current","nextFocusedElement","relatedTarget","currentContainer","currentTarget","contains","handleSelect","newItem","replace","_tagInputRef$current2","resetValue","content","StyledSearchBoxHintText","index","key","name","listIndex","tabIndex","_contentRef$current2","_childrenArray$find","children","childrenArray","Array","from","newChildren","child","startsWith","filteredChildren","dataset","isgroupname","preventDefault","newIndex","prevElement","newElement","stopPropagation","_element$children$","element","textContent","attributes","_element$children$2","nodeValue","newId","document","addEventListener","removeEventListener","handleKeyPress","keyCode","useImperativeHandle","clear","shouldShowDropdown","trim","StyledSearchBox","onAdd","onRemove","size","shouldAllowMultiple","shouldPreventEnter","tags","anchorElement","direction","onClose","onOutsideClick","shouldShow","onGroupSelect","selectedGroups","displayName","_default"],"sources":["../../../../src/components/search-box/SearchBox.tsx"],"sourcesContent":["import { useDevice } from 'chayns-api';\nimport React, {\n ChangeEvent,\n ChangeEventHandler,\n FC,\n FocusEvent,\n FocusEventHandler,\n forwardRef,\n KeyboardEventHandler,\n ReactElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTheme } from 'styled-components';\nimport type { IFilterButtonItem } from '../../types/filterButtons';\nimport type { ISearchBoxItem, ISearchBoxItems } from '../../types/searchBox';\nimport { calculateContentHeight } from '../../utils/calculate';\nimport { searchList, sortSearchBoxItems, type SearchBoxSortFunction } from '../../utils/searchBox';\nimport type { Theme } from '../color-scheme-provider/ColorSchemeProvider';\nimport Icon from '../icon/Icon';\nimport Input, { type InputProps } from '../input/Input';\nimport GroupName from './group-name/GroupName';\nimport SearchBoxBody from './search-box-body/SearchBoxBody';\nimport SearchBoxItem from './search-box-item/SearchBoxItem';\nimport { StyledSearchBoxItemImage } from './search-box-item/SearchBoxItem.styles';\nimport {\n StyledSearchBox,\n StyledSearchBoxHintText,\n StyledSearchBoxIcon,\n StyledSearchBoxLeftWrapper,\n} from './SearchBox.styles';\nimport { useUuid } from '../../hooks/uuid';\nimport DropdownBodyWrapper from '../dropdown-body-wrapper/DropdownBodyWrapper';\nimport TagInput, { TagInputProps, TagInputRef } from '../tag-input/TagInput';\nimport type { DropdownDirection } from '../../types/dropdown';\n\nexport interface SearchBoxRef {\n clear: VoidFunction;\n}\n\nexport interface TagInputSettings {\n onAdd?: TagInputProps['onAdd'];\n onRemove?: TagInputProps['onRemove'];\n size?: TagInputProps['size'];\n shouldAllowMultiple?: TagInputProps['shouldAllowMultiple'];\n tags?: TagInputProps['tags'];\n}\n\nexport const filterSearchBoxItems = ({\n customFilter,\n customSortFunction,\n items,\n searchString,\n shouldUseCustomFilterOnly,\n}: {\n customFilter?: (item: ISearchBoxItem, value: string) => boolean;\n customSortFunction?: SearchBoxSortFunction;\n items: ISearchBoxItem[];\n searchString: string;\n shouldUseCustomFilterOnly?: boolean;\n}) => {\n if (shouldUseCustomFilterOnly) {\n const filteredItems =\n typeof customFilter === 'function'\n ? items.filter((item) => customFilter(item, searchString))\n : items;\n\n return sortSearchBoxItems({ customSortFunction, items: filteredItems, searchString });\n }\n\n if (typeof customFilter !== 'function') {\n return searchList({ customSortFunction, items, searchString });\n }\n\n return searchList({ customSortFunction, items, searchString }).filter((item) =>\n customFilter(item, searchString),\n );\n};\n\nconst getDropdownSearchString = ({\n selectedId,\n shouldKeepSelectedItemPosition,\n value,\n}: {\n selectedId?: string;\n shouldKeepSelectedItemPosition?: boolean;\n value: string;\n}) => (shouldKeepSelectedItemPosition && selectedId ? '' : value);\n\nexport type SearchBoxProps = {\n /**\n * The element where the content of the `ComboBox` should be rendered via React Portal.\n */\n container?: Element;\n /**\n * An optional callback function to filter the elements to be displayed\n * @param item The item to filter.\n * @param value The current input value.\n */\n customFilter?: (item: ISearchBoxItem, value: string) => boolean;\n /**\n * An optional callback function to sort the filtered elements to be displayed\n */\n customSortFunction?: SearchBoxSortFunction;\n /**\n * If true, the custom filter replaces the built-in text search instead of narrowing its results.\n */\n shouldUseCustomFilterOnly?: boolean;\n /**\n * The direction in which the dropdown should be displayed. By default, it is displayed below the input.\n */\n dropdownDirection?: DropdownDirection;\n /**\n * If true, the input field is marked as invalid\n */\n isInvalid?: boolean;\n /**\n * An optional icon that is displayed inside the left side of the input.\n */\n leftIcons?: string[];\n /**\n * Props that are passed to the underlying Input component.\n */\n inputProps?: InputProps;\n /**\n * List of groups with items that can be searched. It is possible to give only one list; if multiple lists are provided, the 'group name' parameter becomes mandatory.\n */\n lists: ISearchBoxItems[];\n /**\n * The maximum height of the dropdown body in pixels.\n */\n maxHeight?: number;\n /**\n * Function to be executed when the input lost focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Function to be executed when the input is changed.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Function that is executed when a letter is pressed\n */\n onKeyDown?: KeyboardEventHandler<HTMLInputElement>;\n /**\n * Function to be executed when an item is selected.\n */\n onSelect?: (item: ISearchBoxItem) => void;\n /**\n * The placeholder that should be displayed.\n */\n placeholder?: string;\n /**\n * Set an input for the search box - it is not an item of a list, just a string.\n */\n presetValue?: string;\n /**\n * Control the selected item. If you use this prop, make sure to update it when the user selects an item.\n */\n selectedId?: string;\n /**\n * If true, the selected item keeps its original position in the dropdown list.\n */\n shouldKeepSelectedItemPosition?: boolean;\n /**\n * If true, the value in the Input is displayed in the list.\n */\n shouldAddInputToList: boolean;\n /**\n * If true, the filter buttons are hidden.\n */\n shouldHideFilterButtons?: boolean;\n /**\n * Whether the full list of items should be displayed if the input is empty.\n */\n shouldShowContentOnEmptyInput?: boolean;\n /**\n * If true, the dropdown items are displayed more compactly.\n */\n shouldShowSmallItems?: boolean;\n /**\n * If true, the images of the items are displayed in a round shape.\n */\n shouldShowRoundImage?: boolean;\n /**\n * Whether the icon to open and close the list should be displayed.\n */\n shouldShowToggleIcon?: boolean;\n /**\n * Settings for the TagInput.\n */\n tagInputSettings?: TagInputSettings;\n /**\n * Enables keyboard-only focus highlighting.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n /**\n * A text that should be displayed if no results are found.\n */\n hintText?: string;\n};\n\nconst SearchBox: FC<SearchBoxProps> = forwardRef<SearchBoxRef, SearchBoxProps>(\n (\n {\n container,\n customFilter,\n customSortFunction,\n dropdownDirection,\n inputProps,\n isInvalid = false,\n leftIcons,\n lists,\n maxHeight = 300,\n onBlur,\n onChange,\n onKeyDown,\n onSelect,\n placeholder,\n presetValue,\n hintText,\n selectedId,\n shouldAddInputToList = true,\n shouldKeepSelectedItemPosition = false,\n shouldUseCustomFilterOnly = false,\n shouldHideFilterButtons = false,\n shouldShowContentOnEmptyInput = true,\n shouldShowSmallItems = false,\n shouldShowRoundImage,\n shouldShowToggleIcon = false,\n tagInputSettings,\n shouldEnableKeyboardHighlighting,\n },\n ref,\n ) => {\n const [matchingListsItems, setMatchingListsItems] = useState<ISearchBoxItems[]>(lists);\n const [selectedImage, setSelectedImage] = useState<ReactElement>();\n const [internalValue, setInternalValue] = useState(\n typeof presetValue === 'string' && presetValue !== '' ? presetValue : '',\n );\n const inputValue = inputProps?.value;\n const value = inputValue ?? internalValue;\n const setValue = useCallback(\n (nextValue: string) => {\n if (typeof inputValue !== 'string') {\n setInternalValue(nextValue);\n }\n },\n [inputValue],\n );\n const [height, setHeight] = useState<number>(0);\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const [hasMultipleGroups, setHasMultipleGroups] = useState<boolean>(lists.length > 1);\n const [filteredChildrenArray, setFilteredChildrenArray] = useState<Element[]>();\n const [inputToListValue, setInputToListValue] = useState<string>('');\n const [groups, setGroups] = useState<string[]>(['all']);\n const [shouldShowBody, setShouldShowBody] = useState(false);\n\n const uuid = useUuid();\n\n const boxRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const tagInputRef = useRef<TagInputRef>(null);\n\n const hasFocusRef = useRef<boolean>(false);\n const isAnimatingRef = useRef<boolean>(false);\n const shouldShowPresetValue = useRef<boolean>(\n typeof presetValue === 'string' && presetValue !== '',\n );\n\n const theme = useTheme() as Theme;\n const dropdownSearchString = getDropdownSearchString({\n selectedId,\n shouldKeepSelectedItemPosition,\n value,\n });\n\n const { isTouch } = useDevice();\n\n /**\n * Checks if there are multiple groups in the lists\n */\n useEffect(() => {\n setHasMultipleGroups(lists.length > 1);\n }, [lists]);\n\n const filterButtons = useMemo(() => {\n const items: IFilterButtonItem[] = [];\n\n if (lists.length <= 1) {\n return items;\n }\n\n lists.forEach(({ groupName }) => {\n if (groupName) {\n items.push({\n id: groupName,\n text: groupName,\n });\n }\n });\n\n return items;\n }, [lists]);\n\n /**\n * Filters the lists by the FilterButtons\n */\n const activeList = useMemo(() => {\n let newLists: ISearchBoxItems[] = [];\n\n if (groups[0] === 'all') {\n newLists = lists;\n } else {\n lists.forEach((list) => {\n if (list.groupName && groups.includes(list.groupName)) {\n newLists.push(list);\n }\n });\n }\n\n const newMatchingItems: ISearchBoxItems[] = [];\n\n newLists.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n const filteredMatchingListItems = newMatchingItems.map(({ list, groupName }) => ({\n groupName,\n list: list.filter((item) => {\n if (typeof customFilter === 'function' && shouldUseCustomFilterOnly) {\n return true;\n }\n\n return !(newMatchingItems.length === 1 && item.text === dropdownSearchString);\n }),\n }));\n\n setMatchingListsItems(filteredMatchingListItems);\n\n return newLists;\n }, [\n groups,\n lists,\n customFilter,\n customSortFunction,\n dropdownSearchString,\n shouldAddInputToList,\n shouldUseCustomFilterOnly,\n ]);\n\n const handleOpen = useCallback(() => {\n setShouldShowBody(true);\n }, []);\n\n const handleClose = useCallback(() => {\n setShouldShowBody(false);\n }, []);\n\n const handleFilterButtonsGroupSelect = (keys: string[]) => {\n setGroups(keys.length === 0 ? ['all'] : keys);\n };\n\n /**\n * This hook calculates the height\n */\n useEffect(() => {\n const textArray: string[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n list.forEach(({ text }) => textArray.push(text));\n if (!groupName) {\n return;\n }\n textArray.push(groupName);\n });\n\n if (shouldAddInputToList && inputToListValue !== '') {\n textArray.push(inputToListValue);\n }\n\n setHeight(calculateContentHeight(textArray));\n }, [inputToListValue, activeList, placeholder, shouldAddInputToList]);\n\n useEffect(() => {\n if (selectedId) {\n activeList.forEach(({ list }) => {\n const selectedItem = list.find(({ id }) => id === selectedId);\n if (selectedItem) {\n setValue(selectedItem.text);\n\n if (selectedItem.imageUrl) {\n setSelectedImage(\n <StyledSearchBoxItemImage\n src={selectedItem.imageUrl}\n $shouldShowRoundImage={shouldShowRoundImage}\n />,\n );\n }\n }\n });\n }\n }, [activeList, selectedId, shouldShowRoundImage]);\n\n /**\n * This hook resets the value if the selectedId changes to undefined. This is an own useEffect because the value\n * should not be reset if the list changes and the selectedId is still undefined.\n */\n useEffect(() => {\n if (!selectedId && !shouldShowPresetValue.current) {\n setValue('');\n }\n }, [selectedId]);\n\n useEffect(() => {\n isAnimatingRef.current = shouldShowBody;\n }, [shouldShowBody]);\n\n useEffect(() => {\n if (\n (matchingListsItems.length !== 0 || hintText) &&\n !isAnimatingRef.current &&\n hasFocusRef.current\n ) {\n handleOpen();\n }\n }, [handleOpen, hintText, matchingListsItems.length]);\n\n /**\n * This function handles the focus event of the input and opens the dropdown if the input\n * should show content on an empty input\n */\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n hasFocusRef.current = true;\n\n if (typeof inputProps?.onFocus === 'function') {\n inputProps.onFocus(event);\n }\n\n if (shouldShowContentOnEmptyInput) {\n const newMatchingItems: ISearchBoxItems[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n const filteredMatchingListItems = newMatchingItems.map(\n ({ list, groupName }) => ({\n groupName,\n list: list.filter((item) => {\n if (\n typeof customFilter === 'function' &&\n shouldUseCustomFilterOnly\n ) {\n return true;\n }\n\n return !(\n newMatchingItems.length === 1 &&\n item.text === dropdownSearchString\n );\n }),\n }),\n );\n\n setMatchingListsItems(filteredMatchingListItems);\n\n if (filteredMatchingListItems.length !== 0 || hintText) {\n handleOpen();\n }\n }\n },\n [\n shouldShowContentOnEmptyInput,\n activeList,\n shouldAddInputToList,\n hintText,\n dropdownSearchString,\n customFilter,\n customSortFunction,\n shouldUseCustomFilterOnly,\n handleOpen,\n inputProps,\n ],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLInputElement>>(\n (event) => {\n if (typeof onKeyDown === 'function') {\n onKeyDown(event);\n }\n\n if (typeof inputProps?.onKeyDown === 'function') {\n inputProps.onKeyDown(event);\n }\n },\n [inputProps, onKeyDown],\n );\n\n /**\n * This function filters the lists by input\n */\n\n useEffect(() => {\n const newMatchingItems: ISearchBoxItems[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n if (shouldAddInputToList && inputToListValue !== '') {\n newMatchingItems.forEach(({ list }) => {\n list.forEach(({ text }) => {\n if (text.toLowerCase() === inputToListValue.toLowerCase()) {\n setInputToListValue('');\n }\n });\n });\n }\n }, [\n inputToListValue,\n activeList,\n shouldAddInputToList,\n shouldShowContentOnEmptyInput,\n dropdownSearchString,\n customFilter,\n customSortFunction,\n shouldUseCustomFilterOnly,\n ]);\n\n const handleClick = useCallback(() => {\n if (shouldShowBody) {\n handleClose();\n } else {\n handleOpen();\n }\n }, [handleClose, handleOpen, shouldShowBody]);\n\n const rightElement = useMemo(() => {\n if (!shouldShowToggleIcon) {\n return undefined;\n }\n\n return (\n <StyledSearchBoxIcon onClick={handleClick}>\n <Icon icons={['fa fa-chevron-down']} color={theme['006'] as string} />\n </StyledSearchBoxIcon>\n );\n }, [handleClick, shouldShowToggleIcon, theme]);\n\n const leftElement = useMemo(\n () =>\n (leftIcons || selectedImage) && (\n <StyledSearchBoxLeftWrapper>\n {leftIcons && <Icon icons={leftIcons} />}\n {selectedImage && selectedImage}\n </StyledSearchBoxLeftWrapper>\n ),\n [leftIcons, selectedImage],\n );\n\n /**\n * This function handles changes of the input\n */\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const filteredLists: ISearchBoxItems[] = [];\n shouldShowPresetValue.current = false;\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: event.target.value,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n filteredLists.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (filteredLists.length === 0 && shouldAddInputToList) {\n filteredLists.push({\n groupName: undefined,\n list: [],\n });\n }\n\n setSelectedImage(undefined);\n\n if (!shouldShowContentOnEmptyInput && !event.target.value) {\n setMatchingListsItems([]);\n } else {\n setMatchingListsItems(filteredLists);\n }\n\n if (filteredLists.length !== 0) {\n handleOpen();\n }\n\n setValue(event.target.value);\n setInputToListValue(event.target.value);\n\n if (typeof onChange === 'function') {\n onChange(event);\n }\n\n if (typeof inputProps?.onChange === 'function') {\n inputProps.onChange(event);\n }\n },\n [\n activeList,\n customFilter,\n customSortFunction,\n handleOpen,\n inputProps,\n onChange,\n shouldAddInputToList,\n shouldShowContentOnEmptyInput,\n shouldUseCustomFilterOnly,\n ],\n );\n\n /**\n * This function handles the blur event of the input\n */\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n hasFocusRef.current = false;\n\n if (typeof onBlur === 'function') {\n onBlur(event);\n }\n\n if (typeof inputProps?.onBlur === 'function') {\n inputProps.onBlur(event);\n }\n },\n [inputProps, onBlur],\n );\n\n const handleDropdownOutsideClick = useCallback(() => {\n tagInputRef.current?.blur();\n\n return hasFocusRef.current && isTouch;\n }, [isTouch]);\n\n const handleContainerBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n const nextFocusedElement = event.relatedTarget as Node | null;\n const currentContainer = event.currentTarget as HTMLElement;\n\n // Check if focus is moving outside the SearchBox container\n // Also check the dropdown content (contentRef) since it's rendered in a portal\n if (\n !nextFocusedElement ||\n (!currentContainer.contains(nextFocusedElement) &&\n !contentRef.current?.contains(nextFocusedElement))\n ) {\n handleClose();\n }\n },\n [handleClose],\n );\n\n /**\n * This function handles the item selection\n */\n const handleSelect = useCallback(\n (item: ISearchBoxItem) => {\n const newItem = {\n ...item,\n text: item.text.replace('<b>', '').replace('</b>', '').replace('</b', ''),\n };\n\n if (tagInputSettings) {\n setValue('');\n setInputToListValue('');\n tagInputRef.current?.resetValue();\n } else {\n setValue(newItem.text);\n }\n\n handleClose();\n\n setSelectedImage(\n newItem.imageUrl ? (\n <StyledSearchBoxItemImage\n src={newItem.imageUrl}\n $shouldShowRoundImage={shouldShowRoundImage}\n />\n ) : undefined,\n );\n\n setMatchingListsItems([]);\n\n if (typeof onSelect === 'function') {\n onSelect(newItem);\n }\n },\n [handleClose, onSelect, shouldShowRoundImage, tagInputSettings],\n );\n\n const content = useMemo(() => {\n if (hintText && matchingListsItems.length === 0) {\n return (\n <StyledSearchBoxHintText>\n {hintText.replace('##value##', value)}\n </StyledSearchBoxHintText>\n );\n }\n\n const items: ReactElement[] = [];\n\n matchingListsItems.forEach(({ groupName, list }, index) => {\n if (hasMultipleGroups) {\n if (list.length <= 0) {\n return;\n }\n\n if (index !== 0) {\n items.push(<GroupName key={groupName} name={groupName ?? ''} />);\n }\n }\n\n list.forEach(({ id, text, imageUrl }, listIndex) => {\n items.push(\n <SearchBoxItem\n key={`${id}_${groupName ?? ''}`}\n id={id}\n text={text}\n imageUrl={imageUrl}\n shouldShowSmallItems={shouldShowSmallItems}\n shouldShowRoundImage={shouldShowRoundImage}\n onSelect={handleSelect}\n groupName={groupName}\n tabIndex={index === 0 && listIndex === 0 ? 0 : -1}\n />,\n );\n });\n });\n\n if (shouldAddInputToList && inputToListValue !== '') {\n items.push(\n <SearchBoxItem\n id=\"input-value\"\n onSelect={handleSelect}\n shouldShowSmallItems={shouldShowSmallItems}\n text={`<b>${inputToListValue}</b`}\n tabIndex={items.length === 0 ? 0 : -1}\n />,\n );\n }\n\n return items;\n }, [\n hintText,\n matchingListsItems,\n shouldAddInputToList,\n inputToListValue,\n value,\n hasMultipleGroups,\n shouldShowSmallItems,\n shouldShowRoundImage,\n handleSelect,\n ]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!shouldShowBody || matchingListsItems.length === 0) {\n return;\n }\n\n const children = contentRef.current?.children;\n\n if (!children) {\n return;\n }\n\n const childrenArray = Array.from(children);\n\n const newChildren = childrenArray.find((child) =>\n child.id.startsWith('searchBoxContent__'),\n )?.children;\n\n if (!(newChildren && newChildren.length > 0)) {\n return;\n }\n\n const filteredChildren = Array.from(newChildren).filter(\n (child) => (child as HTMLElement).dataset.isgroupname !== 'true',\n );\n\n setFilteredChildrenArray(filteredChildren);\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n\n if (newChildren && newChildren.length > 0) {\n const newIndex =\n focusedIndex !== null\n ? (focusedIndex +\n (e.key === 'ArrowUp' ? -1 : 1) +\n filteredChildren.length) %\n filteredChildren.length\n : 0;\n\n if (focusedIndex !== null) {\n const prevElement = filteredChildren[focusedIndex] as HTMLDivElement;\n prevElement.tabIndex = -1;\n }\n\n setFocusedIndex(newIndex);\n\n const newElement = filteredChildren[newIndex] as HTMLDivElement;\n\n newElement.tabIndex = 0;\n }\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n\n if (filteredChildren) {\n const element = filteredChildren[focusedIndex ?? 0];\n\n if (!element) {\n return;\n }\n\n const { id, textContent } = element;\n\n let imageUrl: string | undefined;\n\n // Just Ignore, it works\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (element.children[0]?.attributes.src) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n imageUrl = element.children[0]?.attributes.src.nodeValue as string;\n }\n\n const newId = id.replace('search-box-item__', '');\n\n handleSelect({\n id: newId === 'input-value' ? textContent : newId,\n text: textContent ?? '',\n imageUrl,\n });\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [\n filteredChildrenArray,\n focusedIndex,\n handleSelect,\n matchingListsItems.length,\n shouldShowBody,\n ]);\n\n const handleKeyPress = useCallback((event: KeyboardEvent) => {\n if (event.keyCode === 27) {\n setMatchingListsItems([]);\n }\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n clear: () => setValue(''),\n }),\n [setValue],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyPress);\n\n return () => {\n document.addEventListener('keydown', handleKeyPress);\n };\n }, [handleKeyPress]);\n\n /**\n * Update the value if preset value changes\n */\n useEffect(() => {\n if (presetValue) {\n setValue(presetValue);\n }\n }, [presetValue, setValue]);\n\n const shouldShowDropdown =\n shouldShowBody &&\n (matchingListsItems.length !== 0 || !!hintText) &&\n (value.trim() !== '' || shouldShowContentOnEmptyInput);\n\n return useMemo(\n () => (\n <StyledSearchBox\n ref={boxRef}\n key={`search-box-${uuid}`}\n onBlur={handleContainerBlur}\n >\n <div id={`search_box_input${uuid}`}>\n {tagInputSettings ? (\n <TagInput\n leftElement={leftElement}\n onAdd={tagInputSettings.onAdd}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={handleFocus}\n onRemove={tagInputSettings.onRemove}\n placeholder={placeholder}\n ref={tagInputRef}\n size={tagInputSettings.size}\n shouldAllowMultiple={tagInputSettings.shouldAllowMultiple}\n shouldEnableKeyboardHighlighting={shouldEnableKeyboardHighlighting}\n shouldPreventEnter\n tags={tagInputSettings.tags}\n />\n ) : (\n <Input\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...inputProps}\n isInvalid={isInvalid}\n leftElement={leftElement}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={inputRef}\n rightElement={rightElement}\n shouldEnableKeyboardHighlighting={\n inputProps?.shouldEnableKeyboardHighlighting ??\n shouldEnableKeyboardHighlighting\n }\n value={value}\n />\n )}\n </div>\n {boxRef.current && (\n <DropdownBodyWrapper\n anchorElement={boxRef.current}\n container={container}\n direction={dropdownDirection}\n onClose={handleClose}\n onOutsideClick={handleDropdownOutsideClick}\n shouldShowDropdown={shouldShowDropdown}\n >\n <SearchBoxBody\n filterButtons={filterButtons}\n height={height}\n maxHeight={maxHeight}\n shouldShow={shouldShowDropdown}\n key={`search-box-body-${uuid}`}\n onGroupSelect={handleFilterButtonsGroupSelect}\n ref={contentRef}\n selectedGroups={groups}\n shouldHideFilterButtons={shouldHideFilterButtons}\n >\n {content}\n </SearchBoxBody>\n </DropdownBodyWrapper>\n )}\n </StyledSearchBox>\n ),\n [\n container,\n content,\n dropdownDirection,\n filterButtons,\n groups,\n handleBlur,\n handleChange,\n handleClose,\n handleDropdownOutsideClick,\n handleFocus,\n handleKeyDown,\n height,\n inputProps,\n isInvalid,\n leftElement,\n maxHeight,\n onKeyDown,\n placeholder,\n rightElement,\n shouldHideFilterButtons,\n shouldShowDropdown,\n shouldEnableKeyboardHighlighting,\n tagInputSettings,\n uuid,\n value,\n ],\n );\n },\n);\n\nSearchBox.displayName = 'SearchBox';\n\nexport default SearchBox;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _vitest = require("vitest");
|
|
4
|
+
var _SearchBox = require("../components/search-box/SearchBox");
|
|
4
5
|
var _searchBox = require("./searchBox");
|
|
5
6
|
const items = [{
|
|
6
7
|
id: '2',
|
|
@@ -30,5 +31,24 @@ const items = [{
|
|
|
30
31
|
id
|
|
31
32
|
}) => id)).toEqual(['1', '2']);
|
|
32
33
|
});
|
|
34
|
+
(0, _vitest.it)('uses only the custom filter when shouldUseCustomFilterOnly is enabled', () => {
|
|
35
|
+
const values = [];
|
|
36
|
+
const result = (0, _SearchBox.filterSearchBoxItems)({
|
|
37
|
+
customFilter: ({
|
|
38
|
+
id
|
|
39
|
+
}, value) => {
|
|
40
|
+
values.push(value);
|
|
41
|
+
return id === '2';
|
|
42
|
+
},
|
|
43
|
+
customSortFunction: (a, b) => a.id.localeCompare(b.id),
|
|
44
|
+
items,
|
|
45
|
+
searchString: 'does-not-match',
|
|
46
|
+
shouldUseCustomFilterOnly: true
|
|
47
|
+
});
|
|
48
|
+
(0, _vitest.expect)(result.map(({
|
|
49
|
+
id
|
|
50
|
+
}) => id)).toEqual(['2']);
|
|
51
|
+
(0, _vitest.expect)(values).toEqual(['does-not-match', 'does-not-match']);
|
|
52
|
+
});
|
|
33
53
|
});
|
|
34
54
|
//# sourceMappingURL=searchBox.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchBox.test.js","names":["_vitest","require","_searchBox","items","id","text","describe","it","result","searchList","customSortFunction","a","b","localeCompare","searchString","expect","map","toEqual"],"sources":["../../../src/utils/searchBox.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\nimport type { ISearchBoxItem } from '../types/searchBox';\nimport { searchList } from './searchBox';\n\nconst items: ISearchBoxItem[] = [\n { id: '2', text: 'Zweite' },\n { id: '1', text: 'Erste' },\n];\n\ndescribe('searchList', () => {\n it('uses the custom sort function instead of the default sort', () => {\n const result = searchList({\n customSortFunction: (a, b) => b.id.localeCompare(a.id),\n items,\n searchString: '',\n });\n\n expect(result.map(({ id }) => id)).toEqual(['2', '1']);\n });\n\n it('still filters before applying the custom sort function', () => {\n const result = searchList({\n customSortFunction: (a, b) => a.id.localeCompare(b.id),\n items,\n searchString: 'e',\n });\n\n expect(result.map(({ id }) => id)).toEqual(['1', '2']);\n });\n});\n"],"mappings":";;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAD,OAAA;AAEA,
|
|
1
|
+
{"version":3,"file":"searchBox.test.js","names":["_vitest","require","_SearchBox","_searchBox","items","id","text","describe","it","result","searchList","customSortFunction","a","b","localeCompare","searchString","expect","map","toEqual","values","filterSearchBoxItems","customFilter","value","push","shouldUseCustomFilterOnly"],"sources":["../../../src/utils/searchBox.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\nimport type { ISearchBoxItem } from '../types/searchBox';\nimport { filterSearchBoxItems } from '../components/search-box/SearchBox';\nimport { searchList } from './searchBox';\n\nconst items: ISearchBoxItem[] = [\n { id: '2', text: 'Zweite' },\n { id: '1', text: 'Erste' },\n];\n\ndescribe('searchList', () => {\n it('uses the custom sort function instead of the default sort', () => {\n const result = searchList({\n customSortFunction: (a, b) => b.id.localeCompare(a.id),\n items,\n searchString: '',\n });\n\n expect(result.map(({ id }) => id)).toEqual(['2', '1']);\n });\n\n it('still filters before applying the custom sort function', () => {\n const result = searchList({\n customSortFunction: (a, b) => a.id.localeCompare(b.id),\n items,\n searchString: 'e',\n });\n\n expect(result.map(({ id }) => id)).toEqual(['1', '2']);\n });\n\n it('uses only the custom filter when shouldUseCustomFilterOnly is enabled', () => {\n const values: string[] = [];\n const result = filterSearchBoxItems({\n customFilter: ({ id }, value) => {\n values.push(value);\n return id === '2';\n },\n customSortFunction: (a, b) => a.id.localeCompare(b.id),\n items,\n searchString: 'does-not-match',\n shouldUseCustomFilterOnly: true,\n });\n\n expect(result.map(({ id }) => id)).toEqual(['2']);\n expect(values).toEqual(['does-not-match', 'does-not-match']);\n });\n});\n"],"mappings":";;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AAEA,MAAMG,KAAuB,GAAG,CAC5B;EAAEC,EAAE,EAAE,GAAG;EAAEC,IAAI,EAAE;AAAS,CAAC,EAC3B;EAAED,EAAE,EAAE,GAAG;EAAEC,IAAI,EAAE;AAAQ,CAAC,CAC7B;AAED,IAAAC,gBAAQ,EAAC,YAAY,EAAE,MAAM;EACzB,IAAAC,UAAE,EAAC,2DAA2D,EAAE,MAAM;IAClE,MAAMC,MAAM,GAAG,IAAAC,qBAAU,EAAC;MACtBC,kBAAkB,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACR,EAAE,CAACS,aAAa,CAACF,CAAC,CAACP,EAAE,CAAC;MACtDD,KAAK;MACLW,YAAY,EAAE;IAClB,CAAC,CAAC;IAEF,IAAAC,cAAM,EAACP,MAAM,CAACQ,GAAG,CAAC,CAAC;MAAEZ;IAAG,CAAC,KAAKA,EAAE,CAAC,CAAC,CAACa,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EAC1D,CAAC,CAAC;EAEF,IAAAV,UAAE,EAAC,wDAAwD,EAAE,MAAM;IAC/D,MAAMC,MAAM,GAAG,IAAAC,qBAAU,EAAC;MACtBC,kBAAkB,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACP,EAAE,CAACS,aAAa,CAACD,CAAC,CAACR,EAAE,CAAC;MACtDD,KAAK;MACLW,YAAY,EAAE;IAClB,CAAC,CAAC;IAEF,IAAAC,cAAM,EAACP,MAAM,CAACQ,GAAG,CAAC,CAAC;MAAEZ;IAAG,CAAC,KAAKA,EAAE,CAAC,CAAC,CAACa,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EAC1D,CAAC,CAAC;EAEF,IAAAV,UAAE,EAAC,uEAAuE,EAAE,MAAM;IAC9E,MAAMW,MAAgB,GAAG,EAAE;IAC3B,MAAMV,MAAM,GAAG,IAAAW,+BAAoB,EAAC;MAChCC,YAAY,EAAEA,CAAC;QAAEhB;MAAG,CAAC,EAAEiB,KAAK,KAAK;QAC7BH,MAAM,CAACI,IAAI,CAACD,KAAK,CAAC;QAClB,OAAOjB,EAAE,KAAK,GAAG;MACrB,CAAC;MACDM,kBAAkB,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACP,EAAE,CAACS,aAAa,CAACD,CAAC,CAACR,EAAE,CAAC;MACtDD,KAAK;MACLW,YAAY,EAAE,gBAAgB;MAC9BS,yBAAyB,EAAE;IAC/B,CAAC,CAAC;IAEF,IAAAR,cAAM,EAACP,MAAM,CAACQ,GAAG,CAAC,CAAC;MAAEZ;IAAG,CAAC,KAAKA,EAAE,CAAC,CAAC,CAACa,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;IACjD,IAAAF,cAAM,EAACG,MAAM,CAAC,CAACD,OAAO,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;EAChE,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
|
|
@@ -14,25 +14,25 @@ import { StyledSearchBox, StyledSearchBoxHintText, StyledSearchBoxIcon, StyledSe
|
|
|
14
14
|
import { useUuid } from '../../hooks/uuid';
|
|
15
15
|
import DropdownBodyWrapper from '../dropdown-body-wrapper/DropdownBodyWrapper';
|
|
16
16
|
import TagInput from '../tag-input/TagInput';
|
|
17
|
-
const filterSearchBoxItems = ({
|
|
17
|
+
export const filterSearchBoxItems = ({
|
|
18
18
|
customFilter,
|
|
19
19
|
customSortFunction,
|
|
20
20
|
items,
|
|
21
21
|
searchString,
|
|
22
22
|
shouldUseCustomFilterOnly
|
|
23
23
|
}) => {
|
|
24
|
-
if (
|
|
25
|
-
|
|
24
|
+
if (shouldUseCustomFilterOnly) {
|
|
25
|
+
const filteredItems = typeof customFilter === 'function' ? items.filter(item => customFilter(item, searchString)) : items;
|
|
26
|
+
return sortSearchBoxItems({
|
|
26
27
|
customSortFunction,
|
|
27
|
-
items,
|
|
28
|
+
items: filteredItems,
|
|
28
29
|
searchString
|
|
29
30
|
});
|
|
30
31
|
}
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
return sortSearchBoxItems({
|
|
32
|
+
if (typeof customFilter !== 'function') {
|
|
33
|
+
return searchList({
|
|
34
34
|
customSortFunction,
|
|
35
|
-
items
|
|
35
|
+
items,
|
|
36
36
|
searchString
|
|
37
37
|
});
|
|
38
38
|
}
|
|
@@ -40,7 +40,7 @@ const filterSearchBoxItems = ({
|
|
|
40
40
|
customSortFunction,
|
|
41
41
|
items,
|
|
42
42
|
searchString
|
|
43
|
-
}).filter(customFilter);
|
|
43
|
+
}).filter(item => customFilter(item, searchString));
|
|
44
44
|
};
|
|
45
45
|
const getDropdownSearchString = ({
|
|
46
46
|
selectedId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBox.js","names":["useDevice","React","forwardRef","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","useTheme","calculateContentHeight","searchList","sortSearchBoxItems","Icon","Input","GroupName","SearchBoxBody","SearchBoxItem","StyledSearchBoxItemImage","StyledSearchBox","StyledSearchBoxHintText","StyledSearchBoxIcon","StyledSearchBoxLeftWrapper","useUuid","DropdownBodyWrapper","TagInput","filterSearchBoxItems","customFilter","customSortFunction","items","searchString","shouldUseCustomFilterOnly","filteredItems","filter","getDropdownSearchString","selectedId","shouldKeepSelectedItemPosition","value","SearchBox","container","dropdownDirection","inputProps","isInvalid","leftIcons","lists","maxHeight","onBlur","onChange","onKeyDown","onSelect","placeholder","presetValue","hintText","shouldAddInputToList","shouldHideFilterButtons","shouldShowContentOnEmptyInput","shouldShowSmallItems","shouldShowRoundImage","shouldShowToggleIcon","tagInputSettings","shouldEnableKeyboardHighlighting","ref","matchingListsItems","setMatchingListsItems","selectedImage","setSelectedImage","internalValue","setInternalValue","inputValue","setValue","nextValue","height","setHeight","focusedIndex","setFocusedIndex","hasMultipleGroups","setHasMultipleGroups","length","filteredChildrenArray","setFilteredChildrenArray","inputToListValue","setInputToListValue","groups","setGroups","shouldShowBody","setShouldShowBody","uuid","boxRef","contentRef","inputRef","tagInputRef","hasFocusRef","isAnimatingRef","shouldShowPresetValue","theme","dropdownSearchString","isTouch","filterButtons","forEach","groupName","push","id","text","activeList","newLists","list","includes","newMatchingItems","newList","undefined","filteredMatchingListItems","map","item","handleOpen","handleClose","handleFilterButtonsGroupSelect","keys","textArray","selectedItem","find","imageUrl","createElement","src","$shouldShowRoundImage","current","handleFocus","event","onFocus","handleKeyDown","toLowerCase","handleClick","rightElement","onClick","icons","color","leftElement","handleChange","filteredLists","target","handleBlur","handleDropdownOutsideClick","blur","handleContainerBlur","nextFocusedElement","relatedTarget","currentContainer","currentTarget","contains","handleSelect","newItem","replace","resetValue","content","index","key","name","listIndex","tabIndex","e","children","childrenArray","Array","from","newChildren","child","startsWith","filteredChildren","dataset","isgroupname","preventDefault","newIndex","prevElement","newElement","stopPropagation","element","textContent","attributes","nodeValue","newId","document","addEventListener","removeEventListener","handleKeyPress","keyCode","clear","shouldShowDropdown","trim","onAdd","onRemove","size","shouldAllowMultiple","shouldPreventEnter","tags","_extends","anchorElement","direction","onClose","onOutsideClick","shouldShow","onGroupSelect","selectedGroups","displayName"],"sources":["../../../../src/components/search-box/SearchBox.tsx"],"sourcesContent":["import { useDevice } from 'chayns-api';\nimport React, {\n ChangeEvent,\n ChangeEventHandler,\n FC,\n FocusEvent,\n FocusEventHandler,\n forwardRef,\n KeyboardEventHandler,\n ReactElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTheme } from 'styled-components';\nimport type { IFilterButtonItem } from '../../types/filterButtons';\nimport type { ISearchBoxItem, ISearchBoxItems } from '../../types/searchBox';\nimport { calculateContentHeight } from '../../utils/calculate';\nimport { searchList, sortSearchBoxItems, type SearchBoxSortFunction } from '../../utils/searchBox';\nimport type { Theme } from '../color-scheme-provider/ColorSchemeProvider';\nimport Icon from '../icon/Icon';\nimport Input, { type InputProps } from '../input/Input';\nimport GroupName from './group-name/GroupName';\nimport SearchBoxBody from './search-box-body/SearchBoxBody';\nimport SearchBoxItem from './search-box-item/SearchBoxItem';\nimport { StyledSearchBoxItemImage } from './search-box-item/SearchBoxItem.styles';\nimport {\n StyledSearchBox,\n StyledSearchBoxHintText,\n StyledSearchBoxIcon,\n StyledSearchBoxLeftWrapper,\n} from './SearchBox.styles';\nimport { useUuid } from '../../hooks/uuid';\nimport DropdownBodyWrapper from '../dropdown-body-wrapper/DropdownBodyWrapper';\nimport TagInput, { TagInputProps, TagInputRef } from '../tag-input/TagInput';\nimport type { DropdownDirection } from '../../types/dropdown';\n\nexport interface SearchBoxRef {\n clear: VoidFunction;\n}\n\nexport interface TagInputSettings {\n onAdd?: TagInputProps['onAdd'];\n onRemove?: TagInputProps['onRemove'];\n size?: TagInputProps['size'];\n shouldAllowMultiple?: TagInputProps['shouldAllowMultiple'];\n tags?: TagInputProps['tags'];\n}\n\nconst filterSearchBoxItems = ({\n customFilter,\n customSortFunction,\n items,\n searchString,\n shouldUseCustomFilterOnly,\n}: {\n customFilter?: (item: ISearchBoxItem) => boolean;\n customSortFunction?: SearchBoxSortFunction;\n items: ISearchBoxItem[];\n searchString: string;\n shouldUseCustomFilterOnly?: boolean;\n}) => {\n if (typeof customFilter !== 'function') {\n return searchList({ customSortFunction, items, searchString });\n }\n\n if (shouldUseCustomFilterOnly) {\n const filteredItems = items.filter(customFilter);\n\n return sortSearchBoxItems({ customSortFunction, items: filteredItems, searchString });\n }\n\n return searchList({ customSortFunction, items, searchString }).filter(customFilter);\n};\n\nconst getDropdownSearchString = ({\n selectedId,\n shouldKeepSelectedItemPosition,\n value,\n}: {\n selectedId?: string;\n shouldKeepSelectedItemPosition?: boolean;\n value: string;\n}) => (shouldKeepSelectedItemPosition && selectedId ? '' : value);\n\nexport type SearchBoxProps = {\n /**\n * The element where the content of the `ComboBox` should be rendered via React Portal.\n */\n container?: Element;\n /**\n * An optional callback function to filter the elements to be displayed\n */\n customFilter?: (item: ISearchBoxItem) => boolean;\n /**\n * An optional callback function to sort the filtered elements to be displayed\n */\n customSortFunction?: SearchBoxSortFunction;\n /**\n * If true, the custom filter replaces the built-in text search instead of narrowing its results.\n */\n shouldUseCustomFilterOnly?: boolean;\n /**\n * The direction in which the dropdown should be displayed. By default, it is displayed below the input.\n */\n dropdownDirection?: DropdownDirection;\n /**\n * If true, the input field is marked as invalid\n */\n isInvalid?: boolean;\n /**\n * An optional icon that is displayed inside the left side of the input.\n */\n leftIcons?: string[];\n /**\n * Props that are passed to the underlying Input component.\n */\n inputProps?: InputProps;\n /**\n * List of groups with items that can be searched. It is possible to give only one list; if multiple lists are provided, the 'group name' parameter becomes mandatory.\n */\n lists: ISearchBoxItems[];\n /**\n * The maximum height of the dropdown body in pixels.\n */\n maxHeight?: number;\n /**\n * Function to be executed when the input lost focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Function to be executed when the input is changed.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Function that is executed when a letter is pressed\n */\n onKeyDown?: KeyboardEventHandler<HTMLInputElement>;\n /**\n * Function to be executed when an item is selected.\n */\n onSelect?: (item: ISearchBoxItem) => void;\n /**\n * The placeholder that should be displayed.\n */\n placeholder?: string;\n /**\n * Set an input for the search box - it is not an item of a list, just a string.\n */\n presetValue?: string;\n /**\n * Control the selected item. If you use this prop, make sure to update it when the user selects an item.\n */\n selectedId?: string;\n /**\n * If true, the selected item keeps its original position in the dropdown list.\n */\n shouldKeepSelectedItemPosition?: boolean;\n /**\n * If true, the value in the Input is displayed in the list.\n */\n shouldAddInputToList: boolean;\n /**\n * If true, the filter buttons are hidden.\n */\n shouldHideFilterButtons?: boolean;\n /**\n * Whether the full list of items should be displayed if the input is empty.\n */\n shouldShowContentOnEmptyInput?: boolean;\n /**\n * If true, the dropdown items are displayed more compactly.\n */\n shouldShowSmallItems?: boolean;\n /**\n * If true, the images of the items are displayed in a round shape.\n */\n shouldShowRoundImage?: boolean;\n /**\n * Whether the icon to open and close the list should be displayed.\n */\n shouldShowToggleIcon?: boolean;\n /**\n * Settings for the TagInput.\n */\n tagInputSettings?: TagInputSettings;\n /**\n * Enables keyboard-only focus highlighting.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n /**\n * A text that should be displayed if no results are found.\n */\n hintText?: string;\n};\n\nconst SearchBox: FC<SearchBoxProps> = forwardRef<SearchBoxRef, SearchBoxProps>(\n (\n {\n container,\n customFilter,\n customSortFunction,\n dropdownDirection,\n inputProps,\n isInvalid = false,\n leftIcons,\n lists,\n maxHeight = 300,\n onBlur,\n onChange,\n onKeyDown,\n onSelect,\n placeholder,\n presetValue,\n hintText,\n selectedId,\n shouldAddInputToList = true,\n shouldKeepSelectedItemPosition = false,\n shouldUseCustomFilterOnly = false,\n shouldHideFilterButtons = false,\n shouldShowContentOnEmptyInput = true,\n shouldShowSmallItems = false,\n shouldShowRoundImage,\n shouldShowToggleIcon = false,\n tagInputSettings,\n shouldEnableKeyboardHighlighting,\n },\n ref,\n ) => {\n const [matchingListsItems, setMatchingListsItems] = useState<ISearchBoxItems[]>(lists);\n const [selectedImage, setSelectedImage] = useState<ReactElement>();\n const [internalValue, setInternalValue] = useState(\n typeof presetValue === 'string' && presetValue !== '' ? presetValue : '',\n );\n const inputValue = inputProps?.value;\n const value = inputValue ?? internalValue;\n const setValue = useCallback(\n (nextValue: string) => {\n if (typeof inputValue !== 'string') {\n setInternalValue(nextValue);\n }\n },\n [inputValue],\n );\n const [height, setHeight] = useState<number>(0);\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const [hasMultipleGroups, setHasMultipleGroups] = useState<boolean>(lists.length > 1);\n const [filteredChildrenArray, setFilteredChildrenArray] = useState<Element[]>();\n const [inputToListValue, setInputToListValue] = useState<string>('');\n const [groups, setGroups] = useState<string[]>(['all']);\n const [shouldShowBody, setShouldShowBody] = useState(false);\n\n const uuid = useUuid();\n\n const boxRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const tagInputRef = useRef<TagInputRef>(null);\n\n const hasFocusRef = useRef<boolean>(false);\n const isAnimatingRef = useRef<boolean>(false);\n const shouldShowPresetValue = useRef<boolean>(\n typeof presetValue === 'string' && presetValue !== '',\n );\n\n const theme = useTheme() as Theme;\n const dropdownSearchString = getDropdownSearchString({\n selectedId,\n shouldKeepSelectedItemPosition,\n value,\n });\n\n const { isTouch } = useDevice();\n\n /**\n * Checks if there are multiple groups in the lists\n */\n useEffect(() => {\n setHasMultipleGroups(lists.length > 1);\n }, [lists]);\n\n const filterButtons = useMemo(() => {\n const items: IFilterButtonItem[] = [];\n\n if (lists.length <= 1) {\n return items;\n }\n\n lists.forEach(({ groupName }) => {\n if (groupName) {\n items.push({\n id: groupName,\n text: groupName,\n });\n }\n });\n\n return items;\n }, [lists]);\n\n /**\n * Filters the lists by the FilterButtons\n */\n const activeList = useMemo(() => {\n let newLists: ISearchBoxItems[] = [];\n\n if (groups[0] === 'all') {\n newLists = lists;\n } else {\n lists.forEach((list) => {\n if (list.groupName && groups.includes(list.groupName)) {\n newLists.push(list);\n }\n });\n }\n\n const newMatchingItems: ISearchBoxItems[] = [];\n\n newLists.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n const filteredMatchingListItems = newMatchingItems.map(({ list, groupName }) => ({\n groupName,\n list: list.filter((item) => {\n if (typeof customFilter === 'function' && shouldUseCustomFilterOnly) {\n return true;\n }\n\n return !(newMatchingItems.length === 1 && item.text === dropdownSearchString);\n }),\n }));\n\n setMatchingListsItems(filteredMatchingListItems);\n\n return newLists;\n }, [\n groups,\n lists,\n customFilter,\n customSortFunction,\n dropdownSearchString,\n shouldAddInputToList,\n shouldUseCustomFilterOnly,\n ]);\n\n const handleOpen = useCallback(() => {\n setShouldShowBody(true);\n }, []);\n\n const handleClose = useCallback(() => {\n setShouldShowBody(false);\n }, []);\n\n const handleFilterButtonsGroupSelect = (keys: string[]) => {\n setGroups(keys.length === 0 ? ['all'] : keys);\n };\n\n /**\n * This hook calculates the height\n */\n useEffect(() => {\n const textArray: string[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n list.forEach(({ text }) => textArray.push(text));\n if (!groupName) {\n return;\n }\n textArray.push(groupName);\n });\n\n if (shouldAddInputToList && inputToListValue !== '') {\n textArray.push(inputToListValue);\n }\n\n setHeight(calculateContentHeight(textArray));\n }, [inputToListValue, activeList, placeholder, shouldAddInputToList]);\n\n useEffect(() => {\n if (selectedId) {\n activeList.forEach(({ list }) => {\n const selectedItem = list.find(({ id }) => id === selectedId);\n if (selectedItem) {\n setValue(selectedItem.text);\n\n if (selectedItem.imageUrl) {\n setSelectedImage(\n <StyledSearchBoxItemImage\n src={selectedItem.imageUrl}\n $shouldShowRoundImage={shouldShowRoundImage}\n />,\n );\n }\n }\n });\n }\n }, [activeList, selectedId, shouldShowRoundImage]);\n\n /**\n * This hook resets the value if the selectedId changes to undefined. This is an own useEffect because the value\n * should not be reset if the list changes and the selectedId is still undefined.\n */\n useEffect(() => {\n if (!selectedId && !shouldShowPresetValue.current) {\n setValue('');\n }\n }, [selectedId]);\n\n useEffect(() => {\n isAnimatingRef.current = shouldShowBody;\n }, [shouldShowBody]);\n\n useEffect(() => {\n if (\n (matchingListsItems.length !== 0 || hintText) &&\n !isAnimatingRef.current &&\n hasFocusRef.current\n ) {\n handleOpen();\n }\n }, [handleOpen, hintText, matchingListsItems.length]);\n\n /**\n * This function handles the focus event of the input and opens the dropdown if the input\n * should show content on an empty input\n */\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n hasFocusRef.current = true;\n\n if (typeof inputProps?.onFocus === 'function') {\n inputProps.onFocus(event);\n }\n\n if (shouldShowContentOnEmptyInput) {\n const newMatchingItems: ISearchBoxItems[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n const filteredMatchingListItems = newMatchingItems.map(\n ({ list, groupName }) => ({\n groupName,\n list: list.filter((item) => {\n if (\n typeof customFilter === 'function' &&\n shouldUseCustomFilterOnly\n ) {\n return true;\n }\n\n return !(\n newMatchingItems.length === 1 &&\n item.text === dropdownSearchString\n );\n }),\n }),\n );\n\n setMatchingListsItems(filteredMatchingListItems);\n\n if (filteredMatchingListItems.length !== 0 || hintText) {\n handleOpen();\n }\n }\n },\n [\n shouldShowContentOnEmptyInput,\n activeList,\n shouldAddInputToList,\n hintText,\n dropdownSearchString,\n customFilter,\n customSortFunction,\n shouldUseCustomFilterOnly,\n handleOpen,\n inputProps,\n ],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLInputElement>>(\n (event) => {\n if (typeof onKeyDown === 'function') {\n onKeyDown(event);\n }\n\n if (typeof inputProps?.onKeyDown === 'function') {\n inputProps.onKeyDown(event);\n }\n },\n [inputProps, onKeyDown],\n );\n\n /**\n * This function filters the lists by input\n */\n\n useEffect(() => {\n const newMatchingItems: ISearchBoxItems[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n if (shouldAddInputToList && inputToListValue !== '') {\n newMatchingItems.forEach(({ list }) => {\n list.forEach(({ text }) => {\n if (text.toLowerCase() === inputToListValue.toLowerCase()) {\n setInputToListValue('');\n }\n });\n });\n }\n }, [\n inputToListValue,\n activeList,\n shouldAddInputToList,\n shouldShowContentOnEmptyInput,\n dropdownSearchString,\n customFilter,\n customSortFunction,\n shouldUseCustomFilterOnly,\n ]);\n\n const handleClick = useCallback(() => {\n if (shouldShowBody) {\n handleClose();\n } else {\n handleOpen();\n }\n }, [handleClose, handleOpen, shouldShowBody]);\n\n const rightElement = useMemo(() => {\n if (!shouldShowToggleIcon) {\n return undefined;\n }\n\n return (\n <StyledSearchBoxIcon onClick={handleClick}>\n <Icon icons={['fa fa-chevron-down']} color={theme['006'] as string} />\n </StyledSearchBoxIcon>\n );\n }, [handleClick, shouldShowToggleIcon, theme]);\n\n const leftElement = useMemo(\n () =>\n (leftIcons || selectedImage) && (\n <StyledSearchBoxLeftWrapper>\n {leftIcons && <Icon icons={leftIcons} />}\n {selectedImage && selectedImage}\n </StyledSearchBoxLeftWrapper>\n ),\n [leftIcons, selectedImage],\n );\n\n /**\n * This function handles changes of the input\n */\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const filteredLists: ISearchBoxItems[] = [];\n shouldShowPresetValue.current = false;\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: event.target.value,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n filteredLists.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (filteredLists.length === 0 && shouldAddInputToList) {\n filteredLists.push({\n groupName: undefined,\n list: [],\n });\n }\n\n setSelectedImage(undefined);\n\n if (!shouldShowContentOnEmptyInput && !event.target.value) {\n setMatchingListsItems([]);\n } else {\n setMatchingListsItems(filteredLists);\n }\n\n if (filteredLists.length !== 0) {\n handleOpen();\n }\n\n setValue(event.target.value);\n setInputToListValue(event.target.value);\n\n if (typeof onChange === 'function') {\n onChange(event);\n }\n\n if (typeof inputProps?.onChange === 'function') {\n inputProps.onChange(event);\n }\n },\n [\n activeList,\n customFilter,\n customSortFunction,\n handleOpen,\n inputProps,\n onChange,\n shouldAddInputToList,\n shouldShowContentOnEmptyInput,\n shouldUseCustomFilterOnly,\n ],\n );\n\n /**\n * This function handles the blur event of the input\n */\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n hasFocusRef.current = false;\n\n if (typeof onBlur === 'function') {\n onBlur(event);\n }\n\n if (typeof inputProps?.onBlur === 'function') {\n inputProps.onBlur(event);\n }\n },\n [inputProps, onBlur],\n );\n\n const handleDropdownOutsideClick = useCallback(() => {\n tagInputRef.current?.blur();\n\n return hasFocusRef.current && isTouch;\n }, [isTouch]);\n\n const handleContainerBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n const nextFocusedElement = event.relatedTarget as Node | null;\n const currentContainer = event.currentTarget as HTMLElement;\n\n // Check if focus is moving outside the SearchBox container\n // Also check the dropdown content (contentRef) since it's rendered in a portal\n if (\n !nextFocusedElement ||\n (!currentContainer.contains(nextFocusedElement) &&\n !contentRef.current?.contains(nextFocusedElement))\n ) {\n handleClose();\n }\n },\n [handleClose],\n );\n\n /**\n * This function handles the item selection\n */\n const handleSelect = useCallback(\n (item: ISearchBoxItem) => {\n const newItem = {\n ...item,\n text: item.text.replace('<b>', '').replace('</b>', '').replace('</b', ''),\n };\n\n if (tagInputSettings) {\n setValue('');\n setInputToListValue('');\n tagInputRef.current?.resetValue();\n } else {\n setValue(newItem.text);\n }\n\n handleClose();\n\n setSelectedImage(\n newItem.imageUrl ? (\n <StyledSearchBoxItemImage\n src={newItem.imageUrl}\n $shouldShowRoundImage={shouldShowRoundImage}\n />\n ) : undefined,\n );\n\n setMatchingListsItems([]);\n\n if (typeof onSelect === 'function') {\n onSelect(newItem);\n }\n },\n [handleClose, onSelect, shouldShowRoundImage, tagInputSettings],\n );\n\n const content = useMemo(() => {\n if (hintText && matchingListsItems.length === 0) {\n return (\n <StyledSearchBoxHintText>\n {hintText.replace('##value##', value)}\n </StyledSearchBoxHintText>\n );\n }\n\n const items: ReactElement[] = [];\n\n matchingListsItems.forEach(({ groupName, list }, index) => {\n if (hasMultipleGroups) {\n if (list.length <= 0) {\n return;\n }\n\n if (index !== 0) {\n items.push(<GroupName key={groupName} name={groupName ?? ''} />);\n }\n }\n\n list.forEach(({ id, text, imageUrl }, listIndex) => {\n items.push(\n <SearchBoxItem\n key={`${id}_${groupName ?? ''}`}\n id={id}\n text={text}\n imageUrl={imageUrl}\n shouldShowSmallItems={shouldShowSmallItems}\n shouldShowRoundImage={shouldShowRoundImage}\n onSelect={handleSelect}\n groupName={groupName}\n tabIndex={index === 0 && listIndex === 0 ? 0 : -1}\n />,\n );\n });\n });\n\n if (shouldAddInputToList && inputToListValue !== '') {\n items.push(\n <SearchBoxItem\n id=\"input-value\"\n onSelect={handleSelect}\n shouldShowSmallItems={shouldShowSmallItems}\n text={`<b>${inputToListValue}</b`}\n tabIndex={items.length === 0 ? 0 : -1}\n />,\n );\n }\n\n return items;\n }, [\n hintText,\n matchingListsItems,\n shouldAddInputToList,\n inputToListValue,\n value,\n hasMultipleGroups,\n shouldShowSmallItems,\n shouldShowRoundImage,\n handleSelect,\n ]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!shouldShowBody || matchingListsItems.length === 0) {\n return;\n }\n\n const children = contentRef.current?.children;\n\n if (!children) {\n return;\n }\n\n const childrenArray = Array.from(children);\n\n const newChildren = childrenArray.find((child) =>\n child.id.startsWith('searchBoxContent__'),\n )?.children;\n\n if (!(newChildren && newChildren.length > 0)) {\n return;\n }\n\n const filteredChildren = Array.from(newChildren).filter(\n (child) => (child as HTMLElement).dataset.isgroupname !== 'true',\n );\n\n setFilteredChildrenArray(filteredChildren);\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n\n if (newChildren && newChildren.length > 0) {\n const newIndex =\n focusedIndex !== null\n ? (focusedIndex +\n (e.key === 'ArrowUp' ? -1 : 1) +\n filteredChildren.length) %\n filteredChildren.length\n : 0;\n\n if (focusedIndex !== null) {\n const prevElement = filteredChildren[focusedIndex] as HTMLDivElement;\n prevElement.tabIndex = -1;\n }\n\n setFocusedIndex(newIndex);\n\n const newElement = filteredChildren[newIndex] as HTMLDivElement;\n\n newElement.tabIndex = 0;\n }\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n\n if (filteredChildren) {\n const element = filteredChildren[focusedIndex ?? 0];\n\n if (!element) {\n return;\n }\n\n const { id, textContent } = element;\n\n let imageUrl: string | undefined;\n\n // Just Ignore, it works\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (element.children[0]?.attributes.src) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n imageUrl = element.children[0]?.attributes.src.nodeValue as string;\n }\n\n const newId = id.replace('search-box-item__', '');\n\n handleSelect({\n id: newId === 'input-value' ? textContent : newId,\n text: textContent ?? '',\n imageUrl,\n });\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [\n filteredChildrenArray,\n focusedIndex,\n handleSelect,\n matchingListsItems.length,\n shouldShowBody,\n ]);\n\n const handleKeyPress = useCallback((event: KeyboardEvent) => {\n if (event.keyCode === 27) {\n setMatchingListsItems([]);\n }\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n clear: () => setValue(''),\n }),\n [setValue],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyPress);\n\n return () => {\n document.addEventListener('keydown', handleKeyPress);\n };\n }, [handleKeyPress]);\n\n /**\n * Update the value if preset value changes\n */\n useEffect(() => {\n if (presetValue) {\n setValue(presetValue);\n }\n }, [presetValue, setValue]);\n\n const shouldShowDropdown =\n shouldShowBody &&\n (matchingListsItems.length !== 0 || !!hintText) &&\n (value.trim() !== '' || shouldShowContentOnEmptyInput);\n\n return useMemo(\n () => (\n <StyledSearchBox\n ref={boxRef}\n key={`search-box-${uuid}`}\n onBlur={handleContainerBlur}\n >\n <div id={`search_box_input${uuid}`}>\n {tagInputSettings ? (\n <TagInput\n leftElement={leftElement}\n onAdd={tagInputSettings.onAdd}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={handleFocus}\n onRemove={tagInputSettings.onRemove}\n placeholder={placeholder}\n ref={tagInputRef}\n size={tagInputSettings.size}\n shouldAllowMultiple={tagInputSettings.shouldAllowMultiple}\n shouldEnableKeyboardHighlighting={shouldEnableKeyboardHighlighting}\n shouldPreventEnter\n tags={tagInputSettings.tags}\n />\n ) : (\n <Input\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...inputProps}\n isInvalid={isInvalid}\n leftElement={leftElement}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={inputRef}\n rightElement={rightElement}\n shouldEnableKeyboardHighlighting={\n inputProps?.shouldEnableKeyboardHighlighting ??\n shouldEnableKeyboardHighlighting\n }\n value={value}\n />\n )}\n </div>\n {boxRef.current && (\n <DropdownBodyWrapper\n anchorElement={boxRef.current}\n container={container}\n direction={dropdownDirection}\n onClose={handleClose}\n onOutsideClick={handleDropdownOutsideClick}\n shouldShowDropdown={shouldShowDropdown}\n >\n <SearchBoxBody\n filterButtons={filterButtons}\n height={height}\n maxHeight={maxHeight}\n shouldShow={shouldShowDropdown}\n key={`search-box-body-${uuid}`}\n onGroupSelect={handleFilterButtonsGroupSelect}\n ref={contentRef}\n selectedGroups={groups}\n shouldHideFilterButtons={shouldHideFilterButtons}\n >\n {content}\n </SearchBoxBody>\n </DropdownBodyWrapper>\n )}\n </StyledSearchBox>\n ),\n [\n container,\n content,\n dropdownDirection,\n filterButtons,\n groups,\n handleBlur,\n handleChange,\n handleClose,\n handleDropdownOutsideClick,\n handleFocus,\n handleKeyDown,\n height,\n inputProps,\n isInvalid,\n leftElement,\n maxHeight,\n onKeyDown,\n placeholder,\n rightElement,\n shouldHideFilterButtons,\n shouldShowDropdown,\n shouldEnableKeyboardHighlighting,\n tagInputSettings,\n uuid,\n value,\n ],\n );\n },\n);\n\nSearchBox.displayName = 'SearchBox';\n\nexport default SearchBox;\n"],"mappings":";AAAA,SAASA,SAAS,QAAQ,YAAY;AACtC,OAAOC,KAAK,IAMRC,UAAU,EAGVC,WAAW,EACXC,SAAS,EACTC,mBAAmB,EACnBC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACL,OAAO;AACd,SAASC,QAAQ,QAAQ,mBAAmB;AAG5C,SAASC,sBAAsB,QAAQ,uBAAuB;AAC9D,SAASC,UAAU,EAAEC,kBAAkB,QAAoC,uBAAuB;AAElG,OAAOC,IAAI,MAAM,cAAc;AAC/B,OAAOC,KAAK,MAA2B,gBAAgB;AACvD,OAAOC,SAAS,MAAM,wBAAwB;AAC9C,OAAOC,aAAa,MAAM,iCAAiC;AAC3D,OAAOC,aAAa,MAAM,iCAAiC;AAC3D,SAASC,wBAAwB,QAAQ,wCAAwC;AACjF,SACIC,eAAe,EACfC,uBAAuB,EACvBC,mBAAmB,EACnBC,0BAA0B,QACvB,oBAAoB;AAC3B,SAASC,OAAO,QAAQ,kBAAkB;AAC1C,OAAOC,mBAAmB,MAAM,8CAA8C;AAC9E,OAAOC,QAAQ,MAAsC,uBAAuB;AAe5E,MAAMC,oBAAoB,GAAGA,CAAC;EAC1BC,YAAY;EACZC,kBAAkB;EAClBC,KAAK;EACLC,YAAY;EACZC;AAOJ,CAAC,KAAK;EACF,IAAI,OAAOJ,YAAY,KAAK,UAAU,EAAE;IACpC,OAAOhB,UAAU,CAAC;MAAEiB,kBAAkB;MAAEC,KAAK;MAAEC;IAAa,CAAC,CAAC;EAClE;EAEA,IAAIC,yBAAyB,EAAE;IAC3B,MAAMC,aAAa,GAAGH,KAAK,CAACI,MAAM,CAACN,YAAY,CAAC;IAEhD,OAAOf,kBAAkB,CAAC;MAAEgB,kBAAkB;MAAEC,KAAK,EAAEG,aAAa;MAAEF;IAAa,CAAC,CAAC;EACzF;EAEA,OAAOnB,UAAU,CAAC;IAAEiB,kBAAkB;IAAEC,KAAK;IAAEC;EAAa,CAAC,CAAC,CAACG,MAAM,CAACN,YAAY,CAAC;AACvF,CAAC;AAED,MAAMO,uBAAuB,GAAGA,CAAC;EAC7BC,UAAU;EACVC,8BAA8B;EAC9BC;AAKJ,CAAC,KAAMD,8BAA8B,IAAID,UAAU,GAAG,EAAE,GAAGE,KAAM;AAiHjE,MAAMC,SAA6B,gBAAGpC,UAAU,CAC5C,CACI;EACIqC,SAAS;EACTZ,YAAY;EACZC,kBAAkB;EAClBY,iBAAiB;EACjBC,UAAU;EACVC,SAAS,GAAG,KAAK;EACjBC,SAAS;EACTC,KAAK;EACLC,SAAS,GAAG,GAAG;EACfC,MAAM;EACNC,QAAQ;EACRC,SAAS;EACTC,QAAQ;EACRC,WAAW;EACXC,WAAW;EACXC,QAAQ;EACRjB,UAAU;EACVkB,oBAAoB,GAAG,IAAI;EAC3BjB,8BAA8B,GAAG,KAAK;EACtCL,yBAAyB,GAAG,KAAK;EACjCuB,uBAAuB,GAAG,KAAK;EAC/BC,6BAA6B,GAAG,IAAI;EACpCC,oBAAoB,GAAG,KAAK;EAC5BC,oBAAoB;EACpBC,oBAAoB,GAAG,KAAK;EAC5BC,gBAAgB;EAChBC;AACJ,CAAC,EACDC,GAAG,KACF;EACD,MAAM,CAACC,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGvD,QAAQ,CAAoBoC,KAAK,CAAC;EACtF,MAAM,CAACoB,aAAa,EAAEC,gBAAgB,CAAC,GAAGzD,QAAQ,CAAe,CAAC;EAClE,MAAM,CAAC0D,aAAa,EAAEC,gBAAgB,CAAC,GAAG3D,QAAQ,CAC9C,OAAO2C,WAAW,KAAK,QAAQ,IAAIA,WAAW,KAAK,EAAE,GAAGA,WAAW,GAAG,EAC1E,CAAC;EACD,MAAMiB,UAAU,GAAG3B,UAAU,EAAEJ,KAAK;EACpC,MAAMA,KAAK,GAAG+B,UAAU,IAAIF,aAAa;EACzC,MAAMG,QAAQ,GAAGlE,WAAW,CACvBmE,SAAiB,IAAK;IACnB,IAAI,OAAOF,UAAU,KAAK,QAAQ,EAAE;MAChCD,gBAAgB,CAACG,SAAS,CAAC;IAC/B;EACJ,CAAC,EACD,CAACF,UAAU,CACf,CAAC;EACD,MAAM,CAACG,MAAM,EAAEC,SAAS,CAAC,GAAGhE,QAAQ,CAAS,CAAC,CAAC;EAC/C,MAAM,CAACiE,YAAY,EAAEC,eAAe,CAAC,GAAGlE,QAAQ,CAAgB,IAAI,CAAC;EACrE,MAAM,CAACmE,iBAAiB,EAAEC,oBAAoB,CAAC,GAAGpE,QAAQ,CAAUoC,KAAK,CAACiC,MAAM,GAAG,CAAC,CAAC;EACrF,MAAM,CAACC,qBAAqB,EAAEC,wBAAwB,CAAC,GAAGvE,QAAQ,CAAY,CAAC;EAC/E,MAAM,CAACwE,gBAAgB,EAAEC,mBAAmB,CAAC,GAAGzE,QAAQ,CAAS,EAAE,CAAC;EACpE,MAAM,CAAC0E,MAAM,EAAEC,SAAS,CAAC,GAAG3E,QAAQ,CAAW,CAAC,KAAK,CAAC,CAAC;EACvD,MAAM,CAAC4E,cAAc,EAAEC,iBAAiB,CAAC,GAAG7E,QAAQ,CAAC,KAAK,CAAC;EAE3D,MAAM8E,IAAI,GAAG/D,OAAO,CAAC,CAAC;EAEtB,MAAMgE,MAAM,GAAGhF,MAAM,CAAiB,IAAI,CAAC;EAC3C,MAAMiF,UAAU,GAAGjF,MAAM,CAAiB,IAAI,CAAC;EAC/C,MAAMkF,QAAQ,GAAGlF,MAAM,CAA0B,IAAI,CAAC;EACtD,MAAMmF,WAAW,GAAGnF,MAAM,CAAc,IAAI,CAAC;EAE7C,MAAMoF,WAAW,GAAGpF,MAAM,CAAU,KAAK,CAAC;EAC1C,MAAMqF,cAAc,GAAGrF,MAAM,CAAU,KAAK,CAAC;EAC7C,MAAMsF,qBAAqB,GAAGtF,MAAM,CAChC,OAAO4C,WAAW,KAAK,QAAQ,IAAIA,WAAW,KAAK,EACvD,CAAC;EAED,MAAM2C,KAAK,GAAGrF,QAAQ,CAAC,CAAU;EACjC,MAAMsF,oBAAoB,GAAG7D,uBAAuB,CAAC;IACjDC,UAAU;IACVC,8BAA8B;IAC9BC;EACJ,CAAC,CAAC;EAEF,MAAM;IAAE2D;EAAQ,CAAC,GAAGhG,SAAS,CAAC,CAAC;;EAE/B;AACR;AACA;EACQI,SAAS,CAAC,MAAM;IACZwE,oBAAoB,CAAChC,KAAK,CAACiC,MAAM,GAAG,CAAC,CAAC;EAC1C,CAAC,EAAE,CAACjC,KAAK,CAAC,CAAC;EAEX,MAAMqD,aAAa,GAAG3F,OAAO,CAAC,MAAM;IAChC,MAAMuB,KAA0B,GAAG,EAAE;IAErC,IAAIe,KAAK,CAACiC,MAAM,IAAI,CAAC,EAAE;MACnB,OAAOhD,KAAK;IAChB;IAEAe,KAAK,CAACsD,OAAO,CAAC,CAAC;MAAEC;IAAU,CAAC,KAAK;MAC7B,IAAIA,SAAS,EAAE;QACXtE,KAAK,CAACuE,IAAI,CAAC;UACPC,EAAE,EAAEF,SAAS;UACbG,IAAI,EAAEH;QACV,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;IAEF,OAAOtE,KAAK;EAChB,CAAC,EAAE,CAACe,KAAK,CAAC,CAAC;;EAEX;AACR;AACA;EACQ,MAAM2D,UAAU,GAAGjG,OAAO,CAAC,MAAM;IAC7B,IAAIkG,QAA2B,GAAG,EAAE;IAEpC,IAAItB,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;MACrBsB,QAAQ,GAAG5D,KAAK;IACpB,CAAC,MAAM;MACHA,KAAK,CAACsD,OAAO,CAAEO,IAAI,IAAK;QACpB,IAAIA,IAAI,CAACN,SAAS,IAAIjB,MAAM,CAACwB,QAAQ,CAACD,IAAI,CAACN,SAAS,CAAC,EAAE;UACnDK,QAAQ,CAACJ,IAAI,CAACK,IAAI,CAAC;QACvB;MACJ,CAAC,CAAC;IACN;IAEA,MAAME,gBAAmC,GAAG,EAAE;IAE9CH,QAAQ,CAACN,OAAO,CAAC,CAAC;MAAEO,IAAI;MAAEN;IAAU,CAAC,KAAK;MACtC,MAAMS,OAAO,GAAGlF,oBAAoB,CAAC;QACjCC,YAAY;QACZC,kBAAkB;QAClBC,KAAK,EAAE4E,IAAI;QACX3E,YAAY,EAAEiE,oBAAoB;QAClChE;MACJ,CAAC,CAAC;MAEF,IAAI6E,OAAO,CAAC/B,MAAM,GAAG,CAAC,EAAE;QACpB8B,gBAAgB,CAACP,IAAI,CAAC;UAClBD,SAAS;UACTM,IAAI,EAAEG;QACV,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;IAEF,IAAID,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAAIxB,oBAAoB,EAAE;MACvDsD,gBAAgB,CAACP,IAAI,CAAC;QAClBD,SAAS,EAAEU,SAAS;QACpBJ,IAAI,EAAE;MACV,CAAC,CAAC;IACN;IAEA,MAAMK,yBAAyB,GAAGH,gBAAgB,CAACI,GAAG,CAAC,CAAC;MAAEN,IAAI;MAAEN;IAAU,CAAC,MAAM;MAC7EA,SAAS;MACTM,IAAI,EAAEA,IAAI,CAACxE,MAAM,CAAE+E,IAAI,IAAK;QACxB,IAAI,OAAOrF,YAAY,KAAK,UAAU,IAAII,yBAAyB,EAAE;UACjE,OAAO,IAAI;QACf;QAEA,OAAO,EAAE4E,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAAImC,IAAI,CAACV,IAAI,KAAKP,oBAAoB,CAAC;MACjF,CAAC;IACL,CAAC,CAAC,CAAC;IAEHhC,qBAAqB,CAAC+C,yBAAyB,CAAC;IAEhD,OAAON,QAAQ;EACnB,CAAC,EAAE,CACCtB,MAAM,EACNtC,KAAK,EACLjB,YAAY,EACZC,kBAAkB,EAClBmE,oBAAoB,EACpB1C,oBAAoB,EACpBtB,yBAAyB,CAC5B,CAAC;EAEF,MAAMkF,UAAU,GAAG9G,WAAW,CAAC,MAAM;IACjCkF,iBAAiB,CAAC,IAAI,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM6B,WAAW,GAAG/G,WAAW,CAAC,MAAM;IAClCkF,iBAAiB,CAAC,KAAK,CAAC;EAC5B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM8B,8BAA8B,GAAIC,IAAc,IAAK;IACvDjC,SAAS,CAACiC,IAAI,CAACvC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAGuC,IAAI,CAAC;EACjD,CAAC;;EAED;AACR;AACA;EACQhH,SAAS,CAAC,MAAM;IACZ,MAAMiH,SAAmB,GAAG,EAAE;IAE9Bd,UAAU,CAACL,OAAO,CAAC,CAAC;MAAEO,IAAI;MAAEN;IAAU,CAAC,KAAK;MACxCM,IAAI,CAACP,OAAO,CAAC,CAAC;QAAEI;MAAK,CAAC,KAAKe,SAAS,CAACjB,IAAI,CAACE,IAAI,CAAC,CAAC;MAChD,IAAI,CAACH,SAAS,EAAE;QACZ;MACJ;MACAkB,SAAS,CAACjB,IAAI,CAACD,SAAS,CAAC;IAC7B,CAAC,CAAC;IAEF,IAAI9C,oBAAoB,IAAI2B,gBAAgB,KAAK,EAAE,EAAE;MACjDqC,SAAS,CAACjB,IAAI,CAACpB,gBAAgB,CAAC;IACpC;IAEAR,SAAS,CAAC9D,sBAAsB,CAAC2G,SAAS,CAAC,CAAC;EAChD,CAAC,EAAE,CAACrC,gBAAgB,EAAEuB,UAAU,EAAErD,WAAW,EAAEG,oBAAoB,CAAC,CAAC;EAErEjD,SAAS,CAAC,MAAM;IACZ,IAAI+B,UAAU,EAAE;MACZoE,UAAU,CAACL,OAAO,CAAC,CAAC;QAAEO;MAAK,CAAC,KAAK;QAC7B,MAAMa,YAAY,GAAGb,IAAI,CAACc,IAAI,CAAC,CAAC;UAAElB;QAAG,CAAC,KAAKA,EAAE,KAAKlE,UAAU,CAAC;QAC7D,IAAImF,YAAY,EAAE;UACdjD,QAAQ,CAACiD,YAAY,CAAChB,IAAI,CAAC;UAE3B,IAAIgB,YAAY,CAACE,QAAQ,EAAE;YACvBvD,gBAAgB,cACZhE,KAAA,CAAAwH,aAAA,CAACvG,wBAAwB;cACrBwG,GAAG,EAAEJ,YAAY,CAACE,QAAS;cAC3BG,qBAAqB,EAAElE;YAAqB,CAC/C,CACL,CAAC;UACL;QACJ;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,EAAE,CAAC8C,UAAU,EAAEpE,UAAU,EAAEsB,oBAAoB,CAAC,CAAC;;EAElD;AACR;AACA;AACA;EACQrD,SAAS,CAAC,MAAM;IACZ,IAAI,CAAC+B,UAAU,IAAI,CAAC0D,qBAAqB,CAAC+B,OAAO,EAAE;MAC/CvD,QAAQ,CAAC,EAAE,CAAC;IAChB;EACJ,CAAC,EAAE,CAAClC,UAAU,CAAC,CAAC;EAEhB/B,SAAS,CAAC,MAAM;IACZwF,cAAc,CAACgC,OAAO,GAAGxC,cAAc;EAC3C,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAEpBhF,SAAS,CAAC,MAAM;IACZ,IACI,CAAC0D,kBAAkB,CAACe,MAAM,KAAK,CAAC,IAAIzB,QAAQ,KAC5C,CAACwC,cAAc,CAACgC,OAAO,IACvBjC,WAAW,CAACiC,OAAO,EACrB;MACEX,UAAU,CAAC,CAAC;IAChB;EACJ,CAAC,EAAE,CAACA,UAAU,EAAE7D,QAAQ,EAAEU,kBAAkB,CAACe,MAAM,CAAC,CAAC;;EAErD;AACR;AACA;AACA;EACQ,MAAMgD,WAAW,GAAG1H,WAAW,CAC1B2H,KAAmC,IAAK;IACrCnC,WAAW,CAACiC,OAAO,GAAG,IAAI;IAE1B,IAAI,OAAOnF,UAAU,EAAEsF,OAAO,KAAK,UAAU,EAAE;MAC3CtF,UAAU,CAACsF,OAAO,CAACD,KAAK,CAAC;IAC7B;IAEA,IAAIvE,6BAA6B,EAAE;MAC/B,MAAMoD,gBAAmC,GAAG,EAAE;MAE9CJ,UAAU,CAACL,OAAO,CAAC,CAAC;QAAEO,IAAI;QAAEN;MAAU,CAAC,KAAK;QACxC,MAAMS,OAAO,GAAGlF,oBAAoB,CAAC;UACjCC,YAAY;UACZC,kBAAkB;UAClBC,KAAK,EAAE4E,IAAI;UACX3E,YAAY,EAAEiE,oBAAoB;UAClChE;QACJ,CAAC,CAAC;QAEF,IAAI6E,OAAO,CAAC/B,MAAM,GAAG,CAAC,EAAE;UACpB8B,gBAAgB,CAACP,IAAI,CAAC;YAClBD,SAAS;YACTM,IAAI,EAAEG;UACV,CAAC,CAAC;QACN;MACJ,CAAC,CAAC;MAEF,IAAID,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAAIxB,oBAAoB,EAAE;QACvDsD,gBAAgB,CAACP,IAAI,CAAC;UAClBD,SAAS,EAAEU,SAAS;UACpBJ,IAAI,EAAE;QACV,CAAC,CAAC;MACN;MAEA,MAAMK,yBAAyB,GAAGH,gBAAgB,CAACI,GAAG,CAClD,CAAC;QAAEN,IAAI;QAAEN;MAAU,CAAC,MAAM;QACtBA,SAAS;QACTM,IAAI,EAAEA,IAAI,CAACxE,MAAM,CAAE+E,IAAI,IAAK;UACxB,IACI,OAAOrF,YAAY,KAAK,UAAU,IAClCI,yBAAyB,EAC3B;YACE,OAAO,IAAI;UACf;UAEA,OAAO,EACH4E,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAC7BmC,IAAI,CAACV,IAAI,KAAKP,oBAAoB,CACrC;QACL,CAAC;MACL,CAAC,CACL,CAAC;MAEDhC,qBAAqB,CAAC+C,yBAAyB,CAAC;MAEhD,IAAIA,yBAAyB,CAACjC,MAAM,KAAK,CAAC,IAAIzB,QAAQ,EAAE;QACpD6D,UAAU,CAAC,CAAC;MAChB;IACJ;EACJ,CAAC,EACD,CACI1D,6BAA6B,EAC7BgD,UAAU,EACVlD,oBAAoB,EACpBD,QAAQ,EACR2C,oBAAoB,EACpBpE,YAAY,EACZC,kBAAkB,EAClBG,yBAAyB,EACzBkF,UAAU,EACVxE,UAAU,CAElB,CAAC;EAED,MAAMuF,aAAa,GAAG7H,WAAW,CAC5B2H,KAAK,IAAK;IACP,IAAI,OAAO9E,SAAS,KAAK,UAAU,EAAE;MACjCA,SAAS,CAAC8E,KAAK,CAAC;IACpB;IAEA,IAAI,OAAOrF,UAAU,EAAEO,SAAS,KAAK,UAAU,EAAE;MAC7CP,UAAU,CAACO,SAAS,CAAC8E,KAAK,CAAC;IAC/B;EACJ,CAAC,EACD,CAACrF,UAAU,EAAEO,SAAS,CAC1B,CAAC;;EAED;AACR;AACA;;EAEQ5C,SAAS,CAAC,MAAM;IACZ,MAAMuG,gBAAmC,GAAG,EAAE;IAE9CJ,UAAU,CAACL,OAAO,CAAC,CAAC;MAAEO,IAAI;MAAEN;IAAU,CAAC,KAAK;MACxC,MAAMS,OAAO,GAAGlF,oBAAoB,CAAC;QACjCC,YAAY;QACZC,kBAAkB;QAClBC,KAAK,EAAE4E,IAAI;QACX3E,YAAY,EAAEiE,oBAAoB;QAClChE;MACJ,CAAC,CAAC;MAEF,IAAI6E,OAAO,CAAC/B,MAAM,GAAG,CAAC,EAAE;QACpB8B,gBAAgB,CAACP,IAAI,CAAC;UAClBD,SAAS;UACTM,IAAI,EAAEG;QACV,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;IAEF,IAAID,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAAIxB,oBAAoB,EAAE;MACvDsD,gBAAgB,CAACP,IAAI,CAAC;QAClBD,SAAS,EAAEU,SAAS;QACpBJ,IAAI,EAAE;MACV,CAAC,CAAC;IACN;IAEA,IAAIpD,oBAAoB,IAAI2B,gBAAgB,KAAK,EAAE,EAAE;MACjD2B,gBAAgB,CAACT,OAAO,CAAC,CAAC;QAAEO;MAAK,CAAC,KAAK;QACnCA,IAAI,CAACP,OAAO,CAAC,CAAC;UAAEI;QAAK,CAAC,KAAK;UACvB,IAAIA,IAAI,CAAC2B,WAAW,CAAC,CAAC,KAAKjD,gBAAgB,CAACiD,WAAW,CAAC,CAAC,EAAE;YACvDhD,mBAAmB,CAAC,EAAE,CAAC;UAC3B;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EACJ,CAAC,EAAE,CACCD,gBAAgB,EAChBuB,UAAU,EACVlD,oBAAoB,EACpBE,6BAA6B,EAC7BwC,oBAAoB,EACpBpE,YAAY,EACZC,kBAAkB,EAClBG,yBAAyB,CAC5B,CAAC;EAEF,MAAMmG,WAAW,GAAG/H,WAAW,CAAC,MAAM;IAClC,IAAIiF,cAAc,EAAE;MAChB8B,WAAW,CAAC,CAAC;IACjB,CAAC,MAAM;MACHD,UAAU,CAAC,CAAC;IAChB;EACJ,CAAC,EAAE,CAACC,WAAW,EAAED,UAAU,EAAE7B,cAAc,CAAC,CAAC;EAE7C,MAAM+C,YAAY,GAAG7H,OAAO,CAAC,MAAM;IAC/B,IAAI,CAACoD,oBAAoB,EAAE;MACvB,OAAOmD,SAAS;IACpB;IAEA,oBACI5G,KAAA,CAAAwH,aAAA,CAACpG,mBAAmB;MAAC+G,OAAO,EAAEF;IAAY,gBACtCjI,KAAA,CAAAwH,aAAA,CAAC5G,IAAI;MAACwH,KAAK,EAAE,CAAC,oBAAoB,CAAE;MAACC,KAAK,EAAExC,KAAK,CAAC,KAAK;IAAY,CAAE,CACpD,CAAC;EAE9B,CAAC,EAAE,CAACoC,WAAW,EAAExE,oBAAoB,EAAEoC,KAAK,CAAC,CAAC;EAE9C,MAAMyC,WAAW,GAAGjI,OAAO,CACvB,MACI,CAACqC,SAAS,IAAIqB,aAAa,kBACvB/D,KAAA,CAAAwH,aAAA,CAACnG,0BAA0B,QACtBqB,SAAS,iBAAI1C,KAAA,CAAAwH,aAAA,CAAC5G,IAAI;IAACwH,KAAK,EAAE1F;EAAU,CAAE,CAAC,EACvCqB,aAAa,IAAIA,aACM,CAC/B,EACL,CAACrB,SAAS,EAAEqB,aAAa,CAC7B,CAAC;;EAED;AACR;AACA;EACQ,MAAMwE,YAAY,GAAGrI,WAAW,CAC3B2H,KAAoC,IAAK;IACtC,MAAMW,aAAgC,GAAG,EAAE;IAC3C5C,qBAAqB,CAAC+B,OAAO,GAAG,KAAK;IAErCrB,UAAU,CAACL,OAAO,CAAC,CAAC;MAAEO,IAAI;MAAEN;IAAU,CAAC,KAAK;MACxC,MAAMS,OAAO,GAAGlF,oBAAoB,CAAC;QACjCC,YAAY;QACZC,kBAAkB;QAClBC,KAAK,EAAE4E,IAAI;QACX3E,YAAY,EAAEgG,KAAK,CAACY,MAAM,CAACrG,KAAK;QAChCN;MACJ,CAAC,CAAC;MAEF,IAAI6E,OAAO,CAAC/B,MAAM,GAAG,CAAC,EAAE;QACpB4D,aAAa,CAACrC,IAAI,CAAC;UACfD,SAAS;UACTM,IAAI,EAAEG;QACV,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;IAEF,IAAI6B,aAAa,CAAC5D,MAAM,KAAK,CAAC,IAAIxB,oBAAoB,EAAE;MACpDoF,aAAa,CAACrC,IAAI,CAAC;QACfD,SAAS,EAAEU,SAAS;QACpBJ,IAAI,EAAE;MACV,CAAC,CAAC;IACN;IAEAxC,gBAAgB,CAAC4C,SAAS,CAAC;IAE3B,IAAI,CAACtD,6BAA6B,IAAI,CAACuE,KAAK,CAACY,MAAM,CAACrG,KAAK,EAAE;MACvD0B,qBAAqB,CAAC,EAAE,CAAC;IAC7B,CAAC,MAAM;MACHA,qBAAqB,CAAC0E,aAAa,CAAC;IACxC;IAEA,IAAIA,aAAa,CAAC5D,MAAM,KAAK,CAAC,EAAE;MAC5BoC,UAAU,CAAC,CAAC;IAChB;IAEA5C,QAAQ,CAACyD,KAAK,CAACY,MAAM,CAACrG,KAAK,CAAC;IAC5B4C,mBAAmB,CAAC6C,KAAK,CAACY,MAAM,CAACrG,KAAK,CAAC;IAEvC,IAAI,OAAOU,QAAQ,KAAK,UAAU,EAAE;MAChCA,QAAQ,CAAC+E,KAAK,CAAC;IACnB;IAEA,IAAI,OAAOrF,UAAU,EAAEM,QAAQ,KAAK,UAAU,EAAE;MAC5CN,UAAU,CAACM,QAAQ,CAAC+E,KAAK,CAAC;IAC9B;EACJ,CAAC,EACD,CACIvB,UAAU,EACV5E,YAAY,EACZC,kBAAkB,EAClBqF,UAAU,EACVxE,UAAU,EACVM,QAAQ,EACRM,oBAAoB,EACpBE,6BAA6B,EAC7BxB,yBAAyB,CAEjC,CAAC;;EAED;AACR;AACA;EACQ,MAAM4G,UAAU,GAAGxI,WAAW,CACzB2H,KAAmC,IAAK;IACrCnC,WAAW,CAACiC,OAAO,GAAG,KAAK;IAE3B,IAAI,OAAO9E,MAAM,KAAK,UAAU,EAAE;MAC9BA,MAAM,CAACgF,KAAK,CAAC;IACjB;IAEA,IAAI,OAAOrF,UAAU,EAAEK,MAAM,KAAK,UAAU,EAAE;MAC1CL,UAAU,CAACK,MAAM,CAACgF,KAAK,CAAC;IAC5B;EACJ,CAAC,EACD,CAACrF,UAAU,EAAEK,MAAM,CACvB,CAAC;EAED,MAAM8F,0BAA0B,GAAGzI,WAAW,CAAC,MAAM;IACjDuF,WAAW,CAACkC,OAAO,EAAEiB,IAAI,CAAC,CAAC;IAE3B,OAAOlD,WAAW,CAACiC,OAAO,IAAI5B,OAAO;EACzC,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAEb,MAAM8C,mBAAmB,GAAG3I,WAAW,CAClC2H,KAAuC,IAAK;IACzC,MAAMiB,kBAAkB,GAAGjB,KAAK,CAACkB,aAA4B;IAC7D,MAAMC,gBAAgB,GAAGnB,KAAK,CAACoB,aAA4B;;IAE3D;IACA;IACA,IACI,CAACH,kBAAkB,IAClB,CAACE,gBAAgB,CAACE,QAAQ,CAACJ,kBAAkB,CAAC,IAC3C,CAACvD,UAAU,CAACoC,OAAO,EAAEuB,QAAQ,CAACJ,kBAAkB,CAAE,EACxD;MACE7B,WAAW,CAAC,CAAC;IACjB;EACJ,CAAC,EACD,CAACA,WAAW,CAChB,CAAC;;EAED;AACR;AACA;EACQ,MAAMkC,YAAY,GAAGjJ,WAAW,CAC3B6G,IAAoB,IAAK;IACtB,MAAMqC,OAAO,GAAG;MACZ,GAAGrC,IAAI;MACPV,IAAI,EAAEU,IAAI,CAACV,IAAI,CAACgD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,KAAK,EAAE,EAAE;IAC5E,CAAC;IAED,IAAI3F,gBAAgB,EAAE;MAClBU,QAAQ,CAAC,EAAE,CAAC;MACZY,mBAAmB,CAAC,EAAE,CAAC;MACvBS,WAAW,CAACkC,OAAO,EAAE2B,UAAU,CAAC,CAAC;IACrC,CAAC,MAAM;MACHlF,QAAQ,CAACgF,OAAO,CAAC/C,IAAI,CAAC;IAC1B;IAEAY,WAAW,CAAC,CAAC;IAEbjD,gBAAgB,CACZoF,OAAO,CAAC7B,QAAQ,gBACZvH,KAAA,CAAAwH,aAAA,CAACvG,wBAAwB;MACrBwG,GAAG,EAAE2B,OAAO,CAAC7B,QAAS;MACtBG,qBAAqB,EAAElE;IAAqB,CAC/C,CAAC,GACFoD,SACR,CAAC;IAED9C,qBAAqB,CAAC,EAAE,CAAC;IAEzB,IAAI,OAAOd,QAAQ,KAAK,UAAU,EAAE;MAChCA,QAAQ,CAACoG,OAAO,CAAC;IACrB;EACJ,CAAC,EACD,CAACnC,WAAW,EAAEjE,QAAQ,EAAEQ,oBAAoB,EAAEE,gBAAgB,CAClE,CAAC;EAED,MAAM6F,OAAO,GAAGlJ,OAAO,CAAC,MAAM;IAC1B,IAAI8C,QAAQ,IAAIU,kBAAkB,CAACe,MAAM,KAAK,CAAC,EAAE;MAC7C,oBACI5E,KAAA,CAAAwH,aAAA,CAACrG,uBAAuB,QACnBgC,QAAQ,CAACkG,OAAO,CAAC,WAAW,EAAEjH,KAAK,CACf,CAAC;IAElC;IAEA,MAAMR,KAAqB,GAAG,EAAE;IAEhCiC,kBAAkB,CAACoC,OAAO,CAAC,CAAC;MAAEC,SAAS;MAAEM;IAAK,CAAC,EAAEgD,KAAK,KAAK;MACvD,IAAI9E,iBAAiB,EAAE;QACnB,IAAI8B,IAAI,CAAC5B,MAAM,IAAI,CAAC,EAAE;UAClB;QACJ;QAEA,IAAI4E,KAAK,KAAK,CAAC,EAAE;UACb5H,KAAK,CAACuE,IAAI,cAACnG,KAAA,CAAAwH,aAAA,CAAC1G,SAAS;YAAC2I,GAAG,EAAEvD,SAAU;YAACwD,IAAI,EAAExD,SAAS,IAAI;UAAG,CAAE,CAAC,CAAC;QACpE;MACJ;MAEAM,IAAI,CAACP,OAAO,CAAC,CAAC;QAAEG,EAAE;QAAEC,IAAI;QAAEkB;MAAS,CAAC,EAAEoC,SAAS,KAAK;QAChD/H,KAAK,CAACuE,IAAI,cACNnG,KAAA,CAAAwH,aAAA,CAACxG,aAAa;UACVyI,GAAG,EAAE,GAAGrD,EAAE,IAAIF,SAAS,IAAI,EAAE,EAAG;UAChCE,EAAE,EAAEA,EAAG;UACPC,IAAI,EAAEA,IAAK;UACXkB,QAAQ,EAAEA,QAAS;UACnBhE,oBAAoB,EAAEA,oBAAqB;UAC3CC,oBAAoB,EAAEA,oBAAqB;UAC3CR,QAAQ,EAAEmG,YAAa;UACvBjD,SAAS,EAAEA,SAAU;UACrB0D,QAAQ,EAAEJ,KAAK,KAAK,CAAC,IAAIG,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,CACrD,CACL,CAAC;MACL,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAIvG,oBAAoB,IAAI2B,gBAAgB,KAAK,EAAE,EAAE;MACjDnD,KAAK,CAACuE,IAAI,cACNnG,KAAA,CAAAwH,aAAA,CAACxG,aAAa;QACVoF,EAAE,EAAC,aAAa;QAChBpD,QAAQ,EAAEmG,YAAa;QACvB5F,oBAAoB,EAAEA,oBAAqB;QAC3C8C,IAAI,EAAE,MAAMtB,gBAAgB,KAAM;QAClC6E,QAAQ,EAAEhI,KAAK,CAACgD,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;MAAE,CACzC,CACL,CAAC;IACL;IAEA,OAAOhD,KAAK;EAChB,CAAC,EAAE,CACCuB,QAAQ,EACRU,kBAAkB,EAClBT,oBAAoB,EACpB2B,gBAAgB,EAChB3C,KAAK,EACLsC,iBAAiB,EACjBnB,oBAAoB,EACpBC,oBAAoB,EACpB2F,YAAY,CACf,CAAC;EAEFhJ,SAAS,CAAC,MAAM;IACZ,MAAM4H,aAAa,GAAI8B,CAAgB,IAAK;MACxC,IAAI,CAAC1E,cAAc,IAAItB,kBAAkB,CAACe,MAAM,KAAK,CAAC,EAAE;QACpD;MACJ;MAEA,MAAMkF,QAAQ,GAAGvE,UAAU,CAACoC,OAAO,EAAEmC,QAAQ;MAE7C,IAAI,CAACA,QAAQ,EAAE;QACX;MACJ;MAEA,MAAMC,aAAa,GAAGC,KAAK,CAACC,IAAI,CAACH,QAAQ,CAAC;MAE1C,MAAMI,WAAW,GAAGH,aAAa,CAACzC,IAAI,CAAE6C,KAAK,IACzCA,KAAK,CAAC/D,EAAE,CAACgE,UAAU,CAAC,oBAAoB,CAC5C,CAAC,EAAEN,QAAQ;MAEX,IAAI,EAAEI,WAAW,IAAIA,WAAW,CAACtF,MAAM,GAAG,CAAC,CAAC,EAAE;QAC1C;MACJ;MAEA,MAAMyF,gBAAgB,GAAGL,KAAK,CAACC,IAAI,CAACC,WAAW,CAAC,CAAClI,MAAM,CAClDmI,KAAK,IAAMA,KAAK,CAAiBG,OAAO,CAACC,WAAW,KAAK,MAC9D,CAAC;MAEDzF,wBAAwB,CAACuF,gBAAgB,CAAC;MAE1C,IAAIR,CAAC,CAACJ,GAAG,KAAK,SAAS,IAAII,CAAC,CAACJ,GAAG,KAAK,WAAW,EAAE;QAC9CI,CAAC,CAACW,cAAc,CAAC,CAAC;QAElB,IAAIN,WAAW,IAAIA,WAAW,CAACtF,MAAM,GAAG,CAAC,EAAE;UACvC,MAAM6F,QAAQ,GACVjG,YAAY,KAAK,IAAI,GACf,CAACA,YAAY,IACRqF,CAAC,CAACJ,GAAG,KAAK,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAC9BY,gBAAgB,CAACzF,MAAM,IAC3ByF,gBAAgB,CAACzF,MAAM,GACvB,CAAC;UAEX,IAAIJ,YAAY,KAAK,IAAI,EAAE;YACvB,MAAMkG,WAAW,GAAGL,gBAAgB,CAAC7F,YAAY,CAAmB;YACpEkG,WAAW,CAACd,QAAQ,GAAG,CAAC,CAAC;UAC7B;UAEAnF,eAAe,CAACgG,QAAQ,CAAC;UAEzB,MAAME,UAAU,GAAGN,gBAAgB,CAACI,QAAQ,CAAmB;UAE/DE,UAAU,CAACf,QAAQ,GAAG,CAAC;QAC3B;MACJ,CAAC,MAAM,IAAIC,CAAC,CAACJ,GAAG,KAAK,OAAO,IAAII,CAAC,CAACJ,GAAG,KAAK,GAAG,EAAE;QAC3CI,CAAC,CAACW,cAAc,CAAC,CAAC;QAClBX,CAAC,CAACe,eAAe,CAAC,CAAC;QAEnB,IAAIP,gBAAgB,EAAE;UAClB,MAAMQ,OAAO,GAAGR,gBAAgB,CAAC7F,YAAY,IAAI,CAAC,CAAC;UAEnD,IAAI,CAACqG,OAAO,EAAE;YACV;UACJ;UAEA,MAAM;YAAEzE,EAAE;YAAE0E;UAAY,CAAC,GAAGD,OAAO;UAEnC,IAAItD,QAA4B;;UAEhC;UACA;UACA;UACA,IAAIsD,OAAO,CAACf,QAAQ,CAAC,CAAC,CAAC,EAAEiB,UAAU,CAACtD,GAAG,EAAE;YACrC;YACA;YACA;YACAF,QAAQ,GAAGsD,OAAO,CAACf,QAAQ,CAAC,CAAC,CAAC,EAAEiB,UAAU,CAACtD,GAAG,CAACuD,SAAmB;UACtE;UAEA,MAAMC,KAAK,GAAG7E,EAAE,CAACiD,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;UAEjDF,YAAY,CAAC;YACT/C,EAAE,EAAE6E,KAAK,KAAK,aAAa,GAAGH,WAAW,GAAGG,KAAK;YACjD5E,IAAI,EAAEyE,WAAW,IAAI,EAAE;YACvBvD;UACJ,CAAC,CAAC;QACN;MACJ;IACJ,CAAC;IAED2D,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEpD,aAAa,CAAC;IAEnD,OAAO,MAAM;MACTmD,QAAQ,CAACE,mBAAmB,CAAC,SAAS,EAAErD,aAAa,CAAC;IAC1D,CAAC;EACL,CAAC,EAAE,CACClD,qBAAqB,EACrBL,YAAY,EACZ2E,YAAY,EACZtF,kBAAkB,CAACe,MAAM,EACzBO,cAAc,CACjB,CAAC;EAEF,MAAMkG,cAAc,GAAGnL,WAAW,CAAE2H,KAAoB,IAAK;IACzD,IAAIA,KAAK,CAACyD,OAAO,KAAK,EAAE,EAAE;MACtBxH,qBAAqB,CAAC,EAAE,CAAC;IAC7B;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN1D,mBAAmB,CACfwD,GAAG,EACH,OAAO;IACH2H,KAAK,EAAEA,CAAA,KAAMnH,QAAQ,CAAC,EAAE;EAC5B,CAAC,CAAC,EACF,CAACA,QAAQ,CACb,CAAC;EAEDjE,SAAS,CAAC,MAAM;IACZ+K,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEE,cAAc,CAAC;IAEpD,OAAO,MAAM;MACTH,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEE,cAAc,CAAC;IACxD,CAAC;EACL,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;;EAEpB;AACR;AACA;EACQlL,SAAS,CAAC,MAAM;IACZ,IAAI+C,WAAW,EAAE;MACbkB,QAAQ,CAAClB,WAAW,CAAC;IACzB;EACJ,CAAC,EAAE,CAACA,WAAW,EAAEkB,QAAQ,CAAC,CAAC;EAE3B,MAAMoH,kBAAkB,GACpBrG,cAAc,KACbtB,kBAAkB,CAACe,MAAM,KAAK,CAAC,IAAI,CAAC,CAACzB,QAAQ,CAAC,KAC9Cf,KAAK,CAACqJ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAInI,6BAA6B,CAAC;EAE1D,OAAOjD,OAAO,CACV,mBACIL,KAAA,CAAAwH,aAAA,CAACtG,eAAe;IACZ0C,GAAG,EAAE0B,MAAO;IACZmE,GAAG,EAAE,cAAcpE,IAAI,EAAG;IAC1BxC,MAAM,EAAEgG;EAAoB,gBAE5B7I,KAAA,CAAAwH,aAAA;IAAKpB,EAAE,EAAE,mBAAmBf,IAAI;EAAG,GAC9B3B,gBAAgB,gBACb1D,KAAA,CAAAwH,aAAA,CAAChG,QAAQ;IACL8G,WAAW,EAAEA,WAAY;IACzBoD,KAAK,EAAEhI,gBAAgB,CAACgI,KAAM;IAC9B7I,MAAM,EAAE6F,UAAW;IACnB5F,QAAQ,EAAEyF,YAAa;IACvBT,OAAO,EAAEF,WAAY;IACrB+D,QAAQ,EAAEjI,gBAAgB,CAACiI,QAAS;IACpC1I,WAAW,EAAEA,WAAY;IACzBW,GAAG,EAAE6B,WAAY;IACjBmG,IAAI,EAAElI,gBAAgB,CAACkI,IAAK;IAC5BC,mBAAmB,EAAEnI,gBAAgB,CAACmI,mBAAoB;IAC1DlI,gCAAgC,EAAEA,gCAAiC;IACnEmI,kBAAkB;IAClBC,IAAI,EAAErI,gBAAgB,CAACqI;EAAK,CAC/B,CAAC,gBAEF/L,KAAA,CAAAwH,aAAA,CAAC3G;EACG,6DAAAmL,QAAA,KACIxJ,UAAU;IACdC,SAAS,EAAEA,SAAU;IACrB6F,WAAW,EAAEA,WAAY;IACzBzF,MAAM,EAAE6F,UAAW;IACnB5F,QAAQ,EAAEyF,YAAa;IACvBT,OAAO,EAAEF,WAAY;IACrB7E,SAAS,EAAEgF,aAAc;IACzB9E,WAAW,EAAEA,WAAY;IACzBW,GAAG,EAAE4B,QAAS;IACd0C,YAAY,EAAEA,YAAa;IAC3BvE,gCAAgC,EAC5BnB,UAAU,EAAEmB,gCAAgC,IAC5CA,gCACH;IACDvB,KAAK,EAAEA;EAAM,EAChB,CAEJ,CAAC,EACLkD,MAAM,CAACqC,OAAO,iBACX3H,KAAA,CAAAwH,aAAA,CAACjG,mBAAmB;IAChB0K,aAAa,EAAE3G,MAAM,CAACqC,OAAQ;IAC9BrF,SAAS,EAAEA,SAAU;IACrB4J,SAAS,EAAE3J,iBAAkB;IAC7B4J,OAAO,EAAElF,WAAY;IACrBmF,cAAc,EAAEzD,0BAA2B;IAC3C6C,kBAAkB,EAAEA;EAAmB,gBAEvCxL,KAAA,CAAAwH,aAAA,CAACzG,aAAa;IACViF,aAAa,EAAEA,aAAc;IAC7B1B,MAAM,EAAEA,MAAO;IACf1B,SAAS,EAAEA,SAAU;IACrByJ,UAAU,EAAEb,kBAAmB;IAC/B/B,GAAG,EAAE,mBAAmBpE,IAAI,EAAG;IAC/BiH,aAAa,EAAEpF,8BAA+B;IAC9CtD,GAAG,EAAE2B,UAAW;IAChBgH,cAAc,EAAEtH,MAAO;IACvB5B,uBAAuB,EAAEA;EAAwB,GAEhDkG,OACU,CACE,CAEZ,CACpB,EACD,CACIjH,SAAS,EACTiH,OAAO,EACPhH,iBAAiB,EACjByD,aAAa,EACbf,MAAM,EACNyD,UAAU,EACVH,YAAY,EACZtB,WAAW,EACX0B,0BAA0B,EAC1Bf,WAAW,EACXG,aAAa,EACbzD,MAAM,EACN9B,UAAU,EACVC,SAAS,EACT6F,WAAW,EACX1F,SAAS,EACTG,SAAS,EACTE,WAAW,EACXiF,YAAY,EACZ7E,uBAAuB,EACvBmI,kBAAkB,EAClB7H,gCAAgC,EAChCD,gBAAgB,EAChB2B,IAAI,EACJjD,KAAK,CAEb,CAAC;AACL,CACJ,CAAC;AAEDC,SAAS,CAACmK,WAAW,GAAG,WAAW;AAEnC,eAAenK,SAAS","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SearchBox.js","names":["useDevice","React","forwardRef","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","useTheme","calculateContentHeight","searchList","sortSearchBoxItems","Icon","Input","GroupName","SearchBoxBody","SearchBoxItem","StyledSearchBoxItemImage","StyledSearchBox","StyledSearchBoxHintText","StyledSearchBoxIcon","StyledSearchBoxLeftWrapper","useUuid","DropdownBodyWrapper","TagInput","filterSearchBoxItems","customFilter","customSortFunction","items","searchString","shouldUseCustomFilterOnly","filteredItems","filter","item","getDropdownSearchString","selectedId","shouldKeepSelectedItemPosition","value","SearchBox","container","dropdownDirection","inputProps","isInvalid","leftIcons","lists","maxHeight","onBlur","onChange","onKeyDown","onSelect","placeholder","presetValue","hintText","shouldAddInputToList","shouldHideFilterButtons","shouldShowContentOnEmptyInput","shouldShowSmallItems","shouldShowRoundImage","shouldShowToggleIcon","tagInputSettings","shouldEnableKeyboardHighlighting","ref","matchingListsItems","setMatchingListsItems","selectedImage","setSelectedImage","internalValue","setInternalValue","inputValue","setValue","nextValue","height","setHeight","focusedIndex","setFocusedIndex","hasMultipleGroups","setHasMultipleGroups","length","filteredChildrenArray","setFilteredChildrenArray","inputToListValue","setInputToListValue","groups","setGroups","shouldShowBody","setShouldShowBody","uuid","boxRef","contentRef","inputRef","tagInputRef","hasFocusRef","isAnimatingRef","shouldShowPresetValue","theme","dropdownSearchString","isTouch","filterButtons","forEach","groupName","push","id","text","activeList","newLists","list","includes","newMatchingItems","newList","undefined","filteredMatchingListItems","map","handleOpen","handleClose","handleFilterButtonsGroupSelect","keys","textArray","selectedItem","find","imageUrl","createElement","src","$shouldShowRoundImage","current","handleFocus","event","onFocus","handleKeyDown","toLowerCase","handleClick","rightElement","onClick","icons","color","leftElement","handleChange","filteredLists","target","handleBlur","handleDropdownOutsideClick","blur","handleContainerBlur","nextFocusedElement","relatedTarget","currentContainer","currentTarget","contains","handleSelect","newItem","replace","resetValue","content","index","key","name","listIndex","tabIndex","e","children","childrenArray","Array","from","newChildren","child","startsWith","filteredChildren","dataset","isgroupname","preventDefault","newIndex","prevElement","newElement","stopPropagation","element","textContent","attributes","nodeValue","newId","document","addEventListener","removeEventListener","handleKeyPress","keyCode","clear","shouldShowDropdown","trim","onAdd","onRemove","size","shouldAllowMultiple","shouldPreventEnter","tags","_extends","anchorElement","direction","onClose","onOutsideClick","shouldShow","onGroupSelect","selectedGroups","displayName"],"sources":["../../../../src/components/search-box/SearchBox.tsx"],"sourcesContent":["import { useDevice } from 'chayns-api';\nimport React, {\n ChangeEvent,\n ChangeEventHandler,\n FC,\n FocusEvent,\n FocusEventHandler,\n forwardRef,\n KeyboardEventHandler,\n ReactElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useTheme } from 'styled-components';\nimport type { IFilterButtonItem } from '../../types/filterButtons';\nimport type { ISearchBoxItem, ISearchBoxItems } from '../../types/searchBox';\nimport { calculateContentHeight } from '../../utils/calculate';\nimport { searchList, sortSearchBoxItems, type SearchBoxSortFunction } from '../../utils/searchBox';\nimport type { Theme } from '../color-scheme-provider/ColorSchemeProvider';\nimport Icon from '../icon/Icon';\nimport Input, { type InputProps } from '../input/Input';\nimport GroupName from './group-name/GroupName';\nimport SearchBoxBody from './search-box-body/SearchBoxBody';\nimport SearchBoxItem from './search-box-item/SearchBoxItem';\nimport { StyledSearchBoxItemImage } from './search-box-item/SearchBoxItem.styles';\nimport {\n StyledSearchBox,\n StyledSearchBoxHintText,\n StyledSearchBoxIcon,\n StyledSearchBoxLeftWrapper,\n} from './SearchBox.styles';\nimport { useUuid } from '../../hooks/uuid';\nimport DropdownBodyWrapper from '../dropdown-body-wrapper/DropdownBodyWrapper';\nimport TagInput, { TagInputProps, TagInputRef } from '../tag-input/TagInput';\nimport type { DropdownDirection } from '../../types/dropdown';\n\nexport interface SearchBoxRef {\n clear: VoidFunction;\n}\n\nexport interface TagInputSettings {\n onAdd?: TagInputProps['onAdd'];\n onRemove?: TagInputProps['onRemove'];\n size?: TagInputProps['size'];\n shouldAllowMultiple?: TagInputProps['shouldAllowMultiple'];\n tags?: TagInputProps['tags'];\n}\n\nexport const filterSearchBoxItems = ({\n customFilter,\n customSortFunction,\n items,\n searchString,\n shouldUseCustomFilterOnly,\n}: {\n customFilter?: (item: ISearchBoxItem, value: string) => boolean;\n customSortFunction?: SearchBoxSortFunction;\n items: ISearchBoxItem[];\n searchString: string;\n shouldUseCustomFilterOnly?: boolean;\n}) => {\n if (shouldUseCustomFilterOnly) {\n const filteredItems =\n typeof customFilter === 'function'\n ? items.filter((item) => customFilter(item, searchString))\n : items;\n\n return sortSearchBoxItems({ customSortFunction, items: filteredItems, searchString });\n }\n\n if (typeof customFilter !== 'function') {\n return searchList({ customSortFunction, items, searchString });\n }\n\n return searchList({ customSortFunction, items, searchString }).filter((item) =>\n customFilter(item, searchString),\n );\n};\n\nconst getDropdownSearchString = ({\n selectedId,\n shouldKeepSelectedItemPosition,\n value,\n}: {\n selectedId?: string;\n shouldKeepSelectedItemPosition?: boolean;\n value: string;\n}) => (shouldKeepSelectedItemPosition && selectedId ? '' : value);\n\nexport type SearchBoxProps = {\n /**\n * The element where the content of the `ComboBox` should be rendered via React Portal.\n */\n container?: Element;\n /**\n * An optional callback function to filter the elements to be displayed\n * @param item The item to filter.\n * @param value The current input value.\n */\n customFilter?: (item: ISearchBoxItem, value: string) => boolean;\n /**\n * An optional callback function to sort the filtered elements to be displayed\n */\n customSortFunction?: SearchBoxSortFunction;\n /**\n * If true, the custom filter replaces the built-in text search instead of narrowing its results.\n */\n shouldUseCustomFilterOnly?: boolean;\n /**\n * The direction in which the dropdown should be displayed. By default, it is displayed below the input.\n */\n dropdownDirection?: DropdownDirection;\n /**\n * If true, the input field is marked as invalid\n */\n isInvalid?: boolean;\n /**\n * An optional icon that is displayed inside the left side of the input.\n */\n leftIcons?: string[];\n /**\n * Props that are passed to the underlying Input component.\n */\n inputProps?: InputProps;\n /**\n * List of groups with items that can be searched. It is possible to give only one list; if multiple lists are provided, the 'group name' parameter becomes mandatory.\n */\n lists: ISearchBoxItems[];\n /**\n * The maximum height of the dropdown body in pixels.\n */\n maxHeight?: number;\n /**\n * Function to be executed when the input lost focus.\n */\n onBlur?: FocusEventHandler<HTMLInputElement>;\n /**\n * Function to be executed when the input is changed.\n */\n onChange?: ChangeEventHandler<HTMLInputElement>;\n /**\n * Function that is executed when a letter is pressed\n */\n onKeyDown?: KeyboardEventHandler<HTMLInputElement>;\n /**\n * Function to be executed when an item is selected.\n */\n onSelect?: (item: ISearchBoxItem) => void;\n /**\n * The placeholder that should be displayed.\n */\n placeholder?: string;\n /**\n * Set an input for the search box - it is not an item of a list, just a string.\n */\n presetValue?: string;\n /**\n * Control the selected item. If you use this prop, make sure to update it when the user selects an item.\n */\n selectedId?: string;\n /**\n * If true, the selected item keeps its original position in the dropdown list.\n */\n shouldKeepSelectedItemPosition?: boolean;\n /**\n * If true, the value in the Input is displayed in the list.\n */\n shouldAddInputToList: boolean;\n /**\n * If true, the filter buttons are hidden.\n */\n shouldHideFilterButtons?: boolean;\n /**\n * Whether the full list of items should be displayed if the input is empty.\n */\n shouldShowContentOnEmptyInput?: boolean;\n /**\n * If true, the dropdown items are displayed more compactly.\n */\n shouldShowSmallItems?: boolean;\n /**\n * If true, the images of the items are displayed in a round shape.\n */\n shouldShowRoundImage?: boolean;\n /**\n * Whether the icon to open and close the list should be displayed.\n */\n shouldShowToggleIcon?: boolean;\n /**\n * Settings for the TagInput.\n */\n tagInputSettings?: TagInputSettings;\n /**\n * Enables keyboard-only focus highlighting.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n /**\n * A text that should be displayed if no results are found.\n */\n hintText?: string;\n};\n\nconst SearchBox: FC<SearchBoxProps> = forwardRef<SearchBoxRef, SearchBoxProps>(\n (\n {\n container,\n customFilter,\n customSortFunction,\n dropdownDirection,\n inputProps,\n isInvalid = false,\n leftIcons,\n lists,\n maxHeight = 300,\n onBlur,\n onChange,\n onKeyDown,\n onSelect,\n placeholder,\n presetValue,\n hintText,\n selectedId,\n shouldAddInputToList = true,\n shouldKeepSelectedItemPosition = false,\n shouldUseCustomFilterOnly = false,\n shouldHideFilterButtons = false,\n shouldShowContentOnEmptyInput = true,\n shouldShowSmallItems = false,\n shouldShowRoundImage,\n shouldShowToggleIcon = false,\n tagInputSettings,\n shouldEnableKeyboardHighlighting,\n },\n ref,\n ) => {\n const [matchingListsItems, setMatchingListsItems] = useState<ISearchBoxItems[]>(lists);\n const [selectedImage, setSelectedImage] = useState<ReactElement>();\n const [internalValue, setInternalValue] = useState(\n typeof presetValue === 'string' && presetValue !== '' ? presetValue : '',\n );\n const inputValue = inputProps?.value;\n const value = inputValue ?? internalValue;\n const setValue = useCallback(\n (nextValue: string) => {\n if (typeof inputValue !== 'string') {\n setInternalValue(nextValue);\n }\n },\n [inputValue],\n );\n const [height, setHeight] = useState<number>(0);\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n const [hasMultipleGroups, setHasMultipleGroups] = useState<boolean>(lists.length > 1);\n const [filteredChildrenArray, setFilteredChildrenArray] = useState<Element[]>();\n const [inputToListValue, setInputToListValue] = useState<string>('');\n const [groups, setGroups] = useState<string[]>(['all']);\n const [shouldShowBody, setShouldShowBody] = useState(false);\n\n const uuid = useUuid();\n\n const boxRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const tagInputRef = useRef<TagInputRef>(null);\n\n const hasFocusRef = useRef<boolean>(false);\n const isAnimatingRef = useRef<boolean>(false);\n const shouldShowPresetValue = useRef<boolean>(\n typeof presetValue === 'string' && presetValue !== '',\n );\n\n const theme = useTheme() as Theme;\n const dropdownSearchString = getDropdownSearchString({\n selectedId,\n shouldKeepSelectedItemPosition,\n value,\n });\n\n const { isTouch } = useDevice();\n\n /**\n * Checks if there are multiple groups in the lists\n */\n useEffect(() => {\n setHasMultipleGroups(lists.length > 1);\n }, [lists]);\n\n const filterButtons = useMemo(() => {\n const items: IFilterButtonItem[] = [];\n\n if (lists.length <= 1) {\n return items;\n }\n\n lists.forEach(({ groupName }) => {\n if (groupName) {\n items.push({\n id: groupName,\n text: groupName,\n });\n }\n });\n\n return items;\n }, [lists]);\n\n /**\n * Filters the lists by the FilterButtons\n */\n const activeList = useMemo(() => {\n let newLists: ISearchBoxItems[] = [];\n\n if (groups[0] === 'all') {\n newLists = lists;\n } else {\n lists.forEach((list) => {\n if (list.groupName && groups.includes(list.groupName)) {\n newLists.push(list);\n }\n });\n }\n\n const newMatchingItems: ISearchBoxItems[] = [];\n\n newLists.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n const filteredMatchingListItems = newMatchingItems.map(({ list, groupName }) => ({\n groupName,\n list: list.filter((item) => {\n if (typeof customFilter === 'function' && shouldUseCustomFilterOnly) {\n return true;\n }\n\n return !(newMatchingItems.length === 1 && item.text === dropdownSearchString);\n }),\n }));\n\n setMatchingListsItems(filteredMatchingListItems);\n\n return newLists;\n }, [\n groups,\n lists,\n customFilter,\n customSortFunction,\n dropdownSearchString,\n shouldAddInputToList,\n shouldUseCustomFilterOnly,\n ]);\n\n const handleOpen = useCallback(() => {\n setShouldShowBody(true);\n }, []);\n\n const handleClose = useCallback(() => {\n setShouldShowBody(false);\n }, []);\n\n const handleFilterButtonsGroupSelect = (keys: string[]) => {\n setGroups(keys.length === 0 ? ['all'] : keys);\n };\n\n /**\n * This hook calculates the height\n */\n useEffect(() => {\n const textArray: string[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n list.forEach(({ text }) => textArray.push(text));\n if (!groupName) {\n return;\n }\n textArray.push(groupName);\n });\n\n if (shouldAddInputToList && inputToListValue !== '') {\n textArray.push(inputToListValue);\n }\n\n setHeight(calculateContentHeight(textArray));\n }, [inputToListValue, activeList, placeholder, shouldAddInputToList]);\n\n useEffect(() => {\n if (selectedId) {\n activeList.forEach(({ list }) => {\n const selectedItem = list.find(({ id }) => id === selectedId);\n if (selectedItem) {\n setValue(selectedItem.text);\n\n if (selectedItem.imageUrl) {\n setSelectedImage(\n <StyledSearchBoxItemImage\n src={selectedItem.imageUrl}\n $shouldShowRoundImage={shouldShowRoundImage}\n />,\n );\n }\n }\n });\n }\n }, [activeList, selectedId, shouldShowRoundImage]);\n\n /**\n * This hook resets the value if the selectedId changes to undefined. This is an own useEffect because the value\n * should not be reset if the list changes and the selectedId is still undefined.\n */\n useEffect(() => {\n if (!selectedId && !shouldShowPresetValue.current) {\n setValue('');\n }\n }, [selectedId]);\n\n useEffect(() => {\n isAnimatingRef.current = shouldShowBody;\n }, [shouldShowBody]);\n\n useEffect(() => {\n if (\n (matchingListsItems.length !== 0 || hintText) &&\n !isAnimatingRef.current &&\n hasFocusRef.current\n ) {\n handleOpen();\n }\n }, [handleOpen, hintText, matchingListsItems.length]);\n\n /**\n * This function handles the focus event of the input and opens the dropdown if the input\n * should show content on an empty input\n */\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n hasFocusRef.current = true;\n\n if (typeof inputProps?.onFocus === 'function') {\n inputProps.onFocus(event);\n }\n\n if (shouldShowContentOnEmptyInput) {\n const newMatchingItems: ISearchBoxItems[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n const filteredMatchingListItems = newMatchingItems.map(\n ({ list, groupName }) => ({\n groupName,\n list: list.filter((item) => {\n if (\n typeof customFilter === 'function' &&\n shouldUseCustomFilterOnly\n ) {\n return true;\n }\n\n return !(\n newMatchingItems.length === 1 &&\n item.text === dropdownSearchString\n );\n }),\n }),\n );\n\n setMatchingListsItems(filteredMatchingListItems);\n\n if (filteredMatchingListItems.length !== 0 || hintText) {\n handleOpen();\n }\n }\n },\n [\n shouldShowContentOnEmptyInput,\n activeList,\n shouldAddInputToList,\n hintText,\n dropdownSearchString,\n customFilter,\n customSortFunction,\n shouldUseCustomFilterOnly,\n handleOpen,\n inputProps,\n ],\n );\n\n const handleKeyDown = useCallback<KeyboardEventHandler<HTMLInputElement>>(\n (event) => {\n if (typeof onKeyDown === 'function') {\n onKeyDown(event);\n }\n\n if (typeof inputProps?.onKeyDown === 'function') {\n inputProps.onKeyDown(event);\n }\n },\n [inputProps, onKeyDown],\n );\n\n /**\n * This function filters the lists by input\n */\n\n useEffect(() => {\n const newMatchingItems: ISearchBoxItems[] = [];\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: dropdownSearchString,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n newMatchingItems.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (newMatchingItems.length === 0 && shouldAddInputToList) {\n newMatchingItems.push({\n groupName: undefined,\n list: [],\n });\n }\n\n if (shouldAddInputToList && inputToListValue !== '') {\n newMatchingItems.forEach(({ list }) => {\n list.forEach(({ text }) => {\n if (text.toLowerCase() === inputToListValue.toLowerCase()) {\n setInputToListValue('');\n }\n });\n });\n }\n }, [\n inputToListValue,\n activeList,\n shouldAddInputToList,\n shouldShowContentOnEmptyInput,\n dropdownSearchString,\n customFilter,\n customSortFunction,\n shouldUseCustomFilterOnly,\n ]);\n\n const handleClick = useCallback(() => {\n if (shouldShowBody) {\n handleClose();\n } else {\n handleOpen();\n }\n }, [handleClose, handleOpen, shouldShowBody]);\n\n const rightElement = useMemo(() => {\n if (!shouldShowToggleIcon) {\n return undefined;\n }\n\n return (\n <StyledSearchBoxIcon onClick={handleClick}>\n <Icon icons={['fa fa-chevron-down']} color={theme['006'] as string} />\n </StyledSearchBoxIcon>\n );\n }, [handleClick, shouldShowToggleIcon, theme]);\n\n const leftElement = useMemo(\n () =>\n (leftIcons || selectedImage) && (\n <StyledSearchBoxLeftWrapper>\n {leftIcons && <Icon icons={leftIcons} />}\n {selectedImage && selectedImage}\n </StyledSearchBoxLeftWrapper>\n ),\n [leftIcons, selectedImage],\n );\n\n /**\n * This function handles changes of the input\n */\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const filteredLists: ISearchBoxItems[] = [];\n shouldShowPresetValue.current = false;\n\n activeList.forEach(({ list, groupName }) => {\n const newList = filterSearchBoxItems({\n customFilter,\n customSortFunction,\n items: list,\n searchString: event.target.value,\n shouldUseCustomFilterOnly,\n });\n\n if (newList.length > 0) {\n filteredLists.push({\n groupName,\n list: newList,\n });\n }\n });\n\n if (filteredLists.length === 0 && shouldAddInputToList) {\n filteredLists.push({\n groupName: undefined,\n list: [],\n });\n }\n\n setSelectedImage(undefined);\n\n if (!shouldShowContentOnEmptyInput && !event.target.value) {\n setMatchingListsItems([]);\n } else {\n setMatchingListsItems(filteredLists);\n }\n\n if (filteredLists.length !== 0) {\n handleOpen();\n }\n\n setValue(event.target.value);\n setInputToListValue(event.target.value);\n\n if (typeof onChange === 'function') {\n onChange(event);\n }\n\n if (typeof inputProps?.onChange === 'function') {\n inputProps.onChange(event);\n }\n },\n [\n activeList,\n customFilter,\n customSortFunction,\n handleOpen,\n inputProps,\n onChange,\n shouldAddInputToList,\n shouldShowContentOnEmptyInput,\n shouldUseCustomFilterOnly,\n ],\n );\n\n /**\n * This function handles the blur event of the input\n */\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n hasFocusRef.current = false;\n\n if (typeof onBlur === 'function') {\n onBlur(event);\n }\n\n if (typeof inputProps?.onBlur === 'function') {\n inputProps.onBlur(event);\n }\n },\n [inputProps, onBlur],\n );\n\n const handleDropdownOutsideClick = useCallback(() => {\n tagInputRef.current?.blur();\n\n return hasFocusRef.current && isTouch;\n }, [isTouch]);\n\n const handleContainerBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n const nextFocusedElement = event.relatedTarget as Node | null;\n const currentContainer = event.currentTarget as HTMLElement;\n\n // Check if focus is moving outside the SearchBox container\n // Also check the dropdown content (contentRef) since it's rendered in a portal\n if (\n !nextFocusedElement ||\n (!currentContainer.contains(nextFocusedElement) &&\n !contentRef.current?.contains(nextFocusedElement))\n ) {\n handleClose();\n }\n },\n [handleClose],\n );\n\n /**\n * This function handles the item selection\n */\n const handleSelect = useCallback(\n (item: ISearchBoxItem) => {\n const newItem = {\n ...item,\n text: item.text.replace('<b>', '').replace('</b>', '').replace('</b', ''),\n };\n\n if (tagInputSettings) {\n setValue('');\n setInputToListValue('');\n tagInputRef.current?.resetValue();\n } else {\n setValue(newItem.text);\n }\n\n handleClose();\n\n setSelectedImage(\n newItem.imageUrl ? (\n <StyledSearchBoxItemImage\n src={newItem.imageUrl}\n $shouldShowRoundImage={shouldShowRoundImage}\n />\n ) : undefined,\n );\n\n setMatchingListsItems([]);\n\n if (typeof onSelect === 'function') {\n onSelect(newItem);\n }\n },\n [handleClose, onSelect, shouldShowRoundImage, tagInputSettings],\n );\n\n const content = useMemo(() => {\n if (hintText && matchingListsItems.length === 0) {\n return (\n <StyledSearchBoxHintText>\n {hintText.replace('##value##', value)}\n </StyledSearchBoxHintText>\n );\n }\n\n const items: ReactElement[] = [];\n\n matchingListsItems.forEach(({ groupName, list }, index) => {\n if (hasMultipleGroups) {\n if (list.length <= 0) {\n return;\n }\n\n if (index !== 0) {\n items.push(<GroupName key={groupName} name={groupName ?? ''} />);\n }\n }\n\n list.forEach(({ id, text, imageUrl }, listIndex) => {\n items.push(\n <SearchBoxItem\n key={`${id}_${groupName ?? ''}`}\n id={id}\n text={text}\n imageUrl={imageUrl}\n shouldShowSmallItems={shouldShowSmallItems}\n shouldShowRoundImage={shouldShowRoundImage}\n onSelect={handleSelect}\n groupName={groupName}\n tabIndex={index === 0 && listIndex === 0 ? 0 : -1}\n />,\n );\n });\n });\n\n if (shouldAddInputToList && inputToListValue !== '') {\n items.push(\n <SearchBoxItem\n id=\"input-value\"\n onSelect={handleSelect}\n shouldShowSmallItems={shouldShowSmallItems}\n text={`<b>${inputToListValue}</b`}\n tabIndex={items.length === 0 ? 0 : -1}\n />,\n );\n }\n\n return items;\n }, [\n hintText,\n matchingListsItems,\n shouldAddInputToList,\n inputToListValue,\n value,\n hasMultipleGroups,\n shouldShowSmallItems,\n shouldShowRoundImage,\n handleSelect,\n ]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!shouldShowBody || matchingListsItems.length === 0) {\n return;\n }\n\n const children = contentRef.current?.children;\n\n if (!children) {\n return;\n }\n\n const childrenArray = Array.from(children);\n\n const newChildren = childrenArray.find((child) =>\n child.id.startsWith('searchBoxContent__'),\n )?.children;\n\n if (!(newChildren && newChildren.length > 0)) {\n return;\n }\n\n const filteredChildren = Array.from(newChildren).filter(\n (child) => (child as HTMLElement).dataset.isgroupname !== 'true',\n );\n\n setFilteredChildrenArray(filteredChildren);\n\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n\n if (newChildren && newChildren.length > 0) {\n const newIndex =\n focusedIndex !== null\n ? (focusedIndex +\n (e.key === 'ArrowUp' ? -1 : 1) +\n filteredChildren.length) %\n filteredChildren.length\n : 0;\n\n if (focusedIndex !== null) {\n const prevElement = filteredChildren[focusedIndex] as HTMLDivElement;\n prevElement.tabIndex = -1;\n }\n\n setFocusedIndex(newIndex);\n\n const newElement = filteredChildren[newIndex] as HTMLDivElement;\n\n newElement.tabIndex = 0;\n }\n } else if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n e.stopPropagation();\n\n if (filteredChildren) {\n const element = filteredChildren[focusedIndex ?? 0];\n\n if (!element) {\n return;\n }\n\n const { id, textContent } = element;\n\n let imageUrl: string | undefined;\n\n // Just Ignore, it works\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n if (element.children[0]?.attributes.src) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n imageUrl = element.children[0]?.attributes.src.nodeValue as string;\n }\n\n const newId = id.replace('search-box-item__', '');\n\n handleSelect({\n id: newId === 'input-value' ? textContent : newId,\n text: textContent ?? '',\n imageUrl,\n });\n }\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [\n filteredChildrenArray,\n focusedIndex,\n handleSelect,\n matchingListsItems.length,\n shouldShowBody,\n ]);\n\n const handleKeyPress = useCallback((event: KeyboardEvent) => {\n if (event.keyCode === 27) {\n setMatchingListsItems([]);\n }\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n clear: () => setValue(''),\n }),\n [setValue],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyPress);\n\n return () => {\n document.addEventListener('keydown', handleKeyPress);\n };\n }, [handleKeyPress]);\n\n /**\n * Update the value if preset value changes\n */\n useEffect(() => {\n if (presetValue) {\n setValue(presetValue);\n }\n }, [presetValue, setValue]);\n\n const shouldShowDropdown =\n shouldShowBody &&\n (matchingListsItems.length !== 0 || !!hintText) &&\n (value.trim() !== '' || shouldShowContentOnEmptyInput);\n\n return useMemo(\n () => (\n <StyledSearchBox\n ref={boxRef}\n key={`search-box-${uuid}`}\n onBlur={handleContainerBlur}\n >\n <div id={`search_box_input${uuid}`}>\n {tagInputSettings ? (\n <TagInput\n leftElement={leftElement}\n onAdd={tagInputSettings.onAdd}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={handleFocus}\n onRemove={tagInputSettings.onRemove}\n placeholder={placeholder}\n ref={tagInputRef}\n size={tagInputSettings.size}\n shouldAllowMultiple={tagInputSettings.shouldAllowMultiple}\n shouldEnableKeyboardHighlighting={shouldEnableKeyboardHighlighting}\n shouldPreventEnter\n tags={tagInputSettings.tags}\n />\n ) : (\n <Input\n /* eslint-disable-next-line react/jsx-props-no-spreading */\n {...inputProps}\n isInvalid={isInvalid}\n leftElement={leftElement}\n onBlur={handleBlur}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={inputRef}\n rightElement={rightElement}\n shouldEnableKeyboardHighlighting={\n inputProps?.shouldEnableKeyboardHighlighting ??\n shouldEnableKeyboardHighlighting\n }\n value={value}\n />\n )}\n </div>\n {boxRef.current && (\n <DropdownBodyWrapper\n anchorElement={boxRef.current}\n container={container}\n direction={dropdownDirection}\n onClose={handleClose}\n onOutsideClick={handleDropdownOutsideClick}\n shouldShowDropdown={shouldShowDropdown}\n >\n <SearchBoxBody\n filterButtons={filterButtons}\n height={height}\n maxHeight={maxHeight}\n shouldShow={shouldShowDropdown}\n key={`search-box-body-${uuid}`}\n onGroupSelect={handleFilterButtonsGroupSelect}\n ref={contentRef}\n selectedGroups={groups}\n shouldHideFilterButtons={shouldHideFilterButtons}\n >\n {content}\n </SearchBoxBody>\n </DropdownBodyWrapper>\n )}\n </StyledSearchBox>\n ),\n [\n container,\n content,\n dropdownDirection,\n filterButtons,\n groups,\n handleBlur,\n handleChange,\n handleClose,\n handleDropdownOutsideClick,\n handleFocus,\n handleKeyDown,\n height,\n inputProps,\n isInvalid,\n leftElement,\n maxHeight,\n onKeyDown,\n placeholder,\n rightElement,\n shouldHideFilterButtons,\n shouldShowDropdown,\n shouldEnableKeyboardHighlighting,\n tagInputSettings,\n uuid,\n value,\n ],\n );\n },\n);\n\nSearchBox.displayName = 'SearchBox';\n\nexport default SearchBox;\n"],"mappings":";AAAA,SAASA,SAAS,QAAQ,YAAY;AACtC,OAAOC,KAAK,IAMRC,UAAU,EAGVC,WAAW,EACXC,SAAS,EACTC,mBAAmB,EACnBC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACL,OAAO;AACd,SAASC,QAAQ,QAAQ,mBAAmB;AAG5C,SAASC,sBAAsB,QAAQ,uBAAuB;AAC9D,SAASC,UAAU,EAAEC,kBAAkB,QAAoC,uBAAuB;AAElG,OAAOC,IAAI,MAAM,cAAc;AAC/B,OAAOC,KAAK,MAA2B,gBAAgB;AACvD,OAAOC,SAAS,MAAM,wBAAwB;AAC9C,OAAOC,aAAa,MAAM,iCAAiC;AAC3D,OAAOC,aAAa,MAAM,iCAAiC;AAC3D,SAASC,wBAAwB,QAAQ,wCAAwC;AACjF,SACIC,eAAe,EACfC,uBAAuB,EACvBC,mBAAmB,EACnBC,0BAA0B,QACvB,oBAAoB;AAC3B,SAASC,OAAO,QAAQ,kBAAkB;AAC1C,OAAOC,mBAAmB,MAAM,8CAA8C;AAC9E,OAAOC,QAAQ,MAAsC,uBAAuB;AAe5E,OAAO,MAAMC,oBAAoB,GAAGA,CAAC;EACjCC,YAAY;EACZC,kBAAkB;EAClBC,KAAK;EACLC,YAAY;EACZC;AAOJ,CAAC,KAAK;EACF,IAAIA,yBAAyB,EAAE;IAC3B,MAAMC,aAAa,GACf,OAAOL,YAAY,KAAK,UAAU,GAC5BE,KAAK,CAACI,MAAM,CAAEC,IAAI,IAAKP,YAAY,CAACO,IAAI,EAAEJ,YAAY,CAAC,CAAC,GACxDD,KAAK;IAEf,OAAOjB,kBAAkB,CAAC;MAAEgB,kBAAkB;MAAEC,KAAK,EAAEG,aAAa;MAAEF;IAAa,CAAC,CAAC;EACzF;EAEA,IAAI,OAAOH,YAAY,KAAK,UAAU,EAAE;IACpC,OAAOhB,UAAU,CAAC;MAAEiB,kBAAkB;MAAEC,KAAK;MAAEC;IAAa,CAAC,CAAC;EAClE;EAEA,OAAOnB,UAAU,CAAC;IAAEiB,kBAAkB;IAAEC,KAAK;IAAEC;EAAa,CAAC,CAAC,CAACG,MAAM,CAAEC,IAAI,IACvEP,YAAY,CAACO,IAAI,EAAEJ,YAAY,CACnC,CAAC;AACL,CAAC;AAED,MAAMK,uBAAuB,GAAGA,CAAC;EAC7BC,UAAU;EACVC,8BAA8B;EAC9BC;AAKJ,CAAC,KAAMD,8BAA8B,IAAID,UAAU,GAAG,EAAE,GAAGE,KAAM;AAmHjE,MAAMC,SAA6B,gBAAGrC,UAAU,CAC5C,CACI;EACIsC,SAAS;EACTb,YAAY;EACZC,kBAAkB;EAClBa,iBAAiB;EACjBC,UAAU;EACVC,SAAS,GAAG,KAAK;EACjBC,SAAS;EACTC,KAAK;EACLC,SAAS,GAAG,GAAG;EACfC,MAAM;EACNC,QAAQ;EACRC,SAAS;EACTC,QAAQ;EACRC,WAAW;EACXC,WAAW;EACXC,QAAQ;EACRjB,UAAU;EACVkB,oBAAoB,GAAG,IAAI;EAC3BjB,8BAA8B,GAAG,KAAK;EACtCN,yBAAyB,GAAG,KAAK;EACjCwB,uBAAuB,GAAG,KAAK;EAC/BC,6BAA6B,GAAG,IAAI;EACpCC,oBAAoB,GAAG,KAAK;EAC5BC,oBAAoB;EACpBC,oBAAoB,GAAG,KAAK;EAC5BC,gBAAgB;EAChBC;AACJ,CAAC,EACDC,GAAG,KACF;EACD,MAAM,CAACC,kBAAkB,EAAEC,qBAAqB,CAAC,GAAGxD,QAAQ,CAAoBqC,KAAK,CAAC;EACtF,MAAM,CAACoB,aAAa,EAAEC,gBAAgB,CAAC,GAAG1D,QAAQ,CAAe,CAAC;EAClE,MAAM,CAAC2D,aAAa,EAAEC,gBAAgB,CAAC,GAAG5D,QAAQ,CAC9C,OAAO4C,WAAW,KAAK,QAAQ,IAAIA,WAAW,KAAK,EAAE,GAAGA,WAAW,GAAG,EAC1E,CAAC;EACD,MAAMiB,UAAU,GAAG3B,UAAU,EAAEJ,KAAK;EACpC,MAAMA,KAAK,GAAG+B,UAAU,IAAIF,aAAa;EACzC,MAAMG,QAAQ,GAAGnE,WAAW,CACvBoE,SAAiB,IAAK;IACnB,IAAI,OAAOF,UAAU,KAAK,QAAQ,EAAE;MAChCD,gBAAgB,CAACG,SAAS,CAAC;IAC/B;EACJ,CAAC,EACD,CAACF,UAAU,CACf,CAAC;EACD,MAAM,CAACG,MAAM,EAAEC,SAAS,CAAC,GAAGjE,QAAQ,CAAS,CAAC,CAAC;EAC/C,MAAM,CAACkE,YAAY,EAAEC,eAAe,CAAC,GAAGnE,QAAQ,CAAgB,IAAI,CAAC;EACrE,MAAM,CAACoE,iBAAiB,EAAEC,oBAAoB,CAAC,GAAGrE,QAAQ,CAAUqC,KAAK,CAACiC,MAAM,GAAG,CAAC,CAAC;EACrF,MAAM,CAACC,qBAAqB,EAAEC,wBAAwB,CAAC,GAAGxE,QAAQ,CAAY,CAAC;EAC/E,MAAM,CAACyE,gBAAgB,EAAEC,mBAAmB,CAAC,GAAG1E,QAAQ,CAAS,EAAE,CAAC;EACpE,MAAM,CAAC2E,MAAM,EAAEC,SAAS,CAAC,GAAG5E,QAAQ,CAAW,CAAC,KAAK,CAAC,CAAC;EACvD,MAAM,CAAC6E,cAAc,EAAEC,iBAAiB,CAAC,GAAG9E,QAAQ,CAAC,KAAK,CAAC;EAE3D,MAAM+E,IAAI,GAAGhE,OAAO,CAAC,CAAC;EAEtB,MAAMiE,MAAM,GAAGjF,MAAM,CAAiB,IAAI,CAAC;EAC3C,MAAMkF,UAAU,GAAGlF,MAAM,CAAiB,IAAI,CAAC;EAC/C,MAAMmF,QAAQ,GAAGnF,MAAM,CAA0B,IAAI,CAAC;EACtD,MAAMoF,WAAW,GAAGpF,MAAM,CAAc,IAAI,CAAC;EAE7C,MAAMqF,WAAW,GAAGrF,MAAM,CAAU,KAAK,CAAC;EAC1C,MAAMsF,cAAc,GAAGtF,MAAM,CAAU,KAAK,CAAC;EAC7C,MAAMuF,qBAAqB,GAAGvF,MAAM,CAChC,OAAO6C,WAAW,KAAK,QAAQ,IAAIA,WAAW,KAAK,EACvD,CAAC;EAED,MAAM2C,KAAK,GAAGtF,QAAQ,CAAC,CAAU;EACjC,MAAMuF,oBAAoB,GAAG7D,uBAAuB,CAAC;IACjDC,UAAU;IACVC,8BAA8B;IAC9BC;EACJ,CAAC,CAAC;EAEF,MAAM;IAAE2D;EAAQ,CAAC,GAAGjG,SAAS,CAAC,CAAC;;EAE/B;AACR;AACA;EACQI,SAAS,CAAC,MAAM;IACZyE,oBAAoB,CAAChC,KAAK,CAACiC,MAAM,GAAG,CAAC,CAAC;EAC1C,CAAC,EAAE,CAACjC,KAAK,CAAC,CAAC;EAEX,MAAMqD,aAAa,GAAG5F,OAAO,CAAC,MAAM;IAChC,MAAMuB,KAA0B,GAAG,EAAE;IAErC,IAAIgB,KAAK,CAACiC,MAAM,IAAI,CAAC,EAAE;MACnB,OAAOjD,KAAK;IAChB;IAEAgB,KAAK,CAACsD,OAAO,CAAC,CAAC;MAAEC;IAAU,CAAC,KAAK;MAC7B,IAAIA,SAAS,EAAE;QACXvE,KAAK,CAACwE,IAAI,CAAC;UACPC,EAAE,EAAEF,SAAS;UACbG,IAAI,EAAEH;QACV,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;IAEF,OAAOvE,KAAK;EAChB,CAAC,EAAE,CAACgB,KAAK,CAAC,CAAC;;EAEX;AACR;AACA;EACQ,MAAM2D,UAAU,GAAGlG,OAAO,CAAC,MAAM;IAC7B,IAAImG,QAA2B,GAAG,EAAE;IAEpC,IAAItB,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;MACrBsB,QAAQ,GAAG5D,KAAK;IACpB,CAAC,MAAM;MACHA,KAAK,CAACsD,OAAO,CAAEO,IAAI,IAAK;QACpB,IAAIA,IAAI,CAACN,SAAS,IAAIjB,MAAM,CAACwB,QAAQ,CAACD,IAAI,CAACN,SAAS,CAAC,EAAE;UACnDK,QAAQ,CAACJ,IAAI,CAACK,IAAI,CAAC;QACvB;MACJ,CAAC,CAAC;IACN;IAEA,MAAME,gBAAmC,GAAG,EAAE;IAE9CH,QAAQ,CAACN,OAAO,CAAC,CAAC;MAAEO,IAAI;MAAEN;IAAU,CAAC,KAAK;MACtC,MAAMS,OAAO,GAAGnF,oBAAoB,CAAC;QACjCC,YAAY;QACZC,kBAAkB;QAClBC,KAAK,EAAE6E,IAAI;QACX5E,YAAY,EAAEkE,oBAAoB;QAClCjE;MACJ,CAAC,CAAC;MAEF,IAAI8E,OAAO,CAAC/B,MAAM,GAAG,CAAC,EAAE;QACpB8B,gBAAgB,CAACP,IAAI,CAAC;UAClBD,SAAS;UACTM,IAAI,EAAEG;QACV,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;IAEF,IAAID,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAAIxB,oBAAoB,EAAE;MACvDsD,gBAAgB,CAACP,IAAI,CAAC;QAClBD,SAAS,EAAEU,SAAS;QACpBJ,IAAI,EAAE;MACV,CAAC,CAAC;IACN;IAEA,MAAMK,yBAAyB,GAAGH,gBAAgB,CAACI,GAAG,CAAC,CAAC;MAAEN,IAAI;MAAEN;IAAU,CAAC,MAAM;MAC7EA,SAAS;MACTM,IAAI,EAAEA,IAAI,CAACzE,MAAM,CAAEC,IAAI,IAAK;QACxB,IAAI,OAAOP,YAAY,KAAK,UAAU,IAAII,yBAAyB,EAAE;UACjE,OAAO,IAAI;QACf;QAEA,OAAO,EAAE6E,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAAI5C,IAAI,CAACqE,IAAI,KAAKP,oBAAoB,CAAC;MACjF,CAAC;IACL,CAAC,CAAC,CAAC;IAEHhC,qBAAqB,CAAC+C,yBAAyB,CAAC;IAEhD,OAAON,QAAQ;EACnB,CAAC,EAAE,CACCtB,MAAM,EACNtC,KAAK,EACLlB,YAAY,EACZC,kBAAkB,EAClBoE,oBAAoB,EACpB1C,oBAAoB,EACpBvB,yBAAyB,CAC5B,CAAC;EAEF,MAAMkF,UAAU,GAAG9G,WAAW,CAAC,MAAM;IACjCmF,iBAAiB,CAAC,IAAI,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM4B,WAAW,GAAG/G,WAAW,CAAC,MAAM;IAClCmF,iBAAiB,CAAC,KAAK,CAAC;EAC5B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAM6B,8BAA8B,GAAIC,IAAc,IAAK;IACvDhC,SAAS,CAACgC,IAAI,CAACtC,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAGsC,IAAI,CAAC;EACjD,CAAC;;EAED;AACR;AACA;EACQhH,SAAS,CAAC,MAAM;IACZ,MAAMiH,SAAmB,GAAG,EAAE;IAE9Bb,UAAU,CAACL,OAAO,CAAC,CAAC;MAAEO,IAAI;MAAEN;IAAU,CAAC,KAAK;MACxCM,IAAI,CAACP,OAAO,CAAC,CAAC;QAAEI;MAAK,CAAC,KAAKc,SAAS,CAAChB,IAAI,CAACE,IAAI,CAAC,CAAC;MAChD,IAAI,CAACH,SAAS,EAAE;QACZ;MACJ;MACAiB,SAAS,CAAChB,IAAI,CAACD,SAAS,CAAC;IAC7B,CAAC,CAAC;IAEF,IAAI9C,oBAAoB,IAAI2B,gBAAgB,KAAK,EAAE,EAAE;MACjDoC,SAAS,CAAChB,IAAI,CAACpB,gBAAgB,CAAC;IACpC;IAEAR,SAAS,CAAC/D,sBAAsB,CAAC2G,SAAS,CAAC,CAAC;EAChD,CAAC,EAAE,CAACpC,gBAAgB,EAAEuB,UAAU,EAAErD,WAAW,EAAEG,oBAAoB,CAAC,CAAC;EAErElD,SAAS,CAAC,MAAM;IACZ,IAAIgC,UAAU,EAAE;MACZoE,UAAU,CAACL,OAAO,CAAC,CAAC;QAAEO;MAAK,CAAC,KAAK;QAC7B,MAAMY,YAAY,GAAGZ,IAAI,CAACa,IAAI,CAAC,CAAC;UAAEjB;QAAG,CAAC,KAAKA,EAAE,KAAKlE,UAAU,CAAC;QAC7D,IAAIkF,YAAY,EAAE;UACdhD,QAAQ,CAACgD,YAAY,CAACf,IAAI,CAAC;UAE3B,IAAIe,YAAY,CAACE,QAAQ,EAAE;YACvBtD,gBAAgB,cACZjE,KAAA,CAAAwH,aAAA,CAACvG,wBAAwB;cACrBwG,GAAG,EAAEJ,YAAY,CAACE,QAAS;cAC3BG,qBAAqB,EAAEjE;YAAqB,CAC/C,CACL,CAAC;UACL;QACJ;MACJ,CAAC,CAAC;IACN;EACJ,CAAC,EAAE,CAAC8C,UAAU,EAAEpE,UAAU,EAAEsB,oBAAoB,CAAC,CAAC;;EAElD;AACR;AACA;AACA;EACQtD,SAAS,CAAC,MAAM;IACZ,IAAI,CAACgC,UAAU,IAAI,CAAC0D,qBAAqB,CAAC8B,OAAO,EAAE;MAC/CtD,QAAQ,CAAC,EAAE,CAAC;IAChB;EACJ,CAAC,EAAE,CAAClC,UAAU,CAAC,CAAC;EAEhBhC,SAAS,CAAC,MAAM;IACZyF,cAAc,CAAC+B,OAAO,GAAGvC,cAAc;EAC3C,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;EAEpBjF,SAAS,CAAC,MAAM;IACZ,IACI,CAAC2D,kBAAkB,CAACe,MAAM,KAAK,CAAC,IAAIzB,QAAQ,KAC5C,CAACwC,cAAc,CAAC+B,OAAO,IACvBhC,WAAW,CAACgC,OAAO,EACrB;MACEX,UAAU,CAAC,CAAC;IAChB;EACJ,CAAC,EAAE,CAACA,UAAU,EAAE5D,QAAQ,EAAEU,kBAAkB,CAACe,MAAM,CAAC,CAAC;;EAErD;AACR;AACA;AACA;EACQ,MAAM+C,WAAW,GAAG1H,WAAW,CAC1B2H,KAAmC,IAAK;IACrClC,WAAW,CAACgC,OAAO,GAAG,IAAI;IAE1B,IAAI,OAAOlF,UAAU,EAAEqF,OAAO,KAAK,UAAU,EAAE;MAC3CrF,UAAU,CAACqF,OAAO,CAACD,KAAK,CAAC;IAC7B;IAEA,IAAItE,6BAA6B,EAAE;MAC/B,MAAMoD,gBAAmC,GAAG,EAAE;MAE9CJ,UAAU,CAACL,OAAO,CAAC,CAAC;QAAEO,IAAI;QAAEN;MAAU,CAAC,KAAK;QACxC,MAAMS,OAAO,GAAGnF,oBAAoB,CAAC;UACjCC,YAAY;UACZC,kBAAkB;UAClBC,KAAK,EAAE6E,IAAI;UACX5E,YAAY,EAAEkE,oBAAoB;UAClCjE;QACJ,CAAC,CAAC;QAEF,IAAI8E,OAAO,CAAC/B,MAAM,GAAG,CAAC,EAAE;UACpB8B,gBAAgB,CAACP,IAAI,CAAC;YAClBD,SAAS;YACTM,IAAI,EAAEG;UACV,CAAC,CAAC;QACN;MACJ,CAAC,CAAC;MAEF,IAAID,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAAIxB,oBAAoB,EAAE;QACvDsD,gBAAgB,CAACP,IAAI,CAAC;UAClBD,SAAS,EAAEU,SAAS;UACpBJ,IAAI,EAAE;QACV,CAAC,CAAC;MACN;MAEA,MAAMK,yBAAyB,GAAGH,gBAAgB,CAACI,GAAG,CAClD,CAAC;QAAEN,IAAI;QAAEN;MAAU,CAAC,MAAM;QACtBA,SAAS;QACTM,IAAI,EAAEA,IAAI,CAACzE,MAAM,CAAEC,IAAI,IAAK;UACxB,IACI,OAAOP,YAAY,KAAK,UAAU,IAClCI,yBAAyB,EAC3B;YACE,OAAO,IAAI;UACf;UAEA,OAAO,EACH6E,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAC7B5C,IAAI,CAACqE,IAAI,KAAKP,oBAAoB,CACrC;QACL,CAAC;MACL,CAAC,CACL,CAAC;MAEDhC,qBAAqB,CAAC+C,yBAAyB,CAAC;MAEhD,IAAIA,yBAAyB,CAACjC,MAAM,KAAK,CAAC,IAAIzB,QAAQ,EAAE;QACpD4D,UAAU,CAAC,CAAC;MAChB;IACJ;EACJ,CAAC,EACD,CACIzD,6BAA6B,EAC7BgD,UAAU,EACVlD,oBAAoB,EACpBD,QAAQ,EACR2C,oBAAoB,EACpBrE,YAAY,EACZC,kBAAkB,EAClBG,yBAAyB,EACzBkF,UAAU,EACVvE,UAAU,CAElB,CAAC;EAED,MAAMsF,aAAa,GAAG7H,WAAW,CAC5B2H,KAAK,IAAK;IACP,IAAI,OAAO7E,SAAS,KAAK,UAAU,EAAE;MACjCA,SAAS,CAAC6E,KAAK,CAAC;IACpB;IAEA,IAAI,OAAOpF,UAAU,EAAEO,SAAS,KAAK,UAAU,EAAE;MAC7CP,UAAU,CAACO,SAAS,CAAC6E,KAAK,CAAC;IAC/B;EACJ,CAAC,EACD,CAACpF,UAAU,EAAEO,SAAS,CAC1B,CAAC;;EAED;AACR;AACA;;EAEQ7C,SAAS,CAAC,MAAM;IACZ,MAAMwG,gBAAmC,GAAG,EAAE;IAE9CJ,UAAU,CAACL,OAAO,CAAC,CAAC;MAAEO,IAAI;MAAEN;IAAU,CAAC,KAAK;MACxC,MAAMS,OAAO,GAAGnF,oBAAoB,CAAC;QACjCC,YAAY;QACZC,kBAAkB;QAClBC,KAAK,EAAE6E,IAAI;QACX5E,YAAY,EAAEkE,oBAAoB;QAClCjE;MACJ,CAAC,CAAC;MAEF,IAAI8E,OAAO,CAAC/B,MAAM,GAAG,CAAC,EAAE;QACpB8B,gBAAgB,CAACP,IAAI,CAAC;UAClBD,SAAS;UACTM,IAAI,EAAEG;QACV,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;IAEF,IAAID,gBAAgB,CAAC9B,MAAM,KAAK,CAAC,IAAIxB,oBAAoB,EAAE;MACvDsD,gBAAgB,CAACP,IAAI,CAAC;QAClBD,SAAS,EAAEU,SAAS;QACpBJ,IAAI,EAAE;MACV,CAAC,CAAC;IACN;IAEA,IAAIpD,oBAAoB,IAAI2B,gBAAgB,KAAK,EAAE,EAAE;MACjD2B,gBAAgB,CAACT,OAAO,CAAC,CAAC;QAAEO;MAAK,CAAC,KAAK;QACnCA,IAAI,CAACP,OAAO,CAAC,CAAC;UAAEI;QAAK,CAAC,KAAK;UACvB,IAAIA,IAAI,CAAC0B,WAAW,CAAC,CAAC,KAAKhD,gBAAgB,CAACgD,WAAW,CAAC,CAAC,EAAE;YACvD/C,mBAAmB,CAAC,EAAE,CAAC;UAC3B;QACJ,CAAC,CAAC;MACN,CAAC,CAAC;IACN;EACJ,CAAC,EAAE,CACCD,gBAAgB,EAChBuB,UAAU,EACVlD,oBAAoB,EACpBE,6BAA6B,EAC7BwC,oBAAoB,EACpBrE,YAAY,EACZC,kBAAkB,EAClBG,yBAAyB,CAC5B,CAAC;EAEF,MAAMmG,WAAW,GAAG/H,WAAW,CAAC,MAAM;IAClC,IAAIkF,cAAc,EAAE;MAChB6B,WAAW,CAAC,CAAC;IACjB,CAAC,MAAM;MACHD,UAAU,CAAC,CAAC;IAChB;EACJ,CAAC,EAAE,CAACC,WAAW,EAAED,UAAU,EAAE5B,cAAc,CAAC,CAAC;EAE7C,MAAM8C,YAAY,GAAG7H,OAAO,CAAC,MAAM;IAC/B,IAAI,CAACqD,oBAAoB,EAAE;MACvB,OAAOmD,SAAS;IACpB;IAEA,oBACI7G,KAAA,CAAAwH,aAAA,CAACpG,mBAAmB;MAAC+G,OAAO,EAAEF;IAAY,gBACtCjI,KAAA,CAAAwH,aAAA,CAAC5G,IAAI;MAACwH,KAAK,EAAE,CAAC,oBAAoB,CAAE;MAACC,KAAK,EAAEvC,KAAK,CAAC,KAAK;IAAY,CAAE,CACpD,CAAC;EAE9B,CAAC,EAAE,CAACmC,WAAW,EAAEvE,oBAAoB,EAAEoC,KAAK,CAAC,CAAC;EAE9C,MAAMwC,WAAW,GAAGjI,OAAO,CACvB,MACI,CAACsC,SAAS,IAAIqB,aAAa,kBACvBhE,KAAA,CAAAwH,aAAA,CAACnG,0BAA0B,QACtBsB,SAAS,iBAAI3C,KAAA,CAAAwH,aAAA,CAAC5G,IAAI;IAACwH,KAAK,EAAEzF;EAAU,CAAE,CAAC,EACvCqB,aAAa,IAAIA,aACM,CAC/B,EACL,CAACrB,SAAS,EAAEqB,aAAa,CAC7B,CAAC;;EAED;AACR;AACA;EACQ,MAAMuE,YAAY,GAAGrI,WAAW,CAC3B2H,KAAoC,IAAK;IACtC,MAAMW,aAAgC,GAAG,EAAE;IAC3C3C,qBAAqB,CAAC8B,OAAO,GAAG,KAAK;IAErCpB,UAAU,CAACL,OAAO,CAAC,CAAC;MAAEO,IAAI;MAAEN;IAAU,CAAC,KAAK;MACxC,MAAMS,OAAO,GAAGnF,oBAAoB,CAAC;QACjCC,YAAY;QACZC,kBAAkB;QAClBC,KAAK,EAAE6E,IAAI;QACX5E,YAAY,EAAEgG,KAAK,CAACY,MAAM,CAACpG,KAAK;QAChCP;MACJ,CAAC,CAAC;MAEF,IAAI8E,OAAO,CAAC/B,MAAM,GAAG,CAAC,EAAE;QACpB2D,aAAa,CAACpC,IAAI,CAAC;UACfD,SAAS;UACTM,IAAI,EAAEG;QACV,CAAC,CAAC;MACN;IACJ,CAAC,CAAC;IAEF,IAAI4B,aAAa,CAAC3D,MAAM,KAAK,CAAC,IAAIxB,oBAAoB,EAAE;MACpDmF,aAAa,CAACpC,IAAI,CAAC;QACfD,SAAS,EAAEU,SAAS;QACpBJ,IAAI,EAAE;MACV,CAAC,CAAC;IACN;IAEAxC,gBAAgB,CAAC4C,SAAS,CAAC;IAE3B,IAAI,CAACtD,6BAA6B,IAAI,CAACsE,KAAK,CAACY,MAAM,CAACpG,KAAK,EAAE;MACvD0B,qBAAqB,CAAC,EAAE,CAAC;IAC7B,CAAC,MAAM;MACHA,qBAAqB,CAACyE,aAAa,CAAC;IACxC;IAEA,IAAIA,aAAa,CAAC3D,MAAM,KAAK,CAAC,EAAE;MAC5BmC,UAAU,CAAC,CAAC;IAChB;IAEA3C,QAAQ,CAACwD,KAAK,CAACY,MAAM,CAACpG,KAAK,CAAC;IAC5B4C,mBAAmB,CAAC4C,KAAK,CAACY,MAAM,CAACpG,KAAK,CAAC;IAEvC,IAAI,OAAOU,QAAQ,KAAK,UAAU,EAAE;MAChCA,QAAQ,CAAC8E,KAAK,CAAC;IACnB;IAEA,IAAI,OAAOpF,UAAU,EAAEM,QAAQ,KAAK,UAAU,EAAE;MAC5CN,UAAU,CAACM,QAAQ,CAAC8E,KAAK,CAAC;IAC9B;EACJ,CAAC,EACD,CACItB,UAAU,EACV7E,YAAY,EACZC,kBAAkB,EAClBqF,UAAU,EACVvE,UAAU,EACVM,QAAQ,EACRM,oBAAoB,EACpBE,6BAA6B,EAC7BzB,yBAAyB,CAEjC,CAAC;;EAED;AACR;AACA;EACQ,MAAM4G,UAAU,GAAGxI,WAAW,CACzB2H,KAAmC,IAAK;IACrClC,WAAW,CAACgC,OAAO,GAAG,KAAK;IAE3B,IAAI,OAAO7E,MAAM,KAAK,UAAU,EAAE;MAC9BA,MAAM,CAAC+E,KAAK,CAAC;IACjB;IAEA,IAAI,OAAOpF,UAAU,EAAEK,MAAM,KAAK,UAAU,EAAE;MAC1CL,UAAU,CAACK,MAAM,CAAC+E,KAAK,CAAC;IAC5B;EACJ,CAAC,EACD,CAACpF,UAAU,EAAEK,MAAM,CACvB,CAAC;EAED,MAAM6F,0BAA0B,GAAGzI,WAAW,CAAC,MAAM;IACjDwF,WAAW,CAACiC,OAAO,EAAEiB,IAAI,CAAC,CAAC;IAE3B,OAAOjD,WAAW,CAACgC,OAAO,IAAI3B,OAAO;EACzC,CAAC,EAAE,CAACA,OAAO,CAAC,CAAC;EAEb,MAAM6C,mBAAmB,GAAG3I,WAAW,CAClC2H,KAAuC,IAAK;IACzC,MAAMiB,kBAAkB,GAAGjB,KAAK,CAACkB,aAA4B;IAC7D,MAAMC,gBAAgB,GAAGnB,KAAK,CAACoB,aAA4B;;IAE3D;IACA;IACA,IACI,CAACH,kBAAkB,IAClB,CAACE,gBAAgB,CAACE,QAAQ,CAACJ,kBAAkB,CAAC,IAC3C,CAACtD,UAAU,CAACmC,OAAO,EAAEuB,QAAQ,CAACJ,kBAAkB,CAAE,EACxD;MACE7B,WAAW,CAAC,CAAC;IACjB;EACJ,CAAC,EACD,CAACA,WAAW,CAChB,CAAC;;EAED;AACR;AACA;EACQ,MAAMkC,YAAY,GAAGjJ,WAAW,CAC3B+B,IAAoB,IAAK;IACtB,MAAMmH,OAAO,GAAG;MACZ,GAAGnH,IAAI;MACPqE,IAAI,EAAErE,IAAI,CAACqE,IAAI,CAAC+C,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,KAAK,EAAE,EAAE;IAC5E,CAAC;IAED,IAAI1F,gBAAgB,EAAE;MAClBU,QAAQ,CAAC,EAAE,CAAC;MACZY,mBAAmB,CAAC,EAAE,CAAC;MACvBS,WAAW,CAACiC,OAAO,EAAE2B,UAAU,CAAC,CAAC;IACrC,CAAC,MAAM;MACHjF,QAAQ,CAAC+E,OAAO,CAAC9C,IAAI,CAAC;IAC1B;IAEAW,WAAW,CAAC,CAAC;IAEbhD,gBAAgB,CACZmF,OAAO,CAAC7B,QAAQ,gBACZvH,KAAA,CAAAwH,aAAA,CAACvG,wBAAwB;MACrBwG,GAAG,EAAE2B,OAAO,CAAC7B,QAAS;MACtBG,qBAAqB,EAAEjE;IAAqB,CAC/C,CAAC,GACFoD,SACR,CAAC;IAED9C,qBAAqB,CAAC,EAAE,CAAC;IAEzB,IAAI,OAAOd,QAAQ,KAAK,UAAU,EAAE;MAChCA,QAAQ,CAACmG,OAAO,CAAC;IACrB;EACJ,CAAC,EACD,CAACnC,WAAW,EAAEhE,QAAQ,EAAEQ,oBAAoB,EAAEE,gBAAgB,CAClE,CAAC;EAED,MAAM4F,OAAO,GAAGlJ,OAAO,CAAC,MAAM;IAC1B,IAAI+C,QAAQ,IAAIU,kBAAkB,CAACe,MAAM,KAAK,CAAC,EAAE;MAC7C,oBACI7E,KAAA,CAAAwH,aAAA,CAACrG,uBAAuB,QACnBiC,QAAQ,CAACiG,OAAO,CAAC,WAAW,EAAEhH,KAAK,CACf,CAAC;IAElC;IAEA,MAAMT,KAAqB,GAAG,EAAE;IAEhCkC,kBAAkB,CAACoC,OAAO,CAAC,CAAC;MAAEC,SAAS;MAAEM;IAAK,CAAC,EAAE+C,KAAK,KAAK;MACvD,IAAI7E,iBAAiB,EAAE;QACnB,IAAI8B,IAAI,CAAC5B,MAAM,IAAI,CAAC,EAAE;UAClB;QACJ;QAEA,IAAI2E,KAAK,KAAK,CAAC,EAAE;UACb5H,KAAK,CAACwE,IAAI,cAACpG,KAAA,CAAAwH,aAAA,CAAC1G,SAAS;YAAC2I,GAAG,EAAEtD,SAAU;YAACuD,IAAI,EAAEvD,SAAS,IAAI;UAAG,CAAE,CAAC,CAAC;QACpE;MACJ;MAEAM,IAAI,CAACP,OAAO,CAAC,CAAC;QAAEG,EAAE;QAAEC,IAAI;QAAEiB;MAAS,CAAC,EAAEoC,SAAS,KAAK;QAChD/H,KAAK,CAACwE,IAAI,cACNpG,KAAA,CAAAwH,aAAA,CAACxG,aAAa;UACVyI,GAAG,EAAE,GAAGpD,EAAE,IAAIF,SAAS,IAAI,EAAE,EAAG;UAChCE,EAAE,EAAEA,EAAG;UACPC,IAAI,EAAEA,IAAK;UACXiB,QAAQ,EAAEA,QAAS;UACnB/D,oBAAoB,EAAEA,oBAAqB;UAC3CC,oBAAoB,EAAEA,oBAAqB;UAC3CR,QAAQ,EAAEkG,YAAa;UACvBhD,SAAS,EAAEA,SAAU;UACrByD,QAAQ,EAAEJ,KAAK,KAAK,CAAC,IAAIG,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,CACrD,CACL,CAAC;MACL,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,IAAItG,oBAAoB,IAAI2B,gBAAgB,KAAK,EAAE,EAAE;MACjDpD,KAAK,CAACwE,IAAI,cACNpG,KAAA,CAAAwH,aAAA,CAACxG,aAAa;QACVqF,EAAE,EAAC,aAAa;QAChBpD,QAAQ,EAAEkG,YAAa;QACvB3F,oBAAoB,EAAEA,oBAAqB;QAC3C8C,IAAI,EAAE,MAAMtB,gBAAgB,KAAM;QAClC4E,QAAQ,EAAEhI,KAAK,CAACiD,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;MAAE,CACzC,CACL,CAAC;IACL;IAEA,OAAOjD,KAAK;EAChB,CAAC,EAAE,CACCwB,QAAQ,EACRU,kBAAkB,EAClBT,oBAAoB,EACpB2B,gBAAgB,EAChB3C,KAAK,EACLsC,iBAAiB,EACjBnB,oBAAoB,EACpBC,oBAAoB,EACpB0F,YAAY,CACf,CAAC;EAEFhJ,SAAS,CAAC,MAAM;IACZ,MAAM4H,aAAa,GAAI8B,CAAgB,IAAK;MACxC,IAAI,CAACzE,cAAc,IAAItB,kBAAkB,CAACe,MAAM,KAAK,CAAC,EAAE;QACpD;MACJ;MAEA,MAAMiF,QAAQ,GAAGtE,UAAU,CAACmC,OAAO,EAAEmC,QAAQ;MAE7C,IAAI,CAACA,QAAQ,EAAE;QACX;MACJ;MAEA,MAAMC,aAAa,GAAGC,KAAK,CAACC,IAAI,CAACH,QAAQ,CAAC;MAE1C,MAAMI,WAAW,GAAGH,aAAa,CAACzC,IAAI,CAAE6C,KAAK,IACzCA,KAAK,CAAC9D,EAAE,CAAC+D,UAAU,CAAC,oBAAoB,CAC5C,CAAC,EAAEN,QAAQ;MAEX,IAAI,EAAEI,WAAW,IAAIA,WAAW,CAACrF,MAAM,GAAG,CAAC,CAAC,EAAE;QAC1C;MACJ;MAEA,MAAMwF,gBAAgB,GAAGL,KAAK,CAACC,IAAI,CAACC,WAAW,CAAC,CAAClI,MAAM,CAClDmI,KAAK,IAAMA,KAAK,CAAiBG,OAAO,CAACC,WAAW,KAAK,MAC9D,CAAC;MAEDxF,wBAAwB,CAACsF,gBAAgB,CAAC;MAE1C,IAAIR,CAAC,CAACJ,GAAG,KAAK,SAAS,IAAII,CAAC,CAACJ,GAAG,KAAK,WAAW,EAAE;QAC9CI,CAAC,CAACW,cAAc,CAAC,CAAC;QAElB,IAAIN,WAAW,IAAIA,WAAW,CAACrF,MAAM,GAAG,CAAC,EAAE;UACvC,MAAM4F,QAAQ,GACVhG,YAAY,KAAK,IAAI,GACf,CAACA,YAAY,IACRoF,CAAC,CAACJ,GAAG,KAAK,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAC9BY,gBAAgB,CAACxF,MAAM,IAC3BwF,gBAAgB,CAACxF,MAAM,GACvB,CAAC;UAEX,IAAIJ,YAAY,KAAK,IAAI,EAAE;YACvB,MAAMiG,WAAW,GAAGL,gBAAgB,CAAC5F,YAAY,CAAmB;YACpEiG,WAAW,CAACd,QAAQ,GAAG,CAAC,CAAC;UAC7B;UAEAlF,eAAe,CAAC+F,QAAQ,CAAC;UAEzB,MAAME,UAAU,GAAGN,gBAAgB,CAACI,QAAQ,CAAmB;UAE/DE,UAAU,CAACf,QAAQ,GAAG,CAAC;QAC3B;MACJ,CAAC,MAAM,IAAIC,CAAC,CAACJ,GAAG,KAAK,OAAO,IAAII,CAAC,CAACJ,GAAG,KAAK,GAAG,EAAE;QAC3CI,CAAC,CAACW,cAAc,CAAC,CAAC;QAClBX,CAAC,CAACe,eAAe,CAAC,CAAC;QAEnB,IAAIP,gBAAgB,EAAE;UAClB,MAAMQ,OAAO,GAAGR,gBAAgB,CAAC5F,YAAY,IAAI,CAAC,CAAC;UAEnD,IAAI,CAACoG,OAAO,EAAE;YACV;UACJ;UAEA,MAAM;YAAExE,EAAE;YAAEyE;UAAY,CAAC,GAAGD,OAAO;UAEnC,IAAItD,QAA4B;;UAEhC;UACA;UACA;UACA,IAAIsD,OAAO,CAACf,QAAQ,CAAC,CAAC,CAAC,EAAEiB,UAAU,CAACtD,GAAG,EAAE;YACrC;YACA;YACA;YACAF,QAAQ,GAAGsD,OAAO,CAACf,QAAQ,CAAC,CAAC,CAAC,EAAEiB,UAAU,CAACtD,GAAG,CAACuD,SAAmB;UACtE;UAEA,MAAMC,KAAK,GAAG5E,EAAE,CAACgD,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;UAEjDF,YAAY,CAAC;YACT9C,EAAE,EAAE4E,KAAK,KAAK,aAAa,GAAGH,WAAW,GAAGG,KAAK;YACjD3E,IAAI,EAAEwE,WAAW,IAAI,EAAE;YACvBvD;UACJ,CAAC,CAAC;QACN;MACJ;IACJ,CAAC;IAED2D,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEpD,aAAa,CAAC;IAEnD,OAAO,MAAM;MACTmD,QAAQ,CAACE,mBAAmB,CAAC,SAAS,EAAErD,aAAa,CAAC;IAC1D,CAAC;EACL,CAAC,EAAE,CACCjD,qBAAqB,EACrBL,YAAY,EACZ0E,YAAY,EACZrF,kBAAkB,CAACe,MAAM,EACzBO,cAAc,CACjB,CAAC;EAEF,MAAMiG,cAAc,GAAGnL,WAAW,CAAE2H,KAAoB,IAAK;IACzD,IAAIA,KAAK,CAACyD,OAAO,KAAK,EAAE,EAAE;MACtBvH,qBAAqB,CAAC,EAAE,CAAC;IAC7B;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN3D,mBAAmB,CACfyD,GAAG,EACH,OAAO;IACH0H,KAAK,EAAEA,CAAA,KAAMlH,QAAQ,CAAC,EAAE;EAC5B,CAAC,CAAC,EACF,CAACA,QAAQ,CACb,CAAC;EAEDlE,SAAS,CAAC,MAAM;IACZ+K,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEE,cAAc,CAAC;IAEpD,OAAO,MAAM;MACTH,QAAQ,CAACC,gBAAgB,CAAC,SAAS,EAAEE,cAAc,CAAC;IACxD,CAAC;EACL,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;;EAEpB;AACR;AACA;EACQlL,SAAS,CAAC,MAAM;IACZ,IAAIgD,WAAW,EAAE;MACbkB,QAAQ,CAAClB,WAAW,CAAC;IACzB;EACJ,CAAC,EAAE,CAACA,WAAW,EAAEkB,QAAQ,CAAC,CAAC;EAE3B,MAAMmH,kBAAkB,GACpBpG,cAAc,KACbtB,kBAAkB,CAACe,MAAM,KAAK,CAAC,IAAI,CAAC,CAACzB,QAAQ,CAAC,KAC9Cf,KAAK,CAACoJ,IAAI,CAAC,CAAC,KAAK,EAAE,IAAIlI,6BAA6B,CAAC;EAE1D,OAAOlD,OAAO,CACV,mBACIL,KAAA,CAAAwH,aAAA,CAACtG,eAAe;IACZ2C,GAAG,EAAE0B,MAAO;IACZkE,GAAG,EAAE,cAAcnE,IAAI,EAAG;IAC1BxC,MAAM,EAAE+F;EAAoB,gBAE5B7I,KAAA,CAAAwH,aAAA;IAAKnB,EAAE,EAAE,mBAAmBf,IAAI;EAAG,GAC9B3B,gBAAgB,gBACb3D,KAAA,CAAAwH,aAAA,CAAChG,QAAQ;IACL8G,WAAW,EAAEA,WAAY;IACzBoD,KAAK,EAAE/H,gBAAgB,CAAC+H,KAAM;IAC9B5I,MAAM,EAAE4F,UAAW;IACnB3F,QAAQ,EAAEwF,YAAa;IACvBT,OAAO,EAAEF,WAAY;IACrB+D,QAAQ,EAAEhI,gBAAgB,CAACgI,QAAS;IACpCzI,WAAW,EAAEA,WAAY;IACzBW,GAAG,EAAE6B,WAAY;IACjBkG,IAAI,EAAEjI,gBAAgB,CAACiI,IAAK;IAC5BC,mBAAmB,EAAElI,gBAAgB,CAACkI,mBAAoB;IAC1DjI,gCAAgC,EAAEA,gCAAiC;IACnEkI,kBAAkB;IAClBC,IAAI,EAAEpI,gBAAgB,CAACoI;EAAK,CAC/B,CAAC,gBAEF/L,KAAA,CAAAwH,aAAA,CAAC3G;EACG,6DAAAmL,QAAA,KACIvJ,UAAU;IACdC,SAAS,EAAEA,SAAU;IACrB4F,WAAW,EAAEA,WAAY;IACzBxF,MAAM,EAAE4F,UAAW;IACnB3F,QAAQ,EAAEwF,YAAa;IACvBT,OAAO,EAAEF,WAAY;IACrB5E,SAAS,EAAE+E,aAAc;IACzB7E,WAAW,EAAEA,WAAY;IACzBW,GAAG,EAAE4B,QAAS;IACdyC,YAAY,EAAEA,YAAa;IAC3BtE,gCAAgC,EAC5BnB,UAAU,EAAEmB,gCAAgC,IAC5CA,gCACH;IACDvB,KAAK,EAAEA;EAAM,EAChB,CAEJ,CAAC,EACLkD,MAAM,CAACoC,OAAO,iBACX3H,KAAA,CAAAwH,aAAA,CAACjG,mBAAmB;IAChB0K,aAAa,EAAE1G,MAAM,CAACoC,OAAQ;IAC9BpF,SAAS,EAAEA,SAAU;IACrB2J,SAAS,EAAE1J,iBAAkB;IAC7B2J,OAAO,EAAElF,WAAY;IACrBmF,cAAc,EAAEzD,0BAA2B;IAC3C6C,kBAAkB,EAAEA;EAAmB,gBAEvCxL,KAAA,CAAAwH,aAAA,CAACzG,aAAa;IACVkF,aAAa,EAAEA,aAAc;IAC7B1B,MAAM,EAAEA,MAAO;IACf1B,SAAS,EAAEA,SAAU;IACrBwJ,UAAU,EAAEb,kBAAmB;IAC/B/B,GAAG,EAAE,mBAAmBnE,IAAI,EAAG;IAC/BgH,aAAa,EAAEpF,8BAA+B;IAC9CrD,GAAG,EAAE2B,UAAW;IAChB+G,cAAc,EAAErH,MAAO;IACvB5B,uBAAuB,EAAEA;EAAwB,GAEhDiG,OACU,CACE,CAEZ,CACpB,EACD,CACIhH,SAAS,EACTgH,OAAO,EACP/G,iBAAiB,EACjByD,aAAa,EACbf,MAAM,EACNwD,UAAU,EACVH,YAAY,EACZtB,WAAW,EACX0B,0BAA0B,EAC1Bf,WAAW,EACXG,aAAa,EACbxD,MAAM,EACN9B,UAAU,EACVC,SAAS,EACT4F,WAAW,EACXzF,SAAS,EACTG,SAAS,EACTE,WAAW,EACXgF,YAAY,EACZ5E,uBAAuB,EACvBkI,kBAAkB,EAClB5H,gCAAgC,EAChCD,gBAAgB,EAChB2B,IAAI,EACJjD,KAAK,CAEb,CAAC;AACL,CACJ,CAAC;AAEDC,SAAS,CAACkK,WAAW,GAAG,WAAW;AAEnC,eAAelK,SAAS","ignoreList":[]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { filterSearchBoxItems } from '../components/search-box/SearchBox';
|
|
2
3
|
import { searchList } from './searchBox';
|
|
3
4
|
const items = [{
|
|
4
5
|
id: '2',
|
|
@@ -28,5 +29,24 @@ describe('searchList', () => {
|
|
|
28
29
|
id
|
|
29
30
|
}) => id)).toEqual(['1', '2']);
|
|
30
31
|
});
|
|
32
|
+
it('uses only the custom filter when shouldUseCustomFilterOnly is enabled', () => {
|
|
33
|
+
const values = [];
|
|
34
|
+
const result = filterSearchBoxItems({
|
|
35
|
+
customFilter: ({
|
|
36
|
+
id
|
|
37
|
+
}, value) => {
|
|
38
|
+
values.push(value);
|
|
39
|
+
return id === '2';
|
|
40
|
+
},
|
|
41
|
+
customSortFunction: (a, b) => a.id.localeCompare(b.id),
|
|
42
|
+
items,
|
|
43
|
+
searchString: 'does-not-match',
|
|
44
|
+
shouldUseCustomFilterOnly: true
|
|
45
|
+
});
|
|
46
|
+
expect(result.map(({
|
|
47
|
+
id
|
|
48
|
+
}) => id)).toEqual(['2']);
|
|
49
|
+
expect(values).toEqual(['does-not-match', 'does-not-match']);
|
|
50
|
+
});
|
|
31
51
|
});
|
|
32
52
|
//# sourceMappingURL=searchBox.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchBox.test.js","names":["describe","expect","it","searchList","items","id","text","result","customSortFunction","a","b","localeCompare","searchString","map","toEqual"],"sources":["../../../src/utils/searchBox.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\nimport type { ISearchBoxItem } from '../types/searchBox';\nimport { searchList } from './searchBox';\n\nconst items: ISearchBoxItem[] = [\n { id: '2', text: 'Zweite' },\n { id: '1', text: 'Erste' },\n];\n\ndescribe('searchList', () => {\n it('uses the custom sort function instead of the default sort', () => {\n const result = searchList({\n customSortFunction: (a, b) => b.id.localeCompare(a.id),\n items,\n searchString: '',\n });\n\n expect(result.map(({ id }) => id)).toEqual(['2', '1']);\n });\n\n it('still filters before applying the custom sort function', () => {\n const result = searchList({\n customSortFunction: (a, b) => a.id.localeCompare(b.id),\n items,\n searchString: 'e',\n });\n\n expect(result.map(({ id }) => id)).toEqual(['1', '2']);\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAE7C,SAASC,UAAU,QAAQ,aAAa;AAExC,MAAMC,KAAuB,GAAG,CAC5B;EAAEC,EAAE,EAAE,GAAG;EAAEC,IAAI,EAAE;AAAS,CAAC,EAC3B;EAAED,EAAE,EAAE,GAAG;EAAEC,IAAI,EAAE;AAAQ,CAAC,CAC7B;
|
|
1
|
+
{"version":3,"file":"searchBox.test.js","names":["describe","expect","it","filterSearchBoxItems","searchList","items","id","text","result","customSortFunction","a","b","localeCompare","searchString","map","toEqual","values","customFilter","value","push","shouldUseCustomFilterOnly"],"sources":["../../../src/utils/searchBox.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\nimport type { ISearchBoxItem } from '../types/searchBox';\nimport { filterSearchBoxItems } from '../components/search-box/SearchBox';\nimport { searchList } from './searchBox';\n\nconst items: ISearchBoxItem[] = [\n { id: '2', text: 'Zweite' },\n { id: '1', text: 'Erste' },\n];\n\ndescribe('searchList', () => {\n it('uses the custom sort function instead of the default sort', () => {\n const result = searchList({\n customSortFunction: (a, b) => b.id.localeCompare(a.id),\n items,\n searchString: '',\n });\n\n expect(result.map(({ id }) => id)).toEqual(['2', '1']);\n });\n\n it('still filters before applying the custom sort function', () => {\n const result = searchList({\n customSortFunction: (a, b) => a.id.localeCompare(b.id),\n items,\n searchString: 'e',\n });\n\n expect(result.map(({ id }) => id)).toEqual(['1', '2']);\n });\n\n it('uses only the custom filter when shouldUseCustomFilterOnly is enabled', () => {\n const values: string[] = [];\n const result = filterSearchBoxItems({\n customFilter: ({ id }, value) => {\n values.push(value);\n return id === '2';\n },\n customSortFunction: (a, b) => a.id.localeCompare(b.id),\n items,\n searchString: 'does-not-match',\n shouldUseCustomFilterOnly: true,\n });\n\n expect(result.map(({ id }) => id)).toEqual(['2']);\n expect(values).toEqual(['does-not-match', 'does-not-match']);\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,QAAQ;AAE7C,SAASC,oBAAoB,QAAQ,oCAAoC;AACzE,SAASC,UAAU,QAAQ,aAAa;AAExC,MAAMC,KAAuB,GAAG,CAC5B;EAAEC,EAAE,EAAE,GAAG;EAAEC,IAAI,EAAE;AAAS,CAAC,EAC3B;EAAED,EAAE,EAAE,GAAG;EAAEC,IAAI,EAAE;AAAQ,CAAC,CAC7B;AAEDP,QAAQ,CAAC,YAAY,EAAE,MAAM;EACzBE,EAAE,CAAC,2DAA2D,EAAE,MAAM;IAClE,MAAMM,MAAM,GAAGJ,UAAU,CAAC;MACtBK,kBAAkB,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACL,EAAE,CAACM,aAAa,CAACF,CAAC,CAACJ,EAAE,CAAC;MACtDD,KAAK;MACLQ,YAAY,EAAE;IAClB,CAAC,CAAC;IAEFZ,MAAM,CAACO,MAAM,CAACM,GAAG,CAAC,CAAC;MAAER;IAAG,CAAC,KAAKA,EAAE,CAAC,CAAC,CAACS,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EAC1D,CAAC,CAAC;EAEFb,EAAE,CAAC,wDAAwD,EAAE,MAAM;IAC/D,MAAMM,MAAM,GAAGJ,UAAU,CAAC;MACtBK,kBAAkB,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACJ,EAAE,CAACM,aAAa,CAACD,CAAC,CAACL,EAAE,CAAC;MACtDD,KAAK;MACLQ,YAAY,EAAE;IAClB,CAAC,CAAC;IAEFZ,MAAM,CAACO,MAAM,CAACM,GAAG,CAAC,CAAC;MAAER;IAAG,CAAC,KAAKA,EAAE,CAAC,CAAC,CAACS,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;EAC1D,CAAC,CAAC;EAEFb,EAAE,CAAC,uEAAuE,EAAE,MAAM;IAC9E,MAAMc,MAAgB,GAAG,EAAE;IAC3B,MAAMR,MAAM,GAAGL,oBAAoB,CAAC;MAChCc,YAAY,EAAEA,CAAC;QAAEX;MAAG,CAAC,EAAEY,KAAK,KAAK;QAC7BF,MAAM,CAACG,IAAI,CAACD,KAAK,CAAC;QAClB,OAAOZ,EAAE,KAAK,GAAG;MACrB,CAAC;MACDG,kBAAkB,EAAEA,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACJ,EAAE,CAACM,aAAa,CAACD,CAAC,CAACL,EAAE,CAAC;MACtDD,KAAK;MACLQ,YAAY,EAAE,gBAAgB;MAC9BO,yBAAyB,EAAE;IAC/B,CAAC,CAAC;IAEFnB,MAAM,CAACO,MAAM,CAACM,GAAG,CAAC,CAAC;MAAER;IAAG,CAAC,KAAKA,EAAE,CAAC,CAAC,CAACS,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;IACjDd,MAAM,CAACe,MAAM,CAAC,CAACD,OAAO,CAAC,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;EAChE,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
|
|
@@ -14,6 +14,13 @@ export interface TagInputSettings {
|
|
|
14
14
|
shouldAllowMultiple?: TagInputProps['shouldAllowMultiple'];
|
|
15
15
|
tags?: TagInputProps['tags'];
|
|
16
16
|
}
|
|
17
|
+
export declare const filterSearchBoxItems: ({ customFilter, customSortFunction, items, searchString, shouldUseCustomFilterOnly, }: {
|
|
18
|
+
customFilter?: (item: ISearchBoxItem, value: string) => boolean;
|
|
19
|
+
customSortFunction?: SearchBoxSortFunction;
|
|
20
|
+
items: ISearchBoxItem[];
|
|
21
|
+
searchString: string;
|
|
22
|
+
shouldUseCustomFilterOnly?: boolean;
|
|
23
|
+
}) => ISearchBoxItem[];
|
|
17
24
|
export type SearchBoxProps = {
|
|
18
25
|
/**
|
|
19
26
|
* The element where the content of the `ComboBox` should be rendered via React Portal.
|
|
@@ -21,8 +28,10 @@ export type SearchBoxProps = {
|
|
|
21
28
|
container?: Element;
|
|
22
29
|
/**
|
|
23
30
|
* An optional callback function to filter the elements to be displayed
|
|
31
|
+
* @param item The item to filter.
|
|
32
|
+
* @param value The current input value.
|
|
24
33
|
*/
|
|
25
|
-
customFilter?: (item: ISearchBoxItem) => boolean;
|
|
34
|
+
customFilter?: (item: ISearchBoxItem, value: string) => boolean;
|
|
26
35
|
/**
|
|
27
36
|
* An optional callback function to sort the filtered elements to be displayed
|
|
28
37
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chayns-components/core",
|
|
3
|
-
"version": "5.5.
|
|
3
|
+
"version": "5.5.41",
|
|
4
4
|
"description": "A set of beautiful React components for developing your own applications with chayns.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"browserslist": [
|
|
@@ -93,5 +93,5 @@
|
|
|
93
93
|
"publishConfig": {
|
|
94
94
|
"access": "public"
|
|
95
95
|
},
|
|
96
|
-
"gitHead": "
|
|
96
|
+
"gitHead": "fc3d589835b668db40cc14ed59307d4cca80e9da"
|
|
97
97
|
}
|