@telia-ace/knowledge-widget-components-search 1.0.22 → 1.0.23

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