@chayns-components/core 5.5.40 → 5.5.42
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 +6 -6
- package/lib/cjs/components/search-box/SearchBox.js +10 -9
- package/lib/cjs/components/search-box/SearchBox.js.map +1 -1
- package/lib/cjs/components/truncation/Truncation.js +16 -4
- package/lib/cjs/components/truncation/Truncation.js.map +1 -1
- package/lib/cjs/components/truncation/Truncation.test.js +3 -0
- package/lib/cjs/components/truncation/Truncation.test.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/components/truncation/Truncation.js +16 -4
- package/lib/esm/components/truncation/Truncation.js.map +1 -1
- package/lib/esm/components/truncation/Truncation.test.js +3 -0
- package/lib/esm/components/truncation/Truncation.test.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
|
@@ -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":"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","ignoreList":[]}
|
|
@@ -6,6 +6,16 @@ import { useKeyboardFocusHighlighting } from '../../hooks/useKeyboardFocusHighli
|
|
|
6
6
|
import { ClampPosition } from '../../types/truncation';
|
|
7
7
|
import { StyledMotionTruncationContent, StyledTruncation, StyledTruncationClamp, StyledTruncationClampFocusWrapper, StyledTruncationClampWrapper, StyledTruncationContent } from './Truncation.styles';
|
|
8
8
|
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
|
|
9
|
+
const getHeightAtLineBoundary = (element, height, contentHeight) => {
|
|
10
|
+
const elementTop = element.getBoundingClientRect().top;
|
|
11
|
+
const targetBottom = elementTop + height;
|
|
12
|
+
const range = element.ownerDocument.createRange();
|
|
13
|
+
range.selectNodeContents(element);
|
|
14
|
+
const lineRects = typeof range.getClientRects === 'function' ? Array.from(range.getClientRects()) : [];
|
|
15
|
+
const lineBottom = lineRects.map(rect => rect.bottom).filter(bottom => bottom >= targetBottom).sort((first, second) => first - second)[0];
|
|
16
|
+
range.detach();
|
|
17
|
+
return lineBottom === undefined ? Math.min(contentHeight, height) : Math.min(contentHeight, lineBottom - elementTop);
|
|
18
|
+
};
|
|
9
19
|
const Truncation = ({
|
|
10
20
|
collapsedHeight = 150,
|
|
11
21
|
clampPosition = ClampPosition.Right,
|
|
@@ -22,6 +32,7 @@ const Truncation = ({
|
|
|
22
32
|
const pendingObservedHeight = useRef(0);
|
|
23
33
|
const [internalIsOpen, setInternalIsOpen] = useState(Boolean(isOpen));
|
|
24
34
|
const [contentHeight, setContentHeight] = useState(0);
|
|
35
|
+
const [collapsedContentHeight, setCollapsedContentHeight] = useState(collapsedHeight);
|
|
25
36
|
useEffect(() => {
|
|
26
37
|
if (typeof isOpen === 'boolean') {
|
|
27
38
|
setInternalIsOpen(isOpen);
|
|
@@ -46,7 +57,9 @@ const Truncation = ({
|
|
|
46
57
|
if (!contentRef.current) {
|
|
47
58
|
return;
|
|
48
59
|
}
|
|
49
|
-
|
|
60
|
+
const measuredContentHeight = Math.max(pendingObservedHeight.current, contentRef.current.scrollHeight, contentRef.current.getBoundingClientRect().height);
|
|
61
|
+
setContentHeight(measuredContentHeight);
|
|
62
|
+
setCollapsedContentHeight(getHeightAtLineBoundary(contentRef.current, collapsedHeight, measuredContentHeight));
|
|
50
63
|
pendingObservedHeight.current = 0;
|
|
51
64
|
});
|
|
52
65
|
};
|
|
@@ -66,7 +79,7 @@ const Truncation = ({
|
|
|
66
79
|
window.cancelAnimationFrame(frame);
|
|
67
80
|
}
|
|
68
81
|
};
|
|
69
|
-
}, [children]);
|
|
82
|
+
}, [children, collapsedHeight]);
|
|
70
83
|
const handleClampClick = useCallback(event => {
|
|
71
84
|
setInternalIsOpen(current => {
|
|
72
85
|
onChange?.(event, !current);
|
|
@@ -85,8 +98,7 @@ const Truncation = ({
|
|
|
85
98
|
const internalLessLabel = lessLabel ?? /*#__PURE__*/React.createElement(Translation, {
|
|
86
99
|
textString: textStrings.components.truncation.less
|
|
87
100
|
});
|
|
88
|
-
const
|
|
89
|
-
const targetHeight = internalIsOpen ? contentHeight || collapsedHeight : collapsedContentHeight;
|
|
101
|
+
const targetHeight = internalIsOpen ? contentHeight || collapsedHeight : Math.min(contentHeight || collapsedHeight, collapsedContentHeight);
|
|
90
102
|
return /*#__PURE__*/React.createElement(StyledTruncation, {
|
|
91
103
|
className: "beta-chayns-truncation"
|
|
92
104
|
}, /*#__PURE__*/React.createElement(StyledMotionTruncationContent, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Truncation.js","names":["TextStringProviderSSR","Translation","React","useCallback","useEffect","useLayoutEffect","useRef","useState","textStrings","useFocusRingPortal","useKeyboardFocusHighlighting","ClampPosition","StyledMotionTruncationContent","StyledTruncation","StyledTruncationClamp","StyledTruncationClampFocusWrapper","StyledTruncationClampWrapper","StyledTruncationContent","useIsomorphicLayoutEffect","window","Truncation","collapsedHeight","clampPosition","Right","isOpen","lessLabel","moreLabel","onChange","children","shouldEnableKeyboardHighlighting","shouldShowKeyboardHighlighting","contentRef","clampRef","pendingObservedHeight","internalIsOpen","setInternalIsOpen","Boolean","contentHeight","setContentHeight","hasOverflow","isEnabled","current","frame","updateContentHeight","entries","Math","max","contentRect","height","undefined","requestAnimationFrame","scrollHeight","getBoundingClientRect","resizeObserver","ResizeObserver","mutationObserver","MutationObserver","observe","characterData","childList","subtree","disconnect","cancelAnimationFrame","handleClampClick","event","handleClampKeyDown","key","preventDefault","currentTarget","click","internalMoreLabel","createElement","textString","components","truncation","more","internalLessLabel","less","collapsedContentHeight","min","targetHeight","className","animate","initial","transition","type","duration","ref","$position","libraries","id","onClick","onKeyDown","role","tabIndex"],"sources":["../../../../src/components/truncation/Truncation.tsx"],"sourcesContent":["import { TextStringProviderSSR, Translation } from '@chayns/textstrings';\nimport React, {\n FC,\n KeyboardEventHandler,\n MouseEvent,\n MouseEventHandler,\n ReactElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport textStrings from '../../constants/textStrings';\nimport { useFocusRingPortal } from '../../hooks/useFocusRingPortal';\nimport { useKeyboardFocusHighlighting } from '../../hooks/useKeyboardFocusHighlighting';\nimport { ClampPosition } from '../../types/truncation';\nimport {\n StyledMotionTruncationContent,\n StyledTruncation,\n StyledTruncationClamp,\n StyledTruncationClampFocusWrapper,\n StyledTruncationClampWrapper,\n StyledTruncationContent,\n} from './Truncation.styles';\n\nexport type TruncationProps = {\n /**\n * The elements that should be expanding or collapsing.\n */\n children: ReactElement;\n /**\n * The position of the clamp.\n */\n clampPosition?: ClampPosition;\n /**\n * The height of the children element in its collapsed state.\n */\n collapsedHeight?: number;\n /**\n * If set to true, the content is exposed.\n */\n isOpen?: boolean;\n /**\n * A text that should be displayed if the content is expanded.\n */\n lessLabel?: string;\n /**\n * A text that should be displayed if the content is collapsed.\n */\n moreLabel?: string;\n /**\n * Function to be executed when the component is expanding or collapsing.\n */\n onChange?: (event: MouseEvent<HTMLAnchorElement>, isOpen: boolean) => void;\n /**\n * Enables keyboard-only focus highlighting.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n};\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nconst Truncation: FC<TruncationProps> = ({\n collapsedHeight = 150,\n clampPosition = ClampPosition.Right,\n isOpen,\n lessLabel,\n moreLabel,\n onChange,\n children,\n shouldEnableKeyboardHighlighting,\n}) => {\n const shouldShowKeyboardHighlighting = useKeyboardFocusHighlighting(\n shouldEnableKeyboardHighlighting,\n );\n const contentRef = useRef<HTMLDivElement>(null);\n const clampRef = useRef<HTMLAnchorElement>(null);\n const pendingObservedHeight = useRef(0);\n const [internalIsOpen, setInternalIsOpen] = useState(Boolean(isOpen));\n const [contentHeight, setContentHeight] = useState(0);\n\n useEffect(() => {\n if (typeof isOpen === 'boolean') {\n setInternalIsOpen(isOpen);\n }\n }, [isOpen]);\n\n const hasOverflow = contentHeight > collapsedHeight;\n\n useFocusRingPortal(clampRef, {\n isEnabled: shouldShowKeyboardHighlighting && hasOverflow,\n });\n\n useIsomorphicLayoutEffect(() => {\n if (!contentRef.current) {\n return () => {};\n }\n\n let frame: number | undefined;\n const updateContentHeight = (entries?: ResizeObserverEntry[]) => {\n pendingObservedHeight.current = Math.max(\n pendingObservedHeight.current,\n entries?.[0]?.contentRect.height ?? 0,\n );\n\n if (frame !== undefined) {\n return;\n }\n\n frame = window.requestAnimationFrame(() => {\n frame = undefined;\n\n if (!contentRef.current) {\n return;\n }\n\n setContentHeight(\n Math.max(\n pendingObservedHeight.current,\n contentRef.current.scrollHeight,\n contentRef.current.getBoundingClientRect().height,\n ),\n );\n pendingObservedHeight.current = 0;\n });\n };\n\n const resizeObserver = new ResizeObserver((entries) => updateContentHeight(entries));\n const mutationObserver = new MutationObserver(() => updateContentHeight());\n\n resizeObserver.observe(contentRef.current);\n mutationObserver.observe(contentRef.current, {\n characterData: true,\n childList: true,\n subtree: true,\n });\n updateContentHeight();\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n\n if (frame !== undefined) {\n window.cancelAnimationFrame(frame);\n }\n };\n }, [children]);\n\n const handleClampClick = useCallback<MouseEventHandler<HTMLAnchorElement>>(\n (event) => {\n setInternalIsOpen((current) => {\n onChange?.(event, !current);\n return !current;\n });\n },\n [onChange],\n );\n\n const handleClampKeyDown = useCallback<KeyboardEventHandler<HTMLAnchorElement>>((event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n event.currentTarget.click();\n }\n }, []);\n\n const internalMoreLabel = moreLabel ?? (\n <Translation textString={textStrings.components.truncation.more} />\n );\n const internalLessLabel = lessLabel ?? (\n <Translation textString={textStrings.components.truncation.less} />\n );\n const collapsedContentHeight = Math.min(contentHeight || collapsedHeight, collapsedHeight);\n const targetHeight = internalIsOpen ? contentHeight || collapsedHeight : collapsedContentHeight;\n\n return (\n <StyledTruncation className=\"beta-chayns-truncation\">\n <StyledMotionTruncationContent\n animate={{ height: targetHeight }}\n initial={false}\n transition={{ type: 'tween', duration: 0.2 }}\n >\n <StyledTruncationContent ref={contentRef}>{children}</StyledTruncationContent>\n </StyledMotionTruncationContent>\n {hasOverflow && (\n <StyledTruncationClampWrapper $position={clampPosition}>\n <TextStringProviderSSR libraries=\"chayns-components-v5-core\" id=\"truncation\">\n <StyledTruncationClampFocusWrapper>\n <StyledTruncationClamp\n ref={clampRef}\n onClick={handleClampClick}\n onKeyDown={handleClampKeyDown}\n role=\"button\"\n tabIndex={0}\n >\n {internalIsOpen ? internalLessLabel : internalMoreLabel}\n </StyledTruncationClamp>\n </StyledTruncationClampFocusWrapper>\n </TextStringProviderSSR>\n </StyledTruncationClampWrapper>\n )}\n </StyledTruncation>\n );\n};\n\nexport default Truncation;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"Truncation.js","names":["TextStringProviderSSR","Translation","React","useCallback","useEffect","useLayoutEffect","useRef","useState","textStrings","useFocusRingPortal","useKeyboardFocusHighlighting","ClampPosition","StyledMotionTruncationContent","StyledTruncation","StyledTruncationClamp","StyledTruncationClampFocusWrapper","StyledTruncationClampWrapper","StyledTruncationContent","useIsomorphicLayoutEffect","window","getHeightAtLineBoundary","element","height","contentHeight","elementTop","getBoundingClientRect","top","targetBottom","range","ownerDocument","createRange","selectNodeContents","lineRects","getClientRects","Array","from","lineBottom","map","rect","bottom","filter","sort","first","second","detach","undefined","Math","min","Truncation","collapsedHeight","clampPosition","Right","isOpen","lessLabel","moreLabel","onChange","children","shouldEnableKeyboardHighlighting","shouldShowKeyboardHighlighting","contentRef","clampRef","pendingObservedHeight","internalIsOpen","setInternalIsOpen","Boolean","setContentHeight","collapsedContentHeight","setCollapsedContentHeight","hasOverflow","isEnabled","current","frame","updateContentHeight","entries","max","contentRect","requestAnimationFrame","measuredContentHeight","scrollHeight","resizeObserver","ResizeObserver","mutationObserver","MutationObserver","observe","characterData","childList","subtree","disconnect","cancelAnimationFrame","handleClampClick","event","handleClampKeyDown","key","preventDefault","currentTarget","click","internalMoreLabel","createElement","textString","components","truncation","more","internalLessLabel","less","targetHeight","className","animate","initial","transition","type","duration","ref","$position","libraries","id","onClick","onKeyDown","role","tabIndex"],"sources":["../../../../src/components/truncation/Truncation.tsx"],"sourcesContent":["import { TextStringProviderSSR, Translation } from '@chayns/textstrings';\nimport React, {\n FC,\n KeyboardEventHandler,\n MouseEvent,\n MouseEventHandler,\n ReactElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport textStrings from '../../constants/textStrings';\nimport { useFocusRingPortal } from '../../hooks/useFocusRingPortal';\nimport { useKeyboardFocusHighlighting } from '../../hooks/useKeyboardFocusHighlighting';\nimport { ClampPosition } from '../../types/truncation';\nimport {\n StyledMotionTruncationContent,\n StyledTruncation,\n StyledTruncationClamp,\n StyledTruncationClampFocusWrapper,\n StyledTruncationClampWrapper,\n StyledTruncationContent,\n} from './Truncation.styles';\n\nexport type TruncationProps = {\n /**\n * The elements that should be expanding or collapsing.\n */\n children: ReactElement;\n /**\n * The position of the clamp.\n */\n clampPosition?: ClampPosition;\n /**\n * The height of the children element in its collapsed state.\n */\n collapsedHeight?: number;\n /**\n * If set to true, the content is exposed.\n */\n isOpen?: boolean;\n /**\n * A text that should be displayed if the content is expanded.\n */\n lessLabel?: string;\n /**\n * A text that should be displayed if the content is collapsed.\n */\n moreLabel?: string;\n /**\n * Function to be executed when the component is expanding or collapsing.\n */\n onChange?: (event: MouseEvent<HTMLAnchorElement>, isOpen: boolean) => void;\n /**\n * Enables keyboard-only focus highlighting.\n */\n shouldEnableKeyboardHighlighting?: boolean;\n};\n\nconst useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\nconst getHeightAtLineBoundary = (element: HTMLElement, height: number, contentHeight: number) => {\n const elementTop = element.getBoundingClientRect().top;\n const targetBottom = elementTop + height;\n const range = element.ownerDocument.createRange();\n\n range.selectNodeContents(element);\n\n const lineRects =\n typeof range.getClientRects === 'function' ? Array.from(range.getClientRects()) : [];\n const lineBottom = lineRects\n .map((rect) => rect.bottom)\n .filter((bottom) => bottom >= targetBottom)\n .sort((first, second) => first - second)[0];\n\n range.detach();\n\n return lineBottom === undefined\n ? Math.min(contentHeight, height)\n : Math.min(contentHeight, lineBottom - elementTop);\n};\n\nconst Truncation: FC<TruncationProps> = ({\n collapsedHeight = 150,\n clampPosition = ClampPosition.Right,\n isOpen,\n lessLabel,\n moreLabel,\n onChange,\n children,\n shouldEnableKeyboardHighlighting,\n}) => {\n const shouldShowKeyboardHighlighting = useKeyboardFocusHighlighting(\n shouldEnableKeyboardHighlighting,\n );\n const contentRef = useRef<HTMLDivElement>(null);\n const clampRef = useRef<HTMLAnchorElement>(null);\n const pendingObservedHeight = useRef(0);\n const [internalIsOpen, setInternalIsOpen] = useState(Boolean(isOpen));\n const [contentHeight, setContentHeight] = useState(0);\n const [collapsedContentHeight, setCollapsedContentHeight] = useState(collapsedHeight);\n\n useEffect(() => {\n if (typeof isOpen === 'boolean') {\n setInternalIsOpen(isOpen);\n }\n }, [isOpen]);\n\n const hasOverflow = contentHeight > collapsedHeight;\n\n useFocusRingPortal(clampRef, {\n isEnabled: shouldShowKeyboardHighlighting && hasOverflow,\n });\n\n useIsomorphicLayoutEffect(() => {\n if (!contentRef.current) {\n return () => {};\n }\n\n let frame: number | undefined;\n const updateContentHeight = (entries?: ResizeObserverEntry[]) => {\n pendingObservedHeight.current = Math.max(\n pendingObservedHeight.current,\n entries?.[0]?.contentRect.height ?? 0,\n );\n\n if (frame !== undefined) {\n return;\n }\n\n frame = window.requestAnimationFrame(() => {\n frame = undefined;\n\n if (!contentRef.current) {\n return;\n }\n\n const measuredContentHeight = Math.max(\n pendingObservedHeight.current,\n contentRef.current.scrollHeight,\n contentRef.current.getBoundingClientRect().height,\n );\n\n setContentHeight(measuredContentHeight);\n setCollapsedContentHeight(\n getHeightAtLineBoundary(\n contentRef.current,\n collapsedHeight,\n measuredContentHeight,\n ),\n );\n pendingObservedHeight.current = 0;\n });\n };\n\n const resizeObserver = new ResizeObserver((entries) => updateContentHeight(entries));\n const mutationObserver = new MutationObserver(() => updateContentHeight());\n\n resizeObserver.observe(contentRef.current);\n mutationObserver.observe(contentRef.current, {\n characterData: true,\n childList: true,\n subtree: true,\n });\n updateContentHeight();\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n\n if (frame !== undefined) {\n window.cancelAnimationFrame(frame);\n }\n };\n }, [children, collapsedHeight]);\n\n const handleClampClick = useCallback<MouseEventHandler<HTMLAnchorElement>>(\n (event) => {\n setInternalIsOpen((current) => {\n onChange?.(event, !current);\n return !current;\n });\n },\n [onChange],\n );\n\n const handleClampKeyDown = useCallback<KeyboardEventHandler<HTMLAnchorElement>>((event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n event.currentTarget.click();\n }\n }, []);\n\n const internalMoreLabel = moreLabel ?? (\n <Translation textString={textStrings.components.truncation.more} />\n );\n const internalLessLabel = lessLabel ?? (\n <Translation textString={textStrings.components.truncation.less} />\n );\n const targetHeight = internalIsOpen\n ? contentHeight || collapsedHeight\n : Math.min(contentHeight || collapsedHeight, collapsedContentHeight);\n\n return (\n <StyledTruncation className=\"beta-chayns-truncation\">\n <StyledMotionTruncationContent\n animate={{ height: targetHeight }}\n initial={false}\n transition={{ type: 'tween', duration: 0.2 }}\n >\n <StyledTruncationContent ref={contentRef}>{children}</StyledTruncationContent>\n </StyledMotionTruncationContent>\n {hasOverflow && (\n <StyledTruncationClampWrapper $position={clampPosition}>\n <TextStringProviderSSR libraries=\"chayns-components-v5-core\" id=\"truncation\">\n <StyledTruncationClampFocusWrapper>\n <StyledTruncationClamp\n ref={clampRef}\n onClick={handleClampClick}\n onKeyDown={handleClampKeyDown}\n role=\"button\"\n tabIndex={0}\n >\n {internalIsOpen ? internalLessLabel : internalMoreLabel}\n </StyledTruncationClamp>\n </StyledTruncationClampFocusWrapper>\n </TextStringProviderSSR>\n </StyledTruncationClampWrapper>\n )}\n </StyledTruncation>\n );\n};\n\nexport default Truncation;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Truncation.test.js","names":["render","screen","waitFor","React","afterEach","describe","expect","it","vi","Truncation","mock","Translation","TextStringProvider","children","resizeObserverCallbacks","ResizeObserverMock","constructor","callback","push","disconnect","observe","unobserve","stubGlobal","triggerResize","height","forEach","contentRect","length","createElement","collapsedHeight","getByRole","name","toBeInTheDocument","queryByRole","not"],"sources":["../../../../src/components/truncation/Truncation.test.tsx"],"sourcesContent":["import { render, screen, waitFor } from '@testing-library/react';\nimport React from 'react';\nimport { afterEach, describe, expect, it, vi } from 'vitest';\nimport Truncation from './Truncation';\n\nvi.mock('@chayns/textstrings', () => ({\n Translation: () => 'Mehr anzeigen',\n TextStringProvider: ({ children }: { children: React.ReactNode }) => children,\n}));\n\ntype ResizeObserverCallback = (entries: ResizeObserverEntry[]) => void;\n\nconst resizeObserverCallbacks: ResizeObserverCallback[] = [];\n\nclass ResizeObserverMock {\n constructor(callback: ResizeObserverCallback) {\n resizeObserverCallbacks.push(callback);\n }\n\n disconnect() {}\n\n observe() {}\n\n unobserve() {}\n}\n\nvi.stubGlobal('ResizeObserver', ResizeObserverMock);\n\nconst triggerResize = (height: number) => {\n resizeObserverCallbacks.forEach((callback) => {\n callback([\n {\n contentRect: { height } as DOMRectReadOnly,\n } as ResizeObserverEntry,\n ]);\n });\n};\n\nafterEach(() => {\n resizeObserverCallbacks.length = 0;\n});\n\ndescribe('Truncation', () => {\n it('shows the more action when content exceeds the collapsed height', async () => {\n render(\n <Truncation collapsedHeight={100}>\n <div>Long content</div>\n </Truncation>,\n );\n\n triggerResize(240);\n\n await waitFor(() => {\n expect(screen.getByRole('button', { name: 'Mehr anzeigen' })).toBeInTheDocument();\n });\n });\n\n it('keeps short content expanded without a more action', async () => {\n render(\n <Truncation collapsedHeight={100}>\n <div>Short content</div>\n </Truncation>,\n );\n\n triggerResize(64);\n\n await waitFor(() => {\n expect(screen.queryByRole('button', { name: 'Mehr anzeigen' })).not.toBeInTheDocument();\n });\n });\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,MAAM,EAAEC,OAAO,QAAQ,wBAAwB;AAChE,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,QAAQ;AAC5D,OAAOC,UAAU,MAAM,cAAc;AAErCD,EAAE,CAACE,IAAI,CAAC,qBAAqB,EAAE,OAAO;EAClCC,WAAW,EAAEA,CAAA,KAAM,eAAe;EAClCC,kBAAkB,EAAEA,CAAC;IAAEC;EAAwC,CAAC,KAAKA;
|
|
1
|
+
{"version":3,"file":"Truncation.test.js","names":["render","screen","waitFor","React","afterEach","describe","expect","it","vi","Truncation","mock","Translation","TextStringProvider","children","TextStringProviderSSR","resizeObserverCallbacks","ResizeObserverMock","constructor","callback","push","disconnect","observe","unobserve","stubGlobal","triggerResize","height","forEach","contentRect","length","createElement","collapsedHeight","getByRole","name","toBeInTheDocument","queryByRole","not"],"sources":["../../../../src/components/truncation/Truncation.test.tsx"],"sourcesContent":["import { render, screen, waitFor } from '@testing-library/react';\nimport React from 'react';\nimport { afterEach, describe, expect, it, vi } from 'vitest';\nimport Truncation from './Truncation';\n\nvi.mock('@chayns/textstrings', () => ({\n Translation: () => 'Mehr anzeigen',\n TextStringProvider: ({ children }: { children: React.ReactNode }) => children,\n TextStringProviderSSR: ({ children }: { children: React.ReactNode }) => children,\n}));\n\ntype ResizeObserverCallback = (entries: ResizeObserverEntry[]) => void;\n\nconst resizeObserverCallbacks: ResizeObserverCallback[] = [];\n\nclass ResizeObserverMock {\n constructor(callback: ResizeObserverCallback) {\n resizeObserverCallbacks.push(callback);\n }\n\n disconnect() {}\n\n observe() {}\n\n unobserve() {}\n}\n\nvi.stubGlobal('ResizeObserver', ResizeObserverMock);\n\nconst triggerResize = (height: number) => {\n resizeObserverCallbacks.forEach((callback) => {\n callback([\n {\n contentRect: { height } as DOMRectReadOnly,\n } as ResizeObserverEntry,\n ]);\n });\n};\n\nafterEach(() => {\n resizeObserverCallbacks.length = 0;\n});\n\ndescribe('Truncation', () => {\n it('shows the more action when content exceeds the collapsed height', async () => {\n render(\n <Truncation collapsedHeight={100}>\n <div>Long content</div>\n </Truncation>,\n );\n\n triggerResize(240);\n\n await waitFor(() => {\n expect(screen.getByRole('button', { name: 'Mehr anzeigen' })).toBeInTheDocument();\n });\n });\n\n it('keeps short content expanded without a more action', async () => {\n render(\n <Truncation collapsedHeight={100}>\n <div>Short content</div>\n </Truncation>,\n );\n\n triggerResize(64);\n\n await waitFor(() => {\n expect(screen.queryByRole('button', { name: 'Mehr anzeigen' })).not.toBeInTheDocument();\n });\n });\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,MAAM,EAAEC,OAAO,QAAQ,wBAAwB;AAChE,OAAOC,KAAK,MAAM,OAAO;AACzB,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,QAAQ;AAC5D,OAAOC,UAAU,MAAM,cAAc;AAErCD,EAAE,CAACE,IAAI,CAAC,qBAAqB,EAAE,OAAO;EAClCC,WAAW,EAAEA,CAAA,KAAM,eAAe;EAClCC,kBAAkB,EAAEA,CAAC;IAAEC;EAAwC,CAAC,KAAKA,QAAQ;EAC7EC,qBAAqB,EAAEA,CAAC;IAAED;EAAwC,CAAC,KAAKA;AAC5E,CAAC,CAAC,CAAC;AAIH,MAAME,uBAAiD,GAAG,EAAE;AAE5D,MAAMC,kBAAkB,CAAC;EACrBC,WAAWA,CAACC,QAAgC,EAAE;IAC1CH,uBAAuB,CAACI,IAAI,CAACD,QAAQ,CAAC;EAC1C;EAEAE,UAAUA,CAAA,EAAG,CAAC;EAEdC,OAAOA,CAAA,EAAG,CAAC;EAEXC,SAASA,CAAA,EAAG,CAAC;AACjB;AAEAd,EAAE,CAACe,UAAU,CAAC,gBAAgB,EAAEP,kBAAkB,CAAC;AAEnD,MAAMQ,aAAa,GAAIC,MAAc,IAAK;EACtCV,uBAAuB,CAACW,OAAO,CAAER,QAAQ,IAAK;IAC1CA,QAAQ,CAAC,CACL;MACIS,WAAW,EAAE;QAAEF;MAAO;IAC1B,CAAC,CACJ,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAEDrB,SAAS,CAAC,MAAM;EACZW,uBAAuB,CAACa,MAAM,GAAG,CAAC;AACtC,CAAC,CAAC;AAEFvB,QAAQ,CAAC,YAAY,EAAE,MAAM;EACzBE,EAAE,CAAC,iEAAiE,EAAE,YAAY;IAC9EP,MAAM,cACFG,KAAA,CAAA0B,aAAA,CAACpB,UAAU;MAACqB,eAAe,EAAE;IAAI,gBAC7B3B,KAAA,CAAA0B,aAAA,cAAK,cAAiB,CACd,CAChB,CAAC;IAEDL,aAAa,CAAC,GAAG,CAAC;IAElB,MAAMtB,OAAO,CAAC,MAAM;MAChBI,MAAM,CAACL,MAAM,CAAC8B,SAAS,CAAC,QAAQ,EAAE;QAAEC,IAAI,EAAE;MAAgB,CAAC,CAAC,CAAC,CAACC,iBAAiB,CAAC,CAAC;IACrF,CAAC,CAAC;EACN,CAAC,CAAC;EAEF1B,EAAE,CAAC,oDAAoD,EAAE,YAAY;IACjEP,MAAM,cACFG,KAAA,CAAA0B,aAAA,CAACpB,UAAU;MAACqB,eAAe,EAAE;IAAI,gBAC7B3B,KAAA,CAAA0B,aAAA,cAAK,eAAkB,CACf,CAChB,CAAC;IAEDL,aAAa,CAAC,EAAE,CAAC;IAEjB,MAAMtB,OAAO,CAAC,MAAM;MAChBI,MAAM,CAACL,MAAM,CAACiC,WAAW,CAAC,QAAQ,EAAE;QAAEF,IAAI,EAAE;MAAgB,CAAC,CAAC,CAAC,CAACG,GAAG,CAACF,iBAAiB,CAAC,CAAC;IAC3F,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC,CAAC","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
|