@telia-ace/knowledge-widget-components-search 1.0.22 → 1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -25,7 +25,7 @@ const B = (a) => !!a.guideCategory || !!a.tag, H = (a, e) => {
|
|
|
25
25
|
return e.sort((o, f) => o.title > f.title ? 1 : -1), e.forEach((o) => {
|
|
26
26
|
o.items && (o.items = v(o.items));
|
|
27
27
|
}), e;
|
|
28
|
-
}, K = (a) => x(a, "search", import("./search.
|
|
28
|
+
}, K = (a) => x(a, "search", import("./search.ca38a836.js"), (e) => {
|
|
29
29
|
const { events: o } = a.get("$widget"), [f, P] = F(o), C = (i) => {
|
|
30
30
|
var r, n;
|
|
31
31
|
const { activeFilterBadges: t } = e.properties();
|
|
@@ -55,30 +55,33 @@ const B = (a) => !!a.guideCategory || !!a.tag, H = (a, e) => {
|
|
|
55
55
|
});
|
|
56
56
|
});
|
|
57
57
|
const y = () => a.getAsync("router").then((i) => i.getRouteData().params);
|
|
58
|
-
e.actions.create(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
58
|
+
e.actions.create(
|
|
59
|
+
"quick-filter:add",
|
|
60
|
+
(i) => {
|
|
61
|
+
const { category: t, tag: r, initial: n } = i, { activeFilterBadges: c } = e.properties(), g = c || {
|
|
62
|
+
initial: n,
|
|
63
|
+
guideCategory: null,
|
|
64
|
+
tag: null,
|
|
65
|
+
tooltip: null
|
|
66
|
+
};
|
|
67
|
+
return Promise.resolve().then(() => t ? m({}).then((s) => {
|
|
68
|
+
const d = G(t, s) || null;
|
|
69
|
+
return h(u({}, g), {
|
|
70
|
+
guideCategory: d,
|
|
71
|
+
tooltip: H(t, s) || null
|
|
72
|
+
});
|
|
73
|
+
}) : h(u({}, g), {
|
|
74
|
+
guideCategory: null,
|
|
75
|
+
tooltip: null
|
|
76
|
+
})).then((s) => r ? k({}).then((d) => h(u({}, s), {
|
|
77
|
+
tag: d.find((l) => l.id === r) || null
|
|
78
|
+
})) : h(u({}, s), {
|
|
79
|
+
tag: null
|
|
80
|
+
})).then((s) => e.writeProperties({
|
|
81
|
+
activeFilterBadges: h(u({}, s), { initial: !!n })
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
), e.actions.create("quick-filter:remove", ({ types: i }) => {
|
|
82
85
|
const { activeFilterBadges: t } = e.properties();
|
|
83
86
|
e.writeProperties({
|
|
84
87
|
activeFilterBadges: h(u({}, t), {
|
|
@@ -129,7 +132,9 @@ const B = (a) => !!a.guideCategory || !!a.tag, H = (a, e) => {
|
|
|
129
132
|
});
|
|
130
133
|
});
|
|
131
134
|
})));
|
|
132
|
-
const m = (i) => a.getAsync("dataClient").then(
|
|
135
|
+
const m = (i) => a.getAsync("dataClient").then(
|
|
136
|
+
(t) => t.fetch(A.GuideCategories, i)
|
|
137
|
+
).then((t) => t.categories || []), k = (i) => a.getAsync("dataClient").then((t) => t.fetch(A.TagsOnGuides, i)).then((t = []) => t);
|
|
133
138
|
return y().then((i) => {
|
|
134
139
|
C(i);
|
|
135
140
|
}), f("router:changed", (i, { current: t }) => {
|
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';\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":["hasActiveFilterBadge","filters","getTooltip","categoryId","categories","trailIds","categoryTrail","categoryMap","getCategoryTrailAsObjects","id","_a","sortRecursive","items","clone","deepClone","a","b","item","SearchComponent","container","createReactComponent","component","events","subscribe","unsubscribe","createEventSubscriber","load","params","activeFilterBadges","_b","data","value","filtersChanged","route","patchParams","router","searchParams","__spreadValues","createParams","options","name","getRouterParams","category","tag","initial","previous","fetchCategories","categoryItem","findCategoryById","__spreadProps","next","fetchTags","tags","t","types","symbol","type","guideCategory","phrase","dataClient","DataType","categoriesResult","_","current","event","filterBadges","showTag","tagId"],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ var ne = (e, t, o) => t in e ? Ae(e, t, { enumerable: !0, configurable: !0, writ
|
|
|
10
10
|
se.call(t, o) && ne(e, o, t[o]);
|
|
11
11
|
return e;
|
|
12
12
|
}, D = (e, t) => Ie(e, qe(t));
|
|
13
|
-
var
|
|
13
|
+
var G = (e, t) => {
|
|
14
14
|
var o = {};
|
|
15
15
|
for (var r in e)
|
|
16
16
|
re.call(e, r) && t.indexOf(r) < 0 && (o[r] = e[r]);
|
|
@@ -20,9 +20,9 @@ var U = (e, t) => {
|
|
|
20
20
|
return o;
|
|
21
21
|
};
|
|
22
22
|
import { Component as ze } from "@telia-ace/knowledge-widget-types-grid";
|
|
23
|
-
import { borderTabStyle as
|
|
23
|
+
import { borderTabStyle as M, Text as de, Link as fe, SymbolBadge as J, useProperties as P, useDispatch as U, useRouteData as ge, useEventListener as Y, useKeyPress as H, Tooltip as Fe, ItemTree as Be, contentBox as me, useScroll as Le, useContainer as he, Loader as De, useDebounce as Ne, usePrevious as ae, useChildren as Te, useWidgetEvent as Oe, useTransitionEnd as Ke, convertToStringAttributes as Pe, Input as We, Button as pe } from "@telia-ace/knowledge-widget-ui";
|
|
24
24
|
import { appendClassNames as R, deepClone as je, categoryTrail as Qe } from "@telia-ace/widget-utilities";
|
|
25
|
-
import f, { useRef as V, useState as
|
|
25
|
+
import f, { useRef as V, useState as T, useCallback as I, useEffect as O } from "react";
|
|
26
26
|
import z, { css as K } from "styled-components";
|
|
27
27
|
const Xe = (v) => {
|
|
28
28
|
var b = v, {
|
|
@@ -32,7 +32,7 @@ const Xe = (v) => {
|
|
|
32
32
|
filterType: r,
|
|
33
33
|
handleClick: l,
|
|
34
34
|
deleteAriaLabel: c = ""
|
|
35
|
-
} = b, s =
|
|
35
|
+
} = b, s = G(b, [
|
|
36
36
|
"text",
|
|
37
37
|
"className",
|
|
38
38
|
"forceFocusStyle",
|
|
@@ -52,7 +52,7 @@ const Xe = (v) => {
|
|
|
52
52
|
role: "button",
|
|
53
53
|
"aria-label": c.replace("{{item}}", e),
|
|
54
54
|
onClick: (y) => l(y, r)
|
|
55
|
-
}), /* @__PURE__ */ f.createElement(
|
|
55
|
+
}), /* @__PURE__ */ f.createElement(J, {
|
|
56
56
|
size: 13,
|
|
57
57
|
symbol: { type: "Svg", content: "close" }
|
|
58
58
|
})));
|
|
@@ -63,13 +63,15 @@ const Xe = (v) => {
|
|
|
63
63
|
showGuideCategory: r,
|
|
64
64
|
position: l
|
|
65
65
|
}) => {
|
|
66
|
-
const { activeFilterBadges: c = {}, deleteFilterBadgeAriaLabel: s = "" } = P(), v =
|
|
66
|
+
const { activeFilterBadges: c = {}, deleteFilterBadgeAriaLabel: s = "" } = P(), v = U(), { name: b, params: k } = ge(), [y, u] = T(!1), x = I((m) => {
|
|
67
67
|
const { key: a } = m;
|
|
68
68
|
["ArrowLeft", "ArrowRight"].indexOf(a) === -1 && u(!1);
|
|
69
69
|
}, []);
|
|
70
|
-
|
|
71
|
-
const { guideCategory: S, tag:
|
|
72
|
-
const a = m.querySelectorAll(
|
|
70
|
+
Y("keydown", x, window), Y("click", x, window);
|
|
71
|
+
const { guideCategory: S, tag: $, tooltip: A } = c, d = (m) => {
|
|
72
|
+
const a = m.querySelectorAll(
|
|
73
|
+
".humany-filter-badge"
|
|
74
|
+
);
|
|
73
75
|
return {
|
|
74
76
|
badges: a,
|
|
75
77
|
index: Array.from(a).findIndex((h) => document.activeElement === h)
|
|
@@ -85,58 +87,73 @@ const Xe = (v) => {
|
|
|
85
87
|
m === "left" ? p === -1 ? q = h.item(h.length - 1) : p > 0 && (q = h.item(p - 1)) : m === "right" && (p === h.length - 1 ? a && a.focus() : h.item(p + 1) && (q = h.item(p + 1))), q && (q.focus(), u(!0));
|
|
86
88
|
}
|
|
87
89
|
};
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const
|
|
94
|
-
(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
90
|
+
H(
|
|
91
|
+
"ArrowLeft",
|
|
92
|
+
I(() => {
|
|
93
|
+
if (!t)
|
|
94
|
+
return;
|
|
95
|
+
const { index: m } = d(t);
|
|
96
|
+
if (e || m > -1) {
|
|
97
|
+
const a = t.querySelector('[data-type="search"]'), h = a && a.selectionStart !== null && a.selectionStart <= 0, p = m > -1;
|
|
98
|
+
(h || p) && i("left", a);
|
|
99
|
+
}
|
|
100
|
+
}, [e, t])
|
|
101
|
+
), H(
|
|
102
|
+
"ArrowRight",
|
|
103
|
+
I(() => {
|
|
104
|
+
if (!t)
|
|
105
|
+
return;
|
|
106
|
+
const { index: m } = d(t);
|
|
107
|
+
if (m > -1) {
|
|
108
|
+
const a = t.querySelector('[data-type="search"]');
|
|
109
|
+
m > -1 && i("right", a);
|
|
110
|
+
}
|
|
111
|
+
}, [t])
|
|
112
|
+
), H(
|
|
113
|
+
"Backspace",
|
|
114
|
+
I(
|
|
115
|
+
(m) => {
|
|
116
|
+
if (!t)
|
|
117
|
+
return;
|
|
118
|
+
let a = [];
|
|
119
|
+
const { index: h } = d(t), p = t.querySelector('[data-type="search"]');
|
|
120
|
+
h > -1 ? h === 0 ? r ? a = ["guideCategory"] : o && (a = ["tag"]) : h === 1 && (a = ["tag"]) : p && p.selectionStart !== null && p.selectionStart <= 0 && (c != null && c.tag ? a = ["tag"] : c != null && c.guideCategory && (a = ["guideCategory"])), a.length > 0 && (m.preventDefault(), v("quick-filter:remove", { types: a }));
|
|
121
|
+
},
|
|
122
|
+
[t, c, o, r]
|
|
123
|
+
)
|
|
124
|
+
);
|
|
125
|
+
const g = I(
|
|
126
|
+
(m) => m === "guideCategory" && S && r ? /* @__PURE__ */ f.createElement(ie, {
|
|
127
|
+
text: `@${S.title}`,
|
|
128
|
+
routeName: b,
|
|
129
|
+
filterType: "guideCategory",
|
|
130
|
+
handleClick: n,
|
|
131
|
+
forceFocusStyle: y,
|
|
132
|
+
deleteAriaLabel: s,
|
|
133
|
+
params: D(B({}, k), {
|
|
134
|
+
guideCategory: void 0
|
|
135
|
+
})
|
|
136
|
+
}) : m === "tag" && $ && o ? /* @__PURE__ */ f.createElement(ie, {
|
|
137
|
+
className: "humany-filter-badge",
|
|
138
|
+
text: `#${$.title}`,
|
|
139
|
+
routeName: b,
|
|
140
|
+
filterType: "tag",
|
|
141
|
+
handleClick: n,
|
|
142
|
+
forceFocusStyle: y,
|
|
143
|
+
deleteAriaLabel: s,
|
|
144
|
+
params: D(B({}, k), {
|
|
145
|
+
tag: void 0
|
|
146
|
+
})
|
|
147
|
+
}) : null,
|
|
148
|
+
[S, $, b, k, r, o, y]
|
|
149
|
+
);
|
|
150
|
+
return !S && !$ ? null : /* @__PURE__ */ f.createElement(Ue, {
|
|
134
151
|
className: "humany-filter-badges",
|
|
135
152
|
position: l
|
|
136
153
|
}, S && A ? /* @__PURE__ */ f.createElement(Fe, {
|
|
137
154
|
content: /* @__PURE__ */ f.createElement(f.Fragment, null, A),
|
|
138
155
|
sticky: !1
|
|
139
|
-
}, g("guideCategory")) : g("guideCategory"),
|
|
156
|
+
}, g("guideCategory")) : g("guideCategory"), $ && g("tag"));
|
|
140
157
|
}, Ue = z.div`
|
|
141
158
|
display: flex;
|
|
142
159
|
align-items: center;
|
|
@@ -186,27 +203,36 @@ const Xe = (v) => {
|
|
|
186
203
|
}} / 2);
|
|
187
204
|
|
|
188
205
|
&:focus-within {
|
|
189
|
-
${
|
|
190
|
-
|
|
191
|
-
return (((t = e.theme.accessibility) == null ? void 0 : t.isTabbing) || e.forceFocusStyle) && K`
|
|
192
|
-
${_}
|
|
193
|
-
background-color: transparent;
|
|
206
|
+
${M}
|
|
207
|
+
background-color: transparent;
|
|
194
208
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}};
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
`;
|
|
209
|
+
svg {
|
|
210
|
+
path {
|
|
211
|
+
stroke: ${(e) => {
|
|
212
|
+
var t;
|
|
213
|
+
return (t = e.theme.colors) == null ? void 0 : t.primary;
|
|
204
214
|
}};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
205
217
|
a {
|
|
206
218
|
outline: none;
|
|
207
219
|
}
|
|
208
220
|
}
|
|
209
221
|
|
|
222
|
+
${(e) => e.forceFocusStyle && K`
|
|
223
|
+
${M}
|
|
224
|
+
background-color: transparent;
|
|
225
|
+
|
|
226
|
+
svg {
|
|
227
|
+
path {
|
|
228
|
+
stroke: ${(t) => {
|
|
229
|
+
var o;
|
|
230
|
+
return (o = t.theme.colors) == null ? void 0 : o.primary;
|
|
231
|
+
}};
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
`}
|
|
235
|
+
|
|
210
236
|
svg {
|
|
211
237
|
width: 17px;
|
|
212
238
|
height: 11px;
|
|
@@ -220,16 +246,16 @@ const Xe = (v) => {
|
|
|
220
246
|
}
|
|
221
247
|
order: 1;
|
|
222
248
|
}
|
|
223
|
-
`,
|
|
249
|
+
`, N = (e, t) => !t || !e ? !0 : e.toLowerCase().indexOf(t.toLowerCase()) > -1, Ge = (e = [], t, o) => {
|
|
224
250
|
if (!o)
|
|
225
251
|
return e;
|
|
226
252
|
const r = je(e);
|
|
227
253
|
if (t === "tag")
|
|
228
|
-
return r.filter((s) =>
|
|
254
|
+
return r.filter((s) => N(s.title, o));
|
|
229
255
|
const l = He(r, o);
|
|
230
256
|
return ye(r, (s) => l.indexOf(s.id) > -1);
|
|
231
257
|
}, ye = (e, t) => e.filter((o) => (o.items && o.items.length && (o.items = ye(o.items, t)), t(o))), He = (e, t) => {
|
|
232
|
-
const r = be(e).filter((c) =>
|
|
258
|
+
const r = be(e).filter((c) => N(c.title, t)).map((c) => c.id);
|
|
233
259
|
let l = [];
|
|
234
260
|
return r.forEach((c) => {
|
|
235
261
|
const s = Qe(c, e);
|
|
@@ -240,13 +266,17 @@ const Xe = (v) => {
|
|
|
240
266
|
return e.forEach((o) => {
|
|
241
267
|
t.push(o), Array.isArray(o.items) && (t = t.concat(be(o.items)));
|
|
242
268
|
}), t;
|
|
243
|
-
},
|
|
244
|
-
const t = Array.from((e == null ? void 0 : e.getElementsByTagName("A")) || []).filter(
|
|
269
|
+
}, Z = (e) => {
|
|
270
|
+
const t = Array.from((e == null ? void 0 : e.getElementsByTagName("A")) || []).filter(
|
|
271
|
+
(o) => o.getAttribute("disabled") === null
|
|
272
|
+
);
|
|
245
273
|
return {
|
|
246
274
|
anchors: t,
|
|
247
275
|
focusedIndex: t.findIndex((o) => document.activeElement === o)
|
|
248
276
|
};
|
|
249
|
-
}, Je = (e) => e ? e.querySelector(
|
|
277
|
+
}, Je = (e) => e ? e.querySelector(
|
|
278
|
+
'[data-type="search"], input[type="search"]'
|
|
279
|
+
) : null, _ = (e) => {
|
|
250
280
|
if (!e)
|
|
251
281
|
return;
|
|
252
282
|
const t = Je(e);
|
|
@@ -259,86 +289,93 @@ const Xe = (v) => {
|
|
|
259
289
|
searchContainer: l,
|
|
260
290
|
inputHasFocus: c
|
|
261
291
|
}) => {
|
|
262
|
-
const [s, v] =
|
|
292
|
+
const [s, v] = T(t || []), [b, k] = T(null), y = U(), { activeFilterBadges: u, quickFilters: x } = P(), S = typeof x == "object" && !!x.autoSelect || typeof x == "boolean" && !!x;
|
|
263
293
|
O(() => {
|
|
264
294
|
v(Ge(t, o, e));
|
|
265
295
|
}, [e, o, t]), O(() => {
|
|
266
296
|
var d;
|
|
267
297
|
if (r) {
|
|
268
|
-
const { anchors: n } =
|
|
298
|
+
const { anchors: n } = Z(r), i = (d = n[0]) == null ? void 0 : d.getAttribute("data-id");
|
|
269
299
|
i && k(i);
|
|
270
300
|
}
|
|
271
301
|
}, [s, r]);
|
|
272
|
-
const
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
302
|
+
const $ = I(
|
|
303
|
+
(d, n) => {
|
|
304
|
+
const i = {
|
|
305
|
+
category: u != null && u.guideCategory ? u.guideCategory.id : void 0,
|
|
306
|
+
tag: u != null && u.tag ? u.tag.id : void 0
|
|
307
|
+
};
|
|
308
|
+
n === "guideCategory" ? i.category = d.id : n === "tag" && (i.tag = d.id), y("quick-filter:add", i);
|
|
309
|
+
},
|
|
310
|
+
[u, y]
|
|
311
|
+
), A = (d) => d === "guideCategory" ? {
|
|
279
312
|
renderItem: (n, i) => /* @__PURE__ */ f.createElement(ue, {
|
|
280
313
|
autoSelect: S && c && n.id === b,
|
|
281
|
-
disabled: !
|
|
282
|
-
tabIndex:
|
|
314
|
+
disabled: !N(n.title, e),
|
|
315
|
+
tabIndex: N(n.title, e) ? 0 : -1,
|
|
283
316
|
onKeyDown: (g) => {
|
|
284
|
-
g.key === "Enter" &&
|
|
317
|
+
g.key === "Enter" && $(n, d);
|
|
285
318
|
},
|
|
286
319
|
"data-level": i,
|
|
287
320
|
onClick: () => {
|
|
288
|
-
|
|
321
|
+
$(n, d);
|
|
289
322
|
},
|
|
290
323
|
"data-id": n.id
|
|
291
324
|
}, /* @__PURE__ */ f.createElement(ce, {
|
|
292
325
|
title: n.title,
|
|
293
326
|
phrase: e,
|
|
294
|
-
matches:
|
|
327
|
+
matches: N(n.title, e)
|
|
295
328
|
}))
|
|
296
329
|
} : {
|
|
297
330
|
renderLi: !0,
|
|
298
331
|
renderItem: (n) => /* @__PURE__ */ f.createElement(ue, {
|
|
299
332
|
autoSelect: S && c && n.id === b,
|
|
300
333
|
onKeyDown: (i) => {
|
|
301
|
-
i.key === "Enter" &&
|
|
334
|
+
i.key === "Enter" && $(n, d);
|
|
302
335
|
},
|
|
303
336
|
onClick: () => {
|
|
304
|
-
|
|
337
|
+
$(n, d);
|
|
305
338
|
},
|
|
306
339
|
"data-id": n.id
|
|
307
340
|
}, /* @__PURE__ */ f.createElement(ce, {
|
|
308
341
|
symbol: "#",
|
|
309
342
|
title: n.title,
|
|
310
343
|
phrase: e,
|
|
311
|
-
matches:
|
|
344
|
+
matches: N(n.title, e)
|
|
312
345
|
}))
|
|
313
346
|
};
|
|
314
|
-
return
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
347
|
+
return Y(
|
|
348
|
+
"keydown",
|
|
349
|
+
(d) => {
|
|
350
|
+
var q;
|
|
351
|
+
const { key: n } = d;
|
|
352
|
+
if (!r || !(n === "ArrowDown" || n === "ArrowUp" || n === "Enter"))
|
|
353
|
+
return;
|
|
354
|
+
const { anchors: i, focusedIndex: g } = Z(r);
|
|
355
|
+
if (n === "Enter") {
|
|
356
|
+
if (c && S) {
|
|
357
|
+
const w = (q = i[0]) == null ? void 0 : q.getAttribute("data-id");
|
|
358
|
+
w && $({ id: w }, o);
|
|
359
|
+
}
|
|
360
|
+
return;
|
|
324
361
|
}
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
|
|
362
|
+
const m = () => {
|
|
363
|
+
var w;
|
|
364
|
+
return (w = i[0]) == null ? void 0 : w.focus();
|
|
365
|
+
}, a = () => {
|
|
366
|
+
var w;
|
|
367
|
+
return (w = i[i.length - 1]) == null ? void 0 : w.focus();
|
|
368
|
+
}, h = () => {
|
|
369
|
+
var w;
|
|
370
|
+
return (w = i[g + 1]) == null ? void 0 : w.focus();
|
|
371
|
+
}, p = () => {
|
|
372
|
+
var w;
|
|
373
|
+
return (w = i[g - 1]) == null ? void 0 : w.focus();
|
|
374
|
+
};
|
|
375
|
+
c ? (d.preventDefault(), n === "ArrowDown" ? m() : a()) : g > -1 && (d.preventDefault(), n === "ArrowDown" ? i.length > g + 1 ? h() : _(l) : g - 1 < 0 ? _(l) : p());
|
|
376
|
+
},
|
|
377
|
+
window
|
|
378
|
+
), /* @__PURE__ */ f.createElement(Be, B({
|
|
342
379
|
tree: s,
|
|
343
380
|
renderEmpty: !1,
|
|
344
381
|
ulProps: { role: "listbox" },
|
|
@@ -417,31 +454,42 @@ const Xe = (v) => {
|
|
|
417
454
|
type: "",
|
|
418
455
|
items: []
|
|
419
456
|
}
|
|
420
|
-
} = P(), [l, c] = Le(!0), s = he(), { events: v } = s.get("$widget"), b = V(), k = I(
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
457
|
+
} = P(), [l, c] = Le(!0), s = he(), { events: v } = s.get("$widget"), b = V(), k = I(
|
|
458
|
+
(d) => (d && d.addEventListener(
|
|
459
|
+
"keydown",
|
|
460
|
+
() => {
|
|
461
|
+
Z(d).focusedIndex > -1 && v.subscribeOnce("router:changed", () => {
|
|
462
|
+
_(o);
|
|
463
|
+
});
|
|
464
|
+
},
|
|
465
|
+
!0
|
|
466
|
+
), b.current = d, d),
|
|
467
|
+
[o]
|
|
468
|
+
), { items: y = [], symbol: u, type: x, open: S, loading: $ } = r;
|
|
425
469
|
if (!S || !u)
|
|
426
470
|
return null;
|
|
427
471
|
const A = e.slice(e.indexOf(u) + 1);
|
|
428
472
|
return /* @__PURE__ */ f.createElement(Re, {
|
|
429
473
|
ref: k,
|
|
430
|
-
"data-loading":
|
|
431
|
-
className: R(
|
|
474
|
+
"data-loading": $,
|
|
475
|
+
className: R(
|
|
476
|
+
"humany-quick-filter-dropdown",
|
|
477
|
+
[x === "guideCategory", "humany-quick-filter-guide-categories"],
|
|
478
|
+
[x === "tag", "humany-quick-filter-tags"]
|
|
479
|
+
)
|
|
432
480
|
}, /* @__PURE__ */ f.createElement(Ve, {
|
|
433
481
|
className: "humany-quick-filter-dropdown-inner",
|
|
434
482
|
css: l,
|
|
435
483
|
ref: c
|
|
436
484
|
}, /* @__PURE__ */ f.createElement(Ye, {
|
|
437
|
-
filterType:
|
|
485
|
+
filterType: x,
|
|
438
486
|
items: y,
|
|
439
487
|
filterPhrase: A,
|
|
440
488
|
filterContainer: c.current,
|
|
441
489
|
searchContainer: o,
|
|
442
490
|
inputHasFocus: t
|
|
443
491
|
})), /* @__PURE__ */ f.createElement(De, {
|
|
444
|
-
loading:
|
|
492
|
+
loading: $
|
|
445
493
|
}));
|
|
446
494
|
}, Re = z.div`
|
|
447
495
|
${me};
|
|
@@ -474,28 +522,43 @@ const Xe = (v) => {
|
|
|
474
522
|
}}
|
|
475
523
|
}
|
|
476
524
|
`, X = (e, t) => !!(e && !t || !e && t || e && t && e.id !== t.id), et = (e, t = {}, o = !0) => {
|
|
477
|
-
const r =
|
|
525
|
+
const r = U(), {
|
|
478
526
|
quickFilters: l = !1,
|
|
479
527
|
quickFilter: c = { open: !1 },
|
|
480
528
|
activeFilterBadges: s,
|
|
481
529
|
filterBadges: v = !1,
|
|
482
530
|
incremental: b = 600
|
|
483
|
-
} = P(), k =
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
531
|
+
} = P(), k = Ne(
|
|
532
|
+
e,
|
|
533
|
+
typeof b == "boolean" ? 600 : b
|
|
534
|
+
), y = ae(k), u = ae(s), x = V(null), S = I(
|
|
535
|
+
(n = "") => {
|
|
536
|
+
if (v) {
|
|
537
|
+
const i = X(
|
|
538
|
+
s == null ? void 0 : s.guideCategory,
|
|
539
|
+
u == null ? void 0 : u.guideCategory
|
|
540
|
+
) || X(s == null ? void 0 : s.tag, u == null ? void 0 : u.tag);
|
|
541
|
+
return r("search", { value: n, filtersChanged: i, filters: s });
|
|
542
|
+
}
|
|
543
|
+
return r("search", { value: n });
|
|
544
|
+
},
|
|
545
|
+
[r, s]
|
|
546
|
+
), $ = I(
|
|
547
|
+
(n) => {
|
|
548
|
+
r("clear", { navigateToHome: n });
|
|
549
|
+
},
|
|
550
|
+
[r]
|
|
551
|
+
), A = (n) => l ? n.replace(/([@#].*)/g, "") : n, d = I(
|
|
552
|
+
(n) => {
|
|
553
|
+
if (c.open && n.preventDefault) {
|
|
554
|
+
n.preventDefault();
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
const i = document.activeElement, g = x.current && typeof x.current.contains == "function" ? x.current.contains(i) : !1, m = A(e);
|
|
558
|
+
typeof n == "boolean" && n || m.length && g || (s == null ? void 0 : s.guideCategory) || (s == null ? void 0 : s.tag) && g ? S(m) : $(g);
|
|
559
|
+
},
|
|
560
|
+
[x, e, c, $, s, S]
|
|
561
|
+
);
|
|
499
562
|
return O(() => {
|
|
500
563
|
const n = X(s == null ? void 0 : s.guideCategory, u == null ? void 0 : u.guideCategory) || X(s == null ? void 0 : s.tag, u == null ? void 0 : u.tag), i = k && A(k), g = y && A(y);
|
|
501
564
|
(typeof g != "undefined" && g !== i && i !== t.phrase && o && !c.open || n && !(s != null && s.initial)) && d(n);
|
|
@@ -505,9 +568,9 @@ const Xe = (v) => {
|
|
|
505
568
|
n && e.indexOf("@") === e.length - 1 && r("quick-filter:open", { type: "guideCategory", symbol: "@" }), i && e.indexOf("#") === e.length - 1 && r("quick-filter:open", { type: "tag", symbol: "#" });
|
|
506
569
|
}
|
|
507
570
|
c.open && e.indexOf("@") === -1 && e.indexOf("#") === -1 && r("quick-filter:close");
|
|
508
|
-
}, [e]), [d, x
|
|
571
|
+
}, [e]), [d, $, x];
|
|
509
572
|
}, dt = (o) => {
|
|
510
|
-
var r = o, { className: e } = r, t =
|
|
573
|
+
var r = o, { className: e } = r, t = G(r, ["className"]);
|
|
511
574
|
const {
|
|
512
575
|
showSearchButton: l,
|
|
513
576
|
showClearButton: c,
|
|
@@ -517,41 +580,48 @@ const Xe = (v) => {
|
|
|
517
580
|
searchButtonLabel: k,
|
|
518
581
|
clearButtonLabel: y,
|
|
519
582
|
ariaLabel: u,
|
|
520
|
-
route:
|
|
583
|
+
route: x = "search",
|
|
521
584
|
incremental: S = !0,
|
|
522
|
-
showChildren:
|
|
585
|
+
showChildren: $ = !1,
|
|
523
586
|
quickFilter: A,
|
|
524
587
|
quickFilters: d,
|
|
525
588
|
filterBadges: n
|
|
526
|
-
} = P(), { params: i } = ge(), [g, m] =
|
|
589
|
+
} = P(), { params: i } = ge(), [g, m] = T(!1), [a, h] = T(i.phrase || ""), [p, q] = T({
|
|
527
590
|
guideCategory: !1,
|
|
528
591
|
tag: !1
|
|
529
|
-
}), w = he(), ke =
|
|
592
|
+
}), w = he(), ke = Te(), W = U(), { position: $e = "inside" } = typeof n == "object" ? n : {};
|
|
530
593
|
O(() => {
|
|
531
594
|
const { guideCategory: E, tag: C } = i, F = typeof n == "object" ? !!n.guideCategory : !!n, ve = typeof n == "object" ? !!n.tag : !!n;
|
|
532
595
|
q({
|
|
533
596
|
guideCategory: F && !!E,
|
|
534
597
|
tag: ve && !!C
|
|
535
598
|
});
|
|
536
|
-
}, [n, i]), Oe(
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
if (
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
599
|
+
}, [n, i]), Oe(
|
|
600
|
+
"router:changed",
|
|
601
|
+
() => {
|
|
602
|
+
if (A) {
|
|
603
|
+
const { open: E, symbol: C } = A;
|
|
604
|
+
if (E) {
|
|
605
|
+
if (C) {
|
|
606
|
+
const F = a.replace(a.slice(a.indexOf(C)), "");
|
|
607
|
+
h(F);
|
|
608
|
+
}
|
|
609
|
+
W("quick-filter:close");
|
|
543
610
|
}
|
|
544
|
-
W("quick-filter:close");
|
|
545
611
|
}
|
|
546
|
-
}
|
|
547
|
-
|
|
612
|
+
},
|
|
613
|
+
[A, a, h, W]
|
|
614
|
+
);
|
|
548
615
|
const [ee, j, L] = et(a, i, !!S);
|
|
549
616
|
O(() => {
|
|
550
617
|
h(i.phrase || "");
|
|
551
618
|
}, [i.phrase]);
|
|
552
|
-
const
|
|
553
|
-
|
|
554
|
-
|
|
619
|
+
const xe = I(
|
|
620
|
+
(E) => {
|
|
621
|
+
h(E);
|
|
622
|
+
},
|
|
623
|
+
[h]
|
|
624
|
+
), Ee = I(() => {
|
|
555
625
|
W("quick-filter:close").then(() => j(!0));
|
|
556
626
|
}, [W, j]), we = I(() => {
|
|
557
627
|
var E, C;
|
|
@@ -559,10 +629,10 @@ const Xe = (v) => {
|
|
|
559
629
|
}, [v, g, L]), Ce = I(() => {
|
|
560
630
|
w.getAsync("router").then((E) => {
|
|
561
631
|
const C = E.getInitialRoute(), F = E.getRouteData();
|
|
562
|
-
(C == null ? void 0 : C.name) === F.name && (C == null ? void 0 : C.name) !==
|
|
632
|
+
(C == null ? void 0 : C.name) === F.name && (C == null ? void 0 : C.name) !== x ? h("") : j(!0);
|
|
563
633
|
});
|
|
564
634
|
}, [w, h, j]), te = (E) => {
|
|
565
|
-
if (E !==
|
|
635
|
+
if (E !== $e)
|
|
566
636
|
return null;
|
|
567
637
|
if (!!p.guideCategory || !!p.tag)
|
|
568
638
|
return /* @__PURE__ */ f.createElement(Me, {
|
|
@@ -602,7 +672,7 @@ const Xe = (v) => {
|
|
|
602
672
|
onClick: ee,
|
|
603
673
|
"data-has-phrase": !!a,
|
|
604
674
|
"data-has-focus": g
|
|
605
|
-
}, /* @__PURE__ */ f.createElement(
|
|
675
|
+
}, /* @__PURE__ */ f.createElement(J, {
|
|
606
676
|
size: 32,
|
|
607
677
|
symbol: { type: "Svg", content: "search" }
|
|
608
678
|
})), te("inside"), /* @__PURE__ */ f.createElement(We, D(B({
|
|
@@ -613,7 +683,7 @@ const Xe = (v) => {
|
|
|
613
683
|
onFocusChange: m,
|
|
614
684
|
onEscape: Ee,
|
|
615
685
|
onEnter: ee,
|
|
616
|
-
onChange:
|
|
686
|
+
onChange: xe,
|
|
617
687
|
value: a
|
|
618
688
|
})), oe && /* @__PURE__ */ f.createElement(rt, {
|
|
619
689
|
"aria-label": y,
|
|
@@ -621,10 +691,10 @@ const Xe = (v) => {
|
|
|
621
691
|
hasFocus: g,
|
|
622
692
|
title: y,
|
|
623
693
|
onClick: Ce
|
|
624
|
-
}, /* @__PURE__ */ f.createElement(
|
|
694
|
+
}, /* @__PURE__ */ f.createElement(J, {
|
|
625
695
|
size: 27,
|
|
626
696
|
symbol: { type: "Svg", content: "clear" }
|
|
627
|
-
})),
|
|
697
|
+
})), $ && !oe && ke.map((E) => /* @__PURE__ */ f.createElement(ze, {
|
|
628
698
|
key: E.id,
|
|
629
699
|
id: E.id,
|
|
630
700
|
branch: "default"
|
|
@@ -730,7 +800,7 @@ const Xe = (v) => {
|
|
|
730
800
|
${(e) => e["data-has-focus"] && K`
|
|
731
801
|
${(t) => {
|
|
732
802
|
var o, r;
|
|
733
|
-
return (o = t.theme.accessibility) != null && o.isTabbing ?
|
|
803
|
+
return (o = t.theme.accessibility) != null && o.isTabbing ? M : `
|
|
734
804
|
border-color: ${(r = t.theme.colors) == null ? void 0 : r.primary};
|
|
735
805
|
outline: none;
|
|
736
806
|
input {
|
|
@@ -753,11 +823,8 @@ const Xe = (v) => {
|
|
|
753
823
|
}
|
|
754
824
|
}
|
|
755
825
|
`, rt = z(pe)`
|
|
756
|
-
&:focus svg {
|
|
757
|
-
${
|
|
758
|
-
var t;
|
|
759
|
-
return ((t = e.theme.accessibility) == null ? void 0 : t.isTabbing) && _;
|
|
760
|
-
}}
|
|
826
|
+
&:focus-visible svg {
|
|
827
|
+
${M}
|
|
761
828
|
}
|
|
762
829
|
|
|
763
830
|
svg {
|
|
@@ -776,4 +843,4 @@ const Xe = (v) => {
|
|
|
776
843
|
export {
|
|
777
844
|
dt as default
|
|
778
845
|
};
|
|
779
|
-
//# sourceMappingURL=search.
|
|
846
|
+
//# sourceMappingURL=search.ca38a836.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.ca38a836.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 ${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 a {\r\n outline: none;\r\n }\r\n }\r\n\r\n ${(p) =>\r\n 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\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-visible svg {\r\n ${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":["FilterBadge","_a","_b","text","className","forceFocusStyle","filterType","handleClick","deleteAriaLabel","p","__objRest","ref","useRef","React","Text","appendClassNames","e","Link","__spreadProps","__spreadValues","SymbolBadge","FilterBadges","inputHasFocus","searchContainerRef","showTag","showGuideCategory","position","activeFilterBadges","deleteFilterBadgeAriaLabel","useProperties","dispatch","useDispatch","name","params","useRouteData","isNavigatingWithKeyBoard","setIsNavigatingWithKeyboard","useState","onKeyDown","useCallback","event","key","useEventListener","guideCategory","tag","tooltip","getFocusedFilterBadge","container","badges","handleFilterBadgeClick","keyboardNavigation","direction","inputElem","currentFocusedIndex","toFocus","useKeyPress","focusedBadgeIndex","isAtBeginningOfInput","isFocusingAFilterBadge","filtersToRemove","renderBadge","type","StyledFilterBadge","Wrapper","Tooltip","styled","css","borderTabStyle","match","title","phrase","filterItems","items","cloned","deepClone","i","matchTrail","buildMatchTrail","recursiveFilter","c","fn","categories","matching","flatten","res","id","trail","categoryTrail","result","category","getFocusedIndex","elem","anchors","a","getInputElem","focusInput","QuickFilterItemList","filterPhrase","rawItems","filterContainer","searchContainer","setItems","first","setFirst","quickFilters","autoSelect","useEffect","handleItemClicked","item","data","buildListProps","level","StyledLink","Title","focusedIndex","focusFirst","focusLast","focusNext","focusPrev","ItemTree","matches","symbol","createTitle","index","start","bold","end","disabledCss","focused","_c","_d","QuickFilter","quickFilter","useScroll","useContainer","events","wrapperRef","setWrapperRef","node","open","loading","Inner","Loader","contentBox","filterChanged","newValue","oldValue","useSearch","debounce","filterBadges","incremental","debouncedPhrase","useDebounce","previousDebouncedPhrase","usePrevious","previousFilters","dispatchSearch","value","filtersChanged","dispatchClear","navigateToHome","removeFilterKeywords","input","submitSearch","arg","activeElement","isSearching","cleanedPhrase","previousPhrase","quickFiltersGuideCategory","quickFiltersTag","Search","other","showSearchButton","showClearButton","role","autoFocus","placeholder","searchButtonLabel","clearButtonLabel","ariaLabel","searchRoute","showChildren","quickFiltersEnabled","hasFocus","setHasFocus","setPhrase","showFilterBadges","setShowFilterBadges","children","useChildren","filterBadgePosition","useWidgetEvent","cleaned","search","clear","onChange","onEscape","autoFocusHandler","onClearButtonClick","router","initialRoute","currentRoute","renderFilterBadges","useTransitionEnd","showClear","quickFilterAccessibilityProps","convertToStringAttributes","StyledSearchWrapper","SearchButton","Input","ClearButton","child","Component","Button"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telia-ace/knowledge-widget-components-search",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.23",
|
|
4
4
|
"description": "Search component for ACE Knowledge Widgets.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "Telia Company AB",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"telia"
|
|
9
9
|
],
|
|
10
10
|
"main": "dist/index.js",
|
|
11
|
+
"sourceMain": "src/index.ts",
|
|
11
12
|
"type": "module",
|
|
12
13
|
"types": "dist/index.d.ts",
|
|
13
14
|
"files": [
|
|
@@ -25,11 +26,11 @@
|
|
|
25
26
|
},
|
|
26
27
|
"sideEffects": false,
|
|
27
28
|
"dependencies": {
|
|
28
|
-
"@telia-ace/knowledge-widget-core": "^1.0.
|
|
29
|
-
"@telia-ace/knowledge-widget-types-grid": "^1.0.
|
|
30
|
-
"@telia-ace/knowledge-widget-ui": "^1.0.
|
|
31
|
-
"@telia-ace/widget-routing": "^1.0.
|
|
32
|
-
"@telia-ace/widget-utilities": "^1.0.
|
|
29
|
+
"@telia-ace/knowledge-widget-core": "^1.0.19",
|
|
30
|
+
"@telia-ace/knowledge-widget-types-grid": "^1.0.30",
|
|
31
|
+
"@telia-ace/knowledge-widget-ui": "^1.0.25",
|
|
32
|
+
"@telia-ace/widget-routing": "^1.0.16",
|
|
33
|
+
"@telia-ace/widget-utilities": "^1.0.4",
|
|
33
34
|
"@webprovisions/platform": "^1.1.2"
|
|
34
35
|
},
|
|
35
36
|
"peerDependencies": {
|
|
@@ -42,5 +43,5 @@
|
|
|
42
43
|
"@types/react-dom": "^16.8.0",
|
|
43
44
|
"@types/styled-components": "^5.1.7"
|
|
44
45
|
},
|
|
45
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "db190a67f912245c4145c037972fac2039bda698"
|
|
46
47
|
}
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|