@telia-ace/knowledge-widget-components-search 1.0.14 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +140 -221
- package/dist/index.js.map +1 -1
- package/dist/search.ffb2e6c2.js +779 -0
- package/dist/search.ffb2e6c2.js.map +1 -0
- package/package.json +11 -7
- package/dist/search.js +0 -1063
- package/dist/search.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.ffb2e6c2.js","sources":["../src/filter-badges.tsx","../src/utils.ts","../src/quick-filter-item-list.tsx","../src/quick-filter.tsx","../src/use-search.ts","../src/search.tsx"],"sourcesContent":["import {\r\n borderTabStyle,\r\n Link,\r\n SymbolBadge,\r\n Text,\r\n Tooltip,\r\n useDispatch,\r\n useEventListener,\r\n useKeyPress,\r\n useProperties,\r\n useRouteData,\r\n} from '@telia-ace/knowledge-widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useCallback, useRef, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { SearchComponentProps } from './search-component';\r\n\r\nconst FilterBadge: React.FC<any> = ({\r\n text,\r\n className,\r\n forceFocusStyle,\r\n filterType,\r\n handleClick,\r\n deleteAriaLabel = '',\r\n ...p\r\n}) => {\r\n const ref = useRef<HTMLAnchorElement>();\r\n\r\n return (\r\n <Text\r\n className={appendClassNames(className, 'humany-filter-badge')}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n handleClick(e, filterType);\r\n }\r\n }}\r\n >\r\n {text}\r\n <Link\r\n {...p}\r\n ref={ref}\r\n tabIndex={0}\r\n role=\"button\"\r\n aria-label={deleteAriaLabel.replace('{{item}}', text)}\r\n onClick={(e) => handleClick(e, filterType)}\r\n >\r\n <SymbolBadge size={13} symbol={{ type: 'Svg', content: 'close' }} />\r\n </Link>\r\n </Text>\r\n );\r\n};\r\n\r\ntype Props = {\r\n inputHasFocus: boolean;\r\n searchContainerRef: HTMLElement | null;\r\n showGuideCategory: boolean;\r\n showTag: boolean;\r\n position: 'inside' | 'below';\r\n};\r\nconst FilterBadges: React.FC<Props> = ({\r\n inputHasFocus,\r\n searchContainerRef,\r\n showTag,\r\n showGuideCategory,\r\n position,\r\n}) => {\r\n const { activeFilterBadges = {}, deleteFilterBadgeAriaLabel = '' } =\r\n useProperties<SearchComponentProps>();\r\n const dispatch = useDispatch();\r\n const { name, params } = useRouteData();\r\n const [isNavigatingWithKeyBoard, setIsNavigatingWithKeyboard] = useState(false);\r\n\r\n const onKeyDown = useCallback((event: KeyboardEvent) => {\r\n const { key } = event;\r\n\r\n if (['ArrowLeft', 'ArrowRight'].indexOf(key) === -1) {\r\n setIsNavigatingWithKeyboard(false);\r\n }\r\n }, []);\r\n\r\n useEventListener('keydown', onKeyDown, window);\r\n\r\n useEventListener('click', onKeyDown, window);\r\n\r\n const { guideCategory, tag, tooltip } = activeFilterBadges;\r\n\r\n const getFocusedFilterBadge = (container: HTMLElement) => {\r\n const badges = container.querySelectorAll(\r\n '.humany-filter-badge'\r\n ) as NodeListOf<HTMLElement>;\r\n return {\r\n badges,\r\n index: Array.from(badges).findIndex((e) => document.activeElement === e),\r\n };\r\n };\r\n\r\n const handleFilterBadgeClick = (\r\n event: React.MouseEvent | React.KeyboardEvent,\r\n filterType: string\r\n ) => {\r\n event.preventDefault();\r\n dispatch('quick-filter:remove', { types: [filterType] });\r\n };\r\n\r\n const keyboardNavigation = (\r\n direction: 'left' | 'right',\r\n inputElem: HTMLInputElement | null\r\n ) => {\r\n if (!searchContainerRef) {\r\n return;\r\n }\r\n const { badges, index: currentFocusedIndex } = getFocusedFilterBadge(searchContainerRef);\r\n\r\n if (badges.length) {\r\n let toFocus: HTMLElement | null = null;\r\n\r\n if (direction === 'left') {\r\n if (currentFocusedIndex === -1) {\r\n // if no badge is focused and direction is left\r\n // focus last badge\r\n toFocus = badges.item(badges.length - 1);\r\n } else if (currentFocusedIndex > 0) {\r\n // if there are more badges to the left, go one step back\r\n // do nothing if already focusing the most left badge\r\n toFocus = badges.item(currentFocusedIndex - 1);\r\n }\r\n } else if (direction === 'right') {\r\n if (currentFocusedIndex === badges.length - 1) {\r\n // if currently focusing the last badge, move focus to search input\r\n inputElem && inputElem.focus();\r\n } else if (badges.item(currentFocusedIndex + 1)) {\r\n toFocus = badges.item(currentFocusedIndex + 1);\r\n }\r\n }\r\n\r\n if (toFocus) {\r\n toFocus.focus();\r\n setIsNavigatingWithKeyboard(true);\r\n }\r\n }\r\n };\r\n\r\n useKeyPress(\r\n 'ArrowLeft',\r\n useCallback(() => {\r\n if (!searchContainerRef) {\r\n return;\r\n }\r\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\r\n\r\n if (inputHasFocus || focusedBadgeIndex > -1) {\r\n const inputElem: HTMLInputElement | null =\r\n searchContainerRef.querySelector('[data-type=\"search\"]');\r\n const isAtBeginningOfInput =\r\n inputElem && inputElem.selectionStart !== null && inputElem.selectionStart <= 0;\r\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\r\n\r\n if (isAtBeginningOfInput || isFocusingAFilterBadge) {\r\n keyboardNavigation('left', inputElem);\r\n }\r\n }\r\n }, [inputHasFocus, searchContainerRef])\r\n );\r\n\r\n useKeyPress(\r\n 'ArrowRight',\r\n useCallback(() => {\r\n if (!searchContainerRef) {\r\n return;\r\n }\r\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\r\n\r\n if (focusedBadgeIndex > -1) {\r\n const inputElem: HTMLInputElement | null =\r\n searchContainerRef.querySelector('[data-type=\"search\"]');\r\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\r\n\r\n if (isFocusingAFilterBadge) {\r\n keyboardNavigation('right', inputElem);\r\n }\r\n }\r\n }, [searchContainerRef])\r\n );\r\n\r\n useKeyPress(\r\n 'Backspace',\r\n useCallback(\r\n (event) => {\r\n if (!searchContainerRef) {\r\n return;\r\n }\r\n let filtersToRemove: string[] = [];\r\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\r\n\r\n const inputElem: HTMLInputElement | null =\r\n searchContainerRef.querySelector('[data-type=\"search\"]');\r\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\r\n\r\n if (isFocusingAFilterBadge) {\r\n if (focusedBadgeIndex === 0) {\r\n if (showGuideCategory) {\r\n filtersToRemove = ['guideCategory'];\r\n } else if (showTag) {\r\n filtersToRemove = ['tag'];\r\n }\r\n } else if (focusedBadgeIndex === 1) {\r\n filtersToRemove = ['tag'];\r\n }\r\n } else {\r\n const isAtBeginningOfInput =\r\n inputElem &&\r\n inputElem.selectionStart !== null &&\r\n inputElem.selectionStart <= 0;\r\n\r\n if (isAtBeginningOfInput) {\r\n if (activeFilterBadges?.tag) {\r\n filtersToRemove = ['tag'];\r\n } else if (activeFilterBadges?.guideCategory) {\r\n filtersToRemove = ['guideCategory'];\r\n }\r\n }\r\n }\r\n\r\n if (filtersToRemove.length > 0) {\r\n event.preventDefault();\r\n dispatch('quick-filter:remove', { types: filtersToRemove });\r\n }\r\n },\r\n [searchContainerRef, activeFilterBadges, showTag, showGuideCategory]\r\n )\r\n );\r\n\r\n const renderBadge = useCallback(\r\n (type: 'guideCategory' | 'tag') => {\r\n if (type === 'guideCategory' && guideCategory && showGuideCategory) {\r\n return (\r\n <StyledFilterBadge\r\n text={`@${guideCategory.title}`}\r\n routeName={name}\r\n filterType=\"guideCategory\"\r\n handleClick={handleFilterBadgeClick}\r\n forceFocusStyle={isNavigatingWithKeyBoard}\r\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\r\n params={{\r\n ...params,\r\n guideCategory: undefined,\r\n }}\r\n />\r\n );\r\n }\r\n if (type === 'tag' && tag && showTag) {\r\n return (\r\n <StyledFilterBadge\r\n className=\"humany-filter-badge\"\r\n text={`#${tag.title}`}\r\n routeName={name}\r\n filterType=\"tag\"\r\n handleClick={handleFilterBadgeClick}\r\n forceFocusStyle={isNavigatingWithKeyBoard}\r\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\r\n params={{\r\n ...params,\r\n tag: undefined,\r\n }}\r\n />\r\n );\r\n }\r\n return null;\r\n },\r\n [guideCategory, tag, name, params, showGuideCategory, showTag, isNavigatingWithKeyBoard]\r\n );\r\n\r\n if (!guideCategory && !tag) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Wrapper className=\"humany-filter-badges\" position={position}>\r\n {guideCategory && tooltip ? (\r\n <Tooltip content={<>{tooltip}</>} sticky={false}>\r\n {renderBadge('guideCategory')}\r\n </Tooltip>\r\n ) : (\r\n renderBadge('guideCategory')\r\n )}\r\n {tag && renderBadge('tag')}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport default FilterBadges;\r\n\r\nconst Wrapper = styled.div<{ position: 'inside' | 'below' }>`\r\n display: flex;\r\n align-items: center;\r\n flex-wrap: wrap;\r\n\r\n ${(p) =>\r\n p.position === 'inside'\r\n ? css`\r\n &:not(:first-child) {\r\n margin: 0 0 0 ${(p) => p.theme.sizes?.normal};\r\n }\r\n `\r\n : css`\r\n margin: ${(p) => p.theme.sizes?.small} 0 0 0;\r\n span:first-child {\r\n margin-left: 0;\r\n }\r\n `}\r\n`;\r\n\r\nconst StyledFilterBadge = styled(FilterBadge)`\r\n display: flex;\r\n align-items: center;\r\n padding: ${(p) => `${p.theme.sizes?.small} calc(${p.theme.sizes?.normal}/2) `};\r\n background-color: ${(p) => p.theme.colors?.primary};\r\n border-radius: ${(p) => p.theme.borderRadius};\r\n font-weight: 300;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n font-style: italic;\r\n color: #ffffff;\r\n text-decoration: none;\r\n white-space: nowrap;\r\n\r\n margin: calc(${(p) => p.theme.sizes?.small} / 2);\r\n\r\n &:focus-within {\r\n ${(p) =>\r\n (p.theme.accessibility?.isTabbing || p.forceFocusStyle) &&\r\n css`\r\n ${borderTabStyle}\r\n background-color: transparent;\r\n\r\n svg {\r\n path {\r\n stroke: ${(p) => p.theme.colors?.primary};\r\n }\r\n }\r\n `};\r\n a {\r\n outline: none;\r\n }\r\n }\r\n\r\n svg {\r\n width: 17px;\r\n height: 11px;\r\n margin: 1px 0 0 ${(p) => p.theme.sizes?.small};\r\n path {\r\n stroke: #ffffff;\r\n stroke-width: 2px;\r\n }\r\n order: 1;\r\n }\r\n`;\r\n","import { Category, Tag } from '@telia-ace/knowledge-widget-core';\r\nimport { categoryTrail, deepClone } from '@telia-ace/widget-utilities';\r\n\r\nexport const match = (title: string, phrase: string) => {\r\n if (!phrase || !title) {\r\n return true;\r\n }\r\n\r\n return !!(title.toLowerCase().indexOf(phrase.toLowerCase()) > -1);\r\n};\r\n\r\nexport const filterItems = (\r\n items: (Tag | Category)[] = [],\r\n type: 'tag' | 'guideCategory',\r\n phrase: string\r\n): any[] => {\r\n if (!phrase) {\r\n return items;\r\n }\r\n\r\n const cloned = deepClone(items);\r\n\r\n if (type === 'tag') {\r\n return cloned.filter((i: Tag) => match(i.title, phrase));\r\n }\r\n\r\n const matchTrail = buildMatchTrail(cloned, phrase);\r\n const filtered = recursiveFilter(cloned, (c: Category) => matchTrail.indexOf(c.id) > -1);\r\n\r\n return filtered;\r\n};\r\n\r\nconst recursiveFilter = (items: Category[], fn: (c: Category) => boolean) => {\r\n return items.filter((i: Category) => {\r\n if (i.items && i.items.length) {\r\n i.items = recursiveFilter(i.items, fn);\r\n }\r\n\r\n return fn(i);\r\n });\r\n};\r\n\r\nconst buildMatchTrail = (categories: Category[], phrase: string) => {\r\n const flattened = flatten(categories);\r\n const matching = flattened.filter((c) => match(c.title, phrase)).map((c) => c.id);\r\n\r\n let res: string[] = [];\r\n\r\n matching.forEach((id) => {\r\n const trail = categoryTrail(id, categories);\r\n\r\n res = res.concat(trail);\r\n });\r\n\r\n return res;\r\n};\r\n\r\nconst flatten = (categories: Category[]): Category[] => {\r\n let result: Category[] = [];\r\n\r\n categories.forEach((category) => {\r\n result.push(category);\r\n\r\n if (Array.isArray(category.items)) {\r\n result = result.concat(flatten(category.items));\r\n }\r\n });\r\n\r\n return result;\r\n};\r\n","import { Category, Tag } from '@telia-ace/knowledge-widget-core';\r\nimport {\r\n ItemTree,\r\n Link,\r\n Text,\r\n useDispatch,\r\n useEventListener,\r\n useProperties,\r\n} from '@telia-ace/knowledge-widget-ui';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { SearchComponentProps } from './search-component';\r\nimport { filterItems, match } from './utils';\r\n\r\ntype Props = {\r\n filterPhrase: string;\r\n items: Category[] | Tag[];\r\n filterType: 'guideCategory' | 'tag';\r\n searchContainer: HTMLElement | null;\r\n filterContainer: HTMLElement | null;\r\n inputHasFocus: boolean;\r\n};\r\n\r\nexport const getFocusedIndex = (elem: HTMLElement) => {\r\n const anchors = Array.from(elem?.getElementsByTagName('A') || []).filter(\r\n (a) => a.getAttribute('disabled') === null\r\n ) as HTMLAnchorElement[];\r\n return {\r\n anchors,\r\n focusedIndex: anchors.findIndex((e) => document.activeElement === e),\r\n };\r\n};\r\n\r\nconst getInputElem = (searchContainerRef: HTMLElement | null) => {\r\n return searchContainerRef\r\n ? (searchContainerRef.querySelector(\r\n '[data-type=\"search\"], input[type=\"search\"]'\r\n ) as HTMLElement | null)\r\n : null;\r\n};\r\n\r\nexport const focusInput = (searchContainerRef: HTMLElement | null) => {\r\n if (!searchContainerRef) {\r\n return;\r\n }\r\n const inputElem = getInputElem(searchContainerRef);\r\n if (inputElem) {\r\n inputElem.focus();\r\n }\r\n};\r\n\r\nconst QuickFilterItemList: React.FC<Props> = ({\r\n filterPhrase,\r\n items: rawItems,\r\n filterType,\r\n filterContainer,\r\n searchContainer,\r\n inputHasFocus,\r\n}) => {\r\n const [items, setItems] = useState<Category[] | Tag[]>(rawItems || []);\r\n const [first, setFirst] = useState<string | null>(null);\r\n const dispatch = useDispatch();\r\n const { activeFilterBadges, quickFilters } = useProperties<SearchComponentProps>();\r\n const autoSelect =\r\n (typeof quickFilters === 'object' && !!quickFilters.autoSelect) ||\r\n (typeof quickFilters === 'boolean' && !!quickFilters);\r\n\r\n useEffect(() => {\r\n setItems(filterItems(rawItems, filterType, filterPhrase));\r\n }, [filterPhrase, filterType, rawItems]);\r\n\r\n useEffect(() => {\r\n if (filterContainer) {\r\n const { anchors } = getFocusedIndex(filterContainer);\r\n const id = anchors[0]?.getAttribute('data-id');\r\n\r\n if (id) {\r\n setFirst(id);\r\n }\r\n }\r\n }, [items, filterContainer]);\r\n\r\n const handleItemClicked = useCallback(\r\n (item: Partial<{ id: string }>, type: 'guideCategory' | 'tag') => {\r\n const data: { category?: string; tag?: string } = {\r\n category: activeFilterBadges?.guideCategory\r\n ? activeFilterBadges.guideCategory.id\r\n : undefined,\r\n tag: activeFilterBadges?.tag ? activeFilterBadges.tag.id : undefined,\r\n };\r\n\r\n if (type === 'guideCategory') {\r\n data.category = item.id;\r\n } else if (type === 'tag') {\r\n data.tag = item.id;\r\n }\r\n dispatch('quick-filter:add', data);\r\n },\r\n [activeFilterBadges, dispatch]\r\n );\r\n\r\n const buildListProps = (type: 'guideCategory' | 'tag') => {\r\n if (type === 'guideCategory') {\r\n return {\r\n renderItem: (item: Category, level: number) => (\r\n <StyledLink\r\n autoSelect={autoSelect && inputHasFocus && item.id === first}\r\n disabled={!match(item.title, filterPhrase)}\r\n tabIndex={!match(item.title, filterPhrase) ? -1 : 0}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n handleItemClicked(item, type);\r\n }\r\n }}\r\n data-level={level}\r\n onClick={() => {\r\n handleItemClicked(item, type);\r\n }}\r\n data-id={item.id}\r\n >\r\n <Title\r\n title={item.title}\r\n phrase={filterPhrase}\r\n matches={match(item.title, filterPhrase)}\r\n />\r\n </StyledLink>\r\n ),\r\n };\r\n }\r\n return {\r\n renderLi: true,\r\n renderItem: (item: Tag) => (\r\n <StyledLink\r\n autoSelect={autoSelect && inputHasFocus && item.id === first}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n handleItemClicked(item, type);\r\n }\r\n }}\r\n onClick={() => {\r\n handleItemClicked(item, type);\r\n }}\r\n data-id={item.id}\r\n >\r\n <Title\r\n symbol=\"#\"\r\n title={item.title}\r\n phrase={filterPhrase}\r\n matches={match(item.title, filterPhrase)}\r\n />\r\n </StyledLink>\r\n ),\r\n };\r\n };\r\n\r\n useEventListener(\r\n 'keydown',\r\n (e: KeyboardEvent) => {\r\n const { key } = e;\r\n if (\r\n !filterContainer ||\r\n !(key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter')\r\n ) {\r\n return;\r\n }\r\n\r\n const { anchors, focusedIndex } = getFocusedIndex(filterContainer);\r\n\r\n if (key === 'Enter') {\r\n if (inputHasFocus && autoSelect) {\r\n const id = anchors[0]?.getAttribute('data-id');\r\n\r\n if (id) {\r\n handleItemClicked({ id }, filterType);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n const focusFirst = () => anchors[0]?.focus();\r\n const focusLast = () => anchors[anchors.length - 1]?.focus();\r\n const focusNext = () => anchors[focusedIndex + 1]?.focus();\r\n const focusPrev = () => anchors[focusedIndex - 1]?.focus();\r\n\r\n if (inputHasFocus) {\r\n // Input is focused\r\n\r\n e.preventDefault();\r\n if (key === 'ArrowDown') {\r\n focusFirst();\r\n } else {\r\n focusLast();\r\n }\r\n } else if (focusedIndex > -1) {\r\n // A quick-filter-item is focused\r\n\r\n e.preventDefault();\r\n if (key === 'ArrowDown') {\r\n if (anchors.length > focusedIndex + 1) {\r\n focusNext();\r\n } else {\r\n focusInput(searchContainer);\r\n }\r\n } else {\r\n if (focusedIndex - 1 < 0) {\r\n focusInput(searchContainer);\r\n } else {\r\n focusPrev();\r\n }\r\n }\r\n }\r\n },\r\n window\r\n );\r\n\r\n return (\r\n <ItemTree\r\n tree={items}\r\n renderEmpty={false}\r\n ulProps={{ role: 'listbox' }}\r\n liProps={{ role: 'option' }}\r\n {...buildListProps(filterType)}\r\n />\r\n );\r\n};\r\n\r\nexport default QuickFilterItemList;\r\n\r\ntype TitleProps = {\r\n title: string;\r\n phrase: string;\r\n matches: boolean;\r\n symbol?: string;\r\n};\r\n\r\nconst Title: React.FC<TitleProps> = ({ title, phrase, matches, symbol = '' }) => {\r\n const createTitle = () => {\r\n if (!matches || !phrase) {\r\n return [title];\r\n }\r\n\r\n const index = title.toLowerCase().indexOf(phrase.toLowerCase());\r\n const start = title.substr(0, index);\r\n const bold = title.slice(index, index + phrase.length);\r\n const end = title.substr(index + phrase.length);\r\n return [start, bold, end];\r\n };\r\n\r\n const [start, bold, end] = createTitle();\r\n\r\n return (\r\n <Text>\r\n {symbol}\r\n {start}\r\n {bold ? <strong>{bold}</strong> : null}\r\n {end ? end : null}\r\n </Text>\r\n );\r\n};\r\n\r\nconst disabledCss = css<any>`\r\n opacity: 0.5;\r\n pointer-events: none;\r\n`;\r\n\r\nconst focused = css<{ 'data-level'?: number; autoSelect: boolean }>`\r\n background-color: ${(p) => p.theme.colors?.text};\r\n color: #ffffff;\r\n outline: none;\r\n\r\n span:first-child {\r\n border-color: ${(p) => p.theme.colors?.text};\r\n }\r\n`;\r\n\r\nconst StyledLink = styled(Link)<{ 'data-level'?: number; autoSelect: boolean }>`\r\n display: block;\r\n text-decoration: none;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n\r\n ${(p) => p.disabled && disabledCss}\r\n color: ${(p) => p.theme.colors?.text};\r\n background-color: transparent;\r\n\r\n span {\r\n display: block;\r\n ${(p) =>\r\n p['data-level']\r\n ? `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.normal};`\r\n : `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.medium}; `}\r\n ${(p) => p['data-level'] && 'border-left: 2px solid'}\r\n }\r\n\r\n span:first-child {\r\n border-color: #e7e7e7;\r\n }\r\n\r\n ${(p) => p['data-level'] && `padding: 0 calc(${p.theme.sizes?.medium} * ${p['data-level']});`}\r\n\r\n ${(p) => p.autoSelect && focused}\r\n\r\n &:hover,\r\n &:focus {\r\n ${focused}\r\n }\r\n`;\r\n","import { Widget } from '@telia-ace/knowledge-widget-core';\r\nimport {\r\n contentBox,\r\n Loader,\r\n useContainer,\r\n useProperties,\r\n useScroll,\r\n} from '@telia-ace/knowledge-widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useCallback, useRef } from 'react';\r\nimport styled from 'styled-components';\r\nimport QuickFilterItemList, { focusInput, getFocusedIndex } from './quick-filter-item-list';\r\nimport { SearchComponentProps } from './search-component';\r\n\r\ntype Props = {\r\n phrase: string;\r\n inputHasFocus: boolean;\r\n searchContainerRef: HTMLElement | null;\r\n};\r\n\r\nexport default ({ phrase = '', inputHasFocus, searchContainerRef }: Props) => {\r\n const {\r\n quickFilter = {\r\n open: false,\r\n loading: false,\r\n symbol: '',\r\n type: '',\r\n items: [],\r\n },\r\n } = useProperties<SearchComponentProps>();\r\n const [css, ref] = useScroll(true);\r\n const container = useContainer();\r\n const { events } = container.get('$widget') as Widget;\r\n const wrapperRef = useRef() as React.MutableRefObject<HTMLDivElement | null>;\r\n\r\n const setWrapperRef = useCallback(\r\n (node: HTMLDivElement | null) => {\r\n if (node) {\r\n node.addEventListener(\r\n 'keydown',\r\n () => {\r\n const listItemFocused = getFocusedIndex(node).focusedIndex > -1;\r\n if (listItemFocused) {\r\n events.subscribeOnce('router:changed', () => {\r\n focusInput(searchContainerRef);\r\n });\r\n }\r\n },\r\n true\r\n );\r\n }\r\n\r\n wrapperRef.current = node;\r\n return node;\r\n },\r\n [searchContainerRef]\r\n );\r\n\r\n const { items = [], symbol, type, open, loading } = quickFilter;\r\n\r\n if (!open || !symbol) {\r\n return null;\r\n }\r\n\r\n const filterPhrase = phrase.slice(phrase.indexOf(symbol) + 1);\r\n\r\n return (\r\n <Wrapper\r\n ref={setWrapperRef}\r\n data-loading={loading}\r\n className={appendClassNames(\r\n 'humany-quick-filter-dropdown',\r\n [type === 'guideCategory', 'humany-quick-filter-guide-categories'],\r\n [type === 'tag', 'humany-quick-filter-tags']\r\n )}\r\n >\r\n <Inner className=\"humany-quick-filter-dropdown-inner\" css={css} ref={ref}>\r\n <QuickFilterItemList\r\n filterType={type as 'guideCategory' | 'tag'}\r\n items={items}\r\n filterPhrase={filterPhrase}\r\n filterContainer={ref.current}\r\n searchContainer={searchContainerRef}\r\n inputHasFocus={inputHasFocus}\r\n />\r\n </Inner>\r\n <Loader loading={loading} />\r\n </Wrapper>\r\n );\r\n};\r\n\r\nconst Wrapper = styled.div`\r\n ${contentBox};\r\n position: absolute;\r\n top: calc(100% + ${(p) => p.theme.sizes?.normal});\r\n left: 0;\r\n right: 0;\r\n z-index: 1;\r\n overflow: hidden;\r\n`;\r\n\r\nconst Inner = styled.div<{ css: string }>`\r\n max-height: 300px;\r\n overflow: auto;\r\n padding: ${(p) => p.theme.sizes?.medium} 0;\r\n ${(p) => p.css}\r\n ul {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n }\r\n li div {\r\n ${(p) => `margin: ${p.theme.sizes?.normal} 0;`}\r\n }\r\n`;\r\n","import {\r\n useDebounce,\r\n useDispatch,\r\n usePrevious,\r\n useProperties,\r\n} from '@telia-ace/knowledge-widget-ui';\r\nimport { useCallback, useEffect, useRef } from 'react';\r\nimport { SearchComponentProps } from './search-component';\r\n\r\ntype ReturnType = [\r\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => void,\r\n (navigateToHome: boolean) => void,\r\n React.MutableRefObject<HTMLElement | null>\r\n];\r\n\r\nconst filterChanged = <T extends Optional<{ id: string }> | null>(newValue: T, oldValue: T) => {\r\n if (newValue && !oldValue) {\r\n return true;\r\n }\r\n if (!newValue && oldValue) {\r\n return true;\r\n }\r\n if (newValue && oldValue) {\r\n if (newValue.id !== oldValue.id) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\nexport default (\r\n phrase: string,\r\n params: { [key: string]: any } = {},\r\n debounce = true\r\n): ReturnType => {\r\n const dispatch = useDispatch();\r\n\r\n const {\r\n quickFilters = false,\r\n quickFilter = { open: false },\r\n activeFilterBadges,\r\n filterBadges = false,\r\n incremental = 600,\r\n } = useProperties<SearchComponentProps>();\r\n\r\n const debouncedPhrase = useDebounce(\r\n phrase,\r\n typeof incremental === 'boolean' ? 600 : incremental\r\n );\r\n const previousDebouncedPhrase = usePrevious(debouncedPhrase);\r\n const previousFilters = usePrevious(activeFilterBadges);\r\n const ref = useRef<null | HTMLElement>(null);\r\n\r\n const dispatchSearch = useCallback(\r\n (value: string = '') => {\r\n if (filterBadges) {\r\n const filtersChanged =\r\n filterChanged(\r\n activeFilterBadges?.guideCategory,\r\n previousFilters?.guideCategory\r\n ) || filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\r\n return dispatch('search', { value, filtersChanged, filters: activeFilterBadges });\r\n }\r\n return dispatch('search', { value });\r\n },\r\n [dispatch, activeFilterBadges]\r\n );\r\n\r\n const dispatchClear = useCallback(\r\n (navigateToHome: boolean) => {\r\n dispatch('clear', { navigateToHome });\r\n },\r\n [dispatch]\r\n );\r\n\r\n const removeFilterKeywords = (input: string) => {\r\n if (quickFilters) {\r\n return input.replace(/([@#].*)/g, '');\r\n }\r\n return input;\r\n };\r\n\r\n const submitSearch = useCallback(\r\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => {\r\n if (quickFilter.open && (arg as React.KeyboardEvent).preventDefault) {\r\n (arg as React.KeyboardEvent).preventDefault();\r\n return;\r\n }\r\n\r\n const activeElement = document.activeElement as HTMLElement;\r\n const isSearching =\r\n ref.current && typeof ref.current.contains === 'function'\r\n ? ref.current.contains(activeElement)\r\n : false;\r\n const cleanedPhrase = removeFilterKeywords(phrase);\r\n\r\n if (\r\n (typeof arg === 'boolean' && arg) ||\r\n (cleanedPhrase.length && isSearching) ||\r\n activeFilterBadges?.guideCategory ||\r\n (activeFilterBadges?.tag && isSearching)\r\n ) {\r\n dispatchSearch(cleanedPhrase);\r\n } else {\r\n dispatchClear(isSearching);\r\n }\r\n },\r\n [ref, phrase, quickFilter, dispatchClear, activeFilterBadges, dispatchSearch]\r\n );\r\n\r\n useEffect(() => {\r\n const filtersChanged =\r\n filterChanged(activeFilterBadges?.guideCategory, previousFilters?.guideCategory) ||\r\n filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\r\n\r\n const phrase = debouncedPhrase ? removeFilterKeywords(debouncedPhrase) : debouncedPhrase;\r\n const previousPhrase = previousDebouncedPhrase\r\n ? removeFilterKeywords(previousDebouncedPhrase)\r\n : previousDebouncedPhrase;\r\n if (\r\n (typeof previousPhrase !== 'undefined' &&\r\n previousPhrase !== phrase &&\r\n phrase !== params.phrase &&\r\n debounce &&\r\n !quickFilter.open) ||\r\n (filtersChanged && !activeFilterBadges?.initial)\r\n ) {\r\n submitSearch(filtersChanged);\r\n }\r\n }, [debouncedPhrase, quickFilter.open, activeFilterBadges, submitSearch]);\r\n\r\n useEffect(() => {\r\n if (phrase && quickFilters) {\r\n const quickFiltersGuideCategory =\r\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\r\n (typeof quickFilters === 'object' && !!quickFilters.guideCategory);\r\n\r\n const quickFiltersTag =\r\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\r\n (typeof quickFilters === 'object' && !!quickFilters.tag);\r\n\r\n if (quickFiltersGuideCategory && phrase.indexOf('@') === phrase.length - 1) {\r\n dispatch('quick-filter:open', { type: 'guideCategory', symbol: '@' });\r\n }\r\n\r\n if (quickFiltersTag && phrase.indexOf('#') === phrase.length - 1) {\r\n dispatch('quick-filter:open', { type: 'tag', symbol: '#' });\r\n }\r\n }\r\n\r\n if (quickFilter.open && phrase.indexOf('@') === -1 && phrase.indexOf('#') === -1) {\r\n dispatch('quick-filter:close');\r\n }\r\n }, [phrase]);\r\n\r\n return [submitSearch, dispatchClear, ref];\r\n};\r\n","import { Component } from '@telia-ace/knowledge-widget-types-grid';\r\nimport {\r\n borderTabStyle,\r\n Button,\r\n contentBox,\r\n convertToStringAttributes,\r\n Input,\r\n SymbolBadge,\r\n useChildren,\r\n useContainer,\r\n useDispatch,\r\n useProperties,\r\n useRouteData,\r\n useTransitionEnd,\r\n useWidgetEvent,\r\n} from '@telia-ace/knowledge-widget-ui';\r\nimport { RoutingService } from '@telia-ace/widget-routing';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useCallback, useEffect, useState } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport FilterBadges from './filter-badges';\r\nimport QuickFilter from './quick-filter';\r\nimport { SearchComponentProps } from './search-component';\r\nimport useSearch from './use-search';\r\n\r\ntype Props = {\r\n className: string;\r\n role?: string;\r\n};\r\n\r\nconst Search: React.SFC<Props> = ({ className, ...other }) => {\r\n const {\r\n showSearchButton,\r\n showClearButton,\r\n role = 'search',\r\n autoFocus,\r\n placeholder,\r\n searchButtonLabel,\r\n clearButtonLabel,\r\n ariaLabel,\r\n route: searchRoute = 'search',\r\n incremental = true,\r\n showChildren = false,\r\n quickFilter,\r\n quickFilters: quickFiltersEnabled,\r\n filterBadges,\r\n } = useProperties<SearchComponentProps>();\r\n const { params } = useRouteData();\r\n const [hasFocus, setHasFocus] = useState(false);\r\n const [phrase, setPhrase] = useState(params.phrase || '');\r\n const [showFilterBadges, setShowFilterBadges] = useState({\r\n guideCategory: false,\r\n tag: false,\r\n });\r\n const container = useContainer();\r\n const children = useChildren();\r\n const dispatch = useDispatch();\r\n const { position: filterBadgePosition = 'inside' } =\r\n typeof filterBadges === 'object' ? filterBadges : {};\r\n\r\n useEffect(() => {\r\n const { guideCategory, tag } = params;\r\n const showGuideCategory =\r\n typeof filterBadges === 'object' ? !!filterBadges.guideCategory : !!filterBadges;\r\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\r\n\r\n setShowFilterBadges({\r\n guideCategory: showGuideCategory && !!guideCategory,\r\n tag: showTag && !!tag,\r\n });\r\n }, [filterBadges, params]);\r\n\r\n // Remove quick-filter symbol, quick-filter phrase\r\n // and close quick-filter when route changed\r\n useWidgetEvent(\r\n 'router:changed',\r\n () => {\r\n if (quickFilter) {\r\n const { open, symbol } = quickFilter;\r\n\r\n if (open) {\r\n if (symbol) {\r\n const cleaned = phrase.replace(phrase.slice(phrase.indexOf(symbol)), '');\r\n setPhrase(cleaned);\r\n }\r\n\r\n dispatch('quick-filter:close');\r\n }\r\n }\r\n },\r\n [quickFilter, phrase, setPhrase, dispatch]\r\n );\r\n\r\n const [search, clear, elem] = useSearch(phrase, params, !!incremental);\r\n\r\n useEffect(() => {\r\n setPhrase(params.phrase || '');\r\n }, [params.phrase]);\r\n\r\n const onChange = useCallback(\r\n (value: string) => {\r\n setPhrase(value);\r\n },\r\n [setPhrase]\r\n );\r\n\r\n const onEscape = useCallback(() => {\r\n dispatch('quick-filter:close').then(() => clear(true));\r\n }, [dispatch, clear]);\r\n\r\n const autoFocusHandler = useCallback(() => {\r\n if (autoFocus && !hasFocus) {\r\n elem.current?.getElementsByTagName('input')[0]?.focus();\r\n }\r\n }, [autoFocus, hasFocus, elem]);\r\n\r\n const onClearButtonClick = useCallback(() => {\r\n container.getAsync('router').then((router: RoutingService) => {\r\n const initialRoute = router.getInitialRoute();\r\n const currentRoute = router.getRouteData();\r\n // if we already are on the initial route\r\n // and it's not the search route, clear the search instead of navigate\r\n if (initialRoute?.name === currentRoute.name && initialRoute?.name !== searchRoute) {\r\n setPhrase('');\r\n } else {\r\n clear(true);\r\n }\r\n });\r\n }, [container, setPhrase, clear]);\r\n\r\n const renderFilterBadges = (position: 'inside' | 'below') => {\r\n if (position !== filterBadgePosition) {\r\n return null;\r\n }\r\n if (!!showFilterBadges.guideCategory || !!showFilterBadges.tag) {\r\n return (\r\n <FilterBadges\r\n position={position}\r\n inputHasFocus={hasFocus}\r\n showGuideCategory={showFilterBadges.guideCategory}\r\n showTag={showFilterBadges.tag}\r\n searchContainerRef={elem.current}\r\n />\r\n );\r\n }\r\n };\r\n\r\n useTransitionEnd(autoFocusHandler);\r\n\r\n const showClear =\r\n showClearButton && (showFilterBadges.guideCategory || showFilterBadges.tag || phrase);\r\n const quickFilterAccessibilityProps = quickFiltersEnabled\r\n ? convertToStringAttributes({\r\n role: 'combobox',\r\n 'aria-autocomplete': 'list',\r\n autoComplete: 'off',\r\n 'aria-haspopup': 'listbox',\r\n })\r\n : {};\r\n\r\n return (\r\n <StyledSearchWrapper\r\n {...other}\r\n ref={elem}\r\n role={role}\r\n className={appendClassNames(className, 'humany-search')}\r\n data-has-phrase={!!phrase}\r\n data-has-focus={hasFocus}\r\n data-has-search-symbol={showSearchButton ? 'true' : 'false'}\r\n >\r\n <Inner\r\n action=\".\"\r\n onSubmit={(e: any) => {\r\n e.preventDefault();\r\n elem.current?.getElementsByTagName('input')[0]?.blur();\r\n }}\r\n data-has-focus={hasFocus}\r\n >\r\n {showSearchButton && (\r\n <SearchButton\r\n aria-label={searchButtonLabel}\r\n type=\"submit\"\r\n title={searchButtonLabel}\r\n disabled={!phrase}\r\n onClick={search}\r\n data-has-phrase={!!phrase}\r\n data-has-focus={hasFocus}\r\n >\r\n <SymbolBadge size={32} symbol={{ type: 'Svg', content: 'search' }} />\r\n </SearchButton>\r\n )}\r\n {renderFilterBadges('inside')}\r\n <Input\r\n type=\"search\"\r\n aria-label={ariaLabel}\r\n {...quickFilterAccessibilityProps}\r\n placeholder={\r\n showFilterBadges.guideCategory || showFilterBadges.tag ? '' : placeholder\r\n }\r\n onFocusChange={setHasFocus}\r\n onEscape={onEscape}\r\n onEnter={search}\r\n onChange={onChange}\r\n value={phrase}\r\n />\r\n {showClear && (\r\n <ClearButton\r\n aria-label={clearButtonLabel}\r\n type=\"reset\"\r\n hasFocus={hasFocus}\r\n title={clearButtonLabel}\r\n onClick={onClearButtonClick}\r\n >\r\n <SymbolBadge size={27} symbol={{ type: 'Svg', content: 'clear' }} />\r\n </ClearButton>\r\n )}\r\n {showChildren &&\r\n !showClear &&\r\n children.map((child) => (\r\n <Component key={child.id} id={child.id} branch=\"default\" />\r\n ))}\r\n <QuickFilter\r\n inputHasFocus={hasFocus}\r\n phrase={phrase}\r\n searchContainerRef={elem.current}\r\n />\r\n </Inner>\r\n {renderFilterBadges('below')}\r\n </StyledSearchWrapper>\r\n );\r\n};\r\n\r\nexport default Search;\r\n\r\nconst StyledSearchWrapper = styled.div<\r\n {\r\n 'data-has-focus': boolean;\r\n 'data-has-phrase': boolean;\r\n 'data-has-search-symbol': 'true' | 'false';\r\n } & any\r\n>`\r\n ${contentBox};\r\n width: 100%;\r\n padding: ${(p) => p.theme.sizes?.large};\r\n\r\n input {\r\n background-color: transparent;\r\n border: none;\r\n outline: none;\r\n min-width: 25%;\r\n flex: 1;\r\n font-size: ${(p) => p.theme.fonts?.normal};\r\n font-weight: 300;\r\n font-style: italic;\r\n padding: 1em 0;\r\n color: ${(p) => p.theme.colors?.text};\r\n -webkit-appearance: none;\r\n\r\n ${(p) => p['data-has-search-symbol'] === 'true' && `text-indent: ${p.theme.sizes?.normal};`}\r\n\r\n ::placeholder {\r\n color: ${(p) => p.theme.colors?.text};\r\n }\r\n /* removes the 'X' from IE */\r\n &[type='search']::-ms-clear {\r\n display: none;\r\n width: 0;\r\n height: 0;\r\n }\r\n &[type='search']::-ms-reveal {\r\n display: none;\r\n width: 0;\r\n height: 0;\r\n }\r\n\r\n /* removes the 'X' from Chrome */\r\n &[type='search']::-webkit-search-decoration,\r\n &[type='search']::-webkit-search-cancel-button,\r\n &[type='search']::-webkit-search-results-button,\r\n &[type='search']::-webkit-search-results-decoration {\r\n display: none;\r\n }\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n }\r\n\r\n button {\r\n background: transparent;\r\n border: none;\r\n padding: 0;\r\n font-size: ${(p) => p.theme.fonts?.large};\r\n transition: color 200ms ease-out;\r\n color: ${(p) =>\r\n p['data-has-focus'] || p['data-has-phrase'] ? p.theme.colors?.primary : '#000000'};\r\n cursor: pointer;\r\n > svg {\r\n height: 100%;\r\n }\r\n }\r\n`;\r\n\r\nconst Inner = styled.form<{ 'data-has-focus': boolean } & any>`\r\n display: flex;\r\n flex-wrap: nowrap;\r\n align-items: center;\r\n border: ${(p) => p.theme.inputBorder};\r\n border-radius: ${(p) => p.theme.borderRadius};\r\n background-color: #ffffff;\r\n position: relative;\r\n padding: 0 ${(p) => p.theme.sizes?.normal};\r\n\r\n ${(p) =>\r\n p['data-has-focus'] &&\r\n css`\r\n ${(p) =>\r\n p.theme.accessibility?.isTabbing\r\n ? borderTabStyle\r\n : `\r\n border-color: ${p.theme.colors?.primary};\r\n outline: none;\r\n input {\r\n outline: none;\r\n }\r\n `}\r\n `};\r\n`;\r\n\r\nconst SearchButton = styled(Button)<{\r\n 'data-has-focus': boolean;\r\n 'data-has-phrase': boolean;\r\n}>`\r\n padding: 0;\r\n height: 2em;\r\n\r\n svg {\r\n circle,\r\n line {\r\n stroke: ${(p) => (p['data-has-focus'] ? p.theme.colors?.primary : '#000000')};\r\n }\r\n }\r\n`;\r\n\r\nconst ClearButton = styled(Button)<{ hasFocus: boolean } & any>`\r\n &:focus svg {\r\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle}\r\n }\r\n\r\n svg {\r\n vertical-align: top;\r\n\r\n circle,\r\n line,\r\n path {\r\n stroke: ${(p) => (p.hasFocus ? p.theme.colors?.primary : p.theme.colors?.text)};\r\n }\r\n }\r\n`;\r\n"],"names":["Wrapper","Inner"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telia-ace/knowledge-widget-components-search",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.17",
|
|
4
4
|
"description": "Search component for ACE Knowledge Widgets.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "Telia Company AB",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"telia"
|
|
9
9
|
],
|
|
10
|
-
"
|
|
10
|
+
"exports": {
|
|
11
|
+
"development": "./src/index.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"type": "module",
|
|
11
15
|
"types": "dist/index.d.ts",
|
|
12
16
|
"files": [
|
|
13
17
|
"LICENSE.txt",
|
|
@@ -24,10 +28,10 @@
|
|
|
24
28
|
},
|
|
25
29
|
"sideEffects": false,
|
|
26
30
|
"dependencies": {
|
|
27
|
-
"@telia-ace/knowledge-widget-core": "^1.0.
|
|
28
|
-
"@telia-ace/knowledge-widget-types-grid": "^1.0.
|
|
29
|
-
"@telia-ace/knowledge-widget-ui": "^1.0.
|
|
30
|
-
"@telia-ace/widget-routing": "^1.0.
|
|
31
|
+
"@telia-ace/knowledge-widget-core": "^1.0.14",
|
|
32
|
+
"@telia-ace/knowledge-widget-types-grid": "^1.0.23",
|
|
33
|
+
"@telia-ace/knowledge-widget-ui": "^1.0.20",
|
|
34
|
+
"@telia-ace/widget-routing": "^1.0.12",
|
|
31
35
|
"@telia-ace/widget-utilities": "^1.0.2",
|
|
32
36
|
"@webprovisions/platform": "^1.1.2"
|
|
33
37
|
},
|
|
@@ -41,5 +45,5 @@
|
|
|
41
45
|
"@types/react-dom": "^16.8.0",
|
|
42
46
|
"@types/styled-components": "^5.1.7"
|
|
43
47
|
},
|
|
44
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "ccf2f3c55b373a7e23227e155d7573259abfacb1"
|
|
45
49
|
}
|