@telia-ace/knowledge-widget-components-search 1.0.6 → 1.0.9

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.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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"}
File without changes
File without changes
package/package.json CHANGED
@@ -1,34 +1,33 @@
1
1
  {
2
2
  "name": "@telia-ace/knowledge-widget-components-search",
3
- "version": "1.0.6",
3
+ "version": "1.0.9",
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
- "main": "lib/index.js",
11
- "module": "lib-esm/index.js",
10
+ "module": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
12
  "files": [
13
13
  "LICENSE.txt",
14
14
  "README.md",
15
- "lib/",
16
- "lib-esm/"
15
+ "dist/"
17
16
  ],
18
17
  "publishConfig": {
19
18
  "access": "public"
20
19
  },
21
20
  "scripts": {
22
- "clean": "cleandir lib && cleandir lib-esm",
23
- "compile": "tsc -p tsconfig.cjs.json && tsc -p tsconfig.esm.json"
21
+ "clean": "rimraf ./dist",
22
+ "precompile": "tsc -emitDeclarationOnly",
23
+ "compile": "vite build"
24
24
  },
25
25
  "sideEffects": false,
26
- "typings": "lib/index.d.ts",
27
26
  "dependencies": {
28
- "@telia-ace/knowledge-widget-core": "^1.0.6",
29
- "@telia-ace/knowledge-widget-types-grid": "^1.0.13",
30
- "@telia-ace/knowledge-widget-ui": "^1.0.10",
31
- "@telia-ace/widget-routing": "^1.0.5",
27
+ "@telia-ace/knowledge-widget-core": "^1.0.7",
28
+ "@telia-ace/knowledge-widget-types-grid": "^1.0.14",
29
+ "@telia-ace/knowledge-widget-ui": "^1.0.11",
30
+ "@telia-ace/widget-routing": "^1.0.6",
32
31
  "@telia-ace/widget-utilities": "^1.0.1",
33
32
  "@webprovisions/platform": "^1.1.2"
34
33
  },
@@ -42,5 +41,5 @@
42
41
  "@types/react-dom": "^16.8.0",
43
42
  "@types/styled-components": "^5.1.7"
44
43
  },
45
- "gitHead": "141db586e3989e54f2671aa2079c62a250a00557"
44
+ "gitHead": "6223de72a56dbb4dfa05c2d22d6e2a6e55795d57"
46
45
  }
@@ -1,10 +0,0 @@
1
- import React from 'react';
2
- declare type Props = {
3
- inputHasFocus: boolean;
4
- searchContainerRef: HTMLElement | null;
5
- showGuideCategory: boolean;
6
- showTag: boolean;
7
- position: 'inside' | 'below';
8
- };
9
- declare const FilterBadges: React.FC<Props>;
10
- export default FilterBadges;
@@ -1,235 +0,0 @@
1
- "use strict";
2
- var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
- if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
- return cooked;
5
- };
6
- var __assign = (this && this.__assign) || function () {
7
- __assign = Object.assign || function(t) {
8
- for (var s, i = 1, n = arguments.length; i < n; i++) {
9
- s = arguments[i];
10
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
11
- t[p] = s[p];
12
- }
13
- return t;
14
- };
15
- return __assign.apply(this, arguments);
16
- };
17
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
- if (k2 === undefined) k2 = k;
19
- var desc = Object.getOwnPropertyDescriptor(m, k);
20
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
- desc = { enumerable: true, get: function() { return m[k]; } };
22
- }
23
- Object.defineProperty(o, k2, desc);
24
- }) : (function(o, m, k, k2) {
25
- if (k2 === undefined) k2 = k;
26
- o[k2] = m[k];
27
- }));
28
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
- Object.defineProperty(o, "default", { enumerable: true, value: v });
30
- }) : function(o, v) {
31
- o["default"] = v;
32
- });
33
- var __importStar = (this && this.__importStar) || function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
- var __rest = (this && this.__rest) || function (s, e) {
41
- var t = {};
42
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
43
- t[p] = s[p];
44
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
45
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
46
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
47
- t[p[i]] = s[p[i]];
48
- }
49
- return t;
50
- };
51
- var __read = (this && this.__read) || function (o, n) {
52
- var m = typeof Symbol === "function" && o[Symbol.iterator];
53
- if (!m) return o;
54
- var i = m.call(o), r, ar = [], e;
55
- try {
56
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
57
- }
58
- catch (error) { e = { error: error }; }
59
- finally {
60
- try {
61
- if (r && !r.done && (m = i["return"])) m.call(i);
62
- }
63
- finally { if (e) throw e.error; }
64
- }
65
- return ar;
66
- };
67
- Object.defineProperty(exports, "__esModule", { value: true });
68
- var knowledge_widget_ui_1 = require("@telia-ace/knowledge-widget-ui");
69
- var widget_utilities_1 = require("@telia-ace/widget-utilities");
70
- var react_1 = __importStar(require("react"));
71
- var styled_components_1 = __importStar(require("styled-components"));
72
- var FilterBadge = function (_a) {
73
- var text = _a.text, className = _a.className, forceFocusStyle = _a.forceFocusStyle, filterType = _a.filterType, handleClick = _a.handleClick, _b = _a.deleteAriaLabel, deleteAriaLabel = _b === void 0 ? '' : _b, p = __rest(_a, ["text", "className", "forceFocusStyle", "filterType", "handleClick", "deleteAriaLabel"]);
74
- var ref = (0, react_1.useRef)();
75
- return (react_1.default.createElement(knowledge_widget_ui_1.Text, { className: (0, widget_utilities_1.appendClassNames)(className, 'humany-filter-badge'), onKeyDown: function (e) {
76
- if (e.key === 'Enter') {
77
- handleClick(e, filterType);
78
- }
79
- } },
80
- text,
81
- react_1.default.createElement(knowledge_widget_ui_1.Link, __assign({}, p, { ref: ref, tabIndex: 0, role: "button", "aria-label": deleteAriaLabel.replace('{{item}}', text), onClick: function (e) { return handleClick(e, filterType); } }),
82
- react_1.default.createElement(knowledge_widget_ui_1.SymbolBadge, { size: 13, symbol: { type: 'Svg', content: 'close' } }))));
83
- };
84
- var FilterBadges = function (_a) {
85
- var inputHasFocus = _a.inputHasFocus, searchContainerRef = _a.searchContainerRef, showTag = _a.showTag, showGuideCategory = _a.showGuideCategory, position = _a.position;
86
- var _b = (0, knowledge_widget_ui_1.useProperties)(), _c = _b.activeFilterBadges, activeFilterBadges = _c === void 0 ? {} : _c, _d = _b.deleteFilterBadgeAriaLabel, deleteFilterBadgeAriaLabel = _d === void 0 ? '' : _d;
87
- var dispatch = (0, knowledge_widget_ui_1.useDispatch)();
88
- var _e = (0, knowledge_widget_ui_1.useRouteData)(), name = _e.name, params = _e.params;
89
- var _f = __read((0, react_1.useState)(false), 2), isNavigatingWithKeyBoard = _f[0], setIsNavigatingWithKeyboard = _f[1];
90
- var onKeyDown = (0, react_1.useCallback)(function (event) {
91
- var key = event.key;
92
- if (['ArrowLeft', 'ArrowRight'].indexOf(key) === -1) {
93
- setIsNavigatingWithKeyboard(false);
94
- }
95
- }, []);
96
- (0, knowledge_widget_ui_1.useEventListener)('keydown', onKeyDown, window);
97
- (0, knowledge_widget_ui_1.useEventListener)('click', onKeyDown, window);
98
- var guideCategory = activeFilterBadges.guideCategory, tag = activeFilterBadges.tag, tooltip = activeFilterBadges.tooltip;
99
- var getFocusedFilterBadge = function (container) {
100
- var badges = container.querySelectorAll('.humany-filter-badge');
101
- return {
102
- badges: badges,
103
- index: Array.from(badges).findIndex(function (e) { return document.activeElement === e; }),
104
- };
105
- };
106
- var handleFilterBadgeClick = function (event, filterType) {
107
- event.preventDefault();
108
- dispatch('quick-filter:remove', { types: [filterType] });
109
- };
110
- var keyboardNavigation = function (direction, inputElem) {
111
- if (!searchContainerRef) {
112
- return;
113
- }
114
- var _a = getFocusedFilterBadge(searchContainerRef), badges = _a.badges, currentFocusedIndex = _a.index;
115
- if (badges.length) {
116
- var toFocus = null;
117
- if (direction === 'left') {
118
- if (currentFocusedIndex === -1) {
119
- // if no badge is focused and direction is left
120
- // focus last badge
121
- toFocus = badges.item(badges.length - 1);
122
- }
123
- else if (currentFocusedIndex > 0) {
124
- // if there are more badges to the left, go one step back
125
- // do nothing if already focusing the most left badge
126
- toFocus = badges.item(currentFocusedIndex - 1);
127
- }
128
- }
129
- else if (direction === 'right') {
130
- if (currentFocusedIndex === badges.length - 1) {
131
- // if currently focusing the last badge, move focus to search input
132
- inputElem && inputElem.focus();
133
- }
134
- else if (badges.item(currentFocusedIndex + 1)) {
135
- toFocus = badges.item(currentFocusedIndex + 1);
136
- }
137
- }
138
- if (toFocus) {
139
- toFocus.focus();
140
- setIsNavigatingWithKeyboard(true);
141
- }
142
- }
143
- };
144
- (0, knowledge_widget_ui_1.useKeyPress)('ArrowLeft', (0, react_1.useCallback)(function () {
145
- if (!searchContainerRef) {
146
- return;
147
- }
148
- var focusedBadgeIndex = getFocusedFilterBadge(searchContainerRef).index;
149
- if (inputHasFocus || focusedBadgeIndex > -1) {
150
- var inputElem = searchContainerRef.querySelector('[data-type="search"]');
151
- var isAtBeginningOfInput = inputElem && inputElem.selectionStart !== null && inputElem.selectionStart <= 0;
152
- var isFocusingAFilterBadge = focusedBadgeIndex > -1;
153
- if (isAtBeginningOfInput || isFocusingAFilterBadge) {
154
- keyboardNavigation('left', inputElem);
155
- }
156
- }
157
- }, [inputHasFocus, searchContainerRef]));
158
- (0, knowledge_widget_ui_1.useKeyPress)('ArrowRight', (0, react_1.useCallback)(function () {
159
- if (!searchContainerRef) {
160
- return;
161
- }
162
- var focusedBadgeIndex = getFocusedFilterBadge(searchContainerRef).index;
163
- if (focusedBadgeIndex > -1) {
164
- var inputElem = searchContainerRef.querySelector('[data-type="search"]');
165
- var isFocusingAFilterBadge = focusedBadgeIndex > -1;
166
- if (isFocusingAFilterBadge) {
167
- keyboardNavigation('right', inputElem);
168
- }
169
- }
170
- }, [searchContainerRef]));
171
- (0, knowledge_widget_ui_1.useKeyPress)('Backspace', (0, react_1.useCallback)(function (event) {
172
- if (!searchContainerRef) {
173
- return;
174
- }
175
- var filtersToRemove = [];
176
- var focusedBadgeIndex = getFocusedFilterBadge(searchContainerRef).index;
177
- var inputElem = searchContainerRef.querySelector('[data-type="search"]');
178
- var isFocusingAFilterBadge = focusedBadgeIndex > -1;
179
- if (isFocusingAFilterBadge) {
180
- if (focusedBadgeIndex === 0) {
181
- if (showGuideCategory) {
182
- filtersToRemove = ['guideCategory'];
183
- }
184
- else if (showTag) {
185
- filtersToRemove = ['tag'];
186
- }
187
- }
188
- else if (focusedBadgeIndex === 1) {
189
- filtersToRemove = ['tag'];
190
- }
191
- }
192
- else {
193
- var isAtBeginningOfInput = inputElem &&
194
- inputElem.selectionStart !== null &&
195
- inputElem.selectionStart <= 0;
196
- if (isAtBeginningOfInput) {
197
- if (activeFilterBadges === null || activeFilterBadges === void 0 ? void 0 : activeFilterBadges.tag) {
198
- filtersToRemove = ['tag'];
199
- }
200
- else if (activeFilterBadges === null || activeFilterBadges === void 0 ? void 0 : activeFilterBadges.guideCategory) {
201
- filtersToRemove = ['guideCategory'];
202
- }
203
- }
204
- }
205
- if (filtersToRemove.length > 0) {
206
- event.preventDefault();
207
- dispatch('quick-filter:remove', { types: filtersToRemove });
208
- }
209
- }, [searchContainerRef, activeFilterBadges, showTag, showGuideCategory]));
210
- var renderBadge = (0, react_1.useCallback)(function (type) {
211
- if (type === 'guideCategory' && guideCategory && showGuideCategory) {
212
- return (react_1.default.createElement(StyledFilterBadge, { text: "@".concat(guideCategory.title), routeName: name, filterType: "guideCategory", handleClick: handleFilterBadgeClick, forceFocusStyle: isNavigatingWithKeyBoard, deleteAriaLabel: deleteFilterBadgeAriaLabel, params: __assign(__assign({}, params), { guideCategory: undefined }) }));
213
- }
214
- if (type === 'tag' && tag && showTag) {
215
- return (react_1.default.createElement(StyledFilterBadge, { className: "humany-filter-badge", text: "#".concat(tag.title), routeName: name, filterType: "tag", handleClick: handleFilterBadgeClick, forceFocusStyle: isNavigatingWithKeyBoard, deleteAriaLabel: deleteFilterBadgeAriaLabel, params: __assign(__assign({}, params), { tag: undefined }) }));
216
- }
217
- return null;
218
- }, [guideCategory, tag, name, params, showGuideCategory, showTag, isNavigatingWithKeyBoard]);
219
- if (!guideCategory && !tag) {
220
- return null;
221
- }
222
- return (react_1.default.createElement(Wrapper, { className: "humany-filter-badges", position: position },
223
- guideCategory && tooltip ? (react_1.default.createElement(knowledge_widget_ui_1.Tooltip, { content: react_1.default.createElement(react_1.default.Fragment, null, tooltip), sticky: false }, renderBadge('guideCategory'))) : (renderBadge('guideCategory')),
224
- tag && renderBadge('tag')));
225
- };
226
- exports.default = FilterBadges;
227
- var Wrapper = styled_components_1.default.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n\n ", "\n"], ["\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n\n ", "\n"])), function (p) {
228
- return p.position === 'inside'
229
- ? (0, styled_components_1.css)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n &:not(:first-child) {\n margin: 0 0 0 ", ";\n }\n "], ["\n &:not(:first-child) {\n margin: 0 0 0 ", ";\n }\n "])), function (p) { var _a; return (_a = p.theme.sizes) === null || _a === void 0 ? void 0 : _a.normal; }) : (0, styled_components_1.css)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n margin: ", " 0 0 0;\n span:first-child {\n margin-left: 0;\n }\n "], ["\n margin: ", " 0 0 0;\n span:first-child {\n margin-left: 0;\n }\n "])), function (p) { var _a; return (_a = p.theme.sizes) === null || _a === void 0 ? void 0 : _a.small; });
230
- });
231
- var StyledFilterBadge = (0, styled_components_1.default)(FilterBadge)(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n display: flex;\n align-items: center;\n padding: ", ";\n background-color: ", ";\n border-radius: ", ";\n font-weight: 300;\n font-size: ", ";\n font-style: italic;\n color: #ffffff;\n text-decoration: none;\n white-space: nowrap;\n\n margin: calc(", " / 2);\n\n &:focus-within {\n ", ";\n a {\n outline: none;\n }\n }\n\n svg {\n width: 17px;\n height: 11px;\n margin: 1px 0 0 ", ";\n path {\n stroke: #ffffff;\n stroke-width: 2px;\n }\n order: 1;\n }\n"], ["\n display: flex;\n align-items: center;\n padding: ", ";\n background-color: ", ";\n border-radius: ", ";\n font-weight: 300;\n font-size: ", ";\n font-style: italic;\n color: #ffffff;\n text-decoration: none;\n white-space: nowrap;\n\n margin: calc(", " / 2);\n\n &:focus-within {\n ", ";\n a {\n outline: none;\n }\n }\n\n svg {\n width: 17px;\n height: 11px;\n margin: 1px 0 0 ", ";\n path {\n stroke: #ffffff;\n stroke-width: 2px;\n }\n order: 1;\n }\n"])), function (p) { var _a, _b; return "".concat((_a = p.theme.sizes) === null || _a === void 0 ? void 0 : _a.small, " calc(").concat((_b = p.theme.sizes) === null || _b === void 0 ? void 0 : _b.normal, "/2) "); }, function (p) { var _a; return (_a = p.theme.colors) === null || _a === void 0 ? void 0 : _a.primary; }, function (p) { return p.theme.borderRadius; }, function (p) { var _a; return (_a = p.theme.fonts) === null || _a === void 0 ? void 0 : _a.normal; }, function (p) { var _a; return (_a = p.theme.sizes) === null || _a === void 0 ? void 0 : _a.small; }, function (p) {
232
- var _a;
233
- return (((_a = p.theme.accessibility) === null || _a === void 0 ? void 0 : _a.isTabbing) || p.forceFocusStyle) && (0, styled_components_1.css)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n ", "\n background-color: transparent;\n\n svg {\n path {\n stroke: ", ";\n }\n }\n "], ["\n ", "\n background-color: transparent;\n\n svg {\n path {\n stroke: ", ";\n }\n }\n "])), knowledge_widget_ui_1.borderTabStyle, function (p) { var _a; return (_a = p.theme.colors) === null || _a === void 0 ? void 0 : _a.primary; });
234
- }, function (p) { var _a; return (_a = p.theme.sizes) === null || _a === void 0 ? void 0 : _a.small; });
235
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5;
package/lib/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- import SearchComponent from './search-component';
2
- export default SearchComponent;
package/lib/index.js DELETED
@@ -1,7 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- var search_component_1 = __importDefault(require("./search-component"));
7
- exports.default = search_component_1.default;
@@ -1,17 +0,0 @@
1
- import { Category, Tag } from '@telia-ace/knowledge-widget-core';
2
- import React from 'react';
3
- declare type Props = {
4
- filterPhrase: string;
5
- items: Category[] | Tag[];
6
- filterType: 'guideCategory' | 'tag';
7
- searchContainer: HTMLElement | null;
8
- filterContainer: HTMLElement | null;
9
- inputHasFocus: boolean;
10
- };
11
- export declare const getFocusedIndex: (elem: HTMLElement) => {
12
- anchors: HTMLAnchorElement[];
13
- focusedIndex: number;
14
- };
15
- export declare const focusInput: (searchContainerRef: HTMLElement | null) => void;
16
- declare const QuickFilterItemList: React.FC<Props>;
17
- export default QuickFilterItemList;