@telia-ace/knowledge-widget-components-search 1.0.18 → 1.0.21
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/LICENSE.txt +5 -5
- package/README.md +3 -3
- package/dist/filter-badges.d.ts +10 -10
- package/dist/index.d.ts +2 -2
- package/dist/index.js.map +1 -1
- package/dist/quick-filter-item-list.d.ts +17 -17
- package/dist/quick-filter.d.ts +7 -7
- package/dist/search-component.d.ts +42 -42
- package/dist/search.d.ts +7 -7
- package/dist/search.ffb2e6c2.js.map +1 -1
- package/dist/use-search.d.ts +10 -10
- package/dist/utils.d.ts +3 -3
- package/package.json +7 -10
package/LICENSE.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Copyright © 2021, Telia Company AB. All rights reserved.
|
|
2
|
-
|
|
3
|
-
THIS PACKAGE AND CONTAINING SOFTWARE IS PART OF
|
|
4
|
-
THE HUMANY SERVICE. BY USING THIS SOFTWARE YOU
|
|
5
|
-
AGREE TO THE FOLLOWING TERMS AND CONDITIONS:
|
|
1
|
+
Copyright © 2021, Telia Company AB. All rights reserved.
|
|
2
|
+
|
|
3
|
+
THIS PACKAGE AND CONTAINING SOFTWARE IS PART OF
|
|
4
|
+
THE HUMANY SERVICE. BY USING THIS SOFTWARE YOU
|
|
5
|
+
AGREE TO THE FOLLOWING TERMS AND CONDITIONS:
|
|
6
6
|
http://www.humany.com/legal
|
package/README.md
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
# `@telia-ace/knowledge-widget-components-search`
|
|
2
|
-
|
|
3
|
-
Search component for ACE Knowledge Widgets.
|
|
1
|
+
# `@telia-ace/knowledge-widget-components-search`
|
|
2
|
+
|
|
3
|
+
Search component for ACE Knowledge Widgets.
|
package/dist/filter-badges.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
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
|
+
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;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import SearchComponent from './search-component';
|
|
2
|
-
export default SearchComponent;
|
|
1
|
+
import SearchComponent from './search-component';
|
|
2
|
+
export default SearchComponent;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/search-component.ts"],"sourcesContent":["import { Category, createEventSubscriber, Tag } from '@telia-ace/knowledge-widget-core';\r\nimport {\r\n CategoriesResult,\r\n DataClient,\r\n DataType,\r\n MatchResult,\r\n QueryParameters,\r\n TagsResult,\r\n} from '@telia-ace/knowledge-widget-types-grid';\r\nimport { createReactComponent } from '@telia-ace/knowledge-widget-ui';\r\nimport { RoutingService } from '@telia-ace/widget-routing';\r\nimport {\r\n categoryTrail,\r\n createParams,\r\n deepClone,\r\n findCategoryById,\r\n getCategoryTrailAsObjects,\r\n Params,\r\n} from '@telia-ace/widget-utilities';\r\nimport { Container } from '@webprovisions/platform';\r\n\r\nexport type SearchComponentProps = {\r\n route?: string;\r\n role?: string;\r\n\r\n showSearchButton: boolean;\r\n showClearButton: boolean;\r\n showChildren: boolean;\r\n\r\n searchButtonLabel: string;\r\n clearButtonLabel: string;\r\n ariaLabel?: string;\r\n\r\n placeholder: string;\r\n autoFocus: boolean;\r\n incremental?: boolean | number;\r\n\r\n filterBadges?: FilterConfig | boolean;\r\n activeFilterBadges?: ActiveFilterBadges; // internal\r\n deleteFilterBadgeAriaLabel?: string;\r\n\r\n quickFilters?: FilterConfig | boolean;\r\n quickFilter?: Filter; // internal\r\n\r\n patchParams?: boolean;\r\n};\r\n\r\nexport type Filter = {\r\n items?: Category[] | Tag[];\r\n type?: 'guideCategory' | 'tag';\r\n symbol?: string;\r\n loading: boolean;\r\n open: boolean;\r\n};\r\n\r\nexport type ActiveFilterBadges = {\r\n guideCategory?: Category | null;\r\n tag?: Tag | null;\r\n tooltip?: string | null;\r\n initial?: boolean;\r\n};\r\n\r\nexport type FilterConfig = {\r\n autoSelect?: boolean;\r\n guideCategory?: boolean;\r\n tag?: boolean;\r\n position?: 'inside' | 'below';\r\n};\r\n\r\nconst hasActiveFilterBadge = (filters: ActiveFilterBadges) => {\r\n return !!filters.guideCategory || !!filters.tag;\r\n};\r\n\r\nconst getTooltip = (categoryId: string, categories: Category[]) => {\r\n const trailIds: string[] = categoryTrail(categoryId, categories);\r\n const categoryMap = getCategoryTrailAsObjects(trailIds, categories);\r\n const trail = trailIds.map((id) => categoryMap.get(id)?.title || '').join(' / ');\r\n return trail;\r\n};\r\n\r\nconst sortRecursive = (items: any[]) => {\r\n const clone = deepClone(items);\r\n\r\n clone.sort((a: any, b: any) => {\r\n if (a.title > b.title) {\r\n return 1;\r\n }\r\n return -1;\r\n });\r\n\r\n clone.forEach((item: any) => {\r\n if (item.items) {\r\n item.items = sortRecursive(item.items);\r\n }\r\n });\r\n\r\n return clone;\r\n};\r\n\r\nconst SearchComponent = (container: Container) => {\r\n return createReactComponent(container, 'search', import('./search'), (component) => {\r\n const { events } = container.get('$widget');\r\n const [subscribe, unsubscribe] = createEventSubscriber(events);\r\n\r\n const load = (params: Params) => {\r\n const { activeFilterBadges } = component.properties<SearchComponentProps>();\r\n\r\n if (\r\n activeFilterBadges?.guideCategory?.id !== params.guideCategory ||\r\n activeFilterBadges?.tag?.id !== params.tag\r\n ) {\r\n component.actions.dispatch('quick-filter:add', {\r\n tag: params.tag,\r\n category: params.guideCategory,\r\n initial: true,\r\n });\r\n }\r\n };\r\n\r\n component.actions.create('search', (data) => {\r\n const { value, filters, filtersChanged } = data;\r\n const { route = 'search', patchParams = false } =\r\n component.properties<SearchComponentProps>();\r\n\r\n if (\r\n value.length > 0 ||\r\n ((hasActiveFilterBadge(filters) || filtersChanged) && !filters?.initial)\r\n ) {\r\n container.getAsync('router').then((router: RoutingService) => {\r\n const { params } = router.getRouteData();\r\n\r\n let searchParams: { [key: string]: string | undefined } = {\r\n guide: undefined,\r\n id: undefined,\r\n accordion: undefined,\r\n contactMethod: undefined,\r\n };\r\n\r\n searchParams.phrase = value.length > 0 ? encodeURIComponent(value) : '';\r\n\r\n if (patchParams) {\r\n searchParams = {\r\n ...params,\r\n ...searchParams,\r\n };\r\n }\r\n\r\n if (filters?.guideCategory || filtersChanged) {\r\n searchParams.guideCategory = filters.guideCategory?.id || undefined;\r\n }\r\n\r\n if (filters?.tag || filtersChanged) {\r\n searchParams.tag = filters.tag?.id || undefined;\r\n }\r\n\r\n router.navigate(route, createParams(searchParams));\r\n });\r\n }\r\n });\r\n\r\n component.actions.create('clear', (data, options) => {\r\n if (data.navigateToHome) {\r\n container.getAsync('router').then((router: RoutingService) => {\r\n const { name }: any = router.getInitialRoute();\r\n router.navigate(name);\r\n });\r\n }\r\n });\r\n\r\n const getRouterParams: () => Promise<Params> = () =>\r\n container\r\n .getAsync('router')\r\n .then((router: RoutingService) => router.getRouteData().params);\r\n\r\n component.actions.create(\r\n 'quick-filter:add',\r\n (data: { category?: string; tag?: string; initial?: boolean }) => {\r\n const { category, tag, initial } = data;\r\n const { activeFilterBadges: previous } =\r\n component.properties<SearchComponentProps>();\r\n\r\n const activeFilterBadges: ActiveFilterBadges = previous || {\r\n initial,\r\n guideCategory: null,\r\n tag: null,\r\n tooltip: null,\r\n };\r\n\r\n return Promise.resolve()\r\n .then(() => {\r\n if (category) {\r\n return fetchCategories({}).then((categories) => {\r\n const categoryItem =\r\n <Category | null>findCategoryById(category, categories) || null;\r\n return {\r\n ...activeFilterBadges,\r\n guideCategory: categoryItem,\r\n tooltip: getTooltip(category, categories) || null,\r\n };\r\n });\r\n }\r\n return {\r\n ...activeFilterBadges,\r\n guideCategory: null,\r\n tooltip: null,\r\n };\r\n })\r\n .then((next) => {\r\n if (tag) {\r\n return fetchTags({}).then((tags) => {\r\n return {\r\n ...next,\r\n tag: tags.find((t) => t.id === tag) || null,\r\n };\r\n });\r\n }\r\n return {\r\n ...next,\r\n tag: null,\r\n };\r\n })\r\n .then((next) => {\r\n return component.writeProperties({\r\n activeFilterBadges: { ...next, initial: !!initial },\r\n });\r\n });\r\n }\r\n );\r\n\r\n component.actions.create('quick-filter:remove', ({ types }: { types: string[] }) => {\r\n const { activeFilterBadges } = component.properties<SearchComponentProps>();\r\n\r\n component.writeProperties({\r\n activeFilterBadges: {\r\n ...activeFilterBadges,\r\n initial: false,\r\n guideCategory:\r\n types.indexOf('guideCategory') > -1\r\n ? null\r\n : activeFilterBadges?.guideCategory,\r\n tag: types.indexOf('tag') > -1 ? null : activeFilterBadges?.tag,\r\n },\r\n });\r\n });\r\n\r\n component.actions.create('quick-filter:close', () => {\r\n return component.writeProperties({\r\n quickFilter: {\r\n items: [],\r\n loading: false,\r\n open: false,\r\n },\r\n });\r\n });\r\n\r\n component.actions.create('quick-filter:open', ({ symbol, type }) => {\r\n component.writeProperties({\r\n quickFilter: {\r\n type,\r\n symbol,\r\n items: [],\r\n loading: true,\r\n open: true,\r\n },\r\n });\r\n\r\n return getRouterParams().then(({ tag, guideCategory, phrase }) => {\r\n if (type === 'guideCategory') {\r\n return fetchCategories({\r\n tagId: tag,\r\n searchPhrase: phrase,\r\n }).then((items) => {\r\n const clone = deepClone(items);\r\n\r\n component.writeProperties({\r\n quickFilter: {\r\n items: sortRecursive(clone),\r\n loading: false,\r\n },\r\n });\r\n });\r\n }\r\n\r\n if (type === 'tag') {\r\n return fetchTags({\r\n categories: guideCategory,\r\n searchPhrase: phrase,\r\n }).then((items) => {\r\n const clone = deepClone(items);\r\n component.writeProperties({\r\n quickFilter: {\r\n items: sortRecursive(clone),\r\n loading: false,\r\n },\r\n });\r\n });\r\n }\r\n });\r\n });\r\n\r\n const fetchCategories = (params: QueryParameters) => {\r\n return container\r\n .getAsync('dataClient')\r\n .then((dataClient: DataClient) =>\r\n dataClient.fetch(DataType.GuideCategories, params)\r\n )\r\n .then((categoriesResult: CategoriesResult) => categoriesResult.categories || []);\r\n };\r\n\r\n const fetchTags = (params: QueryParameters) => {\r\n return container\r\n .getAsync('dataClient')\r\n .then((dataClient: DataClient) => dataClient.fetch(DataType.TagsOnGuides, params))\r\n .then((tags: TagsResult = []) => tags);\r\n };\r\n\r\n getRouterParams().then((params) => {\r\n load(params);\r\n });\r\n\r\n subscribe('router:changed', (_, { current }) => {\r\n const {\r\n routeData: { params },\r\n } = current;\r\n load(params);\r\n });\r\n\r\n subscribe('data-client:fetched', (event, data) => {\r\n const { filterBadges } = component.properties<SearchComponentProps>();\r\n\r\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\r\n\r\n if (data.type === 'match' && showTag) {\r\n getRouterParams().then(({ tag: tagId }) => {\r\n const { tags = [] }: MatchResult = data.response;\r\n const tag = tags.find((t) => t.id === tagId) || null;\r\n component.writeProperties({ filters: { tag } });\r\n });\r\n }\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n });\r\n};\r\n\r\nexport default SearchComponent;\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/search-component.ts"],"sourcesContent":["import { Category, createEventSubscriber, Tag } from '@telia-ace/knowledge-widget-core';\nimport {\n CategoriesResult,\n DataClient,\n DataType,\n MatchResult,\n QueryParameters,\n TagsResult,\n} from '@telia-ace/knowledge-widget-types-grid';\nimport { createReactComponent } from '@telia-ace/knowledge-widget-ui';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport {\n categoryTrail,\n createParams,\n deepClone,\n findCategoryById,\n getCategoryTrailAsObjects,\n Params,\n} from '@telia-ace/widget-utilities';\nimport { Container } from '@webprovisions/platform';\n\nexport type SearchComponentProps = {\n route?: string;\n role?: string;\n\n showSearchButton: boolean;\n showClearButton: boolean;\n showChildren: boolean;\n\n searchButtonLabel: string;\n clearButtonLabel: string;\n ariaLabel?: string;\n\n placeholder: string;\n autoFocus: boolean;\n incremental?: boolean | number;\n\n filterBadges?: FilterConfig | boolean;\n activeFilterBadges?: ActiveFilterBadges; // internal\n deleteFilterBadgeAriaLabel?: string;\n\n quickFilters?: FilterConfig | boolean;\n quickFilter?: Filter; // internal\n\n patchParams?: boolean;\n};\n\nexport type Filter = {\n items?: Category[] | Tag[];\n type?: 'guideCategory' | 'tag';\n symbol?: string;\n loading: boolean;\n open: boolean;\n};\n\nexport type ActiveFilterBadges = {\n guideCategory?: Category | null;\n tag?: Tag | null;\n tooltip?: string | null;\n initial?: boolean;\n};\n\nexport type FilterConfig = {\n autoSelect?: boolean;\n guideCategory?: boolean;\n tag?: boolean;\n position?: 'inside' | 'below';\n};\n\nconst hasActiveFilterBadge = (filters: ActiveFilterBadges) => {\n return !!filters.guideCategory || !!filters.tag;\n};\n\nconst getTooltip = (categoryId: string, categories: Category[]) => {\n const trailIds: string[] = categoryTrail(categoryId, categories);\n const categoryMap = getCategoryTrailAsObjects(trailIds, categories);\n const trail = trailIds.map((id) => categoryMap.get(id)?.title || '').join(' / ');\n return trail;\n};\n\nconst sortRecursive = (items: any[]) => {\n const clone = deepClone(items);\n\n clone.sort((a: any, b: any) => {\n if (a.title > b.title) {\n return 1;\n }\n return -1;\n });\n\n clone.forEach((item: any) => {\n if (item.items) {\n item.items = sortRecursive(item.items);\n }\n });\n\n return clone;\n};\n\nconst SearchComponent = (container: Container) => {\n return createReactComponent(container, 'search', import('./search'), (component) => {\n const { events } = container.get('$widget');\n const [subscribe, unsubscribe] = createEventSubscriber(events);\n\n const load = (params: Params) => {\n const { activeFilterBadges } = component.properties<SearchComponentProps>();\n\n if (\n activeFilterBadges?.guideCategory?.id !== params.guideCategory ||\n activeFilterBadges?.tag?.id !== params.tag\n ) {\n component.actions.dispatch('quick-filter:add', {\n tag: params.tag,\n category: params.guideCategory,\n initial: true,\n });\n }\n };\n\n component.actions.create('search', (data) => {\n const { value, filters, filtersChanged } = data;\n const { route = 'search', patchParams = false } =\n component.properties<SearchComponentProps>();\n\n if (\n value.length > 0 ||\n ((hasActiveFilterBadge(filters) || filtersChanged) && !filters?.initial)\n ) {\n container.getAsync('router').then((router: RoutingService) => {\n const { params } = router.getRouteData();\n\n let searchParams: { [key: string]: string | undefined } = {\n guide: undefined,\n id: undefined,\n accordion: undefined,\n contactMethod: undefined,\n };\n\n searchParams.phrase = value.length > 0 ? encodeURIComponent(value) : '';\n\n if (patchParams) {\n searchParams = {\n ...params,\n ...searchParams,\n };\n }\n\n if (filters?.guideCategory || filtersChanged) {\n searchParams.guideCategory = filters.guideCategory?.id || undefined;\n }\n\n if (filters?.tag || filtersChanged) {\n searchParams.tag = filters.tag?.id || undefined;\n }\n\n router.navigate(route, createParams(searchParams));\n });\n }\n });\n\n component.actions.create('clear', (data, options) => {\n if (data.navigateToHome) {\n container.getAsync('router').then((router: RoutingService) => {\n const { name }: any = router.getInitialRoute();\n router.navigate(name);\n });\n }\n });\n\n const getRouterParams: () => Promise<Params> = () =>\n container\n .getAsync('router')\n .then((router: RoutingService) => router.getRouteData().params);\n\n component.actions.create(\n 'quick-filter:add',\n (data: { category?: string; tag?: string; initial?: boolean }) => {\n const { category, tag, initial } = data;\n const { activeFilterBadges: previous } =\n component.properties<SearchComponentProps>();\n\n const activeFilterBadges: ActiveFilterBadges = previous || {\n initial,\n guideCategory: null,\n tag: null,\n tooltip: null,\n };\n\n return Promise.resolve()\n .then(() => {\n if (category) {\n return fetchCategories({}).then((categories) => {\n const categoryItem =\n <Category | null>findCategoryById(category, categories) || null;\n return {\n ...activeFilterBadges,\n guideCategory: categoryItem,\n tooltip: getTooltip(category, categories) || null,\n };\n });\n }\n return {\n ...activeFilterBadges,\n guideCategory: null,\n tooltip: null,\n };\n })\n .then((next) => {\n if (tag) {\n return fetchTags({}).then((tags) => {\n return {\n ...next,\n tag: tags.find((t) => t.id === tag) || null,\n };\n });\n }\n return {\n ...next,\n tag: null,\n };\n })\n .then((next) => {\n return component.writeProperties({\n activeFilterBadges: { ...next, initial: !!initial },\n });\n });\n }\n );\n\n component.actions.create('quick-filter:remove', ({ types }: { types: string[] }) => {\n const { activeFilterBadges } = component.properties<SearchComponentProps>();\n\n component.writeProperties({\n activeFilterBadges: {\n ...activeFilterBadges,\n initial: false,\n guideCategory:\n types.indexOf('guideCategory') > -1\n ? null\n : activeFilterBadges?.guideCategory,\n tag: types.indexOf('tag') > -1 ? null : activeFilterBadges?.tag,\n },\n });\n });\n\n component.actions.create('quick-filter:close', () => {\n return component.writeProperties({\n quickFilter: {\n items: [],\n loading: false,\n open: false,\n },\n });\n });\n\n component.actions.create('quick-filter:open', ({ symbol, type }) => {\n component.writeProperties({\n quickFilter: {\n type,\n symbol,\n items: [],\n loading: true,\n open: true,\n },\n });\n\n return getRouterParams().then(({ tag, guideCategory, phrase }) => {\n if (type === 'guideCategory') {\n return fetchCategories({\n tagId: tag,\n searchPhrase: phrase,\n }).then((items) => {\n const clone = deepClone(items);\n\n component.writeProperties({\n quickFilter: {\n items: sortRecursive(clone),\n loading: false,\n },\n });\n });\n }\n\n if (type === 'tag') {\n return fetchTags({\n categories: guideCategory,\n searchPhrase: phrase,\n }).then((items) => {\n const clone = deepClone(items);\n component.writeProperties({\n quickFilter: {\n items: sortRecursive(clone),\n loading: false,\n },\n });\n });\n }\n });\n });\n\n const fetchCategories = (params: QueryParameters) => {\n return container\n .getAsync('dataClient')\n .then((dataClient: DataClient) =>\n dataClient.fetch(DataType.GuideCategories, params)\n )\n .then((categoriesResult: CategoriesResult) => categoriesResult.categories || []);\n };\n\n const fetchTags = (params: QueryParameters) => {\n return container\n .getAsync('dataClient')\n .then((dataClient: DataClient) => dataClient.fetch(DataType.TagsOnGuides, params))\n .then((tags: TagsResult = []) => tags);\n };\n\n getRouterParams().then((params) => {\n load(params);\n });\n\n subscribe('router:changed', (_, { current }) => {\n const {\n routeData: { params },\n } = current;\n load(params);\n });\n\n subscribe('data-client:fetched', (event, data) => {\n const { filterBadges } = component.properties<SearchComponentProps>();\n\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\n\n if (data.type === 'match' && showTag) {\n getRouterParams().then(({ tag: tagId }) => {\n const { tags = [] }: MatchResult = data.response;\n const tag = tags.find((t) => t.id === tagId) || null;\n component.writeProperties({ filters: { tag } });\n });\n }\n });\n\n return () => {\n unsubscribe();\n };\n });\n};\n\nexport default SearchComponent;\n"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,17 @@
|
|
|
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;
|
|
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;
|
package/dist/quick-filter.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
declare type Props = {
|
|
2
|
-
phrase: string;
|
|
3
|
-
inputHasFocus: boolean;
|
|
4
|
-
searchContainerRef: HTMLElement | null;
|
|
5
|
-
};
|
|
6
|
-
declare const _default: ({ phrase, inputHasFocus, searchContainerRef }: Props) => JSX.Element | null;
|
|
7
|
-
export default _default;
|
|
1
|
+
declare type Props = {
|
|
2
|
+
phrase: string;
|
|
3
|
+
inputHasFocus: boolean;
|
|
4
|
+
searchContainerRef: HTMLElement | null;
|
|
5
|
+
};
|
|
6
|
+
declare const _default: ({ phrase, inputHasFocus, searchContainerRef }: Props) => JSX.Element | null;
|
|
7
|
+
export default _default;
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
import { Category, Tag } from '@telia-ace/knowledge-widget-core';
|
|
2
|
-
import { Container } from '@webprovisions/platform';
|
|
3
|
-
export declare type SearchComponentProps = {
|
|
4
|
-
route?: string;
|
|
5
|
-
role?: string;
|
|
6
|
-
showSearchButton: boolean;
|
|
7
|
-
showClearButton: boolean;
|
|
8
|
-
showChildren: boolean;
|
|
9
|
-
searchButtonLabel: string;
|
|
10
|
-
clearButtonLabel: string;
|
|
11
|
-
ariaLabel?: string;
|
|
12
|
-
placeholder: string;
|
|
13
|
-
autoFocus: boolean;
|
|
14
|
-
incremental?: boolean | number;
|
|
15
|
-
filterBadges?: FilterConfig | boolean;
|
|
16
|
-
activeFilterBadges?: ActiveFilterBadges;
|
|
17
|
-
deleteFilterBadgeAriaLabel?: string;
|
|
18
|
-
quickFilters?: FilterConfig | boolean;
|
|
19
|
-
quickFilter?: Filter;
|
|
20
|
-
patchParams?: boolean;
|
|
21
|
-
};
|
|
22
|
-
export declare type Filter = {
|
|
23
|
-
items?: Category[] | Tag[];
|
|
24
|
-
type?: 'guideCategory' | 'tag';
|
|
25
|
-
symbol?: string;
|
|
26
|
-
loading: boolean;
|
|
27
|
-
open: boolean;
|
|
28
|
-
};
|
|
29
|
-
export declare type ActiveFilterBadges = {
|
|
30
|
-
guideCategory?: Category | null;
|
|
31
|
-
tag?: Tag | null;
|
|
32
|
-
tooltip?: string | null;
|
|
33
|
-
initial?: boolean;
|
|
34
|
-
};
|
|
35
|
-
export declare type FilterConfig = {
|
|
36
|
-
autoSelect?: boolean;
|
|
37
|
-
guideCategory?: boolean;
|
|
38
|
-
tag?: boolean;
|
|
39
|
-
position?: 'inside' | 'below';
|
|
40
|
-
};
|
|
41
|
-
declare const SearchComponent: (container: Container) => Promise<void>;
|
|
42
|
-
export default SearchComponent;
|
|
1
|
+
import { Category, Tag } from '@telia-ace/knowledge-widget-core';
|
|
2
|
+
import { Container } from '@webprovisions/platform';
|
|
3
|
+
export declare type SearchComponentProps = {
|
|
4
|
+
route?: string;
|
|
5
|
+
role?: string;
|
|
6
|
+
showSearchButton: boolean;
|
|
7
|
+
showClearButton: boolean;
|
|
8
|
+
showChildren: boolean;
|
|
9
|
+
searchButtonLabel: string;
|
|
10
|
+
clearButtonLabel: string;
|
|
11
|
+
ariaLabel?: string;
|
|
12
|
+
placeholder: string;
|
|
13
|
+
autoFocus: boolean;
|
|
14
|
+
incremental?: boolean | number;
|
|
15
|
+
filterBadges?: FilterConfig | boolean;
|
|
16
|
+
activeFilterBadges?: ActiveFilterBadges;
|
|
17
|
+
deleteFilterBadgeAriaLabel?: string;
|
|
18
|
+
quickFilters?: FilterConfig | boolean;
|
|
19
|
+
quickFilter?: Filter;
|
|
20
|
+
patchParams?: boolean;
|
|
21
|
+
};
|
|
22
|
+
export declare type Filter = {
|
|
23
|
+
items?: Category[] | Tag[];
|
|
24
|
+
type?: 'guideCategory' | 'tag';
|
|
25
|
+
symbol?: string;
|
|
26
|
+
loading: boolean;
|
|
27
|
+
open: boolean;
|
|
28
|
+
};
|
|
29
|
+
export declare type ActiveFilterBadges = {
|
|
30
|
+
guideCategory?: Category | null;
|
|
31
|
+
tag?: Tag | null;
|
|
32
|
+
tooltip?: string | null;
|
|
33
|
+
initial?: boolean;
|
|
34
|
+
};
|
|
35
|
+
export declare type FilterConfig = {
|
|
36
|
+
autoSelect?: boolean;
|
|
37
|
+
guideCategory?: boolean;
|
|
38
|
+
tag?: boolean;
|
|
39
|
+
position?: 'inside' | 'below';
|
|
40
|
+
};
|
|
41
|
+
declare const SearchComponent: (container: Container) => Promise<void>;
|
|
42
|
+
export default SearchComponent;
|
package/dist/search.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
declare type Props = {
|
|
3
|
-
className: string;
|
|
4
|
-
role?: string;
|
|
5
|
-
};
|
|
6
|
-
declare const Search: React.SFC<Props>;
|
|
7
|
-
export default Search;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
declare type Props = {
|
|
3
|
+
className: string;
|
|
4
|
+
role?: string;
|
|
5
|
+
};
|
|
6
|
+
declare const Search: React.SFC<Props>;
|
|
7
|
+
export default Search;
|
|
@@ -1 +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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"}
|
|
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 {\n borderTabStyle,\n Link,\n SymbolBadge,\n Text,\n Tooltip,\n useDispatch,\n useEventListener,\n useKeyPress,\n useProperties,\n useRouteData,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useRef, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport { SearchComponentProps } from './search-component';\n\nconst FilterBadge: React.FC<any> = ({\n text,\n className,\n forceFocusStyle,\n filterType,\n handleClick,\n deleteAriaLabel = '',\n ...p\n}) => {\n const ref = useRef<HTMLAnchorElement>();\n\n return (\n <Text\n className={appendClassNames(className, 'humany-filter-badge')}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleClick(e, filterType);\n }\n }}\n >\n {text}\n <Link\n {...p}\n ref={ref}\n tabIndex={0}\n role=\"button\"\n aria-label={deleteAriaLabel.replace('{{item}}', text)}\n onClick={(e) => handleClick(e, filterType)}\n >\n <SymbolBadge size={13} symbol={{ type: 'Svg', content: 'close' }} />\n </Link>\n </Text>\n );\n};\n\ntype Props = {\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n showGuideCategory: boolean;\n showTag: boolean;\n position: 'inside' | 'below';\n};\nconst FilterBadges: React.FC<Props> = ({\n inputHasFocus,\n searchContainerRef,\n showTag,\n showGuideCategory,\n position,\n}) => {\n const { activeFilterBadges = {}, deleteFilterBadgeAriaLabel = '' } =\n useProperties<SearchComponentProps>();\n const dispatch = useDispatch();\n const { name, params } = useRouteData();\n const [isNavigatingWithKeyBoard, setIsNavigatingWithKeyboard] = useState(false);\n\n const onKeyDown = useCallback((event: KeyboardEvent) => {\n const { key } = event;\n\n if (['ArrowLeft', 'ArrowRight'].indexOf(key) === -1) {\n setIsNavigatingWithKeyboard(false);\n }\n }, []);\n\n useEventListener('keydown', onKeyDown, window);\n\n useEventListener('click', onKeyDown, window);\n\n const { guideCategory, tag, tooltip } = activeFilterBadges;\n\n const getFocusedFilterBadge = (container: HTMLElement) => {\n const badges = container.querySelectorAll(\n '.humany-filter-badge'\n ) as NodeListOf<HTMLElement>;\n return {\n badges,\n index: Array.from(badges).findIndex((e) => document.activeElement === e),\n };\n };\n\n const handleFilterBadgeClick = (\n event: React.MouseEvent | React.KeyboardEvent,\n filterType: string\n ) => {\n event.preventDefault();\n dispatch('quick-filter:remove', { types: [filterType] });\n };\n\n const keyboardNavigation = (\n direction: 'left' | 'right',\n inputElem: HTMLInputElement | null\n ) => {\n if (!searchContainerRef) {\n return;\n }\n const { badges, index: currentFocusedIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (badges.length) {\n let toFocus: HTMLElement | null = null;\n\n if (direction === 'left') {\n if (currentFocusedIndex === -1) {\n // if no badge is focused and direction is left\n // focus last badge\n toFocus = badges.item(badges.length - 1);\n } else if (currentFocusedIndex > 0) {\n // if there are more badges to the left, go one step back\n // do nothing if already focusing the most left badge\n toFocus = badges.item(currentFocusedIndex - 1);\n }\n } else if (direction === 'right') {\n if (currentFocusedIndex === badges.length - 1) {\n // if currently focusing the last badge, move focus to search input\n inputElem && inputElem.focus();\n } else if (badges.item(currentFocusedIndex + 1)) {\n toFocus = badges.item(currentFocusedIndex + 1);\n }\n }\n\n if (toFocus) {\n toFocus.focus();\n setIsNavigatingWithKeyboard(true);\n }\n }\n };\n\n useKeyPress(\n 'ArrowLeft',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (inputHasFocus || focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isAtBeginningOfInput =\n inputElem && inputElem.selectionStart !== null && inputElem.selectionStart <= 0;\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isAtBeginningOfInput || isFocusingAFilterBadge) {\n keyboardNavigation('left', inputElem);\n }\n }\n }, [inputHasFocus, searchContainerRef])\n );\n\n useKeyPress(\n 'ArrowRight',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n keyboardNavigation('right', inputElem);\n }\n }\n }, [searchContainerRef])\n );\n\n useKeyPress(\n 'Backspace',\n useCallback(\n (event) => {\n if (!searchContainerRef) {\n return;\n }\n let filtersToRemove: string[] = [];\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n if (focusedBadgeIndex === 0) {\n if (showGuideCategory) {\n filtersToRemove = ['guideCategory'];\n } else if (showTag) {\n filtersToRemove = ['tag'];\n }\n } else if (focusedBadgeIndex === 1) {\n filtersToRemove = ['tag'];\n }\n } else {\n const isAtBeginningOfInput =\n inputElem &&\n inputElem.selectionStart !== null &&\n inputElem.selectionStart <= 0;\n\n if (isAtBeginningOfInput) {\n if (activeFilterBadges?.tag) {\n filtersToRemove = ['tag'];\n } else if (activeFilterBadges?.guideCategory) {\n filtersToRemove = ['guideCategory'];\n }\n }\n }\n\n if (filtersToRemove.length > 0) {\n event.preventDefault();\n dispatch('quick-filter:remove', { types: filtersToRemove });\n }\n },\n [searchContainerRef, activeFilterBadges, showTag, showGuideCategory]\n )\n );\n\n const renderBadge = useCallback(\n (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory' && guideCategory && showGuideCategory) {\n return (\n <StyledFilterBadge\n text={`@${guideCategory.title}`}\n routeName={name}\n filterType=\"guideCategory\"\n handleClick={handleFilterBadgeClick}\n forceFocusStyle={isNavigatingWithKeyBoard}\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n guideCategory: undefined,\n }}\n />\n );\n }\n if (type === 'tag' && tag && showTag) {\n return (\n <StyledFilterBadge\n className=\"humany-filter-badge\"\n text={`#${tag.title}`}\n routeName={name}\n filterType=\"tag\"\n handleClick={handleFilterBadgeClick}\n forceFocusStyle={isNavigatingWithKeyBoard}\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n tag: undefined,\n }}\n />\n );\n }\n return null;\n },\n [guideCategory, tag, name, params, showGuideCategory, showTag, isNavigatingWithKeyBoard]\n );\n\n if (!guideCategory && !tag) {\n return null;\n }\n\n return (\n <Wrapper className=\"humany-filter-badges\" position={position}>\n {guideCategory && tooltip ? (\n <Tooltip content={<>{tooltip}</>} sticky={false}>\n {renderBadge('guideCategory')}\n </Tooltip>\n ) : (\n renderBadge('guideCategory')\n )}\n {tag && renderBadge('tag')}\n </Wrapper>\n );\n};\n\nexport default FilterBadges;\n\nconst Wrapper = styled.div<{ position: 'inside' | 'below' }>`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n\n ${(p) =>\n p.position === 'inside'\n ? css`\n &:not(:first-child) {\n margin: 0 0 0 ${(p) => p.theme.sizes?.normal};\n }\n `\n : css`\n margin: ${(p) => p.theme.sizes?.small} 0 0 0;\n span:first-child {\n margin-left: 0;\n }\n `}\n`;\n\nconst StyledFilterBadge = styled(FilterBadge)`\n display: flex;\n align-items: center;\n padding: ${(p) => `${p.theme.sizes?.small} calc(${p.theme.sizes?.normal}/2) `};\n background-color: ${(p) => p.theme.colors?.primary};\n border-radius: ${(p) => p.theme.borderRadius};\n font-weight: 300;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-style: italic;\n color: #ffffff;\n text-decoration: none;\n white-space: nowrap;\n\n margin: calc(${(p) => p.theme.sizes?.small} / 2);\n\n &:focus-within {\n ${(p) =>\n (p.theme.accessibility?.isTabbing || p.forceFocusStyle) &&\n css`\n ${borderTabStyle}\n background-color: transparent;\n\n svg {\n path {\n stroke: ${(p) => p.theme.colors?.primary};\n }\n }\n `};\n a {\n outline: none;\n }\n }\n\n svg {\n width: 17px;\n height: 11px;\n margin: 1px 0 0 ${(p) => p.theme.sizes?.small};\n path {\n stroke: #ffffff;\n stroke-width: 2px;\n }\n order: 1;\n }\n`;\n","import { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport { categoryTrail, deepClone } from '@telia-ace/widget-utilities';\n\nexport const match = (title: string, phrase: string) => {\n if (!phrase || !title) {\n return true;\n }\n\n return !!(title.toLowerCase().indexOf(phrase.toLowerCase()) > -1);\n};\n\nexport const filterItems = (\n items: (Tag | Category)[] = [],\n type: 'tag' | 'guideCategory',\n phrase: string\n): any[] => {\n if (!phrase) {\n return items;\n }\n\n const cloned = deepClone(items);\n\n if (type === 'tag') {\n return cloned.filter((i: Tag) => match(i.title, phrase));\n }\n\n const matchTrail = buildMatchTrail(cloned, phrase);\n const filtered = recursiveFilter(cloned, (c: Category) => matchTrail.indexOf(c.id) > -1);\n\n return filtered;\n};\n\nconst recursiveFilter = (items: Category[], fn: (c: Category) => boolean) => {\n return items.filter((i: Category) => {\n if (i.items && i.items.length) {\n i.items = recursiveFilter(i.items, fn);\n }\n\n return fn(i);\n });\n};\n\nconst buildMatchTrail = (categories: Category[], phrase: string) => {\n const flattened = flatten(categories);\n const matching = flattened.filter((c) => match(c.title, phrase)).map((c) => c.id);\n\n let res: string[] = [];\n\n matching.forEach((id) => {\n const trail = categoryTrail(id, categories);\n\n res = res.concat(trail);\n });\n\n return res;\n};\n\nconst flatten = (categories: Category[]): Category[] => {\n let result: Category[] = [];\n\n categories.forEach((category) => {\n result.push(category);\n\n if (Array.isArray(category.items)) {\n result = result.concat(flatten(category.items));\n }\n });\n\n return result;\n};\n","import { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport {\n ItemTree,\n Link,\n Text,\n useDispatch,\n useEventListener,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport { SearchComponentProps } from './search-component';\nimport { filterItems, match } from './utils';\n\ntype Props = {\n filterPhrase: string;\n items: Category[] | Tag[];\n filterType: 'guideCategory' | 'tag';\n searchContainer: HTMLElement | null;\n filterContainer: HTMLElement | null;\n inputHasFocus: boolean;\n};\n\nexport const getFocusedIndex = (elem: HTMLElement) => {\n const anchors = Array.from(elem?.getElementsByTagName('A') || []).filter(\n (a) => a.getAttribute('disabled') === null\n ) as HTMLAnchorElement[];\n return {\n anchors,\n focusedIndex: anchors.findIndex((e) => document.activeElement === e),\n };\n};\n\nconst getInputElem = (searchContainerRef: HTMLElement | null) => {\n return searchContainerRef\n ? (searchContainerRef.querySelector(\n '[data-type=\"search\"], input[type=\"search\"]'\n ) as HTMLElement | null)\n : null;\n};\n\nexport const focusInput = (searchContainerRef: HTMLElement | null) => {\n if (!searchContainerRef) {\n return;\n }\n const inputElem = getInputElem(searchContainerRef);\n if (inputElem) {\n inputElem.focus();\n }\n};\n\nconst QuickFilterItemList: React.FC<Props> = ({\n filterPhrase,\n items: rawItems,\n filterType,\n filterContainer,\n searchContainer,\n inputHasFocus,\n}) => {\n const [items, setItems] = useState<Category[] | Tag[]>(rawItems || []);\n const [first, setFirst] = useState<string | null>(null);\n const dispatch = useDispatch();\n const { activeFilterBadges, quickFilters } = useProperties<SearchComponentProps>();\n const autoSelect =\n (typeof quickFilters === 'object' && !!quickFilters.autoSelect) ||\n (typeof quickFilters === 'boolean' && !!quickFilters);\n\n useEffect(() => {\n setItems(filterItems(rawItems, filterType, filterPhrase));\n }, [filterPhrase, filterType, rawItems]);\n\n useEffect(() => {\n if (filterContainer) {\n const { anchors } = getFocusedIndex(filterContainer);\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n setFirst(id);\n }\n }\n }, [items, filterContainer]);\n\n const handleItemClicked = useCallback(\n (item: Partial<{ id: string }>, type: 'guideCategory' | 'tag') => {\n const data: { category?: string; tag?: string } = {\n category: activeFilterBadges?.guideCategory\n ? activeFilterBadges.guideCategory.id\n : undefined,\n tag: activeFilterBadges?.tag ? activeFilterBadges.tag.id : undefined,\n };\n\n if (type === 'guideCategory') {\n data.category = item.id;\n } else if (type === 'tag') {\n data.tag = item.id;\n }\n dispatch('quick-filter:add', data);\n },\n [activeFilterBadges, dispatch]\n );\n\n const buildListProps = (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory') {\n return {\n renderItem: (item: Category, level: number) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n disabled={!match(item.title, filterPhrase)}\n tabIndex={!match(item.title, filterPhrase) ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n data-level={level}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n }\n return {\n renderLi: true,\n renderItem: (item: Tag) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n symbol=\"#\"\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n };\n\n useEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n const { key } = e;\n if (\n !filterContainer ||\n !(key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter')\n ) {\n return;\n }\n\n const { anchors, focusedIndex } = getFocusedIndex(filterContainer);\n\n if (key === 'Enter') {\n if (inputHasFocus && autoSelect) {\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n handleItemClicked({ id }, filterType);\n }\n }\n return;\n }\n\n const focusFirst = () => anchors[0]?.focus();\n const focusLast = () => anchors[anchors.length - 1]?.focus();\n const focusNext = () => anchors[focusedIndex + 1]?.focus();\n const focusPrev = () => anchors[focusedIndex - 1]?.focus();\n\n if (inputHasFocus) {\n // Input is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n focusFirst();\n } else {\n focusLast();\n }\n } else if (focusedIndex > -1) {\n // A quick-filter-item is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n if (anchors.length > focusedIndex + 1) {\n focusNext();\n } else {\n focusInput(searchContainer);\n }\n } else {\n if (focusedIndex - 1 < 0) {\n focusInput(searchContainer);\n } else {\n focusPrev();\n }\n }\n }\n },\n window\n );\n\n return (\n <ItemTree\n tree={items}\n renderEmpty={false}\n ulProps={{ role: 'listbox' }}\n liProps={{ role: 'option' }}\n {...buildListProps(filterType)}\n />\n );\n};\n\nexport default QuickFilterItemList;\n\ntype TitleProps = {\n title: string;\n phrase: string;\n matches: boolean;\n symbol?: string;\n};\n\nconst Title: React.FC<TitleProps> = ({ title, phrase, matches, symbol = '' }) => {\n const createTitle = () => {\n if (!matches || !phrase) {\n return [title];\n }\n\n const index = title.toLowerCase().indexOf(phrase.toLowerCase());\n const start = title.substr(0, index);\n const bold = title.slice(index, index + phrase.length);\n const end = title.substr(index + phrase.length);\n return [start, bold, end];\n };\n\n const [start, bold, end] = createTitle();\n\n return (\n <Text>\n {symbol}\n {start}\n {bold ? <strong>{bold}</strong> : null}\n {end ? end : null}\n </Text>\n );\n};\n\nconst disabledCss = css<any>`\n opacity: 0.5;\n pointer-events: none;\n`;\n\nconst focused = css<{ 'data-level'?: number; autoSelect: boolean }>`\n background-color: ${(p) => p.theme.colors?.text};\n color: #ffffff;\n outline: none;\n\n span:first-child {\n border-color: ${(p) => p.theme.colors?.text};\n }\n`;\n\nconst StyledLink = styled(Link)<{ 'data-level'?: number; autoSelect: boolean }>`\n display: block;\n text-decoration: none;\n font-size: ${(p) => p.theme.fonts?.normal};\n\n ${(p) => p.disabled && disabledCss}\n color: ${(p) => p.theme.colors?.text};\n background-color: transparent;\n\n span {\n display: block;\n ${(p) =>\n p['data-level']\n ? `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.normal};`\n : `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.medium}; `}\n ${(p) => p['data-level'] && 'border-left: 2px solid'}\n }\n\n span:first-child {\n border-color: #e7e7e7;\n }\n\n ${(p) => p['data-level'] && `padding: 0 calc(${p.theme.sizes?.medium} * ${p['data-level']});`}\n\n ${(p) => p.autoSelect && focused}\n\n &:hover,\n &:focus {\n ${focused}\n }\n`;\n","import { Widget } from '@telia-ace/knowledge-widget-core';\nimport {\n contentBox,\n Loader,\n useContainer,\n useProperties,\n useScroll,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useRef } from 'react';\nimport styled from 'styled-components';\nimport QuickFilterItemList, { focusInput, getFocusedIndex } from './quick-filter-item-list';\nimport { SearchComponentProps } from './search-component';\n\ntype Props = {\n phrase: string;\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n};\n\nexport default ({ phrase = '', inputHasFocus, searchContainerRef }: Props) => {\n const {\n quickFilter = {\n open: false,\n loading: false,\n symbol: '',\n type: '',\n items: [],\n },\n } = useProperties<SearchComponentProps>();\n const [css, ref] = useScroll(true);\n const container = useContainer();\n const { events } = container.get('$widget') as Widget;\n const wrapperRef = useRef() as React.MutableRefObject<HTMLDivElement | null>;\n\n const setWrapperRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) {\n node.addEventListener(\n 'keydown',\n () => {\n const listItemFocused = getFocusedIndex(node).focusedIndex > -1;\n if (listItemFocused) {\n events.subscribeOnce('router:changed', () => {\n focusInput(searchContainerRef);\n });\n }\n },\n true\n );\n }\n\n wrapperRef.current = node;\n return node;\n },\n [searchContainerRef]\n );\n\n const { items = [], symbol, type, open, loading } = quickFilter;\n\n if (!open || !symbol) {\n return null;\n }\n\n const filterPhrase = phrase.slice(phrase.indexOf(symbol) + 1);\n\n return (\n <Wrapper\n ref={setWrapperRef}\n data-loading={loading}\n className={appendClassNames(\n 'humany-quick-filter-dropdown',\n [type === 'guideCategory', 'humany-quick-filter-guide-categories'],\n [type === 'tag', 'humany-quick-filter-tags']\n )}\n >\n <Inner className=\"humany-quick-filter-dropdown-inner\" css={css} ref={ref}>\n <QuickFilterItemList\n filterType={type as 'guideCategory' | 'tag'}\n items={items}\n filterPhrase={filterPhrase}\n filterContainer={ref.current}\n searchContainer={searchContainerRef}\n inputHasFocus={inputHasFocus}\n />\n </Inner>\n <Loader loading={loading} />\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n ${contentBox};\n position: absolute;\n top: calc(100% + ${(p) => p.theme.sizes?.normal});\n left: 0;\n right: 0;\n z-index: 1;\n overflow: hidden;\n`;\n\nconst Inner = styled.div<{ css: string }>`\n max-height: 300px;\n overflow: auto;\n padding: ${(p) => p.theme.sizes?.medium} 0;\n ${(p) => p.css}\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n li div {\n ${(p) => `margin: ${p.theme.sizes?.normal} 0;`}\n }\n`;\n","import {\n useDebounce,\n useDispatch,\n usePrevious,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SearchComponentProps } from './search-component';\n\ntype ReturnType = [\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => void,\n (navigateToHome: boolean) => void,\n React.MutableRefObject<HTMLElement | null>\n];\n\nconst filterChanged = <T extends Optional<{ id: string }> | null>(newValue: T, oldValue: T) => {\n if (newValue && !oldValue) {\n return true;\n }\n if (!newValue && oldValue) {\n return true;\n }\n if (newValue && oldValue) {\n if (newValue.id !== oldValue.id) {\n return true;\n }\n }\n return false;\n};\n\nexport default (\n phrase: string,\n params: { [key: string]: any } = {},\n debounce = true\n): ReturnType => {\n const dispatch = useDispatch();\n\n const {\n quickFilters = false,\n quickFilter = { open: false },\n activeFilterBadges,\n filterBadges = false,\n incremental = 600,\n } = useProperties<SearchComponentProps>();\n\n const debouncedPhrase = useDebounce(\n phrase,\n typeof incremental === 'boolean' ? 600 : incremental\n );\n const previousDebouncedPhrase = usePrevious(debouncedPhrase);\n const previousFilters = usePrevious(activeFilterBadges);\n const ref = useRef<null | HTMLElement>(null);\n\n const dispatchSearch = useCallback(\n (value: string = '') => {\n if (filterBadges) {\n const filtersChanged =\n filterChanged(\n activeFilterBadges?.guideCategory,\n previousFilters?.guideCategory\n ) || filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n return dispatch('search', { value, filtersChanged, filters: activeFilterBadges });\n }\n return dispatch('search', { value });\n },\n [dispatch, activeFilterBadges]\n );\n\n const dispatchClear = useCallback(\n (navigateToHome: boolean) => {\n dispatch('clear', { navigateToHome });\n },\n [dispatch]\n );\n\n const removeFilterKeywords = (input: string) => {\n if (quickFilters) {\n return input.replace(/([@#].*)/g, '');\n }\n return input;\n };\n\n const submitSearch = useCallback(\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => {\n if (quickFilter.open && (arg as React.KeyboardEvent).preventDefault) {\n (arg as React.KeyboardEvent).preventDefault();\n return;\n }\n\n const activeElement = document.activeElement as HTMLElement;\n const isSearching =\n ref.current && typeof ref.current.contains === 'function'\n ? ref.current.contains(activeElement)\n : false;\n const cleanedPhrase = removeFilterKeywords(phrase);\n\n if (\n (typeof arg === 'boolean' && arg) ||\n (cleanedPhrase.length && isSearching) ||\n activeFilterBadges?.guideCategory ||\n (activeFilterBadges?.tag && isSearching)\n ) {\n dispatchSearch(cleanedPhrase);\n } else {\n dispatchClear(isSearching);\n }\n },\n [ref, phrase, quickFilter, dispatchClear, activeFilterBadges, dispatchSearch]\n );\n\n useEffect(() => {\n const filtersChanged =\n filterChanged(activeFilterBadges?.guideCategory, previousFilters?.guideCategory) ||\n filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n\n const phrase = debouncedPhrase ? removeFilterKeywords(debouncedPhrase) : debouncedPhrase;\n const previousPhrase = previousDebouncedPhrase\n ? removeFilterKeywords(previousDebouncedPhrase)\n : previousDebouncedPhrase;\n if (\n (typeof previousPhrase !== 'undefined' &&\n previousPhrase !== phrase &&\n phrase !== params.phrase &&\n debounce &&\n !quickFilter.open) ||\n (filtersChanged && !activeFilterBadges?.initial)\n ) {\n submitSearch(filtersChanged);\n }\n }, [debouncedPhrase, quickFilter.open, activeFilterBadges, submitSearch]);\n\n useEffect(() => {\n if (phrase && quickFilters) {\n const quickFiltersGuideCategory =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.guideCategory);\n\n const quickFiltersTag =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.tag);\n\n if (quickFiltersGuideCategory && phrase.indexOf('@') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'guideCategory', symbol: '@' });\n }\n\n if (quickFiltersTag && phrase.indexOf('#') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'tag', symbol: '#' });\n }\n }\n\n if (quickFilter.open && phrase.indexOf('@') === -1 && phrase.indexOf('#') === -1) {\n dispatch('quick-filter:close');\n }\n }, [phrase]);\n\n return [submitSearch, dispatchClear, ref];\n};\n","import { Component } from '@telia-ace/knowledge-widget-types-grid';\nimport {\n borderTabStyle,\n Button,\n contentBox,\n convertToStringAttributes,\n Input,\n SymbolBadge,\n useChildren,\n useContainer,\n useDispatch,\n useProperties,\n useRouteData,\n useTransitionEnd,\n useWidgetEvent,\n} from '@telia-ace/knowledge-widget-ui';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport styled, { css } from 'styled-components';\nimport FilterBadges from './filter-badges';\nimport QuickFilter from './quick-filter';\nimport { SearchComponentProps } from './search-component';\nimport useSearch from './use-search';\n\ntype Props = {\n className: string;\n role?: string;\n};\n\nconst Search: React.SFC<Props> = ({ className, ...other }) => {\n const {\n showSearchButton,\n showClearButton,\n role = 'search',\n autoFocus,\n placeholder,\n searchButtonLabel,\n clearButtonLabel,\n ariaLabel,\n route: searchRoute = 'search',\n incremental = true,\n showChildren = false,\n quickFilter,\n quickFilters: quickFiltersEnabled,\n filterBadges,\n } = useProperties<SearchComponentProps>();\n const { params } = useRouteData();\n const [hasFocus, setHasFocus] = useState(false);\n const [phrase, setPhrase] = useState(params.phrase || '');\n const [showFilterBadges, setShowFilterBadges] = useState({\n guideCategory: false,\n tag: false,\n });\n const container = useContainer();\n const children = useChildren();\n const dispatch = useDispatch();\n const { position: filterBadgePosition = 'inside' } =\n typeof filterBadges === 'object' ? filterBadges : {};\n\n useEffect(() => {\n const { guideCategory, tag } = params;\n const showGuideCategory =\n typeof filterBadges === 'object' ? !!filterBadges.guideCategory : !!filterBadges;\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\n\n setShowFilterBadges({\n guideCategory: showGuideCategory && !!guideCategory,\n tag: showTag && !!tag,\n });\n }, [filterBadges, params]);\n\n // Remove quick-filter symbol, quick-filter phrase\n // and close quick-filter when route changed\n useWidgetEvent(\n 'router:changed',\n () => {\n if (quickFilter) {\n const { open, symbol } = quickFilter;\n\n if (open) {\n if (symbol) {\n const cleaned = phrase.replace(phrase.slice(phrase.indexOf(symbol)), '');\n setPhrase(cleaned);\n }\n\n dispatch('quick-filter:close');\n }\n }\n },\n [quickFilter, phrase, setPhrase, dispatch]\n );\n\n const [search, clear, elem] = useSearch(phrase, params, !!incremental);\n\n useEffect(() => {\n setPhrase(params.phrase || '');\n }, [params.phrase]);\n\n const onChange = useCallback(\n (value: string) => {\n setPhrase(value);\n },\n [setPhrase]\n );\n\n const onEscape = useCallback(() => {\n dispatch('quick-filter:close').then(() => clear(true));\n }, [dispatch, clear]);\n\n const autoFocusHandler = useCallback(() => {\n if (autoFocus && !hasFocus) {\n elem.current?.getElementsByTagName('input')[0]?.focus();\n }\n }, [autoFocus, hasFocus, elem]);\n\n const onClearButtonClick = useCallback(() => {\n container.getAsync('router').then((router: RoutingService) => {\n const initialRoute = router.getInitialRoute();\n const currentRoute = router.getRouteData();\n // if we already are on the initial route\n // and it's not the search route, clear the search instead of navigate\n if (initialRoute?.name === currentRoute.name && initialRoute?.name !== searchRoute) {\n setPhrase('');\n } else {\n clear(true);\n }\n });\n }, [container, setPhrase, clear]);\n\n const renderFilterBadges = (position: 'inside' | 'below') => {\n if (position !== filterBadgePosition) {\n return null;\n }\n if (!!showFilterBadges.guideCategory || !!showFilterBadges.tag) {\n return (\n <FilterBadges\n position={position}\n inputHasFocus={hasFocus}\n showGuideCategory={showFilterBadges.guideCategory}\n showTag={showFilterBadges.tag}\n searchContainerRef={elem.current}\n />\n );\n }\n };\n\n useTransitionEnd(autoFocusHandler);\n\n const showClear =\n showClearButton && (showFilterBadges.guideCategory || showFilterBadges.tag || phrase);\n const quickFilterAccessibilityProps = quickFiltersEnabled\n ? convertToStringAttributes({\n role: 'combobox',\n 'aria-autocomplete': 'list',\n autoComplete: 'off',\n 'aria-haspopup': 'listbox',\n })\n : {};\n\n return (\n <StyledSearchWrapper\n {...other}\n ref={elem}\n role={role}\n className={appendClassNames(className, 'humany-search')}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n data-has-search-symbol={showSearchButton ? 'true' : 'false'}\n >\n <Inner\n action=\".\"\n onSubmit={(e: any) => {\n e.preventDefault();\n elem.current?.getElementsByTagName('input')[0]?.blur();\n }}\n data-has-focus={hasFocus}\n >\n {showSearchButton && (\n <SearchButton\n aria-label={searchButtonLabel}\n type=\"submit\"\n title={searchButtonLabel}\n disabled={!phrase}\n onClick={search}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n >\n <SymbolBadge size={32} symbol={{ type: 'Svg', content: 'search' }} />\n </SearchButton>\n )}\n {renderFilterBadges('inside')}\n <Input\n type=\"search\"\n aria-label={ariaLabel}\n {...quickFilterAccessibilityProps}\n placeholder={\n showFilterBadges.guideCategory || showFilterBadges.tag ? '' : placeholder\n }\n onFocusChange={setHasFocus}\n onEscape={onEscape}\n onEnter={search}\n onChange={onChange}\n value={phrase}\n />\n {showClear && (\n <ClearButton\n aria-label={clearButtonLabel}\n type=\"reset\"\n hasFocus={hasFocus}\n title={clearButtonLabel}\n onClick={onClearButtonClick}\n >\n <SymbolBadge size={27} symbol={{ type: 'Svg', content: 'clear' }} />\n </ClearButton>\n )}\n {showChildren &&\n !showClear &&\n children.map((child) => (\n <Component key={child.id} id={child.id} branch=\"default\" />\n ))}\n <QuickFilter\n inputHasFocus={hasFocus}\n phrase={phrase}\n searchContainerRef={elem.current}\n />\n </Inner>\n {renderFilterBadges('below')}\n </StyledSearchWrapper>\n );\n};\n\nexport default Search;\n\nconst StyledSearchWrapper = styled.div<\n {\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n 'data-has-search-symbol': 'true' | 'false';\n } & any\n>`\n ${contentBox};\n width: 100%;\n padding: ${(p) => p.theme.sizes?.large};\n\n input {\n background-color: transparent;\n border: none;\n outline: none;\n min-width: 25%;\n flex: 1;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-weight: 300;\n font-style: italic;\n padding: 1em 0;\n color: ${(p) => p.theme.colors?.text};\n -webkit-appearance: none;\n\n ${(p) => p['data-has-search-symbol'] === 'true' && `text-indent: ${p.theme.sizes?.normal};`}\n\n ::placeholder {\n color: ${(p) => p.theme.colors?.text};\n }\n /* removes the 'X' from IE */\n &[type='search']::-ms-clear {\n display: none;\n width: 0;\n height: 0;\n }\n &[type='search']::-ms-reveal {\n display: none;\n width: 0;\n height: 0;\n }\n\n /* removes the 'X' from Chrome */\n &[type='search']::-webkit-search-decoration,\n &[type='search']::-webkit-search-cancel-button,\n &[type='search']::-webkit-search-results-button,\n &[type='search']::-webkit-search-results-decoration {\n display: none;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n button {\n background: transparent;\n border: none;\n padding: 0;\n font-size: ${(p) => p.theme.fonts?.large};\n transition: color 200ms ease-out;\n color: ${(p) =>\n p['data-has-focus'] || p['data-has-phrase'] ? p.theme.colors?.primary : '#000000'};\n cursor: pointer;\n > svg {\n height: 100%;\n }\n }\n`;\n\nconst Inner = styled.form<{ 'data-has-focus': boolean } & any>`\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n border: ${(p) => p.theme.inputBorder};\n border-radius: ${(p) => p.theme.borderRadius};\n background-color: #ffffff;\n position: relative;\n padding: 0 ${(p) => p.theme.sizes?.normal};\n\n ${(p) =>\n p['data-has-focus'] &&\n css`\n ${(p) =>\n p.theme.accessibility?.isTabbing\n ? borderTabStyle\n : `\n border-color: ${p.theme.colors?.primary};\n outline: none;\n input {\n outline: none;\n }\n `}\n `};\n`;\n\nconst SearchButton = styled(Button)<{\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n}>`\n padding: 0;\n height: 2em;\n\n svg {\n circle,\n line {\n stroke: ${(p) => (p['data-has-focus'] ? p.theme.colors?.primary : '#000000')};\n }\n }\n`;\n\nconst ClearButton = styled(Button)<{ hasFocus: boolean } & any>`\n &:focus svg {\n ${(p) => p.theme.accessibility?.isTabbing && borderTabStyle}\n }\n\n svg {\n vertical-align: top;\n\n circle,\n line,\n path {\n stroke: ${(p) => (p.hasFocus ? p.theme.colors?.primary : p.theme.colors?.text)};\n }\n }\n`;\n"],"names":["Wrapper","Inner"],"mappings":"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"}
|
package/dist/use-search.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
declare type ReturnType = [
|
|
3
|
-
(arg: React.KeyboardEvent | React.MouseEvent | boolean) => void,
|
|
4
|
-
(navigateToHome: boolean) => void,
|
|
5
|
-
React.MutableRefObject<HTMLElement | null>
|
|
6
|
-
];
|
|
7
|
-
declare const _default: (phrase: string, params?: {
|
|
8
|
-
[key: string]: any;
|
|
9
|
-
}, debounce?: boolean) => ReturnType;
|
|
10
|
-
export default _default;
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
declare type ReturnType = [
|
|
3
|
+
(arg: React.KeyboardEvent | React.MouseEvent | boolean) => void,
|
|
4
|
+
(navigateToHome: boolean) => void,
|
|
5
|
+
React.MutableRefObject<HTMLElement | null>
|
|
6
|
+
];
|
|
7
|
+
declare const _default: (phrase: string, params?: {
|
|
8
|
+
[key: string]: any;
|
|
9
|
+
}, debounce?: boolean) => ReturnType;
|
|
10
|
+
export default _default;
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { Category, Tag } from '@telia-ace/knowledge-widget-core';
|
|
2
|
-
export declare const match: (title: string, phrase: string) => boolean;
|
|
3
|
-
export declare const filterItems: (items: (Category | Tag)[] | undefined, type: 'tag' | 'guideCategory', phrase: string) => any[];
|
|
1
|
+
import { Category, Tag } from '@telia-ace/knowledge-widget-core';
|
|
2
|
+
export declare const match: (title: string, phrase: string) => boolean;
|
|
3
|
+
export declare const filterItems: (items: (Category | Tag)[] | undefined, type: 'tag' | 'guideCategory', phrase: string) => any[];
|
package/package.json
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telia-ace/knowledge-widget-components-search",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.21",
|
|
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
|
-
"
|
|
11
|
-
"development": "./src/index.ts",
|
|
12
|
-
"default": "./dist/index.js"
|
|
13
|
-
},
|
|
10
|
+
"main": "dist/index.js",
|
|
14
11
|
"type": "module",
|
|
15
12
|
"types": "dist/index.d.ts",
|
|
16
13
|
"files": [
|
|
@@ -28,10 +25,10 @@
|
|
|
28
25
|
},
|
|
29
26
|
"sideEffects": false,
|
|
30
27
|
"dependencies": {
|
|
31
|
-
"@telia-ace/knowledge-widget-core": "^1.0.
|
|
32
|
-
"@telia-ace/knowledge-widget-types-grid": "^1.0.
|
|
33
|
-
"@telia-ace/knowledge-widget-ui": "^1.0.
|
|
34
|
-
"@telia-ace/widget-routing": "^1.0.
|
|
28
|
+
"@telia-ace/knowledge-widget-core": "^1.0.17",
|
|
29
|
+
"@telia-ace/knowledge-widget-types-grid": "^1.0.28",
|
|
30
|
+
"@telia-ace/knowledge-widget-ui": "^1.0.23",
|
|
31
|
+
"@telia-ace/widget-routing": "^1.0.14",
|
|
35
32
|
"@telia-ace/widget-utilities": "^1.0.2",
|
|
36
33
|
"@webprovisions/platform": "^1.1.2"
|
|
37
34
|
},
|
|
@@ -45,5 +42,5 @@
|
|
|
45
42
|
"@types/react-dom": "^16.8.0",
|
|
46
43
|
"@types/styled-components": "^5.1.7"
|
|
47
44
|
},
|
|
48
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "038c3d0914f7298d2bb74a80c7a679c7450633f9"
|
|
49
46
|
}
|