@chayns-components/core 5.0.0-beta.523 → 5.0.0-beta.525
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/lib/components/search-box/SearchBox.js +11 -3
- package/lib/components/search-box/SearchBox.js.map +1 -1
- package/lib/components/setup-wizard/setup-wizard-item/SetupWizardItem.js +14 -3
- package/lib/components/setup-wizard/setup-wizard-item/SetupWizardItem.js.map +1 -1
- package/package.json +2 -2
|
@@ -101,10 +101,14 @@ const SearchBox = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
101
101
|
*/
|
|
102
102
|
const handleFocus = useCallback(() => {
|
|
103
103
|
if (shouldShowContentOnEmptyInput) {
|
|
104
|
-
|
|
104
|
+
const newMatchingItems = searchList({
|
|
105
105
|
items: list,
|
|
106
106
|
searchString: value
|
|
107
|
-
})
|
|
107
|
+
});
|
|
108
|
+
if (newMatchingItems.length === 1 && newMatchingItems[0]?.text === value) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
setMatchingItems(newMatchingItems);
|
|
108
112
|
setIsAnimating(true);
|
|
109
113
|
}
|
|
110
114
|
}, [list, shouldShowContentOnEmptyInput, value]);
|
|
@@ -114,6 +118,9 @@ const SearchBox = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
114
118
|
items: list,
|
|
115
119
|
searchString: value
|
|
116
120
|
});
|
|
121
|
+
if (newMatchingItems.length === 1 && newMatchingItems[0]?.text === value) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
117
124
|
if (shouldShowContentOnEmptyInput || value !== '') {
|
|
118
125
|
setMatchingItems(newMatchingItems);
|
|
119
126
|
setIsAnimating(newMatchingItems.length !== 0);
|
|
@@ -129,7 +136,7 @@ const SearchBox = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
129
136
|
items: list,
|
|
130
137
|
searchString: event.target.value
|
|
131
138
|
});
|
|
132
|
-
if (!shouldShowContentOnEmptyInput && !event.target.value) {
|
|
139
|
+
if (!shouldShowContentOnEmptyInput && !event.target.value || searchedItems.length === 1 && searchedItems[0]?.text === event.target.value) {
|
|
133
140
|
setMatchingItems([]);
|
|
134
141
|
} else {
|
|
135
142
|
setMatchingItems(searchedItems);
|
|
@@ -156,6 +163,7 @@ const SearchBox = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
156
163
|
const handleSelect = useCallback(item => {
|
|
157
164
|
setValue(item.text);
|
|
158
165
|
setIsAnimating(false);
|
|
166
|
+
setMatchingItems([]);
|
|
159
167
|
if (typeof onSelect === 'function') {
|
|
160
168
|
onSelect(item);
|
|
161
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchBox.js","names":["getDevice","AnimatePresence","React","forwardRef","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","calculateContentHeight","searchList","Input","SearchBoxItem","StyledMotionSearchBoxBody","StyledSearchBox","SearchBox","_ref","ref","placeholder","list","onChange","onBlur","onSelect","selectedId","shouldShowRoundImage","shouldShowContentOnEmptyInput","matchingItems","setMatchingItems","value","setValue","isAnimating","setIsAnimating","height","setHeight","width","setWidth","focusedIndex","setFocusedIndex","boxRef","contentRef","inputRef","browser","handleOutsideClick","event","current","contains","target","document","addEventListener","window","removeEventListener","textArray","map","_ref2","text","input","getElementById","offsetWidth","selectedItem","find","_ref3","id","handleFocus","items","searchString","newMatchingItems","length","handleChange","searchedItems","handleBlur","handleSelect","item","content","sort","a","b","localeCompare","forEach","_ref4","imageUrl","push","createElement","key","handleKeyDown","e","preventDefault","children","newIndex","prevElement","tabIndex","newElement","focus","element","textContent","replace","handleKeyPress","keyCode","clear","onFocus","initial","$browser","name","$height","$width","opacity","animate","transition","duration","type","displayName"],"sources":["../../../src/components/search-box/SearchBox.tsx"],"sourcesContent":["import { getDevice } from 'chayns-api';\nimport { AnimatePresence } from 'framer-motion';\nimport React, {\n ChangeEvent,\n ChangeEventHandler,\n FC,\n FocusEvent,\n FocusEventHandler,\n forwardRef,\n ReactElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ISearchBoxItem } from '../../types/searchBox';\nimport { calculateContentHeight } from '../../utils/calculate';\nimport { searchList } from '../../utils/searchBox';\nimport Input from '../input/Input';\nimport SearchBoxItem from './search-box-item/SearchBoxItem';\nimport { StyledMotionSearchBoxBody, StyledSearchBox } from './SearchBox.styles';\n\nexport type SearchBoxRef = {\n clear: VoidFunction;\n};\n\nexport type SearchBoxProps = {\n /**\n * A list of items that can be searched.\n */\n list: ISearchBoxItem[];\n /**\n * The placeholder that should be displayed.\n */\n placeholder?: string;\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 to be executed when an item is selected.\n */\n onSelect?: (item: ISearchBoxItem) => void;\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 * Whether the full list of items should be displayed if the input is empty.\n */\n shouldShowContentOnEmptyInput?: boolean;\n /**\n * If true, the images of the items are displayed in a round shape.\n */\n shouldShowRoundImage?: boolean;\n};\n\nconst SearchBox: FC<SearchBoxProps> = forwardRef<SearchBoxRef, SearchBoxProps>(\n (\n {\n placeholder,\n list,\n onChange,\n onBlur,\n onSelect,\n selectedId,\n shouldShowRoundImage,\n shouldShowContentOnEmptyInput = true,\n },\n ref,\n ) => {\n const [matchingItems, setMatchingItems] = useState<ISearchBoxItem[]>([]);\n const [value, setValue] = useState('');\n const [isAnimating, setIsAnimating] = useState(false);\n const [height, setHeight] = useState<number>(0);\n const [width, setWidth] = useState(0);\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n\n const boxRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const { browser } = getDevice();\n\n /**\n * This function closes the list of items\n */\n const handleOutsideClick = useCallback(\n (event: MouseEvent) => {\n if (boxRef.current && !boxRef.current.contains(event.target as Node)) {\n setIsAnimating(false);\n }\n },\n [boxRef],\n );\n\n /**\n * This hook listens for clicks\n */\n useEffect(() => {\n document.addEventListener('click', handleOutsideClick);\n window.addEventListener('blur', () => setIsAnimating(false));\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n };\n }, [handleOutsideClick, boxRef]);\n\n /**\n * This hook calculates the height\n */\n useEffect(() => {\n const textArray = list.map(({ text }) => text);\n\n setHeight(calculateContentHeight(textArray));\n }, [list, placeholder]);\n\n /**\n * This hook calculates the width\n */\n useEffect(() => {\n const input = document.getElementById('search_box_input');\n\n if (input) {\n setWidth(input.offsetWidth);\n }\n }, []);\n\n useEffect(() => {\n if (selectedId) {\n const selectedItem = list.find(({ id }) => id === selectedId);\n\n if (selectedItem) {\n setValue(selectedItem.text);\n }\n }\n }, [list, selectedId]);\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) {\n setValue('');\n }\n }, [selectedId]);\n\n /**\n * This function sets the items on focus if shouldShowContentOnEmptyInput\n */\n const handleFocus = useCallback(() => {\n if (shouldShowContentOnEmptyInput) {\n setMatchingItems(searchList({ items: list, searchString: value }));\n setIsAnimating(true);\n }\n }, [list, shouldShowContentOnEmptyInput, value]);\n\n useEffect(() => {\n if (list) {\n const newMatchingItems = searchList({ items: list, searchString: value });\n\n if (shouldShowContentOnEmptyInput || value !== '') {\n setMatchingItems(newMatchingItems);\n setIsAnimating(newMatchingItems.length !== 0);\n }\n }\n }, [list, shouldShowContentOnEmptyInput, value]);\n\n /**\n * This function handles changes of the input\n */\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const searchedItems = searchList({ items: list, searchString: event.target.value });\n\n if (!shouldShowContentOnEmptyInput && !event.target.value) {\n setMatchingItems([]);\n } else {\n setMatchingItems(searchedItems);\n setIsAnimating(searchedItems.length !== 0);\n }\n\n setValue(event.target.value);\n\n if (typeof onChange === 'function') {\n onChange(event);\n }\n },\n [list, onChange, shouldShowContentOnEmptyInput],\n );\n\n /**\n * This function handles the blur event of the input\n */\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (typeof onBlur === 'function') {\n onBlur(event);\n }\n },\n [onBlur],\n );\n\n /**\n * This function handles the item selection\n */\n const handleSelect = useCallback(\n (item: ISearchBoxItem) => {\n setValue(item.text);\n setIsAnimating(false);\n\n if (typeof onSelect === 'function') {\n onSelect(item);\n }\n },\n [onSelect],\n );\n\n const content = useMemo(() => {\n const items: ReactElement[] = [];\n\n matchingItems.sort((a, b) => a.text.localeCompare(b.text));\n\n matchingItems.forEach(({ id, text, imageUrl }) => {\n items.push(\n <SearchBoxItem\n key={id}\n text={text}\n imageUrl={imageUrl}\n id={id}\n shouldShowRoundImage={shouldShowRoundImage}\n onSelect={handleSelect}\n />,\n );\n });\n\n return items;\n }, [shouldShowRoundImage, handleSelect, matchingItems]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const children = contentRef.current?.children;\n if (children && children.length > 0) {\n const newIndex =\n focusedIndex !== null\n ? (focusedIndex +\n (e.key === 'ArrowUp' ? -1 : 1) +\n children.length) %\n children.length\n : 0;\n\n if (focusedIndex !== null) {\n const prevElement = children[focusedIndex] as HTMLDivElement;\n prevElement.tabIndex = -1;\n }\n\n setFocusedIndex(newIndex);\n\n const newElement = children[newIndex] as HTMLDivElement;\n newElement.tabIndex = 0;\n newElement.focus();\n }\n } else if (e.key === 'Enter' && focusedIndex !== null) {\n const element = contentRef.current?.children[focusedIndex];\n\n if (!element) {\n return;\n }\n\n const { id, textContent } = element;\n\n handleSelect({\n id: id.replace('search-box-item__', ''),\n text: textContent ?? '',\n });\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [focusedIndex, handleSelect]);\n\n const handleKeyPress = useCallback((event: KeyboardEvent) => {\n if (event.keyCode === 27) {\n setMatchingItems([]);\n }\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n clear: () => setValue(''),\n }),\n [],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyPress);\n\n return () => {\n document.addEventListener('keydown', handleKeyPress);\n };\n }, [handleKeyPress]);\n\n return useMemo(\n () => (\n <StyledSearchBox ref={boxRef}>\n <div id=\"search_box_input\">\n <Input\n ref={inputRef}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n placeholder={placeholder}\n value={value}\n />\n </div>\n <AnimatePresence initial={false}>\n <StyledMotionSearchBoxBody\n $browser={browser?.name}\n key=\"content\"\n $height={height}\n $width={width}\n initial={{ height: 0, opacity: 0 }}\n animate={\n isAnimating\n ? { height: 'fit-content', opacity: 1 }\n : { height: 0, opacity: 0 }\n }\n transition={{\n duration: 0.2,\n type: 'tween',\n }}\n >\n <div ref={contentRef}>{content}</div>\n </StyledMotionSearchBoxBody>\n </AnimatePresence>\n </StyledSearchBox>\n ),\n [\n browser?.name,\n content,\n handleBlur,\n handleChange,\n handleFocus,\n height,\n isAnimating,\n placeholder,\n value,\n width,\n ],\n );\n },\n);\n\nSearchBox.displayName = 'SearchBox';\n\nexport default SearchBox;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SearchBox.js","names":["getDevice","AnimatePresence","React","forwardRef","useCallback","useEffect","useImperativeHandle","useMemo","useRef","useState","calculateContentHeight","searchList","Input","SearchBoxItem","StyledMotionSearchBoxBody","StyledSearchBox","SearchBox","_ref","ref","placeholder","list","onChange","onBlur","onSelect","selectedId","shouldShowRoundImage","shouldShowContentOnEmptyInput","matchingItems","setMatchingItems","value","setValue","isAnimating","setIsAnimating","height","setHeight","width","setWidth","focusedIndex","setFocusedIndex","boxRef","contentRef","inputRef","browser","handleOutsideClick","event","current","contains","target","document","addEventListener","window","removeEventListener","textArray","map","_ref2","text","input","getElementById","offsetWidth","selectedItem","find","_ref3","id","handleFocus","newMatchingItems","items","searchString","length","handleChange","searchedItems","handleBlur","handleSelect","item","content","sort","a","b","localeCompare","forEach","_ref4","imageUrl","push","createElement","key","handleKeyDown","e","preventDefault","children","newIndex","prevElement","tabIndex","newElement","focus","element","textContent","replace","handleKeyPress","keyCode","clear","onFocus","initial","$browser","name","$height","$width","opacity","animate","transition","duration","type","displayName"],"sources":["../../../src/components/search-box/SearchBox.tsx"],"sourcesContent":["import { getDevice } from 'chayns-api';\nimport { AnimatePresence } from 'framer-motion';\nimport React, {\n ChangeEvent,\n ChangeEventHandler,\n FC,\n FocusEvent,\n FocusEventHandler,\n forwardRef,\n ReactElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ISearchBoxItem } from '../../types/searchBox';\nimport { calculateContentHeight } from '../../utils/calculate';\nimport { searchList } from '../../utils/searchBox';\nimport Input from '../input/Input';\nimport SearchBoxItem from './search-box-item/SearchBoxItem';\nimport { StyledMotionSearchBoxBody, StyledSearchBox } from './SearchBox.styles';\n\nexport type SearchBoxRef = {\n clear: VoidFunction;\n};\n\nexport type SearchBoxProps = {\n /**\n * A list of items that can be searched.\n */\n list: ISearchBoxItem[];\n /**\n * The placeholder that should be displayed.\n */\n placeholder?: string;\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 to be executed when an item is selected.\n */\n onSelect?: (item: ISearchBoxItem) => void;\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 * Whether the full list of items should be displayed if the input is empty.\n */\n shouldShowContentOnEmptyInput?: boolean;\n /**\n * If true, the images of the items are displayed in a round shape.\n */\n shouldShowRoundImage?: boolean;\n};\n\nconst SearchBox: FC<SearchBoxProps> = forwardRef<SearchBoxRef, SearchBoxProps>(\n (\n {\n placeholder,\n list,\n onChange,\n onBlur,\n onSelect,\n selectedId,\n shouldShowRoundImage,\n shouldShowContentOnEmptyInput = true,\n },\n ref,\n ) => {\n const [matchingItems, setMatchingItems] = useState<ISearchBoxItem[]>([]);\n const [value, setValue] = useState('');\n const [isAnimating, setIsAnimating] = useState(false);\n const [height, setHeight] = useState<number>(0);\n const [width, setWidth] = useState(0);\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n\n const boxRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const { browser } = getDevice();\n\n /**\n * This function closes the list of items\n */\n const handleOutsideClick = useCallback(\n (event: MouseEvent) => {\n if (boxRef.current && !boxRef.current.contains(event.target as Node)) {\n setIsAnimating(false);\n }\n },\n [boxRef],\n );\n\n /**\n * This hook listens for clicks\n */\n useEffect(() => {\n document.addEventListener('click', handleOutsideClick);\n window.addEventListener('blur', () => setIsAnimating(false));\n\n return () => {\n document.removeEventListener('click', handleOutsideClick);\n };\n }, [handleOutsideClick, boxRef]);\n\n /**\n * This hook calculates the height\n */\n useEffect(() => {\n const textArray = list.map(({ text }) => text);\n\n setHeight(calculateContentHeight(textArray));\n }, [list, placeholder]);\n\n /**\n * This hook calculates the width\n */\n useEffect(() => {\n const input = document.getElementById('search_box_input');\n\n if (input) {\n setWidth(input.offsetWidth);\n }\n }, []);\n\n useEffect(() => {\n if (selectedId) {\n const selectedItem = list.find(({ id }) => id === selectedId);\n\n if (selectedItem) {\n setValue(selectedItem.text);\n }\n }\n }, [list, selectedId]);\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) {\n setValue('');\n }\n }, [selectedId]);\n\n /**\n * This function sets the items on focus if shouldShowContentOnEmptyInput\n */\n const handleFocus = useCallback(() => {\n if (shouldShowContentOnEmptyInput) {\n const newMatchingItems = searchList({ items: list, searchString: value });\n\n if (newMatchingItems.length === 1 && newMatchingItems[0]?.text === value) {\n return;\n }\n\n setMatchingItems(newMatchingItems);\n setIsAnimating(true);\n }\n }, [list, shouldShowContentOnEmptyInput, value]);\n\n useEffect(() => {\n if (list) {\n const newMatchingItems = searchList({ items: list, searchString: value });\n\n if (newMatchingItems.length === 1 && newMatchingItems[0]?.text === value) {\n return;\n }\n\n if (shouldShowContentOnEmptyInput || value !== '') {\n setMatchingItems(newMatchingItems);\n setIsAnimating(newMatchingItems.length !== 0);\n }\n }\n }, [list, shouldShowContentOnEmptyInput, value]);\n\n /**\n * This function handles changes of the input\n */\n const handleChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const searchedItems = searchList({ items: list, searchString: event.target.value });\n\n if (\n (!shouldShowContentOnEmptyInput && !event.target.value) ||\n (searchedItems.length === 1 && searchedItems[0]?.text === event.target.value)\n ) {\n setMatchingItems([]);\n } else {\n setMatchingItems(searchedItems);\n setIsAnimating(searchedItems.length !== 0);\n }\n\n setValue(event.target.value);\n\n if (typeof onChange === 'function') {\n onChange(event);\n }\n },\n [list, onChange, shouldShowContentOnEmptyInput],\n );\n\n /**\n * This function handles the blur event of the input\n */\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLInputElement>) => {\n if (typeof onBlur === 'function') {\n onBlur(event);\n }\n },\n [onBlur],\n );\n\n /**\n * This function handles the item selection\n */\n const handleSelect = useCallback(\n (item: ISearchBoxItem) => {\n setValue(item.text);\n setIsAnimating(false);\n setMatchingItems([]);\n\n if (typeof onSelect === 'function') {\n onSelect(item);\n }\n },\n [onSelect],\n );\n\n const content = useMemo(() => {\n const items: ReactElement[] = [];\n\n matchingItems.sort((a, b) => a.text.localeCompare(b.text));\n\n matchingItems.forEach(({ id, text, imageUrl }) => {\n items.push(\n <SearchBoxItem\n key={id}\n text={text}\n imageUrl={imageUrl}\n id={id}\n shouldShowRoundImage={shouldShowRoundImage}\n onSelect={handleSelect}\n />,\n );\n });\n\n return items;\n }, [shouldShowRoundImage, handleSelect, matchingItems]);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const children = contentRef.current?.children;\n if (children && children.length > 0) {\n const newIndex =\n focusedIndex !== null\n ? (focusedIndex +\n (e.key === 'ArrowUp' ? -1 : 1) +\n children.length) %\n children.length\n : 0;\n\n if (focusedIndex !== null) {\n const prevElement = children[focusedIndex] as HTMLDivElement;\n prevElement.tabIndex = -1;\n }\n\n setFocusedIndex(newIndex);\n\n const newElement = children[newIndex] as HTMLDivElement;\n newElement.tabIndex = 0;\n newElement.focus();\n }\n } else if (e.key === 'Enter' && focusedIndex !== null) {\n const element = contentRef.current?.children[focusedIndex];\n\n if (!element) {\n return;\n }\n\n const { id, textContent } = element;\n\n handleSelect({\n id: id.replace('search-box-item__', ''),\n text: textContent ?? '',\n });\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [focusedIndex, handleSelect]);\n\n const handleKeyPress = useCallback((event: KeyboardEvent) => {\n if (event.keyCode === 27) {\n setMatchingItems([]);\n }\n }, []);\n\n useImperativeHandle(\n ref,\n () => ({\n clear: () => setValue(''),\n }),\n [],\n );\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyPress);\n\n return () => {\n document.addEventListener('keydown', handleKeyPress);\n };\n }, [handleKeyPress]);\n\n return useMemo(\n () => (\n <StyledSearchBox ref={boxRef}>\n <div id=\"search_box_input\">\n <Input\n ref={inputRef}\n onChange={handleChange}\n onBlur={handleBlur}\n onFocus={handleFocus}\n placeholder={placeholder}\n value={value}\n />\n </div>\n <AnimatePresence initial={false}>\n <StyledMotionSearchBoxBody\n $browser={browser?.name}\n key=\"content\"\n $height={height}\n $width={width}\n initial={{ height: 0, opacity: 0 }}\n animate={\n isAnimating\n ? { height: 'fit-content', opacity: 1 }\n : { height: 0, opacity: 0 }\n }\n transition={{\n duration: 0.2,\n type: 'tween',\n }}\n >\n <div ref={contentRef}>{content}</div>\n </StyledMotionSearchBoxBody>\n </AnimatePresence>\n </StyledSearchBox>\n ),\n [\n browser?.name,\n content,\n handleBlur,\n handleChange,\n handleFocus,\n height,\n isAnimating,\n placeholder,\n value,\n width,\n ],\n );\n },\n);\n\nSearchBox.displayName = 'SearchBox';\n\nexport default SearchBox;\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useCallback, useContext, useMemo } from 'react';
|
|
1
|
+
import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
2
|
import Accordion from '../../accordion/Accordion';
|
|
3
3
|
import AccordionContent from '../../accordion/accordion-content/AccordionContent';
|
|
4
4
|
import Badge from '../../badge/Badge';
|
|
@@ -17,6 +17,17 @@ const SetupWizardItem = _ref => {
|
|
|
17
17
|
updateSelectedId,
|
|
18
18
|
activeId
|
|
19
19
|
} = useContext(SetupWizardContext);
|
|
20
|
+
const [shouldOpen, setShouldOpen] = useState(false);
|
|
21
|
+
const initialRender = useRef(0);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
initialRender.current++;
|
|
24
|
+
}, []);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const timeout = setTimeout(() => {
|
|
27
|
+
setShouldOpen(id === selectedId);
|
|
28
|
+
}, 5);
|
|
29
|
+
return () => clearTimeout(timeout);
|
|
30
|
+
}, [id, selectedId]);
|
|
20
31
|
const shouldBeDisabled = useMemo(() => {
|
|
21
32
|
if (typeof activeId === 'number' && activeId === id) {
|
|
22
33
|
return false;
|
|
@@ -39,10 +50,10 @@ const SetupWizardItem = _ref => {
|
|
|
39
50
|
return useMemo(() => /*#__PURE__*/React.createElement(StyledSetupWizardItem, null, /*#__PURE__*/React.createElement(Accordion, {
|
|
40
51
|
onOpen: handleAccordionOpen,
|
|
41
52
|
title: `${step}. ${title}`,
|
|
42
|
-
|
|
53
|
+
isOpened: shouldOpen,
|
|
43
54
|
isDisabled: shouldBeDisabled,
|
|
44
55
|
rightElement: rightElement
|
|
45
|
-
}, /*#__PURE__*/React.createElement(AccordionContent, null, children))), [
|
|
56
|
+
}, /*#__PURE__*/React.createElement(AccordionContent, null, children))), [handleAccordionOpen, step, title, shouldOpen, shouldBeDisabled, rightElement, children]);
|
|
46
57
|
};
|
|
47
58
|
SetupWizardItem.displayName = 'SetupWizardItem';
|
|
48
59
|
export default SetupWizardItem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupWizardItem.js","names":["React","useCallback","useContext","useMemo","Accordion","AccordionContent","Badge","Icon","SetupWizardContext","StyledSetupWizardItem","StyledSetupWizardItemBadge","SetupWizardItem","_ref","children","step","title","id","selectedId","updateSelectedId","activeId","shouldBeDisabled","rightElement","createElement","icons","handleAccordionOpen","onOpen","
|
|
1
|
+
{"version":3,"file":"SetupWizardItem.js","names":["React","useCallback","useContext","useEffect","useMemo","useRef","useState","Accordion","AccordionContent","Badge","Icon","SetupWizardContext","StyledSetupWizardItem","StyledSetupWizardItemBadge","SetupWizardItem","_ref","children","step","title","id","selectedId","updateSelectedId","activeId","shouldOpen","setShouldOpen","initialRender","current","timeout","setTimeout","clearTimeout","shouldBeDisabled","rightElement","createElement","icons","handleAccordionOpen","onOpen","isOpened","isDisabled","displayName"],"sources":["../../../../src/components/setup-wizard/setup-wizard-item/SetupWizardItem.tsx"],"sourcesContent":["import React, {\n FC,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Accordion from '../../accordion/Accordion';\nimport AccordionContent from '../../accordion/accordion-content/AccordionContent';\nimport Badge from '../../badge/Badge';\nimport Icon from '../../icon/Icon';\nimport { SetupWizardContext } from '../SetupWizard';\nimport { StyledSetupWizardItem, StyledSetupWizardItemBadge } from './SetupWizardItem.styles';\n\nexport type SetupWizardItemProps = {\n /**\n * The content that should be displayed inside the item.\n */\n children: ReactNode;\n /**\n * The id of the item.\n */\n id: number;\n /**\n * The step of the item.\n */\n step: number;\n /**\n * The title of the item.\n */\n title: string;\n};\n\nconst SetupWizardItem: FC<SetupWizardItemProps> = ({ children, step, title, id }) => {\n const { selectedId, updateSelectedId, activeId } = useContext(SetupWizardContext);\n\n const [shouldOpen, setShouldOpen] = useState<boolean>(false);\n\n const initialRender = useRef(0);\n\n useEffect(() => {\n initialRender.current++;\n }, []);\n\n useEffect(() => {\n const timeout = setTimeout(() => {\n setShouldOpen(id === selectedId);\n }, 5);\n\n return () => clearTimeout(timeout);\n }, [id, selectedId]);\n\n const shouldBeDisabled = useMemo(() => {\n if (typeof activeId === 'number' && activeId === id) {\n return false;\n }\n\n return typeof activeId === 'number' && activeId < id;\n }, [activeId, id]);\n\n const rightElement = useMemo(() => {\n if (activeId && id < activeId) {\n return (\n <Badge>\n <StyledSetupWizardItemBadge>\n <Icon icons={['ts-check']} />\n </StyledSetupWizardItemBadge>\n </Badge>\n );\n }\n\n return null;\n }, [activeId, id]);\n\n const handleAccordionOpen = useCallback(() => {\n if (typeof updateSelectedId === 'function') {\n updateSelectedId(id);\n }\n }, [id, updateSelectedId]);\n\n return useMemo(\n () => (\n <StyledSetupWizardItem>\n <Accordion\n onOpen={handleAccordionOpen}\n title={`${step}. ${title}`}\n isOpened={shouldOpen}\n isDisabled={shouldBeDisabled}\n rightElement={rightElement}\n >\n <AccordionContent>{children}</AccordionContent>\n </Accordion>\n </StyledSetupWizardItem>\n ),\n [handleAccordionOpen, step, title, shouldOpen, shouldBeDisabled, rightElement, children],\n );\n};\n\nSetupWizardItem.displayName = 'SetupWizardItem';\n\nexport default SetupWizardItem;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chayns-components/core",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.525",
|
|
4
4
|
"description": "A set of beautiful React components for developing your own applications with chayns.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"browserslist": [
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"publishConfig": {
|
|
74
74
|
"access": "public"
|
|
75
75
|
},
|
|
76
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "097b4297cc9e35ba4ed73ee212fbe7b74d7e1eb3"
|
|
77
77
|
}
|