@telia-ace/knowledge-widget-components-search 1.0.39-next.5 → 1.0.39
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
|
@@ -10,24 +10,23 @@ var I = (a, e, o) => e in a ? A(a, e, { enumerable: !0, configurable: !0, writab
|
|
|
10
10
|
F.call(e, o) && I(a, o, e[o]);
|
|
11
11
|
return a;
|
|
12
12
|
}, h = (a, e) => D(a, O(e));
|
|
13
|
-
import { DataClient as T } from "@telia-ace/knowledge-data-client";
|
|
13
|
+
import { DataClient as T, DataType as R } from "@telia-ace/knowledge-data-client";
|
|
14
14
|
import { createEventSubscriber as S } from "@telia-ace/knowledge-widget-core";
|
|
15
|
-
import { DataType as R } from "@telia-ace/knowledge-widget-types-grid";
|
|
16
15
|
import { createReactComponent as x } from "@telia-ace/knowledge-widget-ui";
|
|
17
|
-
import { createParams as E, findCategoryById as G, deepClone as
|
|
16
|
+
import { createParams as E, findCategoryById as G, deepClone as p, categoryTrail as M, getCategoryTrailAsObjects as $ } from "@telia-ace/widget-utilities";
|
|
18
17
|
const B = (a) => !!a.guideCategory || !!a.tag, H = (a, e) => {
|
|
19
18
|
const o = M(a, e), f = $(o, e);
|
|
20
|
-
return o.map((
|
|
21
|
-
var
|
|
22
|
-
return ((
|
|
19
|
+
return o.map((C) => {
|
|
20
|
+
var y;
|
|
21
|
+
return ((y = f.get(C)) == null ? void 0 : y.title) || "";
|
|
23
22
|
}).join(" / ");
|
|
24
23
|
}, v = (a) => {
|
|
25
|
-
const e =
|
|
24
|
+
const e = p(a);
|
|
26
25
|
return e.sort((o, f) => o.title > f.title ? 1 : -1), e.forEach((o) => {
|
|
27
26
|
o.items && (o.items = v(o.items));
|
|
28
27
|
}), e;
|
|
29
|
-
}, U = (a) => x(a, "search", import("./search.
|
|
30
|
-
const { events: o } = a.get("$widget"), [f, P] = S(o),
|
|
28
|
+
}, U = (a) => x(a, "search", import("./search.9f859d14.js"), (e) => {
|
|
29
|
+
const { events: o } = a.get("$widget"), [f, P] = S(o), C = (i) => {
|
|
31
30
|
var r, n;
|
|
32
31
|
const { activeFilterBadges: t } = e.properties();
|
|
33
32
|
(((r = t == null ? void 0 : t.guideCategory) == null ? void 0 : r.id) !== i.guideCategory || ((n = t == null ? void 0 : t.tag) == null ? void 0 : n.id) !== i.tag) && e.actions.dispatch("quick-filter:add", {
|
|
@@ -55,7 +54,7 @@ const B = (a) => !!a.guideCategory || !!a.tag, H = (a, e) => {
|
|
|
55
54
|
r.navigate(n);
|
|
56
55
|
});
|
|
57
56
|
});
|
|
58
|
-
const
|
|
57
|
+
const y = () => a.getAsync("router").then((i) => i.getRouteData().params);
|
|
59
58
|
e.actions.create(
|
|
60
59
|
"quick-filter:add",
|
|
61
60
|
(i) => {
|
|
@@ -105,13 +104,13 @@ const B = (a) => !!a.guideCategory || !!a.tag, H = (a, e) => {
|
|
|
105
104
|
loading: !0,
|
|
106
105
|
open: !0
|
|
107
106
|
}
|
|
108
|
-
}),
|
|
107
|
+
}), y().then(({ tag: r, guideCategory: n, phrase: u }) => {
|
|
109
108
|
if (t === "guideCategory")
|
|
110
109
|
return m({
|
|
111
110
|
tagId: r,
|
|
112
111
|
searchPhrase: u
|
|
113
112
|
}).then((g) => {
|
|
114
|
-
const s =
|
|
113
|
+
const s = p(g);
|
|
115
114
|
e.writeProperties({
|
|
116
115
|
quickFilter: {
|
|
117
116
|
items: v(s),
|
|
@@ -124,7 +123,7 @@ const B = (a) => !!a.guideCategory || !!a.tag, H = (a, e) => {
|
|
|
124
123
|
categories: n,
|
|
125
124
|
searchPhrase: u
|
|
126
125
|
}).then((g) => {
|
|
127
|
-
const s =
|
|
126
|
+
const s = p(g);
|
|
128
127
|
e.writeProperties({
|
|
129
128
|
quickFilter: {
|
|
130
129
|
items: v(s),
|
|
@@ -134,24 +133,24 @@ const B = (a) => !!a.guideCategory || !!a.tag, H = (a, e) => {
|
|
|
134
133
|
});
|
|
135
134
|
})));
|
|
136
135
|
const m = (i) => T.getInstance(a).then((t) => t.fetch(R.GuideCategories, i)).then((t) => t.categories || []), k = (i) => T.getInstance(a).then((t) => t.fetch(R.TagsOnGuides, i)).then((t = []) => t);
|
|
137
|
-
return
|
|
138
|
-
|
|
136
|
+
return y().then((i) => {
|
|
137
|
+
C(i);
|
|
139
138
|
}), f("router:changed", (i, { current: t }) => {
|
|
140
139
|
const {
|
|
141
140
|
routeData: { params: r }
|
|
142
141
|
} = t;
|
|
143
|
-
|
|
142
|
+
C(r);
|
|
144
143
|
}), f("data-client:fetched", (i, t) => {
|
|
145
144
|
const { filterBadges: r } = e.properties(), n = typeof r == "object" ? !!r.tag : !!r;
|
|
146
|
-
t.type === "match" && n &&
|
|
145
|
+
t.type === "match" && n && y().then(({ tag: u }) => {
|
|
147
146
|
const { tags: g = [] } = t.response, s = g.find((d) => d.id === u) || null;
|
|
148
147
|
e.writeProperties({ filters: { tag: s } });
|
|
149
148
|
});
|
|
150
149
|
}), () => {
|
|
151
150
|
P();
|
|
152
151
|
};
|
|
153
|
-
}),
|
|
152
|
+
}), N = U;
|
|
154
153
|
export {
|
|
155
|
-
|
|
154
|
+
N as default
|
|
156
155
|
};
|
|
157
156
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/search-component.ts"],"sourcesContent":["import { DataClient } from '@telia-ace/knowledge-data-client';\nimport { Category, createEventSubscriber, Tag } from '@telia-ace/knowledge-widget-core';\nimport {\n CategoriesResult,\n DataType,\n MatchResult,\n QueryParameters,\n TagsResult,\n} from '@telia-ace/knowledge-widget-types-grid';\nimport { createReactComponent } from '@telia-ace/knowledge-widget-ui';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport {\n categoryTrail,\n createParams,\n deepClone,\n findCategoryById,\n getCategoryTrailAsObjects,\n Params,\n} from '@telia-ace/widget-utilities';\nimport { Container } from '@webprovisions/platform';\n\nexport type SearchComponentProps = {\n route?: string;\n role?: string;\n\n showSearchButton: boolean;\n showClearButton: boolean;\n showChildren: boolean;\n\n searchButtonLabel: string;\n clearButtonLabel: string;\n ariaLabel?: string;\n\n placeholder: string;\n autoFocus: boolean;\n incremental?: boolean | number;\n\n filterBadges?: FilterConfig | boolean;\n activeFilterBadges?: ActiveFilterBadges; // internal\n deleteFilterBadgeAriaLabel?: string;\n\n quickFilters?: FilterConfig | boolean;\n quickFilter?: Filter; // internal\n\n patchParams?: boolean;\n};\n\nexport type Filter = {\n items?: Category[] | Tag[];\n type?: 'guideCategory' | 'tag';\n symbol?: string;\n loading: boolean;\n open: boolean;\n};\n\nexport type ActiveFilterBadges = {\n guideCategory?: Category | null;\n tag?: Tag | null;\n tooltip?: string | null;\n initial?: boolean;\n};\n\nexport type FilterConfig = {\n autoSelect?: boolean;\n guideCategory?: boolean;\n tag?: boolean;\n position?: 'inside' | 'below';\n};\n\nconst hasActiveFilterBadge = (filters: ActiveFilterBadges) => {\n return !!filters.guideCategory || !!filters.tag;\n};\n\nconst getTooltip = (categoryId: string, categories: Category[]) => {\n const trailIds: string[] = categoryTrail(categoryId, categories);\n const categoryMap = getCategoryTrailAsObjects(trailIds, categories);\n const trail = trailIds.map((id) => categoryMap.get(id)?.title || '').join(' / ');\n return trail;\n};\n\nconst sortRecursive = (items: any[]) => {\n const clone = deepClone(items);\n\n clone.sort((a: any, b: any) => {\n if (a.title > b.title) {\n return 1;\n }\n return -1;\n });\n\n clone.forEach((item: any) => {\n if (item.items) {\n item.items = sortRecursive(item.items);\n }\n });\n\n return clone;\n};\n\nconst SearchComponent = (container: Container) => {\n return createReactComponent(container, 'search', import('./search'), (component) => {\n const { events } = container.get('$widget');\n const [subscribe, unsubscribe] = createEventSubscriber(events);\n\n const load = (params: Params) => {\n const { activeFilterBadges } = component.properties<SearchComponentProps>();\n\n if (\n activeFilterBadges?.guideCategory?.id !== params.guideCategory ||\n activeFilterBadges?.tag?.id !== params.tag\n ) {\n component.actions.dispatch('quick-filter:add', {\n tag: params.tag,\n category: params.guideCategory,\n initial: true,\n });\n }\n };\n\n component.actions.create('search', (data) => {\n const { value, filters, filtersChanged } = data;\n const { route = 'search', patchParams = false } =\n component.properties<SearchComponentProps>();\n\n if (\n value.length > 0 ||\n ((hasActiveFilterBadge(filters) || filtersChanged) && !filters?.initial)\n ) {\n container.getAsync('router').then((router: RoutingService) => {\n const { params } = router.getRouteData();\n\n let searchParams: { [key: string]: string | undefined } = {\n guide: undefined,\n id: undefined,\n accordion: undefined,\n contactMethod: undefined,\n };\n\n searchParams.phrase = value.length > 0 ? encodeURIComponent(value) : '';\n\n if (patchParams) {\n searchParams = {\n ...params,\n ...searchParams,\n };\n }\n\n if (filters?.guideCategory || filtersChanged) {\n searchParams.guideCategory = filters.guideCategory?.id || undefined;\n }\n\n if (filters?.tag || filtersChanged) {\n searchParams.tag = filters.tag?.id || undefined;\n }\n\n router.navigate(route, createParams(searchParams));\n });\n }\n });\n\n component.actions.create('clear', (data, options) => {\n if (data.navigateToHome) {\n container.getAsync('router').then((router: RoutingService) => {\n const { name }: any = router.getInitialRoute();\n router.navigate(name);\n });\n }\n });\n\n const getRouterParams: () => Promise<Params> = () =>\n container\n .getAsync('router')\n .then((router: RoutingService) => router.getRouteData().params);\n\n component.actions.create(\n 'quick-filter:add',\n (data: { category?: string; tag?: string; initial?: boolean }) => {\n const { category, tag, initial } = data;\n const { activeFilterBadges: previous } =\n component.properties<SearchComponentProps>();\n\n const activeFilterBadges: ActiveFilterBadges = previous || {\n initial,\n guideCategory: null,\n tag: null,\n tooltip: null,\n };\n\n return Promise.resolve()\n .then(() => {\n if (category) {\n return fetchCategories({}).then((categories) => {\n const categoryItem =\n <Category | null>findCategoryById(category, categories) || null;\n return {\n ...activeFilterBadges,\n guideCategory: categoryItem,\n tooltip: getTooltip(category, categories) || null,\n };\n });\n }\n return {\n ...activeFilterBadges,\n guideCategory: null,\n tooltip: null,\n };\n })\n .then((next) => {\n if (tag) {\n return fetchTags({}).then((tags) => {\n return {\n ...next,\n tag: tags.find((t) => t.id === tag) || null,\n };\n });\n }\n return {\n ...next,\n tag: null,\n };\n })\n .then((next) => {\n return component.writeProperties({\n activeFilterBadges: { ...next, initial: !!initial },\n });\n });\n }\n );\n\n component.actions.create('quick-filter:remove', ({ types }: { types: string[] }) => {\n const { activeFilterBadges } = component.properties<SearchComponentProps>();\n\n component.writeProperties({\n activeFilterBadges: {\n ...activeFilterBadges,\n initial: false,\n guideCategory:\n types.indexOf('guideCategory') > -1\n ? null\n : activeFilterBadges?.guideCategory,\n tag: types.indexOf('tag') > -1 ? null : activeFilterBadges?.tag,\n },\n });\n });\n\n component.actions.create('quick-filter:close', () => {\n return component.writeProperties({\n quickFilter: {\n items: [],\n loading: false,\n open: false,\n },\n });\n });\n\n component.actions.create('quick-filter:open', ({ symbol, type }) => {\n component.writeProperties({\n quickFilter: {\n type,\n symbol,\n items: [],\n loading: true,\n open: true,\n },\n });\n\n return getRouterParams().then(({ tag, guideCategory, phrase }) => {\n if (type === 'guideCategory') {\n return fetchCategories({\n tagId: tag,\n searchPhrase: phrase,\n }).then((items) => {\n const clone = deepClone(items);\n\n component.writeProperties({\n quickFilter: {\n items: sortRecursive(clone),\n loading: false,\n },\n });\n });\n }\n\n if (type === 'tag') {\n return fetchTags({\n categories: guideCategory,\n searchPhrase: phrase,\n }).then((items) => {\n const clone = deepClone(items);\n component.writeProperties({\n quickFilter: {\n items: sortRecursive(clone),\n loading: false,\n },\n });\n });\n }\n });\n });\n\n const fetchCategories = (params: QueryParameters) => {\n return DataClient.getInstance(container)\n .then((dataClient) => dataClient.fetch(DataType.GuideCategories, params))\n .then((categoriesResult: CategoriesResult) => categoriesResult.categories || []);\n };\n\n const fetchTags = (params: QueryParameters) => {\n return DataClient.getInstance(container)\n .then((dataClient) => dataClient.fetch(DataType.TagsOnGuides, params))\n .then((tags: TagsResult = []) => tags);\n };\n\n getRouterParams().then((params) => {\n load(params);\n });\n\n subscribe('router:changed', (_, { current }) => {\n const {\n routeData: { params },\n } = current;\n load(params);\n });\n\n subscribe('data-client:fetched', (event, data) => {\n const { filterBadges } = component.properties<SearchComponentProps>();\n\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\n\n if (data.type === 'match' && showTag) {\n getRouterParams().then(({ tag: tagId }) => {\n const { tags = [] }: MatchResult = data.response;\n const tag = tags.find((t) => t.id === tagId) || null;\n component.writeProperties({ filters: { tag } });\n });\n }\n });\n\n return () => {\n unsubscribe();\n };\n });\n};\n\nexport default SearchComponent;\n"],"names":["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","dataClient","DataType","categoriesResult","_","current","event","filterBadges","showTag","tagId","SearchComponent$1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/search-component.ts"],"sourcesContent":["import {\n CategoriesResult,\n DataClient,\n DataType,\n MatchResult,\n QueryParameters,\n TagsResult,\n} from '@telia-ace/knowledge-data-client';\nimport { Category, createEventSubscriber, Tag } from '@telia-ace/knowledge-widget-core';\nimport { createReactComponent } from '@telia-ace/knowledge-widget-ui';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport {\n categoryTrail,\n createParams,\n deepClone,\n findCategoryById,\n getCategoryTrailAsObjects,\n Params,\n} from '@telia-ace/widget-utilities';\nimport { Container } from '@webprovisions/platform';\n\nexport type SearchComponentProps = {\n route?: string;\n role?: string;\n\n showSearchButton: boolean;\n showClearButton: boolean;\n showChildren: boolean;\n\n searchButtonLabel: string;\n clearButtonLabel: string;\n ariaLabel?: string;\n\n placeholder: string;\n autoFocus: boolean;\n incremental?: boolean | number;\n\n filterBadges?: FilterConfig | boolean;\n activeFilterBadges?: ActiveFilterBadges; // internal\n deleteFilterBadgeAriaLabel?: string;\n\n quickFilters?: FilterConfig | boolean;\n quickFilter?: Filter; // internal\n\n patchParams?: boolean;\n};\n\nexport type Filter = {\n items?: Category[] | Tag[];\n type?: 'guideCategory' | 'tag';\n symbol?: string;\n loading: boolean;\n open: boolean;\n};\n\nexport type ActiveFilterBadges = {\n guideCategory?: Category | null;\n tag?: Tag | null;\n tooltip?: string | null;\n initial?: boolean;\n};\n\nexport type FilterConfig = {\n autoSelect?: boolean;\n guideCategory?: boolean;\n tag?: boolean;\n position?: 'inside' | 'below';\n};\n\nconst hasActiveFilterBadge = (filters: ActiveFilterBadges) => {\n return !!filters.guideCategory || !!filters.tag;\n};\n\nconst getTooltip = (categoryId: string, categories: Category[]) => {\n const trailIds: string[] = categoryTrail(categoryId, categories);\n const categoryMap = getCategoryTrailAsObjects(trailIds, categories);\n const trail = trailIds.map((id) => categoryMap.get(id)?.title || '').join(' / ');\n return trail;\n};\n\nconst sortRecursive = (items: any[]) => {\n const clone = deepClone(items);\n\n clone.sort((a: any, b: any) => {\n if (a.title > b.title) {\n return 1;\n }\n return -1;\n });\n\n clone.forEach((item: any) => {\n if (item.items) {\n item.items = sortRecursive(item.items);\n }\n });\n\n return clone;\n};\n\nconst SearchComponent = (container: Container) => {\n return createReactComponent(container, 'search', import('./search'), (component) => {\n const { events } = container.get('$widget');\n const [subscribe, unsubscribe] = createEventSubscriber(events);\n\n const load = (params: Params) => {\n const { activeFilterBadges } = component.properties<SearchComponentProps>();\n\n if (\n activeFilterBadges?.guideCategory?.id !== params.guideCategory ||\n activeFilterBadges?.tag?.id !== params.tag\n ) {\n component.actions.dispatch('quick-filter:add', {\n tag: params.tag,\n category: params.guideCategory,\n initial: true,\n });\n }\n };\n\n component.actions.create('search', (data) => {\n const { value, filters, filtersChanged } = data;\n const { route = 'search', patchParams = false } =\n component.properties<SearchComponentProps>();\n\n if (\n value.length > 0 ||\n ((hasActiveFilterBadge(filters) || filtersChanged) && !filters?.initial)\n ) {\n container.getAsync('router').then((router: RoutingService) => {\n const { params } = router.getRouteData();\n\n let searchParams: { [key: string]: string | undefined } = {\n guide: undefined,\n id: undefined,\n accordion: undefined,\n contactMethod: undefined,\n };\n\n searchParams.phrase = value.length > 0 ? encodeURIComponent(value) : '';\n\n if (patchParams) {\n searchParams = {\n ...params,\n ...searchParams,\n };\n }\n\n if (filters?.guideCategory || filtersChanged) {\n searchParams.guideCategory = filters.guideCategory?.id || undefined;\n }\n\n if (filters?.tag || filtersChanged) {\n searchParams.tag = filters.tag?.id || undefined;\n }\n\n router.navigate(route, createParams(searchParams));\n });\n }\n });\n\n component.actions.create('clear', (data, options) => {\n if (data.navigateToHome) {\n container.getAsync('router').then((router: RoutingService) => {\n const { name }: any = router.getInitialRoute();\n router.navigate(name);\n });\n }\n });\n\n const getRouterParams: () => Promise<Params> = () =>\n container\n .getAsync('router')\n .then((router: RoutingService) => router.getRouteData().params);\n\n component.actions.create(\n 'quick-filter:add',\n (data: { category?: string; tag?: string; initial?: boolean }) => {\n const { category, tag, initial } = data;\n const { activeFilterBadges: previous } =\n component.properties<SearchComponentProps>();\n\n const activeFilterBadges: ActiveFilterBadges = previous || {\n initial,\n guideCategory: null,\n tag: null,\n tooltip: null,\n };\n\n return Promise.resolve()\n .then(() => {\n if (category) {\n return fetchCategories({}).then((categories) => {\n const categoryItem =\n <Category | null>findCategoryById(category, categories) || null;\n return {\n ...activeFilterBadges,\n guideCategory: categoryItem,\n tooltip: getTooltip(category, categories) || null,\n };\n });\n }\n return {\n ...activeFilterBadges,\n guideCategory: null,\n tooltip: null,\n };\n })\n .then((next) => {\n if (tag) {\n return fetchTags({}).then((tags) => {\n return {\n ...next,\n tag: tags.find((t) => t.id === tag) || null,\n };\n });\n }\n return {\n ...next,\n tag: null,\n };\n })\n .then((next) => {\n return component.writeProperties({\n activeFilterBadges: { ...next, initial: !!initial },\n });\n });\n }\n );\n\n component.actions.create('quick-filter:remove', ({ types }: { types: string[] }) => {\n const { activeFilterBadges } = component.properties<SearchComponentProps>();\n\n component.writeProperties({\n activeFilterBadges: {\n ...activeFilterBadges,\n initial: false,\n guideCategory:\n types.indexOf('guideCategory') > -1\n ? null\n : activeFilterBadges?.guideCategory,\n tag: types.indexOf('tag') > -1 ? null : activeFilterBadges?.tag,\n },\n });\n });\n\n component.actions.create('quick-filter:close', () => {\n return component.writeProperties({\n quickFilter: {\n items: [],\n loading: false,\n open: false,\n },\n });\n });\n\n component.actions.create('quick-filter:open', ({ symbol, type }) => {\n component.writeProperties({\n quickFilter: {\n type,\n symbol,\n items: [],\n loading: true,\n open: true,\n },\n });\n\n return getRouterParams().then(({ tag, guideCategory, phrase }) => {\n if (type === 'guideCategory') {\n return fetchCategories({\n tagId: tag,\n searchPhrase: phrase,\n }).then((items) => {\n const clone = deepClone(items);\n\n component.writeProperties({\n quickFilter: {\n items: sortRecursive(clone),\n loading: false,\n },\n });\n });\n }\n\n if (type === 'tag') {\n return fetchTags({\n categories: guideCategory,\n searchPhrase: phrase,\n }).then((items) => {\n const clone = deepClone(items);\n component.writeProperties({\n quickFilter: {\n items: sortRecursive(clone),\n loading: false,\n },\n });\n });\n }\n });\n });\n\n const fetchCategories = (params: QueryParameters) => {\n return DataClient.getInstance(container)\n .then((dataClient) => dataClient.fetch(DataType.GuideCategories, params))\n .then((categoriesResult: CategoriesResult) => categoriesResult.categories || []);\n };\n\n const fetchTags = (params: QueryParameters) => {\n return DataClient.getInstance(container)\n .then((dataClient) => dataClient.fetch(DataType.TagsOnGuides, params))\n .then((tags: TagsResult = []) => tags);\n };\n\n getRouterParams().then((params) => {\n load(params);\n });\n\n subscribe('router:changed', (_, { current }) => {\n const {\n routeData: { params },\n } = current;\n load(params);\n });\n\n subscribe('data-client:fetched', (event, data) => {\n const { filterBadges } = component.properties<SearchComponentProps>();\n\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\n\n if (data.type === 'match' && showTag) {\n getRouterParams().then(({ tag: tagId }) => {\n const { tags = [] }: MatchResult = data.response;\n const tag = tags.find((t) => t.id === tagId) || null;\n component.writeProperties({ filters: { tag } });\n });\n }\n });\n\n return () => {\n unsubscribe();\n };\n });\n};\n\nexport default SearchComponent;\n"],"names":["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","dataClient","DataType","categoriesResult","_","current","event","filterBadges","showTag","tagId","SearchComponent$1"],"mappings":"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"}
|
|
@@ -21,8 +21,8 @@ var G = (e, t) => {
|
|
|
21
21
|
};
|
|
22
22
|
import { css as O } from "@emotion/react";
|
|
23
23
|
import F from "@emotion/styled";
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
24
|
+
import { useProperties as P, useDispatch as U, useRouteData as de, useEventListener as J, useKeyPress as H, Tooltip as Fe, borderTabStyle as M, Text as fe, Link as ge, SymbolBadge as Y, ItemTree as ze, useScroll as Be, useContainer as me, Loader as Le, contentBox as he, useDebounce as De, usePrevious as ae, useChildren as Ne, useWidgetEvent as Te, useTransitionEnd as Oe, convertToStringAttributes as Ke, Input as Pe, Button as pe } from "@telia-ace/knowledge-widget-ui";
|
|
25
|
+
import { Component as We } from "@telia-ace/widget-types-grid";
|
|
26
26
|
import { appendClassNames as R, deepClone as je, categoryTrail as Qe } from "@telia-ace/widget-utilities";
|
|
27
27
|
import f, { useState as T, useCallback as I, useRef as V, useEffect as K } from "react";
|
|
28
28
|
const Xe = (v) => {
|
|
@@ -160,7 +160,7 @@ const Xe = (v) => {
|
|
|
160
160
|
) : null,
|
|
161
161
|
[S, $, b, k, r, o, y]
|
|
162
162
|
);
|
|
163
|
-
return !S && !$ ? null : /* @__PURE__ */ f.createElement(Ge, { className: "humany-filter-badges", position: l }, S && A ? /* @__PURE__ */ f.createElement(
|
|
163
|
+
return !S && !$ ? null : /* @__PURE__ */ f.createElement(Ge, { className: "humany-filter-badges", position: l }, S && A ? /* @__PURE__ */ f.createElement(Fe, { content: /* @__PURE__ */ f.createElement(f.Fragment, null, A), sticky: !1 }, g("guideCategory")) : g("guideCategory"), $ && g("tag"));
|
|
164
164
|
}, Ue = Me, Ge = F.div`
|
|
165
165
|
display: flex;
|
|
166
166
|
align-items: center;
|
|
@@ -394,7 +394,7 @@ const Xe = (v) => {
|
|
|
394
394
|
},
|
|
395
395
|
window
|
|
396
396
|
), /* @__PURE__ */ f.createElement(
|
|
397
|
-
|
|
397
|
+
ze,
|
|
398
398
|
B({
|
|
399
399
|
tree: s,
|
|
400
400
|
renderEmpty: !1,
|
|
@@ -472,7 +472,7 @@ const Xe = (v) => {
|
|
|
472
472
|
type: "",
|
|
473
473
|
items: []
|
|
474
474
|
}
|
|
475
|
-
} = P(), [l, c] =
|
|
475
|
+
} = P(), [l, c] = Be(!0), s = me(), { events: v } = s.get("$widget"), b = V(), k = I(
|
|
476
476
|
(d) => (d && d.addEventListener(
|
|
477
477
|
"keydown",
|
|
478
478
|
() => {
|
|
@@ -509,7 +509,7 @@ const Xe = (v) => {
|
|
|
509
509
|
inputHasFocus: t
|
|
510
510
|
}
|
|
511
511
|
)),
|
|
512
|
-
/* @__PURE__ */ f.createElement(
|
|
512
|
+
/* @__PURE__ */ f.createElement(Le, { loading: $ })
|
|
513
513
|
);
|
|
514
514
|
}, et = F.div`
|
|
515
515
|
${(e) => he(e)};
|
|
@@ -548,7 +548,7 @@ const Xe = (v) => {
|
|
|
548
548
|
activeFilterBadges: s,
|
|
549
549
|
filterBadges: v = !1,
|
|
550
550
|
incremental: b = 600
|
|
551
|
-
} = P(), k =
|
|
551
|
+
} = P(), k = De(
|
|
552
552
|
e,
|
|
553
553
|
typeof b == "boolean" ? 600 : b
|
|
554
554
|
), y = ae(k), u = ae(s), x = V(null), S = I(
|
|
@@ -609,14 +609,14 @@ const Xe = (v) => {
|
|
|
609
609
|
} = P(), { params: i } = de(), [g, m] = T(!1), [a, h] = T(i.phrase || ""), [p, q] = T({
|
|
610
610
|
guideCategory: !1,
|
|
611
611
|
tag: !1
|
|
612
|
-
}), w = me(), ke =
|
|
612
|
+
}), w = me(), ke = Ne(), W = U(), { position: $e = "inside" } = typeof n == "object" ? n : {};
|
|
613
613
|
K(() => {
|
|
614
614
|
const { guideCategory: E, tag: C } = i, z = typeof n == "object" ? !!n.guideCategory : !!n, ve = typeof n == "object" ? !!n.tag : !!n;
|
|
615
615
|
q({
|
|
616
616
|
guideCategory: z && !!E,
|
|
617
617
|
tag: ve && !!C
|
|
618
618
|
});
|
|
619
|
-
}, [n, i]),
|
|
619
|
+
}, [n, i]), Te(
|
|
620
620
|
"router:changed",
|
|
621
621
|
() => {
|
|
622
622
|
if (A) {
|
|
@@ -666,8 +666,8 @@ const Xe = (v) => {
|
|
|
666
666
|
}
|
|
667
667
|
);
|
|
668
668
|
};
|
|
669
|
-
|
|
670
|
-
const oe = c && (p.guideCategory || p.tag || a), Se = d ?
|
|
669
|
+
Oe(we);
|
|
670
|
+
const oe = c && (p.guideCategory || p.tag || a), Se = d ? Ke({
|
|
671
671
|
role: "combobox",
|
|
672
672
|
"aria-autocomplete": "list",
|
|
673
673
|
autoComplete: "off",
|
|
@@ -708,7 +708,7 @@ const Xe = (v) => {
|
|
|
708
708
|
),
|
|
709
709
|
te("inside"),
|
|
710
710
|
/* @__PURE__ */ f.createElement(
|
|
711
|
-
|
|
711
|
+
Pe,
|
|
712
712
|
D(B({
|
|
713
713
|
type: "search",
|
|
714
714
|
"aria-label": u
|
|
@@ -732,7 +732,7 @@ const Xe = (v) => {
|
|
|
732
732
|
},
|
|
733
733
|
/* @__PURE__ */ f.createElement(Y, { size: 27, symbol: { type: "Svg", content: "clear" } })
|
|
734
734
|
),
|
|
735
|
-
$ && !oe && ke.map((E) => /* @__PURE__ */ f.createElement(
|
|
735
|
+
$ && !oe && ke.map((E) => /* @__PURE__ */ f.createElement(We, { key: E.id, id: E.id, branch: "default" })),
|
|
736
736
|
/* @__PURE__ */ f.createElement(
|
|
737
737
|
Ve,
|
|
738
738
|
{
|
|
@@ -884,4 +884,4 @@ const Xe = (v) => {
|
|
|
884
884
|
export {
|
|
885
885
|
mt as default
|
|
886
886
|
};
|
|
887
|
-
//# sourceMappingURL=search.
|
|
887
|
+
//# sourceMappingURL=search.9f859d14.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.9f859d14.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 { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Link,\n SymbolBadge,\n Text,\n Tooltip,\n useDispatch,\n useEventListener,\n useKeyPress,\n useProperties,\n useRouteData,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { SearchComponentProps } from './search-component';\n\nconst FilterBadge: React.FC<any> = ({\n text,\n className,\n forceFocusStyle,\n filterType,\n handleClick,\n deleteAriaLabel = '',\n ...p\n}) => {\n const ref = useRef<HTMLAnchorElement>();\n\n return (\n <Text\n className={appendClassNames(className, 'humany-filter-badge')}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleClick(e, filterType);\n }\n }}\n >\n {text}\n <Link\n {...p}\n ref={ref}\n tabIndex={0}\n role=\"button\"\n aria-label={deleteAriaLabel.replace('{{item}}', text)}\n onClick={(e) => handleClick(e, filterType)}\n >\n <SymbolBadge size={13} symbol={{ type: 'Svg', content: 'close' }} />\n </Link>\n </Text>\n );\n};\n\ntype Props = {\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n showGuideCategory: boolean;\n showTag: boolean;\n position: 'inside' | 'below';\n};\nconst FilterBadges: React.FC<Props> = ({\n inputHasFocus,\n searchContainerRef,\n showTag,\n showGuideCategory,\n position,\n}) => {\n const { activeFilterBadges = {}, deleteFilterBadgeAriaLabel = '' } =\n useProperties<SearchComponentProps>();\n const dispatch = useDispatch();\n const { name, params } = useRouteData();\n const [isNavigatingWithKeyBoard, setIsNavigatingWithKeyboard] = useState(false);\n\n const onKeyDown = useCallback((event: KeyboardEvent) => {\n const { key } = event;\n\n if (['ArrowLeft', 'ArrowRight'].indexOf(key) === -1) {\n setIsNavigatingWithKeyboard(false);\n }\n }, []);\n\n useEventListener('keydown', onKeyDown, window);\n\n useEventListener('click', onKeyDown, window);\n\n const { guideCategory, tag, tooltip } = activeFilterBadges;\n\n const getFocusedFilterBadge = (container: HTMLElement) => {\n const badges = container.querySelectorAll(\n '.humany-filter-badge'\n ) as NodeListOf<HTMLElement>;\n return {\n badges,\n index: Array.from(badges).findIndex((e) => document.activeElement === e),\n };\n };\n\n const handleFilterBadgeClick = (\n event: React.MouseEvent | React.KeyboardEvent,\n filterType: string\n ) => {\n event.preventDefault();\n dispatch('quick-filter:remove', { types: [filterType] });\n };\n\n const keyboardNavigation = (\n direction: 'left' | 'right',\n inputElem: HTMLInputElement | null\n ) => {\n if (!searchContainerRef) {\n return;\n }\n const { badges, index: currentFocusedIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (badges.length) {\n let toFocus: HTMLElement | null = null;\n\n if (direction === 'left') {\n if (currentFocusedIndex === -1) {\n // if no badge is focused and direction is left\n // focus last badge\n toFocus = badges.item(badges.length - 1);\n } else if (currentFocusedIndex > 0) {\n // if there are more badges to the left, go one step back\n // do nothing if already focusing the most left badge\n toFocus = badges.item(currentFocusedIndex - 1);\n }\n } else if (direction === 'right') {\n if (currentFocusedIndex === badges.length - 1) {\n // if currently focusing the last badge, move focus to search input\n inputElem && inputElem.focus();\n } else if (badges.item(currentFocusedIndex + 1)) {\n toFocus = badges.item(currentFocusedIndex + 1);\n }\n }\n\n if (toFocus) {\n toFocus.focus();\n setIsNavigatingWithKeyboard(true);\n }\n }\n };\n\n useKeyPress(\n 'ArrowLeft',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (inputHasFocus || focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isAtBeginningOfInput =\n inputElem && inputElem.selectionStart !== null && inputElem.selectionStart <= 0;\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isAtBeginningOfInput || isFocusingAFilterBadge) {\n keyboardNavigation('left', inputElem);\n }\n }\n }, [inputHasFocus, searchContainerRef])\n );\n\n useKeyPress(\n 'ArrowRight',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n keyboardNavigation('right', inputElem);\n }\n }\n }, [searchContainerRef])\n );\n\n useKeyPress(\n 'Backspace',\n useCallback(\n (event: any) => {\n if (!searchContainerRef) {\n return;\n }\n let filtersToRemove: string[] = [];\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n if (focusedBadgeIndex === 0) {\n if (showGuideCategory) {\n filtersToRemove = ['guideCategory'];\n } else if (showTag) {\n filtersToRemove = ['tag'];\n }\n } else if (focusedBadgeIndex === 1) {\n filtersToRemove = ['tag'];\n }\n } else {\n const isAtBeginningOfInput =\n inputElem &&\n inputElem.selectionStart !== null &&\n inputElem.selectionStart <= 0;\n\n if (isAtBeginningOfInput) {\n if (activeFilterBadges?.tag) {\n filtersToRemove = ['tag'];\n } else if (activeFilterBadges?.guideCategory) {\n filtersToRemove = ['guideCategory'];\n }\n }\n }\n\n if (filtersToRemove.length > 0) {\n event.preventDefault();\n dispatch('quick-filter:remove', { types: filtersToRemove });\n }\n },\n [searchContainerRef, activeFilterBadges, showTag, showGuideCategory]\n )\n );\n\n const renderBadge = useCallback(\n (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory' && guideCategory && showGuideCategory) {\n return (\n <StyledFilterBadge\n text={`@${guideCategory.title}`}\n routeName={name}\n filterType=\"guideCategory\"\n handleClick={handleFilterBadgeClick}\n forceFocusStyle={isNavigatingWithKeyBoard}\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n guideCategory: undefined,\n }}\n />\n );\n }\n if (type === 'tag' && tag && showTag) {\n return (\n <StyledFilterBadge\n className=\"humany-filter-badge\"\n text={`#${tag.title}`}\n routeName={name}\n filterType=\"tag\"\n handleClick={handleFilterBadgeClick}\n forceFocusStyle={isNavigatingWithKeyBoard}\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n tag: undefined,\n }}\n />\n );\n }\n return null;\n },\n [guideCategory, tag, name, params, showGuideCategory, showTag, isNavigatingWithKeyBoard]\n );\n\n if (!guideCategory && !tag) {\n return null;\n }\n\n return (\n <Wrapper className=\"humany-filter-badges\" position={position}>\n {guideCategory && tooltip ? (\n <Tooltip content={<>{tooltip}</>} sticky={false}>\n {renderBadge('guideCategory')}\n </Tooltip>\n ) : (\n renderBadge('guideCategory')\n )}\n {tag && renderBadge('tag')}\n </Wrapper>\n );\n};\n\nexport default FilterBadges;\n\nconst Wrapper = styled.div<{ position: 'inside' | 'below' }>`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n\n ${(p) =>\n p.position === 'inside'\n ? css`\n &:not(:first-child) {\n margin: 0 0 0 ${p.theme.sizes?.normal};\n }\n `\n : css`\n margin: ${p.theme.sizes?.small} 0 0 0;\n span:first-child {\n margin-left: 0;\n }\n `}\n`;\n\nconst StyledFilterBadge = styled(FilterBadge)`\n display: flex;\n align-items: center;\n padding: ${(p) => `${p.theme.sizes?.small} calc(${p.theme.sizes?.normal}/2) `};\n background-color: ${(p) => p.theme.colors?.primary};\n border-radius: ${(p) => p.theme.borderRadius};\n font-weight: 300;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-style: italic;\n color: #ffffff;\n text-decoration: none;\n white-space: nowrap;\n\n margin: calc(${(p) => p.theme.sizes?.small} / 2);\n\n &:focus-within {\n ${borderTabStyle}\n background-color: transparent;\n\n svg {\n path {\n stroke: ${(p) => p.theme.colors?.primary};\n }\n }\n a {\n outline: none;\n }\n }\n\n ${(p) =>\n p.forceFocusStyle &&\n css`\n ${borderTabStyle(p)}\n background-color: transparent;\n\n svg {\n path {\n stroke: ${p.theme.colors?.primary};\n }\n }\n `}\n\n svg {\n width: 17px;\n height: 11px;\n margin: 1px 0 0 ${(p) => p.theme.sizes?.small};\n path {\n stroke: #ffffff;\n stroke-width: 2px;\n }\n order: 1;\n }\n`;\n","import { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport { categoryTrail, deepClone } from '@telia-ace/widget-utilities';\n\nexport const match = (title: string, phrase: string) => {\n if (!phrase || !title) {\n return true;\n }\n\n return !!(title.toLowerCase().indexOf(phrase.toLowerCase()) > -1);\n};\n\nexport const filterItems = (\n items: (Tag | Category)[] = [],\n type: 'tag' | 'guideCategory',\n phrase: string\n): any[] => {\n if (!phrase) {\n return items;\n }\n\n const cloned = deepClone(items);\n\n if (type === 'tag') {\n return cloned.filter((i: Tag) => match(i.title, phrase));\n }\n\n const matchTrail = buildMatchTrail(cloned, phrase);\n const filtered = recursiveFilter(cloned, (c: Category) => matchTrail.indexOf(c.id) > -1);\n\n return filtered;\n};\n\nconst recursiveFilter = (items: Category[], fn: (c: Category) => boolean) => {\n return items.filter((i: Category) => {\n if (i.items && i.items.length) {\n i.items = recursiveFilter(i.items, fn);\n }\n\n return fn(i);\n });\n};\n\nconst buildMatchTrail = (categories: Category[], phrase: string) => {\n const flattened = flatten(categories);\n const matching = flattened.filter((c) => match(c.title, phrase)).map((c) => c.id);\n\n let res: string[] = [];\n\n matching.forEach((id) => {\n const trail = categoryTrail(id, categories);\n\n res = res.concat(trail);\n });\n\n return res;\n};\n\nconst flatten = (categories: Category[]): Category[] => {\n let result: Category[] = [];\n\n categories.forEach((category) => {\n result.push(category);\n\n if (Array.isArray(category.items)) {\n result = result.concat(flatten(category.items));\n }\n });\n\n return result;\n};\n","import { css, Theme } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport {\n ItemTree,\n Link,\n Text,\n useDispatch,\n useEventListener,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { SearchComponentProps } from './search-component';\nimport { filterItems, match } from './utils';\n\ntype Props = {\n filterPhrase: string;\n items: Category[] | Tag[];\n filterType: 'guideCategory' | 'tag';\n searchContainer: HTMLElement | null;\n filterContainer: HTMLElement | null;\n inputHasFocus: boolean;\n};\n\nexport const getFocusedIndex = (elem: HTMLElement) => {\n const anchors = Array.from(elem?.getElementsByTagName('A') || []).filter(\n (a) => a.getAttribute('disabled') === null\n ) as HTMLAnchorElement[];\n return {\n anchors,\n focusedIndex: anchors.findIndex((e) => document.activeElement === e),\n };\n};\n\nconst getInputElem = (searchContainerRef: HTMLElement | null) => {\n return searchContainerRef\n ? (searchContainerRef.querySelector(\n '[data-type=\"search\"], input[type=\"search\"]'\n ) as HTMLElement | null)\n : null;\n};\n\nexport const focusInput = (searchContainerRef: HTMLElement | null) => {\n if (!searchContainerRef) {\n return;\n }\n const inputElem = getInputElem(searchContainerRef);\n if (inputElem) {\n inputElem.focus();\n }\n};\n\nconst QuickFilterItemList: React.FC<Props> = ({\n filterPhrase,\n items: rawItems,\n filterType,\n filterContainer,\n searchContainer,\n inputHasFocus,\n}) => {\n const [items, setItems] = useState<Category[] | Tag[]>(rawItems || []);\n const [first, setFirst] = useState<string | null>(null);\n const dispatch = useDispatch();\n const { activeFilterBadges, quickFilters } = useProperties<SearchComponentProps>();\n const autoSelect =\n (typeof quickFilters === 'object' && !!quickFilters.autoSelect) ||\n (typeof quickFilters === 'boolean' && !!quickFilters);\n\n useEffect(() => {\n setItems(filterItems(rawItems, filterType, filterPhrase));\n }, [filterPhrase, filterType, rawItems]);\n\n useEffect(() => {\n if (filterContainer) {\n const { anchors } = getFocusedIndex(filterContainer);\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n setFirst(id);\n }\n }\n }, [items, filterContainer]);\n\n const handleItemClicked = useCallback(\n (item: Partial<{ id: string }>, type: 'guideCategory' | 'tag') => {\n const data: { category?: string; tag?: string } = {\n category: activeFilterBadges?.guideCategory\n ? activeFilterBadges.guideCategory.id\n : undefined,\n tag: activeFilterBadges?.tag ? activeFilterBadges.tag.id : undefined,\n };\n\n if (type === 'guideCategory') {\n data.category = item.id;\n } else if (type === 'tag') {\n data.tag = item.id;\n }\n dispatch('quick-filter:add', data);\n },\n [activeFilterBadges, dispatch]\n );\n\n const buildListProps = (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory') {\n return {\n renderItem: (item: Category, level: number) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n disabled={!match(item.title, filterPhrase)}\n tabIndex={!match(item.title, filterPhrase) ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n data-level={level}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n }\n return {\n renderLi: true,\n renderItem: (item: Tag) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n symbol=\"#\"\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n };\n\n useEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n const { key } = e;\n if (\n !filterContainer ||\n !(key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter')\n ) {\n return;\n }\n\n const { anchors, focusedIndex } = getFocusedIndex(filterContainer);\n\n if (key === 'Enter') {\n if (inputHasFocus && autoSelect) {\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n handleItemClicked({ id }, filterType);\n }\n }\n return;\n }\n\n const focusFirst = () => anchors[0]?.focus();\n const focusLast = () => anchors[anchors.length - 1]?.focus();\n const focusNext = () => anchors[focusedIndex + 1]?.focus();\n const focusPrev = () => anchors[focusedIndex - 1]?.focus();\n\n if (inputHasFocus) {\n // Input is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n focusFirst();\n } else {\n focusLast();\n }\n } else if (focusedIndex > -1) {\n // A quick-filter-item is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n if (anchors.length > focusedIndex + 1) {\n focusNext();\n } else {\n focusInput(searchContainer);\n }\n } else {\n if (focusedIndex - 1 < 0) {\n focusInput(searchContainer);\n } else {\n focusPrev();\n }\n }\n }\n },\n window\n );\n\n return (\n <ItemTree\n tree={items}\n renderEmpty={false}\n ulProps={{ role: 'listbox' }}\n liProps={{ role: 'option' }}\n {...buildListProps(filterType)}\n />\n );\n};\n\nexport default QuickFilterItemList;\n\ntype TitleProps = {\n title: string;\n phrase: string;\n matches: boolean;\n symbol?: string;\n};\n\nconst Title: React.FC<TitleProps> = ({ title, phrase, matches, symbol = '' }) => {\n const createTitle = () => {\n if (!matches || !phrase) {\n return [title];\n }\n\n const index = title.toLowerCase().indexOf(phrase.toLowerCase());\n const start = title.substr(0, index);\n const bold = title.slice(index, index + phrase.length);\n const end = title.substr(index + phrase.length);\n return [start, bold, end];\n };\n\n const [start, bold, end] = createTitle();\n\n return (\n <Text>\n {symbol}\n {start}\n {bold ? <strong>{bold}</strong> : null}\n {end ? end : null}\n </Text>\n );\n};\n\nconst disabledCss = css`\n opacity: 0.5;\n pointer-events: none;\n`;\n\nconst focused = (p: { theme: Theme; 'data-level'?: number; autoSelect: boolean }) => css`\n background-color: ${p.theme.colors?.text};\n color: #ffffff;\n outline: none;\n\n span:first-child {\n border-color: ${p.theme.colors?.text};\n }\n`;\n\nconst StyledLink = styled(Link)<{ 'data-level'?: number; autoSelect: boolean }>`\n display: block;\n text-decoration: none;\n font-size: ${(p) => p.theme.fonts?.normal};\n\n ${(p) => p.disabled && disabledCss}\n color: ${(p) => p.theme.colors?.text};\n background-color: transparent;\n\n span {\n display: block;\n ${(p) =>\n p['data-level']\n ? `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.normal};`\n : `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.medium}; `}\n ${(p) => p['data-level'] && 'border-left: 2px solid'}\n }\n\n span:first-child {\n border-color: #e7e7e7;\n }\n\n ${(p) => p['data-level'] && `padding: 0 calc(${p.theme.sizes?.medium} * ${p['data-level']});`}\n\n ${(p) => p.autoSelect && focused}\n\n &:hover,\n &:focus {\n ${focused}\n }\n`;\n","import styled from '@emotion/styled';\nimport { Widget } from '@telia-ace/knowledge-widget-core';\nimport {\n contentBox,\n Loader,\n useContainer,\n useProperties,\n useScroll,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useRef } from 'react';\nimport QuickFilterItemList, { focusInput, getFocusedIndex } from './quick-filter-item-list';\nimport { SearchComponentProps } from './search-component';\n\ntype Props = {\n phrase: string;\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n};\n\nexport default ({ phrase = '', inputHasFocus, searchContainerRef }: Props) => {\n const {\n quickFilter = {\n open: false,\n loading: false,\n symbol: '',\n type: '',\n items: [],\n },\n } = useProperties<SearchComponentProps>();\n const [css, ref] = useScroll(true);\n const container = useContainer();\n const { events } = container.get('$widget') as Widget;\n const wrapperRef = useRef() as React.MutableRefObject<HTMLDivElement | null>;\n\n const setWrapperRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) {\n node.addEventListener(\n 'keydown',\n () => {\n const listItemFocused = getFocusedIndex(node).focusedIndex > -1;\n if (listItemFocused) {\n events.subscribeOnce('router:changed', () => {\n focusInput(searchContainerRef);\n });\n }\n },\n true\n );\n }\n\n wrapperRef.current = node;\n return node;\n },\n [searchContainerRef]\n );\n\n const { items = [], symbol, type, open, loading } = quickFilter;\n\n if (!open || !symbol) {\n return null;\n }\n\n const filterPhrase = phrase.slice(phrase.indexOf(symbol) + 1);\n\n return (\n <Wrapper\n ref={setWrapperRef}\n data-loading={loading}\n className={appendClassNames(\n 'humany-quick-filter-dropdown',\n [type === 'guideCategory', 'humany-quick-filter-guide-categories'],\n [type === 'tag', 'humany-quick-filter-tags']\n )}\n >\n <Inner className=\"humany-quick-filter-dropdown-inner\" css={css} ref={ref}>\n <QuickFilterItemList\n filterType={type as 'guideCategory' | 'tag'}\n items={items}\n filterPhrase={filterPhrase}\n filterContainer={ref.current}\n searchContainer={searchContainerRef}\n inputHasFocus={inputHasFocus}\n />\n </Inner>\n <Loader loading={loading} />\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n ${(p) => contentBox(p)};\n position: absolute;\n top: calc(100% + ${(p) => p.theme.sizes?.normal});\n left: 0;\n right: 0;\n z-index: 1;\n overflow: hidden;\n`;\n\nconst Inner = styled.div<{ css: string }>`\n max-height: 300px;\n overflow: auto;\n padding: ${(p) => p.theme.sizes?.medium} 0;\n ${(p) => p.css}\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n li div {\n ${(p) => `margin: ${p.theme.sizes?.normal} 0;`}\n }\n`;\n","import {\n useDebounce,\n useDispatch,\n usePrevious,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SearchComponentProps } from './search-component';\n\ntype ReturnType = [\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => void,\n (navigateToHome: boolean) => void,\n React.MutableRefObject<HTMLElement | null>\n];\n\nconst filterChanged = <T extends Optional<{ id: string }> | null>(newValue: T, oldValue: T) => {\n if (newValue && !oldValue) {\n return true;\n }\n if (!newValue && oldValue) {\n return true;\n }\n if (newValue && oldValue) {\n if (newValue.id !== oldValue.id) {\n return true;\n }\n }\n return false;\n};\n\nexport default (\n phrase: string,\n params: { [key: string]: any } = {},\n debounce = true\n): ReturnType => {\n const dispatch = useDispatch();\n\n const {\n quickFilters = false,\n quickFilter = { open: false },\n activeFilterBadges,\n filterBadges = false,\n incremental = 600,\n } = useProperties<SearchComponentProps>();\n\n const debouncedPhrase = useDebounce(\n phrase,\n typeof incremental === 'boolean' ? 600 : incremental\n );\n const previousDebouncedPhrase = usePrevious(debouncedPhrase);\n const previousFilters = usePrevious(activeFilterBadges);\n const ref = useRef<null | HTMLElement>(null);\n\n const dispatchSearch = useCallback(\n (value: string = '') => {\n if (filterBadges) {\n const filtersChanged =\n filterChanged(\n activeFilterBadges?.guideCategory,\n previousFilters?.guideCategory\n ) || filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n return dispatch('search', { value, filtersChanged, filters: activeFilterBadges });\n }\n return dispatch('search', { value });\n },\n [dispatch, activeFilterBadges]\n );\n\n const dispatchClear = useCallback(\n (navigateToHome: boolean) => {\n dispatch('clear', { navigateToHome });\n },\n [dispatch]\n );\n\n const removeFilterKeywords = (input: string) => {\n if (quickFilters) {\n return input.replace(/([@#].*)/g, '');\n }\n return input;\n };\n\n const submitSearch = useCallback(\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => {\n if (quickFilter.open && (arg as React.KeyboardEvent).preventDefault) {\n (arg as React.KeyboardEvent).preventDefault();\n return;\n }\n\n const activeElement = document.activeElement as HTMLElement;\n const isSearching =\n ref.current && typeof ref.current.contains === 'function'\n ? ref.current.contains(activeElement)\n : false;\n const cleanedPhrase = removeFilterKeywords(phrase);\n\n if (\n (typeof arg === 'boolean' && arg) ||\n (cleanedPhrase.length && isSearching) ||\n activeFilterBadges?.guideCategory ||\n (activeFilterBadges?.tag && isSearching)\n ) {\n dispatchSearch(cleanedPhrase);\n } else {\n dispatchClear(isSearching);\n }\n },\n [ref, phrase, quickFilter, dispatchClear, activeFilterBadges, dispatchSearch]\n );\n\n useEffect(() => {\n const filtersChanged =\n filterChanged(activeFilterBadges?.guideCategory, previousFilters?.guideCategory) ||\n filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n\n const phrase = debouncedPhrase ? removeFilterKeywords(debouncedPhrase) : debouncedPhrase;\n const previousPhrase = previousDebouncedPhrase\n ? removeFilterKeywords(previousDebouncedPhrase)\n : previousDebouncedPhrase;\n if (\n (typeof previousPhrase !== 'undefined' &&\n previousPhrase !== phrase &&\n phrase !== params.phrase &&\n debounce &&\n !quickFilter.open) ||\n (filtersChanged && !activeFilterBadges?.initial)\n ) {\n submitSearch(filtersChanged);\n }\n }, [debouncedPhrase, quickFilter.open, activeFilterBadges, submitSearch]);\n\n useEffect(() => {\n if (phrase && quickFilters) {\n const quickFiltersGuideCategory =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.guideCategory);\n\n const quickFiltersTag =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.tag);\n\n if (quickFiltersGuideCategory && phrase.indexOf('@') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'guideCategory', symbol: '@' });\n }\n\n if (quickFiltersTag && phrase.indexOf('#') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'tag', symbol: '#' });\n }\n }\n\n if (quickFilter.open && phrase.indexOf('@') === -1 && phrase.indexOf('#') === -1) {\n dispatch('quick-filter:close');\n }\n }, [phrase]);\n\n return [submitSearch, dispatchClear, ref];\n};\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n contentBox,\n convertToStringAttributes,\n Input,\n SymbolBadge,\n useChildren,\n useContainer,\n useDispatch,\n useProperties,\n useRouteData,\n useTransitionEnd,\n useWidgetEvent,\n} from '@telia-ace/knowledge-widget-ui';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { Component } from '@telia-ace/widget-types-grid';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport FilterBadges from './filter-badges';\nimport QuickFilter from './quick-filter';\nimport { SearchComponentProps } from './search-component';\nimport useSearch from './use-search';\n\ntype Props = {\n className: string;\n role?: string;\n};\n\nconst Search: React.FC<Props> = ({ className, ...other }) => {\n const {\n showSearchButton,\n showClearButton,\n role = 'search',\n autoFocus,\n placeholder,\n searchButtonLabel,\n clearButtonLabel,\n ariaLabel,\n route: searchRoute = 'search',\n incremental = true,\n showChildren = false,\n quickFilter,\n quickFilters: quickFiltersEnabled,\n filterBadges,\n } = useProperties<SearchComponentProps>();\n const { params } = useRouteData();\n const [hasFocus, setHasFocus] = useState(false);\n const [phrase, setPhrase] = useState(params.phrase || '');\n const [showFilterBadges, setShowFilterBadges] = useState({\n guideCategory: false,\n tag: false,\n });\n const container = useContainer();\n const children = useChildren();\n const dispatch = useDispatch();\n const { position: filterBadgePosition = 'inside' } =\n typeof filterBadges === 'object' ? filterBadges : {};\n\n useEffect(() => {\n const { guideCategory, tag } = params;\n const showGuideCategory =\n typeof filterBadges === 'object' ? !!filterBadges.guideCategory : !!filterBadges;\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\n\n setShowFilterBadges({\n guideCategory: showGuideCategory && !!guideCategory,\n tag: showTag && !!tag,\n });\n }, [filterBadges, params]);\n\n // Remove quick-filter symbol, quick-filter phrase\n // and close quick-filter when route changed\n useWidgetEvent(\n 'router:changed',\n () => {\n if (quickFilter) {\n const { open, symbol } = quickFilter;\n\n if (open) {\n if (symbol) {\n const cleaned = phrase.replace(phrase.slice(phrase.indexOf(symbol)), '');\n setPhrase(cleaned);\n }\n\n dispatch('quick-filter:close');\n }\n }\n },\n [quickFilter, phrase, setPhrase, dispatch]\n );\n\n const [search, clear, elem] = useSearch(phrase, params, !!incremental);\n\n useEffect(() => {\n setPhrase(params.phrase || '');\n }, [params.phrase]);\n\n const onChange = useCallback(\n (value: string) => {\n setPhrase(value);\n },\n [setPhrase]\n );\n\n const onEscape = useCallback(() => {\n dispatch('quick-filter:close').then(() => clear(true));\n }, [dispatch, clear]);\n\n const autoFocusHandler = useCallback(() => {\n if (autoFocus && !hasFocus) {\n elem.current?.getElementsByTagName('input')[0]?.focus();\n }\n }, [autoFocus, hasFocus, elem]);\n\n const onClearButtonClick = useCallback(() => {\n container.getAsync('router').then((router: RoutingService) => {\n const initialRoute = router.getInitialRoute();\n const currentRoute = router.getRouteData();\n // if we already are on the initial route\n // and it's not the search route, clear the search instead of navigate\n if (initialRoute?.name === currentRoute.name && initialRoute?.name !== searchRoute) {\n setPhrase('');\n } else {\n clear(true);\n }\n });\n }, [container, setPhrase, clear]);\n\n const renderFilterBadges = (position: 'inside' | 'below') => {\n if (position !== filterBadgePosition) {\n return null;\n }\n if (!!showFilterBadges.guideCategory || !!showFilterBadges.tag) {\n return (\n <FilterBadges\n position={position}\n inputHasFocus={hasFocus}\n showGuideCategory={showFilterBadges.guideCategory}\n showTag={showFilterBadges.tag}\n searchContainerRef={elem.current}\n />\n );\n }\n };\n\n useTransitionEnd(autoFocusHandler);\n\n const showClear =\n showClearButton && (showFilterBadges.guideCategory || showFilterBadges.tag || phrase);\n const quickFilterAccessibilityProps = quickFiltersEnabled\n ? convertToStringAttributes({\n role: 'combobox',\n 'aria-autocomplete': 'list',\n autoComplete: 'off',\n 'aria-haspopup': 'listbox',\n })\n : {};\n\n return (\n <StyledSearchWrapper\n {...other}\n ref={elem}\n role={role}\n className={appendClassNames(className, 'humany-search')}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n data-has-search-symbol={showSearchButton ? 'true' : 'false'}\n >\n <Inner\n action=\".\"\n onSubmit={(e: any) => {\n e.preventDefault();\n elem.current?.getElementsByTagName('input')[0]?.blur();\n }}\n data-has-focus={hasFocus}\n >\n {showSearchButton && (\n <SearchButton\n aria-label={searchButtonLabel}\n type=\"submit\"\n title={searchButtonLabel}\n disabled={!phrase}\n onClick={search}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n >\n <SymbolBadge size={32} symbol={{ type: 'Svg', content: 'search' }} />\n </SearchButton>\n )}\n {renderFilterBadges('inside')}\n <Input\n type=\"search\"\n aria-label={ariaLabel}\n {...quickFilterAccessibilityProps}\n placeholder={\n showFilterBadges.guideCategory || showFilterBadges.tag ? '' : placeholder\n }\n onFocusChange={setHasFocus}\n onEscape={onEscape}\n onEnter={search}\n onChange={onChange}\n value={phrase}\n />\n {showClear && (\n <ClearButton\n aria-label={clearButtonLabel}\n type=\"reset\"\n hasFocus={hasFocus}\n title={clearButtonLabel}\n onClick={onClearButtonClick}\n >\n <SymbolBadge size={27} symbol={{ type: 'Svg', content: 'clear' }} />\n </ClearButton>\n )}\n {showChildren &&\n !showClear &&\n children.map((child) => (\n <Component key={child.id} id={child.id} branch=\"default\" />\n ))}\n <QuickFilter\n inputHasFocus={hasFocus}\n phrase={phrase}\n searchContainerRef={elem.current}\n />\n </Inner>\n {renderFilterBadges('below')}\n </StyledSearchWrapper>\n );\n};\n\nexport default Search;\n\nconst StyledSearchWrapper = styled.div<\n {\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n 'data-has-search-symbol': 'true' | 'false';\n } & any\n>`\n ${contentBox};\n width: 100%;\n padding: ${(p) => p.theme.sizes?.large};\n\n input {\n background-color: transparent;\n border: none;\n outline: none;\n min-width: 25%;\n flex: 1;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-weight: 300;\n font-style: italic;\n padding: 1em 0;\n color: ${(p) => p.theme.colors?.text};\n -webkit-appearance: none;\n\n ${(p) => p['data-has-search-symbol'] === 'true' && `text-indent: ${p.theme.sizes?.normal};`}\n\n ::placeholder {\n color: ${(p) => p.theme.colors?.text};\n }\n /* removes the 'X' from IE */\n &[type='search']::-ms-clear {\n display: none;\n width: 0;\n height: 0;\n }\n &[type='search']::-ms-reveal {\n display: none;\n width: 0;\n height: 0;\n }\n\n /* removes the 'X' from Chrome */\n &[type='search']::-webkit-search-decoration,\n &[type='search']::-webkit-search-cancel-button,\n &[type='search']::-webkit-search-results-button,\n &[type='search']::-webkit-search-results-decoration {\n display: none;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n button {\n background: transparent;\n border: none;\n padding: 0;\n font-size: ${(p) => p.theme.fonts?.large};\n transition: color 200ms ease-out;\n color: ${(p) =>\n p['data-has-focus'] || p['data-has-phrase'] ? p.theme.colors?.primary : '#000000'};\n cursor: pointer;\n > svg {\n height: 100%;\n }\n }\n`;\n\nconst Inner = styled.form<{ 'data-has-focus': boolean } & any>`\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n border: ${(p) => p.theme.inputBorder};\n border-radius: ${(p) => p.theme.borderRadius};\n background-color: #ffffff;\n position: relative;\n padding: 0 ${(p) => p.theme.sizes?.normal};\n\n ${(p) =>\n p['data-has-focus'] &&\n css`\n ${p.theme.accessibility?.isTabbing\n ? borderTabStyle(p)\n : `\n border-color: ${p.theme.colors?.primary};\n outline: none;\n input {\n outline: none;\n }\n `}\n `};\n`;\n\nconst SearchButton = styled(Button)<{\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n}>`\n padding: 0;\n height: 2em;\n\n svg {\n circle,\n line {\n stroke: ${(p) => (p['data-has-focus'] ? p.theme.colors?.primary : '#000000')};\n }\n }\n`;\n\nconst ClearButton = styled(Button)<{ hasFocus: boolean } & any>`\n &:focus-visible svg {\n ${borderTabStyle}\n }\n\n svg {\n vertical-align: top;\n\n circle,\n line,\n path {\n stroke: ${(p) => (p.hasFocus ? p.theme.colors?.primary : p.theme.colors?.text)};\n }\n }\n`;\n"],"names":["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","FilterBadges$1","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","QuickFilterItemList$1","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.39
|
|
3
|
+
"version": "1.0.39",
|
|
4
4
|
"description": "Search component for ACE Knowledge Widgets.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "Telia Company AB",
|
|
@@ -21,12 +21,12 @@
|
|
|
21
21
|
},
|
|
22
22
|
"sideEffects": false,
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@telia-ace/knowledge-data-client": "1.0.2
|
|
25
|
-
"@telia-ace/knowledge-widget-core": "1.0.35
|
|
26
|
-
"@telia-ace/knowledge-widget-
|
|
27
|
-
"@telia-ace/
|
|
28
|
-
"@telia-ace/widget-
|
|
29
|
-
"@telia-ace/widget-utilities": "^1.0.10
|
|
24
|
+
"@telia-ace/knowledge-data-client": "1.0.2",
|
|
25
|
+
"@telia-ace/knowledge-widget-core": "1.0.35",
|
|
26
|
+
"@telia-ace/knowledge-widget-ui": "1.0.41",
|
|
27
|
+
"@telia-ace/widget-routing": "^1.0.22",
|
|
28
|
+
"@telia-ace/widget-types-grid": "^1.0.30",
|
|
29
|
+
"@telia-ace/widget-utilities": "^1.0.10",
|
|
30
30
|
"@webprovisions/platform": "^1.1.2"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.3478324e.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 { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Link,\n SymbolBadge,\n Text,\n Tooltip,\n useDispatch,\n useEventListener,\n useKeyPress,\n useProperties,\n useRouteData,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { SearchComponentProps } from './search-component';\n\nconst FilterBadge: React.FC<any> = ({\n text,\n className,\n forceFocusStyle,\n filterType,\n handleClick,\n deleteAriaLabel = '',\n ...p\n}) => {\n const ref = useRef<HTMLAnchorElement>();\n\n return (\n <Text\n className={appendClassNames(className, 'humany-filter-badge')}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleClick(e, filterType);\n }\n }}\n >\n {text}\n <Link\n {...p}\n ref={ref}\n tabIndex={0}\n role=\"button\"\n aria-label={deleteAriaLabel.replace('{{item}}', text)}\n onClick={(e) => handleClick(e, filterType)}\n >\n <SymbolBadge size={13} symbol={{ type: 'Svg', content: 'close' }} />\n </Link>\n </Text>\n );\n};\n\ntype Props = {\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n showGuideCategory: boolean;\n showTag: boolean;\n position: 'inside' | 'below';\n};\nconst FilterBadges: React.FC<Props> = ({\n inputHasFocus,\n searchContainerRef,\n showTag,\n showGuideCategory,\n position,\n}) => {\n const { activeFilterBadges = {}, deleteFilterBadgeAriaLabel = '' } =\n useProperties<SearchComponentProps>();\n const dispatch = useDispatch();\n const { name, params } = useRouteData();\n const [isNavigatingWithKeyBoard, setIsNavigatingWithKeyboard] = useState(false);\n\n const onKeyDown = useCallback((event: KeyboardEvent) => {\n const { key } = event;\n\n if (['ArrowLeft', 'ArrowRight'].indexOf(key) === -1) {\n setIsNavigatingWithKeyboard(false);\n }\n }, []);\n\n useEventListener('keydown', onKeyDown, window);\n\n useEventListener('click', onKeyDown, window);\n\n const { guideCategory, tag, tooltip } = activeFilterBadges;\n\n const getFocusedFilterBadge = (container: HTMLElement) => {\n const badges = container.querySelectorAll(\n '.humany-filter-badge'\n ) as NodeListOf<HTMLElement>;\n return {\n badges,\n index: Array.from(badges).findIndex((e) => document.activeElement === e),\n };\n };\n\n const handleFilterBadgeClick = (\n event: React.MouseEvent | React.KeyboardEvent,\n filterType: string\n ) => {\n event.preventDefault();\n dispatch('quick-filter:remove', { types: [filterType] });\n };\n\n const keyboardNavigation = (\n direction: 'left' | 'right',\n inputElem: HTMLInputElement | null\n ) => {\n if (!searchContainerRef) {\n return;\n }\n const { badges, index: currentFocusedIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (badges.length) {\n let toFocus: HTMLElement | null = null;\n\n if (direction === 'left') {\n if (currentFocusedIndex === -1) {\n // if no badge is focused and direction is left\n // focus last badge\n toFocus = badges.item(badges.length - 1);\n } else if (currentFocusedIndex > 0) {\n // if there are more badges to the left, go one step back\n // do nothing if already focusing the most left badge\n toFocus = badges.item(currentFocusedIndex - 1);\n }\n } else if (direction === 'right') {\n if (currentFocusedIndex === badges.length - 1) {\n // if currently focusing the last badge, move focus to search input\n inputElem && inputElem.focus();\n } else if (badges.item(currentFocusedIndex + 1)) {\n toFocus = badges.item(currentFocusedIndex + 1);\n }\n }\n\n if (toFocus) {\n toFocus.focus();\n setIsNavigatingWithKeyboard(true);\n }\n }\n };\n\n useKeyPress(\n 'ArrowLeft',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (inputHasFocus || focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isAtBeginningOfInput =\n inputElem && inputElem.selectionStart !== null && inputElem.selectionStart <= 0;\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isAtBeginningOfInput || isFocusingAFilterBadge) {\n keyboardNavigation('left', inputElem);\n }\n }\n }, [inputHasFocus, searchContainerRef])\n );\n\n useKeyPress(\n 'ArrowRight',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n keyboardNavigation('right', inputElem);\n }\n }\n }, [searchContainerRef])\n );\n\n useKeyPress(\n 'Backspace',\n useCallback(\n (event: any) => {\n if (!searchContainerRef) {\n return;\n }\n let filtersToRemove: string[] = [];\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n if (focusedBadgeIndex === 0) {\n if (showGuideCategory) {\n filtersToRemove = ['guideCategory'];\n } else if (showTag) {\n filtersToRemove = ['tag'];\n }\n } else if (focusedBadgeIndex === 1) {\n filtersToRemove = ['tag'];\n }\n } else {\n const isAtBeginningOfInput =\n inputElem &&\n inputElem.selectionStart !== null &&\n inputElem.selectionStart <= 0;\n\n if (isAtBeginningOfInput) {\n if (activeFilterBadges?.tag) {\n filtersToRemove = ['tag'];\n } else if (activeFilterBadges?.guideCategory) {\n filtersToRemove = ['guideCategory'];\n }\n }\n }\n\n if (filtersToRemove.length > 0) {\n event.preventDefault();\n dispatch('quick-filter:remove', { types: filtersToRemove });\n }\n },\n [searchContainerRef, activeFilterBadges, showTag, showGuideCategory]\n )\n );\n\n const renderBadge = useCallback(\n (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory' && guideCategory && showGuideCategory) {\n return (\n <StyledFilterBadge\n text={`@${guideCategory.title}`}\n routeName={name}\n filterType=\"guideCategory\"\n handleClick={handleFilterBadgeClick}\n forceFocusStyle={isNavigatingWithKeyBoard}\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n guideCategory: undefined,\n }}\n />\n );\n }\n if (type === 'tag' && tag && showTag) {\n return (\n <StyledFilterBadge\n className=\"humany-filter-badge\"\n text={`#${tag.title}`}\n routeName={name}\n filterType=\"tag\"\n handleClick={handleFilterBadgeClick}\n forceFocusStyle={isNavigatingWithKeyBoard}\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n tag: undefined,\n }}\n />\n );\n }\n return null;\n },\n [guideCategory, tag, name, params, showGuideCategory, showTag, isNavigatingWithKeyBoard]\n );\n\n if (!guideCategory && !tag) {\n return null;\n }\n\n return (\n <Wrapper className=\"humany-filter-badges\" position={position}>\n {guideCategory && tooltip ? (\n <Tooltip content={<>{tooltip}</>} sticky={false}>\n {renderBadge('guideCategory')}\n </Tooltip>\n ) : (\n renderBadge('guideCategory')\n )}\n {tag && renderBadge('tag')}\n </Wrapper>\n );\n};\n\nexport default FilterBadges;\n\nconst Wrapper = styled.div<{ position: 'inside' | 'below' }>`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n\n ${(p) =>\n p.position === 'inside'\n ? css`\n &:not(:first-child) {\n margin: 0 0 0 ${p.theme.sizes?.normal};\n }\n `\n : css`\n margin: ${p.theme.sizes?.small} 0 0 0;\n span:first-child {\n margin-left: 0;\n }\n `}\n`;\n\nconst StyledFilterBadge = styled(FilterBadge)`\n display: flex;\n align-items: center;\n padding: ${(p) => `${p.theme.sizes?.small} calc(${p.theme.sizes?.normal}/2) `};\n background-color: ${(p) => p.theme.colors?.primary};\n border-radius: ${(p) => p.theme.borderRadius};\n font-weight: 300;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-style: italic;\n color: #ffffff;\n text-decoration: none;\n white-space: nowrap;\n\n margin: calc(${(p) => p.theme.sizes?.small} / 2);\n\n &:focus-within {\n ${borderTabStyle}\n background-color: transparent;\n\n svg {\n path {\n stroke: ${(p) => p.theme.colors?.primary};\n }\n }\n a {\n outline: none;\n }\n }\n\n ${(p) =>\n p.forceFocusStyle &&\n css`\n ${borderTabStyle(p)}\n background-color: transparent;\n\n svg {\n path {\n stroke: ${p.theme.colors?.primary};\n }\n }\n `}\n\n svg {\n width: 17px;\n height: 11px;\n margin: 1px 0 0 ${(p) => p.theme.sizes?.small};\n path {\n stroke: #ffffff;\n stroke-width: 2px;\n }\n order: 1;\n }\n`;\n","import { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport { categoryTrail, deepClone } from '@telia-ace/widget-utilities';\n\nexport const match = (title: string, phrase: string) => {\n if (!phrase || !title) {\n return true;\n }\n\n return !!(title.toLowerCase().indexOf(phrase.toLowerCase()) > -1);\n};\n\nexport const filterItems = (\n items: (Tag | Category)[] = [],\n type: 'tag' | 'guideCategory',\n phrase: string\n): any[] => {\n if (!phrase) {\n return items;\n }\n\n const cloned = deepClone(items);\n\n if (type === 'tag') {\n return cloned.filter((i: Tag) => match(i.title, phrase));\n }\n\n const matchTrail = buildMatchTrail(cloned, phrase);\n const filtered = recursiveFilter(cloned, (c: Category) => matchTrail.indexOf(c.id) > -1);\n\n return filtered;\n};\n\nconst recursiveFilter = (items: Category[], fn: (c: Category) => boolean) => {\n return items.filter((i: Category) => {\n if (i.items && i.items.length) {\n i.items = recursiveFilter(i.items, fn);\n }\n\n return fn(i);\n });\n};\n\nconst buildMatchTrail = (categories: Category[], phrase: string) => {\n const flattened = flatten(categories);\n const matching = flattened.filter((c) => match(c.title, phrase)).map((c) => c.id);\n\n let res: string[] = [];\n\n matching.forEach((id) => {\n const trail = categoryTrail(id, categories);\n\n res = res.concat(trail);\n });\n\n return res;\n};\n\nconst flatten = (categories: Category[]): Category[] => {\n let result: Category[] = [];\n\n categories.forEach((category) => {\n result.push(category);\n\n if (Array.isArray(category.items)) {\n result = result.concat(flatten(category.items));\n }\n });\n\n return result;\n};\n","import { css, Theme } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport {\n ItemTree,\n Link,\n Text,\n useDispatch,\n useEventListener,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { SearchComponentProps } from './search-component';\nimport { filterItems, match } from './utils';\n\ntype Props = {\n filterPhrase: string;\n items: Category[] | Tag[];\n filterType: 'guideCategory' | 'tag';\n searchContainer: HTMLElement | null;\n filterContainer: HTMLElement | null;\n inputHasFocus: boolean;\n};\n\nexport const getFocusedIndex = (elem: HTMLElement) => {\n const anchors = Array.from(elem?.getElementsByTagName('A') || []).filter(\n (a) => a.getAttribute('disabled') === null\n ) as HTMLAnchorElement[];\n return {\n anchors,\n focusedIndex: anchors.findIndex((e) => document.activeElement === e),\n };\n};\n\nconst getInputElem = (searchContainerRef: HTMLElement | null) => {\n return searchContainerRef\n ? (searchContainerRef.querySelector(\n '[data-type=\"search\"], input[type=\"search\"]'\n ) as HTMLElement | null)\n : null;\n};\n\nexport const focusInput = (searchContainerRef: HTMLElement | null) => {\n if (!searchContainerRef) {\n return;\n }\n const inputElem = getInputElem(searchContainerRef);\n if (inputElem) {\n inputElem.focus();\n }\n};\n\nconst QuickFilterItemList: React.FC<Props> = ({\n filterPhrase,\n items: rawItems,\n filterType,\n filterContainer,\n searchContainer,\n inputHasFocus,\n}) => {\n const [items, setItems] = useState<Category[] | Tag[]>(rawItems || []);\n const [first, setFirst] = useState<string | null>(null);\n const dispatch = useDispatch();\n const { activeFilterBadges, quickFilters } = useProperties<SearchComponentProps>();\n const autoSelect =\n (typeof quickFilters === 'object' && !!quickFilters.autoSelect) ||\n (typeof quickFilters === 'boolean' && !!quickFilters);\n\n useEffect(() => {\n setItems(filterItems(rawItems, filterType, filterPhrase));\n }, [filterPhrase, filterType, rawItems]);\n\n useEffect(() => {\n if (filterContainer) {\n const { anchors } = getFocusedIndex(filterContainer);\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n setFirst(id);\n }\n }\n }, [items, filterContainer]);\n\n const handleItemClicked = useCallback(\n (item: Partial<{ id: string }>, type: 'guideCategory' | 'tag') => {\n const data: { category?: string; tag?: string } = {\n category: activeFilterBadges?.guideCategory\n ? activeFilterBadges.guideCategory.id\n : undefined,\n tag: activeFilterBadges?.tag ? activeFilterBadges.tag.id : undefined,\n };\n\n if (type === 'guideCategory') {\n data.category = item.id;\n } else if (type === 'tag') {\n data.tag = item.id;\n }\n dispatch('quick-filter:add', data);\n },\n [activeFilterBadges, dispatch]\n );\n\n const buildListProps = (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory') {\n return {\n renderItem: (item: Category, level: number) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n disabled={!match(item.title, filterPhrase)}\n tabIndex={!match(item.title, filterPhrase) ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n data-level={level}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n }\n return {\n renderLi: true,\n renderItem: (item: Tag) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n symbol=\"#\"\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n };\n\n useEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n const { key } = e;\n if (\n !filterContainer ||\n !(key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter')\n ) {\n return;\n }\n\n const { anchors, focusedIndex } = getFocusedIndex(filterContainer);\n\n if (key === 'Enter') {\n if (inputHasFocus && autoSelect) {\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n handleItemClicked({ id }, filterType);\n }\n }\n return;\n }\n\n const focusFirst = () => anchors[0]?.focus();\n const focusLast = () => anchors[anchors.length - 1]?.focus();\n const focusNext = () => anchors[focusedIndex + 1]?.focus();\n const focusPrev = () => anchors[focusedIndex - 1]?.focus();\n\n if (inputHasFocus) {\n // Input is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n focusFirst();\n } else {\n focusLast();\n }\n } else if (focusedIndex > -1) {\n // A quick-filter-item is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n if (anchors.length > focusedIndex + 1) {\n focusNext();\n } else {\n focusInput(searchContainer);\n }\n } else {\n if (focusedIndex - 1 < 0) {\n focusInput(searchContainer);\n } else {\n focusPrev();\n }\n }\n }\n },\n window\n );\n\n return (\n <ItemTree\n tree={items}\n renderEmpty={false}\n ulProps={{ role: 'listbox' }}\n liProps={{ role: 'option' }}\n {...buildListProps(filterType)}\n />\n );\n};\n\nexport default QuickFilterItemList;\n\ntype TitleProps = {\n title: string;\n phrase: string;\n matches: boolean;\n symbol?: string;\n};\n\nconst Title: React.FC<TitleProps> = ({ title, phrase, matches, symbol = '' }) => {\n const createTitle = () => {\n if (!matches || !phrase) {\n return [title];\n }\n\n const index = title.toLowerCase().indexOf(phrase.toLowerCase());\n const start = title.substr(0, index);\n const bold = title.slice(index, index + phrase.length);\n const end = title.substr(index + phrase.length);\n return [start, bold, end];\n };\n\n const [start, bold, end] = createTitle();\n\n return (\n <Text>\n {symbol}\n {start}\n {bold ? <strong>{bold}</strong> : null}\n {end ? end : null}\n </Text>\n );\n};\n\nconst disabledCss = css`\n opacity: 0.5;\n pointer-events: none;\n`;\n\nconst focused = (p: { theme: Theme; 'data-level'?: number; autoSelect: boolean }) => css`\n background-color: ${p.theme.colors?.text};\n color: #ffffff;\n outline: none;\n\n span:first-child {\n border-color: ${p.theme.colors?.text};\n }\n`;\n\nconst StyledLink = styled(Link)<{ 'data-level'?: number; autoSelect: boolean }>`\n display: block;\n text-decoration: none;\n font-size: ${(p) => p.theme.fonts?.normal};\n\n ${(p) => p.disabled && disabledCss}\n color: ${(p) => p.theme.colors?.text};\n background-color: transparent;\n\n span {\n display: block;\n ${(p) =>\n p['data-level']\n ? `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.normal};`\n : `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.medium}; `}\n ${(p) => p['data-level'] && 'border-left: 2px solid'}\n }\n\n span:first-child {\n border-color: #e7e7e7;\n }\n\n ${(p) => p['data-level'] && `padding: 0 calc(${p.theme.sizes?.medium} * ${p['data-level']});`}\n\n ${(p) => p.autoSelect && focused}\n\n &:hover,\n &:focus {\n ${focused}\n }\n`;\n","import styled from '@emotion/styled';\nimport { Widget } from '@telia-ace/knowledge-widget-core';\nimport {\n contentBox,\n Loader,\n useContainer,\n useProperties,\n useScroll,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useRef } from 'react';\nimport QuickFilterItemList, { focusInput, getFocusedIndex } from './quick-filter-item-list';\nimport { SearchComponentProps } from './search-component';\n\ntype Props = {\n phrase: string;\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n};\n\nexport default ({ phrase = '', inputHasFocus, searchContainerRef }: Props) => {\n const {\n quickFilter = {\n open: false,\n loading: false,\n symbol: '',\n type: '',\n items: [],\n },\n } = useProperties<SearchComponentProps>();\n const [css, ref] = useScroll(true);\n const container = useContainer();\n const { events } = container.get('$widget') as Widget;\n const wrapperRef = useRef() as React.MutableRefObject<HTMLDivElement | null>;\n\n const setWrapperRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) {\n node.addEventListener(\n 'keydown',\n () => {\n const listItemFocused = getFocusedIndex(node).focusedIndex > -1;\n if (listItemFocused) {\n events.subscribeOnce('router:changed', () => {\n focusInput(searchContainerRef);\n });\n }\n },\n true\n );\n }\n\n wrapperRef.current = node;\n return node;\n },\n [searchContainerRef]\n );\n\n const { items = [], symbol, type, open, loading } = quickFilter;\n\n if (!open || !symbol) {\n return null;\n }\n\n const filterPhrase = phrase.slice(phrase.indexOf(symbol) + 1);\n\n return (\n <Wrapper\n ref={setWrapperRef}\n data-loading={loading}\n className={appendClassNames(\n 'humany-quick-filter-dropdown',\n [type === 'guideCategory', 'humany-quick-filter-guide-categories'],\n [type === 'tag', 'humany-quick-filter-tags']\n )}\n >\n <Inner className=\"humany-quick-filter-dropdown-inner\" css={css} ref={ref}>\n <QuickFilterItemList\n filterType={type as 'guideCategory' | 'tag'}\n items={items}\n filterPhrase={filterPhrase}\n filterContainer={ref.current}\n searchContainer={searchContainerRef}\n inputHasFocus={inputHasFocus}\n />\n </Inner>\n <Loader loading={loading} />\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n ${(p) => contentBox(p)};\n position: absolute;\n top: calc(100% + ${(p) => p.theme.sizes?.normal});\n left: 0;\n right: 0;\n z-index: 1;\n overflow: hidden;\n`;\n\nconst Inner = styled.div<{ css: string }>`\n max-height: 300px;\n overflow: auto;\n padding: ${(p) => p.theme.sizes?.medium} 0;\n ${(p) => p.css}\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n li div {\n ${(p) => `margin: ${p.theme.sizes?.normal} 0;`}\n }\n`;\n","import {\n useDebounce,\n useDispatch,\n usePrevious,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SearchComponentProps } from './search-component';\n\ntype ReturnType = [\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => void,\n (navigateToHome: boolean) => void,\n React.MutableRefObject<HTMLElement | null>\n];\n\nconst filterChanged = <T extends Optional<{ id: string }> | null>(newValue: T, oldValue: T) => {\n if (newValue && !oldValue) {\n return true;\n }\n if (!newValue && oldValue) {\n return true;\n }\n if (newValue && oldValue) {\n if (newValue.id !== oldValue.id) {\n return true;\n }\n }\n return false;\n};\n\nexport default (\n phrase: string,\n params: { [key: string]: any } = {},\n debounce = true\n): ReturnType => {\n const dispatch = useDispatch();\n\n const {\n quickFilters = false,\n quickFilter = { open: false },\n activeFilterBadges,\n filterBadges = false,\n incremental = 600,\n } = useProperties<SearchComponentProps>();\n\n const debouncedPhrase = useDebounce(\n phrase,\n typeof incremental === 'boolean' ? 600 : incremental\n );\n const previousDebouncedPhrase = usePrevious(debouncedPhrase);\n const previousFilters = usePrevious(activeFilterBadges);\n const ref = useRef<null | HTMLElement>(null);\n\n const dispatchSearch = useCallback(\n (value: string = '') => {\n if (filterBadges) {\n const filtersChanged =\n filterChanged(\n activeFilterBadges?.guideCategory,\n previousFilters?.guideCategory\n ) || filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n return dispatch('search', { value, filtersChanged, filters: activeFilterBadges });\n }\n return dispatch('search', { value });\n },\n [dispatch, activeFilterBadges]\n );\n\n const dispatchClear = useCallback(\n (navigateToHome: boolean) => {\n dispatch('clear', { navigateToHome });\n },\n [dispatch]\n );\n\n const removeFilterKeywords = (input: string) => {\n if (quickFilters) {\n return input.replace(/([@#].*)/g, '');\n }\n return input;\n };\n\n const submitSearch = useCallback(\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => {\n if (quickFilter.open && (arg as React.KeyboardEvent).preventDefault) {\n (arg as React.KeyboardEvent).preventDefault();\n return;\n }\n\n const activeElement = document.activeElement as HTMLElement;\n const isSearching =\n ref.current && typeof ref.current.contains === 'function'\n ? ref.current.contains(activeElement)\n : false;\n const cleanedPhrase = removeFilterKeywords(phrase);\n\n if (\n (typeof arg === 'boolean' && arg) ||\n (cleanedPhrase.length && isSearching) ||\n activeFilterBadges?.guideCategory ||\n (activeFilterBadges?.tag && isSearching)\n ) {\n dispatchSearch(cleanedPhrase);\n } else {\n dispatchClear(isSearching);\n }\n },\n [ref, phrase, quickFilter, dispatchClear, activeFilterBadges, dispatchSearch]\n );\n\n useEffect(() => {\n const filtersChanged =\n filterChanged(activeFilterBadges?.guideCategory, previousFilters?.guideCategory) ||\n filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n\n const phrase = debouncedPhrase ? removeFilterKeywords(debouncedPhrase) : debouncedPhrase;\n const previousPhrase = previousDebouncedPhrase\n ? removeFilterKeywords(previousDebouncedPhrase)\n : previousDebouncedPhrase;\n if (\n (typeof previousPhrase !== 'undefined' &&\n previousPhrase !== phrase &&\n phrase !== params.phrase &&\n debounce &&\n !quickFilter.open) ||\n (filtersChanged && !activeFilterBadges?.initial)\n ) {\n submitSearch(filtersChanged);\n }\n }, [debouncedPhrase, quickFilter.open, activeFilterBadges, submitSearch]);\n\n useEffect(() => {\n if (phrase && quickFilters) {\n const quickFiltersGuideCategory =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.guideCategory);\n\n const quickFiltersTag =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.tag);\n\n if (quickFiltersGuideCategory && phrase.indexOf('@') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'guideCategory', symbol: '@' });\n }\n\n if (quickFiltersTag && phrase.indexOf('#') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'tag', symbol: '#' });\n }\n }\n\n if (quickFilter.open && phrase.indexOf('@') === -1 && phrase.indexOf('#') === -1) {\n dispatch('quick-filter:close');\n }\n }, [phrase]);\n\n return [submitSearch, dispatchClear, ref];\n};\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Component } from '@telia-ace/knowledge-widget-types-grid';\nimport {\n borderTabStyle,\n Button,\n contentBox,\n convertToStringAttributes,\n Input,\n SymbolBadge,\n useChildren,\n useContainer,\n useDispatch,\n useProperties,\n useRouteData,\n useTransitionEnd,\n useWidgetEvent,\n} from '@telia-ace/knowledge-widget-ui';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport FilterBadges from './filter-badges';\nimport QuickFilter from './quick-filter';\nimport { SearchComponentProps } from './search-component';\nimport useSearch from './use-search';\n\ntype Props = {\n className: string;\n role?: string;\n};\n\nconst Search: React.FC<Props> = ({ className, ...other }) => {\n const {\n showSearchButton,\n showClearButton,\n role = 'search',\n autoFocus,\n placeholder,\n searchButtonLabel,\n clearButtonLabel,\n ariaLabel,\n route: searchRoute = 'search',\n incremental = true,\n showChildren = false,\n quickFilter,\n quickFilters: quickFiltersEnabled,\n filterBadges,\n } = useProperties<SearchComponentProps>();\n const { params } = useRouteData();\n const [hasFocus, setHasFocus] = useState(false);\n const [phrase, setPhrase] = useState(params.phrase || '');\n const [showFilterBadges, setShowFilterBadges] = useState({\n guideCategory: false,\n tag: false,\n });\n const container = useContainer();\n const children = useChildren();\n const dispatch = useDispatch();\n const { position: filterBadgePosition = 'inside' } =\n typeof filterBadges === 'object' ? filterBadges : {};\n\n useEffect(() => {\n const { guideCategory, tag } = params;\n const showGuideCategory =\n typeof filterBadges === 'object' ? !!filterBadges.guideCategory : !!filterBadges;\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\n\n setShowFilterBadges({\n guideCategory: showGuideCategory && !!guideCategory,\n tag: showTag && !!tag,\n });\n }, [filterBadges, params]);\n\n // Remove quick-filter symbol, quick-filter phrase\n // and close quick-filter when route changed\n useWidgetEvent(\n 'router:changed',\n () => {\n if (quickFilter) {\n const { open, symbol } = quickFilter;\n\n if (open) {\n if (symbol) {\n const cleaned = phrase.replace(phrase.slice(phrase.indexOf(symbol)), '');\n setPhrase(cleaned);\n }\n\n dispatch('quick-filter:close');\n }\n }\n },\n [quickFilter, phrase, setPhrase, dispatch]\n );\n\n const [search, clear, elem] = useSearch(phrase, params, !!incremental);\n\n useEffect(() => {\n setPhrase(params.phrase || '');\n }, [params.phrase]);\n\n const onChange = useCallback(\n (value: string) => {\n setPhrase(value);\n },\n [setPhrase]\n );\n\n const onEscape = useCallback(() => {\n dispatch('quick-filter:close').then(() => clear(true));\n }, [dispatch, clear]);\n\n const autoFocusHandler = useCallback(() => {\n if (autoFocus && !hasFocus) {\n elem.current?.getElementsByTagName('input')[0]?.focus();\n }\n }, [autoFocus, hasFocus, elem]);\n\n const onClearButtonClick = useCallback(() => {\n container.getAsync('router').then((router: RoutingService) => {\n const initialRoute = router.getInitialRoute();\n const currentRoute = router.getRouteData();\n // if we already are on the initial route\n // and it's not the search route, clear the search instead of navigate\n if (initialRoute?.name === currentRoute.name && initialRoute?.name !== searchRoute) {\n setPhrase('');\n } else {\n clear(true);\n }\n });\n }, [container, setPhrase, clear]);\n\n const renderFilterBadges = (position: 'inside' | 'below') => {\n if (position !== filterBadgePosition) {\n return null;\n }\n if (!!showFilterBadges.guideCategory || !!showFilterBadges.tag) {\n return (\n <FilterBadges\n position={position}\n inputHasFocus={hasFocus}\n showGuideCategory={showFilterBadges.guideCategory}\n showTag={showFilterBadges.tag}\n searchContainerRef={elem.current}\n />\n );\n }\n };\n\n useTransitionEnd(autoFocusHandler);\n\n const showClear =\n showClearButton && (showFilterBadges.guideCategory || showFilterBadges.tag || phrase);\n const quickFilterAccessibilityProps = quickFiltersEnabled\n ? convertToStringAttributes({\n role: 'combobox',\n 'aria-autocomplete': 'list',\n autoComplete: 'off',\n 'aria-haspopup': 'listbox',\n })\n : {};\n\n return (\n <StyledSearchWrapper\n {...other}\n ref={elem}\n role={role}\n className={appendClassNames(className, 'humany-search')}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n data-has-search-symbol={showSearchButton ? 'true' : 'false'}\n >\n <Inner\n action=\".\"\n onSubmit={(e: any) => {\n e.preventDefault();\n elem.current?.getElementsByTagName('input')[0]?.blur();\n }}\n data-has-focus={hasFocus}\n >\n {showSearchButton && (\n <SearchButton\n aria-label={searchButtonLabel}\n type=\"submit\"\n title={searchButtonLabel}\n disabled={!phrase}\n onClick={search}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n >\n <SymbolBadge size={32} symbol={{ type: 'Svg', content: 'search' }} />\n </SearchButton>\n )}\n {renderFilterBadges('inside')}\n <Input\n type=\"search\"\n aria-label={ariaLabel}\n {...quickFilterAccessibilityProps}\n placeholder={\n showFilterBadges.guideCategory || showFilterBadges.tag ? '' : placeholder\n }\n onFocusChange={setHasFocus}\n onEscape={onEscape}\n onEnter={search}\n onChange={onChange}\n value={phrase}\n />\n {showClear && (\n <ClearButton\n aria-label={clearButtonLabel}\n type=\"reset\"\n hasFocus={hasFocus}\n title={clearButtonLabel}\n onClick={onClearButtonClick}\n >\n <SymbolBadge size={27} symbol={{ type: 'Svg', content: 'clear' }} />\n </ClearButton>\n )}\n {showChildren &&\n !showClear &&\n children.map((child) => (\n <Component key={child.id} id={child.id} branch=\"default\" />\n ))}\n <QuickFilter\n inputHasFocus={hasFocus}\n phrase={phrase}\n searchContainerRef={elem.current}\n />\n </Inner>\n {renderFilterBadges('below')}\n </StyledSearchWrapper>\n );\n};\n\nexport default Search;\n\nconst StyledSearchWrapper = styled.div<\n {\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n 'data-has-search-symbol': 'true' | 'false';\n } & any\n>`\n ${contentBox};\n width: 100%;\n padding: ${(p) => p.theme.sizes?.large};\n\n input {\n background-color: transparent;\n border: none;\n outline: none;\n min-width: 25%;\n flex: 1;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-weight: 300;\n font-style: italic;\n padding: 1em 0;\n color: ${(p) => p.theme.colors?.text};\n -webkit-appearance: none;\n\n ${(p) => p['data-has-search-symbol'] === 'true' && `text-indent: ${p.theme.sizes?.normal};`}\n\n ::placeholder {\n color: ${(p) => p.theme.colors?.text};\n }\n /* removes the 'X' from IE */\n &[type='search']::-ms-clear {\n display: none;\n width: 0;\n height: 0;\n }\n &[type='search']::-ms-reveal {\n display: none;\n width: 0;\n height: 0;\n }\n\n /* removes the 'X' from Chrome */\n &[type='search']::-webkit-search-decoration,\n &[type='search']::-webkit-search-cancel-button,\n &[type='search']::-webkit-search-results-button,\n &[type='search']::-webkit-search-results-decoration {\n display: none;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n button {\n background: transparent;\n border: none;\n padding: 0;\n font-size: ${(p) => p.theme.fonts?.large};\n transition: color 200ms ease-out;\n color: ${(p) =>\n p['data-has-focus'] || p['data-has-phrase'] ? p.theme.colors?.primary : '#000000'};\n cursor: pointer;\n > svg {\n height: 100%;\n }\n }\n`;\n\nconst Inner = styled.form<{ 'data-has-focus': boolean } & any>`\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n border: ${(p) => p.theme.inputBorder};\n border-radius: ${(p) => p.theme.borderRadius};\n background-color: #ffffff;\n position: relative;\n padding: 0 ${(p) => p.theme.sizes?.normal};\n\n ${(p) =>\n p['data-has-focus'] &&\n css`\n ${p.theme.accessibility?.isTabbing\n ? borderTabStyle(p)\n : `\n border-color: ${p.theme.colors?.primary};\n outline: none;\n input {\n outline: none;\n }\n `}\n `};\n`;\n\nconst SearchButton = styled(Button)<{\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n}>`\n padding: 0;\n height: 2em;\n\n svg {\n circle,\n line {\n stroke: ${(p) => (p['data-has-focus'] ? p.theme.colors?.primary : '#000000')};\n }\n }\n`;\n\nconst ClearButton = styled(Button)<{ hasFocus: boolean } & any>`\n &:focus-visible svg {\n ${borderTabStyle}\n }\n\n svg {\n vertical-align: top;\n\n circle,\n line,\n path {\n stroke: ${(p) => (p.hasFocus ? p.theme.colors?.primary : p.theme.colors?.text)};\n }\n }\n`;\n"],"names":["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","FilterBadges$1","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","QuickFilterItemList$1","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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"}
|