@telia-ace/knowledge-widget-components-search 1.0.44-next.5 → 1.0.44

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
@@ -41,7 +41,7 @@ const z = (a) => !!a.guideCategoryId || a.tagIds.length > 0, B = (a, t) => {
41
41
  return t.sort((i, l) => i.title > l.title ? 1 : -1), t.forEach((i) => {
42
42
  i.items && (i.items = w(i.items));
43
43
  }), t;
44
- }, J = (a) => M(a, "search", import("./search.b520d18c.js"), (t) => {
44
+ }, J = (a) => M(a, "search", import("./search.cde1b7c0.js"), (t) => {
45
45
  const { events: i } = a.get("$widget"), [l, y] = G(i), f = (e) => m(void 0, null, function* () {
46
46
  const s = e.tag ? e.tag.split(",") : [], r = e.guideCategory, o = e.phrase || "", { activeFilterBadges: c } = t.properties(), n = yield u({}), g = yield p({
47
47
  tagId: e.tag,
@@ -1,8 +1,8 @@
1
- /// <reference types="react" />
1
+ import React from 'react';
2
2
  type Props = {
3
3
  phrase: string;
4
4
  inputHasFocus: boolean;
5
5
  searchContainerRef: HTMLElement | null;
6
6
  };
7
- declare const _default: ({ phrase, inputHasFocus, searchContainerRef }: Props) => JSX.Element | null;
7
+ declare const _default: ({ phrase, inputHasFocus, searchContainerRef }: Props) => React.JSX.Element | null;
8
8
  export default _default;
@@ -1,15 +1,15 @@
1
- var Ie = Object.defineProperty, ve = Object.defineProperties;
1
+ var Se = Object.defineProperty, ve = Object.defineProperties;
2
2
  var qe = Object.getOwnPropertyDescriptors;
3
3
  var Q = Object.getOwnPropertySymbols;
4
4
  var se = Object.prototype.hasOwnProperty, ie = Object.prototype.propertyIsEnumerable;
5
- var re = (e, t, n) => t in e ? Ie(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, F = (e, t) => {
5
+ var re = (e, t, n) => t in e ? Se(e, t, { enumerable: !0, configurable: !0, writable: !0, value: n }) : e[t] = n, F = (e, t) => {
6
6
  for (var n in t || (t = {}))
7
7
  se.call(t, n) && re(e, n, t[n]);
8
8
  if (Q)
9
9
  for (var n of Q(t))
10
10
  ie.call(t, n) && re(e, n, t[n]);
11
11
  return e;
12
- }, N = (e, t) => ve(e, qe(t));
12
+ }, T = (e, t) => ve(e, qe(t));
13
13
  var G = (e, t) => {
14
14
  var n = {};
15
15
  for (var r in e)
@@ -24,29 +24,29 @@ import z from "@emotion/styled";
24
24
  import { useProperties as W, useDispatch as U, useRouteData as fe, useEventListener as J, useKeyPress as H, Tooltip as ze, borderTabStyle as R, Text as me, Link as ge, SymbolBadge as Y, ItemTree as Le, useScroll as Fe, useContainer as he, Loader as De, contentBox as pe, useDebounce as Be, usePrevious as ae, useChildren as Ne, useWidgetEvent as Te, useTransitionEnd as Oe, convertToStringAttributes as Ke, Input as Pe, Button as ye } from "@telia-ace/knowledge-widget-ui";
25
25
  import { Component as We } from "@telia-ace/widget-types-grid";
26
26
  import { appendClassNames as V, deepClone as je, categoryTrail as Me } from "@telia-ace/widget-utilities";
27
- import g, { useState as D, useCallback as I, useRef as ee, useEffect as O, useMemo as Qe } from "react";
27
+ import g, { useState as D, useCallback as S, useRef as ee, useEffect as K, useMemo as Qe } from "react";
28
28
  const Xe = (s) => {
29
- var $ = s, {
29
+ var E = s, {
30
30
  text: e,
31
31
  className: t,
32
32
  filterType: n,
33
33
  handleClick: r,
34
34
  deleteAriaLabel: l = ""
35
- } = $, u = G($, [
35
+ } = E, u = G(E, [
36
36
  "text",
37
37
  "className",
38
38
  "filterType",
39
39
  "handleClick",
40
40
  "deleteAriaLabel"
41
41
  ]);
42
- const b = ee(), [x, w] = D(document.activeElement === b.current);
42
+ const k = ee(), [$, w] = D(document.activeElement === k.current);
43
43
  return /* @__PURE__ */ g.createElement(
44
44
  me,
45
45
  {
46
46
  className: V(
47
47
  t,
48
48
  "humany-filter-badge",
49
- x ? "humany-filter-badge-focused" : ""
49
+ $ ? "humany-filter-badge-focused" : ""
50
50
  ),
51
51
  onKeyDown: (f) => {
52
52
  f.key === "Enter" && r(f, n);
@@ -55,8 +55,8 @@ const Xe = (s) => {
55
55
  e,
56
56
  /* @__PURE__ */ g.createElement(
57
57
  ge,
58
- N(F({}, u), {
59
- ref: b,
58
+ T(F({}, u), {
59
+ ref: k,
60
60
  tabIndex: 0,
61
61
  onFocus: () => {
62
62
  w(!0);
@@ -78,7 +78,7 @@ const Xe = (s) => {
78
78
  showGuideCategory: r,
79
79
  position: l
80
80
  }) => {
81
- const { activeFilterBadges: u, deleteFilterBadgeAriaLabel: s = "" } = W(), $ = U(), { name: b, params: x } = fe(), [w, f] = D(!1), C = I((d) => {
81
+ const { activeFilterBadges: u, deleteFilterBadgeAriaLabel: s = "" } = W(), E = U(), { name: k, params: $ } = fe(), [w, f] = D(!1), C = S((d) => {
82
82
  const { key: i } = d;
83
83
  ["ArrowLeft", "ArrowRight"].indexOf(i) === -1 && f(!1);
84
84
  }, []);
@@ -91,11 +91,11 @@ const Xe = (s) => {
91
91
  badges: i,
92
92
  index: Array.from(i).findIndex((h) => document.activeElement === h)
93
93
  };
94
- }, o = I(
94
+ }, o = S(
95
95
  (d, i, h) => {
96
- d.preventDefault(), $("quick-filter:remove", { types: [i], ids: [h] });
96
+ d.preventDefault(), E("quick-filter:remove", { types: [i], ids: [h] });
97
97
  },
98
- [$]
98
+ [E]
99
99
  ), a = (d, i) => {
100
100
  if (!t)
101
101
  return;
@@ -107,7 +107,7 @@ const Xe = (s) => {
107
107
  };
108
108
  H(
109
109
  "ArrowLeft",
110
- I(() => {
110
+ S(() => {
111
111
  if (!t)
112
112
  return;
113
113
  const { index: d } = m(t);
@@ -118,7 +118,7 @@ const Xe = (s) => {
118
118
  }, [e, t])
119
119
  ), H(
120
120
  "ArrowRight",
121
- I(() => {
121
+ S(() => {
122
122
  if (!t)
123
123
  return;
124
124
  const { index: d } = m(t);
@@ -129,35 +129,41 @@ const Xe = (s) => {
129
129
  }, [t])
130
130
  ), H(
131
131
  "Backspace",
132
- I(
132
+ S(
133
133
  (d) => {
134
134
  if (!t)
135
135
  return;
136
136
  let i = [];
137
137
  const { index: h } = m(t), p = t.querySelector('[data-type="search"]');
138
- if (h > -1 ? h === 0 ? r ? i = ["guideCategory"] : n && (i = ["tag"]) : h === 1 && (i = ["tag"]) : p && p.selectionStart !== null && p.selectionStart <= 0 && (u != null && u.tag.length ? i = ["tag"] : u != null && u.guideCategory && (i = ["guideCategory"])), i.length > 0) {
138
+ if (h > -1)
139
+ h === 0 ? r ? i = ["guideCategory"] : n && (i = ["tag"]) : h === 1 && (i = ["tag"]);
140
+ else {
141
+ const b = document.activeElement === p;
142
+ p && p.selectionStart !== null && p.selectionStart <= 0 && b && (u != null && u.tag.length ? i = ["tag"] : u != null && u.guideCategory && (i = ["guideCategory"]));
143
+ }
144
+ if (i.length > 0) {
139
145
  d.preventDefault();
140
- let k;
146
+ let b;
141
147
  if (i.includes("tag")) {
142
- const K = u == null ? void 0 : u.tag.at(-1);
143
- k = K == null ? void 0 : K.id;
148
+ const B = u == null ? void 0 : u.tag.at(-1);
149
+ b = B == null ? void 0 : B.id;
144
150
  }
145
- $("quick-filter:remove", { types: i, ids: [k] });
151
+ E("quick-filter:remove", { types: i, ids: [b] });
146
152
  }
147
153
  },
148
- [t, u, n, r, $]
154
+ [t, u, n, r, E]
149
155
  )
150
156
  );
151
- const c = I(
157
+ const c = S(
152
158
  (d) => d === "guideCategory" && A && r ? /* @__PURE__ */ g.createElement(
153
159
  ce,
154
160
  {
155
161
  text: `@${A.title}`,
156
- routeName: b,
162
+ routeName: k,
157
163
  filterType: "guideCategory",
158
164
  handleClick: o,
159
165
  deleteAriaLabel: s,
160
- params: N(F({}, x), {
166
+ params: T(F({}, $), {
161
167
  guideCategory: void 0
162
168
  })
163
169
  }
@@ -169,11 +175,11 @@ const Xe = (s) => {
169
175
  key: i.id,
170
176
  className: "humany-filter-badge",
171
177
  text: `#${i.title}`,
172
- routeName: b,
178
+ routeName: k,
173
179
  filterType: "tag",
174
180
  handleClick: (p) => o(p, "tag", i.id),
175
181
  deleteAriaLabel: s,
176
- params: N(F({}, x), {
182
+ params: T(F({}, $), {
177
183
  tag: h
178
184
  })
179
185
  }
@@ -182,8 +188,8 @@ const Xe = (s) => {
182
188
  [
183
189
  A,
184
190
  y,
185
- b,
186
- x,
191
+ k,
192
+ $,
187
193
  r,
188
194
  n,
189
195
  w,
@@ -266,16 +272,16 @@ const Xe = (s) => {
266
272
  }
267
273
  order: 1;
268
274
  }
269
- `, T = (e, t) => !t || !e ? !0 : e.toLowerCase().indexOf(t.toLowerCase()) > -1, Je = (e = [], t, n) => {
275
+ `, O = (e, t) => !t || !e ? !0 : e.toLowerCase().indexOf(t.toLowerCase()) > -1, Je = (e = [], t, n) => {
270
276
  if (!n)
271
277
  return e;
272
278
  const r = je(e);
273
279
  if (t === "tag")
274
- return r.filter((s) => T(s.title, n));
280
+ return r.filter((s) => O(s.title, n));
275
281
  const l = Ye(r, n);
276
282
  return be(r, (s) => l.indexOf(s.id) > -1);
277
283
  }, be = (e, t) => e.filter((n) => (n.items && n.items.length && (n.items = be(n.items, t)), t(n))), Ye = (e, t) => {
278
- const r = ke(e).filter((u) => T(u.title, t)).map((u) => u.id);
284
+ const r = ke(e).filter((u) => O(u.title, t)).map((u) => u.id);
279
285
  let l = [];
280
286
  return r.forEach((u) => {
281
287
  const s = Me(u, e);
@@ -309,17 +315,17 @@ const Xe = (s) => {
309
315
  searchContainer: l,
310
316
  inputHasFocus: u
311
317
  }) => {
312
- const [s, $] = D(t || []), [b, x] = D(null), w = U(), { activeFilterBadges: f, quickFilters: C } = W(), A = typeof C == "object" && !!C.autoSelect || typeof C == "boolean" && !!C;
313
- O(() => {
314
- $(Je(t, n, e));
315
- }, [e, n, t]), O(() => {
318
+ const [s, E] = D(t || []), [k, $] = D(null), w = U(), { activeFilterBadges: f, quickFilters: C } = W(), A = typeof C == "object" && !!C.autoSelect || typeof C == "boolean" && !!C;
319
+ K(() => {
320
+ E(Je(t, n, e));
321
+ }, [e, n, t]), K(() => {
316
322
  var m;
317
323
  if (r) {
318
324
  const { anchors: o } = Z(r), a = (m = o[0]) == null ? void 0 : m.getAttribute("data-id");
319
- a && x(a);
325
+ a && $(a);
320
326
  }
321
327
  }, [s, r]);
322
- const y = I(
328
+ const y = S(
323
329
  (m, o) => {
324
330
  let a = ((f == null ? void 0 : f.tag) || []).map((d) => d.id);
325
331
  o === "tag" && m.id && (a = a.includes(m.id) ? a.filter((d) => d !== m.id) : [...a, m.id]);
@@ -334,9 +340,9 @@ const Xe = (s) => {
334
340
  renderItem: (o, a) => /* @__PURE__ */ g.createElement(
335
341
  de,
336
342
  {
337
- autoSelect: A && u && o.id === b,
338
- disabled: !T(o.title, e),
339
- tabIndex: T(o.title, e) ? 0 : -1,
343
+ autoSelect: A && u && o.id === k,
344
+ disabled: !O(o.title, e),
345
+ tabIndex: O(o.title, e) ? 0 : -1,
340
346
  onKeyDown: (c) => {
341
347
  c.key === "Enter" && y(o, m);
342
348
  },
@@ -351,7 +357,7 @@ const Xe = (s) => {
351
357
  {
352
358
  title: o.title,
353
359
  phrase: e,
354
- matches: T(o.title, e)
360
+ matches: O(o.title, e)
355
361
  }
356
362
  )
357
363
  )
@@ -360,7 +366,7 @@ const Xe = (s) => {
360
366
  renderItem: (o) => /* @__PURE__ */ g.createElement(
361
367
  de,
362
368
  {
363
- autoSelect: A && u && o.id === b,
369
+ autoSelect: A && u && o.id === k,
364
370
  onKeyDown: (a) => {
365
371
  a.key === "Enter" && y(o, m);
366
372
  },
@@ -375,7 +381,7 @@ const Xe = (s) => {
375
381
  symbol: "#",
376
382
  title: o.title,
377
383
  phrase: e,
378
- matches: T(o.title, e)
384
+ matches: O(o.title, e)
379
385
  }
380
386
  )
381
387
  )
@@ -390,23 +396,23 @@ const Xe = (s) => {
390
396
  const { anchors: a, focusedIndex: c } = Z(r);
391
397
  if (o === "Enter") {
392
398
  if (u && A) {
393
- const k = (q = a[0]) == null ? void 0 : q.getAttribute("data-id");
394
- k && y({ id: k }, n);
399
+ const b = (q = a[0]) == null ? void 0 : q.getAttribute("data-id");
400
+ b && y({ id: b }, n);
395
401
  }
396
402
  return;
397
403
  }
398
404
  const d = () => {
399
- var k;
400
- return (k = a[0]) == null ? void 0 : k.focus();
405
+ var b;
406
+ return (b = a[0]) == null ? void 0 : b.focus();
401
407
  }, i = () => {
402
- var k;
403
- return (k = a[a.length - 1]) == null ? void 0 : k.focus();
408
+ var b;
409
+ return (b = a[a.length - 1]) == null ? void 0 : b.focus();
404
410
  }, h = () => {
405
- var k;
406
- return (k = a[c + 1]) == null ? void 0 : k.focus();
411
+ var b;
412
+ return (b = a[c + 1]) == null ? void 0 : b.focus();
407
413
  }, p = () => {
408
- var k;
409
- return (k = a[c - 1]) == null ? void 0 : k.focus();
414
+ var b;
415
+ return (b = a[c - 1]) == null ? void 0 : b.focus();
410
416
  };
411
417
  u ? (m.preventDefault(), o === "ArrowDown" ? d() : i()) : c > -1 && (m.preventDefault(), o === "ArrowDown" ? a.length > c + 1 ? h() : _(l) : c - 1 < 0 ? _(l) : p());
412
418
  },
@@ -424,10 +430,10 @@ const Xe = (s) => {
424
430
  const l = () => {
425
431
  if (!n || !t)
426
432
  return [e];
427
- const b = e.toLowerCase().indexOf(t.toLowerCase()), x = e.substr(0, b), w = e.slice(b, b + t.length), f = e.substr(b + t.length);
428
- return [x, w, f];
429
- }, [u, s, $] = l();
430
- return /* @__PURE__ */ g.createElement(me, null, r, u, s ? /* @__PURE__ */ g.createElement("strong", null, s) : null, $ || null);
433
+ const k = e.toLowerCase().indexOf(t.toLowerCase()), $ = e.substr(0, k), w = e.slice(k, k + t.length), f = e.substr(k + t.length);
434
+ return [$, w, f];
435
+ }, [u, s, E] = l();
436
+ return /* @__PURE__ */ g.createElement(me, null, r, u, s ? /* @__PURE__ */ g.createElement("strong", null, s) : null, E || null);
431
437
  }, Ve = P`
432
438
  opacity: 0.5;
433
439
  pointer-events: none;
@@ -492,11 +498,11 @@ const Xe = (s) => {
492
498
  },
493
499
  activeFilterBadges: l,
494
500
  noMatchesLabel: u = "No matching items"
495
- } = W(), [s, $] = Fe(!0), b = he(), { events: x } = b.get("$widget"), w = ee(), f = I(
501
+ } = W(), [s, E] = Fe(!0), k = he(), { events: $ } = k.get("$widget"), w = ee(), f = S(
496
502
  (c) => (c && c.addEventListener(
497
503
  "keydown",
498
504
  () => {
499
- Z(c).focusedIndex > -1 && x.subscribeOnce("router:changed", () => {
505
+ Z(c).focusedIndex > -1 && $.subscribeOnce("router:changed", () => {
500
506
  _(n);
501
507
  });
502
508
  },
@@ -521,13 +527,13 @@ const Xe = (s) => {
521
527
  [y === "tag", "humany-quick-filter-tags"]
522
528
  )
523
529
  },
524
- /* @__PURE__ */ g.createElement(nt, { className: "humany-quick-filter-dropdown-inner", css: s, ref: $ }, o.length > 0 ? /* @__PURE__ */ g.createElement(
530
+ /* @__PURE__ */ g.createElement(nt, { className: "humany-quick-filter-dropdown-inner", css: s, ref: E }, o.length > 0 ? /* @__PURE__ */ g.createElement(
525
531
  Re,
526
532
  {
527
533
  filterType: y,
528
534
  items: o,
529
535
  filterPhrase: a,
530
- filterContainer: $.current,
536
+ filterContainer: E.current,
531
537
  searchContainer: n,
532
538
  inputHasFocus: t
533
539
  }
@@ -589,15 +595,15 @@ const Xe = (s) => {
589
595
  quickFilters: l = !1,
590
596
  quickFilter: u = { open: !1 },
591
597
  activeFilterBadges: s,
592
- filterBadges: $ = !1,
593
- incremental: b = 600
594
- } = W(), x = Be(
598
+ filterBadges: E = !1,
599
+ incremental: k = 600
600
+ } = W(), $ = Be(
595
601
  e,
596
- typeof b == "boolean" ? 600 : b
597
- ), w = ae(x), f = ae(s), C = ee(null), A = I(
602
+ typeof k == "boolean" ? 600 : k
603
+ ), w = ae($), f = ae(s), C = ee(null), A = S(
598
604
  (o = "") => {
599
605
  var a;
600
- if ($) {
606
+ if (E) {
601
607
  const c = X(
602
608
  s == null ? void 0 : s.guideCategory,
603
609
  f == null ? void 0 : f.guideCategory
@@ -614,12 +620,12 @@ const Xe = (s) => {
614
620
  return r("search", { value: o });
615
621
  },
616
622
  [r, s]
617
- ), y = I(
623
+ ), y = S(
618
624
  (o) => {
619
625
  r("clear", { navigateToHome: o });
620
626
  },
621
627
  [r]
622
- ), v = (o) => l ? o.replace(/([@#].*)/g, "") : o, m = I(
628
+ ), v = (o) => l ? o.replace(/([@#].*)/g, "") : o, m = S(
623
629
  (o) => {
624
630
  if (u.open && o.preventDefault) {
625
631
  o.preventDefault();
@@ -630,10 +636,10 @@ const Xe = (s) => {
630
636
  },
631
637
  [C, e, u, y, s, A]
632
638
  );
633
- return O(() => {
634
- const o = X(s == null ? void 0 : s.guideCategory, f == null ? void 0 : f.guideCategory) || X(s == null ? void 0 : s.tag, f == null ? void 0 : f.tag), a = x && v(x), c = w && v(w);
639
+ return K(() => {
640
+ const o = X(s == null ? void 0 : s.guideCategory, f == null ? void 0 : f.guideCategory) || X(s == null ? void 0 : s.tag, f == null ? void 0 : f.tag), a = $ && v($), c = w && v(w);
635
641
  typeof c != "undefined" && c !== a && a !== t.phrase && n && !u.open && m(o);
636
- }, [x, u.open, s, m]), O(() => {
642
+ }, [$, u.open, s, m]), K(() => {
637
643
  if (e && l) {
638
644
  const o = typeof l == "boolean" && !!l || typeof l == "object" && !!l.guideCategory, a = typeof l == "boolean" && !!l || typeof l == "object" && !!l.tag;
639
645
  o && e.indexOf("@") === e.length - 1 && r("quick-filter:open", { type: "guideCategory", symbol: "@" }), a && e.indexOf("#") === e.length - 1 && r("quick-filter:open", { type: "tag", symbol: "#" });
@@ -646,9 +652,9 @@ const Xe = (s) => {
646
652
  showSearchButton: l,
647
653
  showClearButton: u,
648
654
  role: s = "search",
649
- autoFocus: $,
650
- placeholder: b,
651
- searchButtonLabel: x,
655
+ autoFocus: E,
656
+ placeholder: k,
657
+ searchButtonLabel: $,
652
658
  clearButtonLabel: w,
653
659
  ariaLabel: f,
654
660
  route: C = "search",
@@ -660,21 +666,21 @@ const Xe = (s) => {
660
666
  } = W(), { params: a } = fe(), [c, d] = D(!1), [i, h] = D(a.phrase || ""), [p, q] = D({
661
667
  guideCategory: !1,
662
668
  tag: !1
663
- }), k = he(), K = Ne(), j = U(), { position: $e = "inside" } = typeof o == "object" ? o : {};
664
- O(() => {
665
- const { guideCategory: E, tag: S } = a, L = typeof o == "object" ? !!o.guideCategory : !!o, Se = typeof o == "object" ? !!o.tag : !!o;
669
+ }), b = he(), B = Ne(), j = U(), { position: Ee = "inside" } = typeof o == "object" ? o : {};
670
+ K(() => {
671
+ const { guideCategory: x, tag: I } = a, L = typeof o == "object" ? !!o.guideCategory : !!o, Ie = typeof o == "object" ? !!o.tag : !!o;
666
672
  q({
667
- guideCategory: L && !!E,
668
- tag: Se && !!S
673
+ guideCategory: L && !!x,
674
+ tag: Ie && !!I
669
675
  });
670
676
  }, [o, a]), Te(
671
677
  "router:changed",
672
678
  () => {
673
679
  if (v) {
674
- const { open: E, symbol: S } = v;
675
- if (E) {
676
- if (S) {
677
- const L = i.replace(i.slice(i.indexOf(S)), "");
680
+ const { open: x, symbol: I } = v;
681
+ if (x) {
682
+ if (I) {
683
+ const L = i.replace(i.slice(i.indexOf(I)), "");
678
684
  h(L);
679
685
  }
680
686
  j("quick-filter:close");
@@ -683,37 +689,37 @@ const Xe = (s) => {
683
689
  },
684
690
  [v, i, h, j]
685
691
  );
686
- const [te, M, B] = rt(i, a, !!A);
687
- O(() => {
692
+ const [te, M, N] = rt(i, a, !!A);
693
+ K(() => {
688
694
  h(a.phrase || "");
689
695
  }, [a.phrase]);
690
- const xe = I(
691
- (E) => {
692
- h(E);
696
+ const $e = S(
697
+ (x) => {
698
+ h(x);
693
699
  },
694
700
  [h]
695
- ), Ee = I(() => {
701
+ ), xe = S(() => {
696
702
  j("quick-filter:close").then(() => M(!0));
697
- }, [j, M]), we = I(() => {
698
- var E, S;
699
- $ && !c && ((S = (E = B.current) == null ? void 0 : E.getElementsByTagName("input")[0]) == null || S.focus());
700
- }, [$, c, B]), Ce = I(() => {
701
- k.getAsync("router").then((E) => {
702
- const S = E.getInitialRoute(), L = E.getRouteData();
703
- (S == null ? void 0 : S.name) === L.name && (S == null ? void 0 : S.name) !== C ? h("") : M(!0);
703
+ }, [j, M]), we = S(() => {
704
+ var x, I;
705
+ E && !c && ((I = (x = N.current) == null ? void 0 : x.getElementsByTagName("input")[0]) == null || I.focus());
706
+ }, [E, c, N]), Ce = S(() => {
707
+ b.getAsync("router").then((x) => {
708
+ const I = x.getInitialRoute(), L = x.getRouteData();
709
+ (I == null ? void 0 : I.name) === L.name && (I == null ? void 0 : I.name) !== C ? h("") : M(!0);
704
710
  });
705
- }, [k, h, M]), ne = (E) => {
706
- if (E !== $e)
711
+ }, [b, h, M]), ne = (x) => {
712
+ if (x !== Ee)
707
713
  return null;
708
714
  if (!!p.guideCategory || !!p.tag)
709
715
  return /* @__PURE__ */ g.createElement(
710
716
  Ge,
711
717
  {
712
- position: E,
718
+ position: x,
713
719
  inputHasFocus: c,
714
720
  showGuideCategory: p.guideCategory,
715
721
  showTag: p.tag,
716
- searchContainerRef: B.current
722
+ searchContainerRef: N.current
717
723
  }
718
724
  );
719
725
  };
@@ -726,8 +732,8 @@ const Xe = (s) => {
726
732
  }) : {};
727
733
  return /* @__PURE__ */ g.createElement(
728
734
  st,
729
- N(F({}, t), {
730
- ref: B,
735
+ T(F({}, t), {
736
+ ref: N,
731
737
  role: s,
732
738
  className: V(e, "humany-search"),
733
739
  "data-has-phrase": !!i,
@@ -738,18 +744,18 @@ const Xe = (s) => {
738
744
  it,
739
745
  {
740
746
  action: ".",
741
- onSubmit: (E) => {
742
- var S, L;
743
- E.preventDefault(), (L = (S = B.current) == null ? void 0 : S.getElementsByTagName("input")[0]) == null || L.blur();
747
+ onSubmit: (x) => {
748
+ var I, L;
749
+ x.preventDefault(), (L = (I = N.current) == null ? void 0 : I.getElementsByTagName("input")[0]) == null || L.blur();
744
750
  },
745
751
  "data-has-focus": c
746
752
  },
747
753
  l && /* @__PURE__ */ g.createElement(
748
754
  at,
749
755
  {
750
- "aria-label": x,
756
+ "aria-label": $,
751
757
  type: "submit",
752
- title: x,
758
+ title: $,
753
759
  disabled: !i,
754
760
  onClick: te,
755
761
  "data-has-phrase": !!i,
@@ -760,15 +766,15 @@ const Xe = (s) => {
760
766
  ne("inside"),
761
767
  /* @__PURE__ */ g.createElement(
762
768
  Pe,
763
- N(F({
769
+ T(F({
764
770
  type: "search",
765
771
  "aria-label": f
766
772
  }, Ae), {
767
- placeholder: p.guideCategory || p.tag ? "" : b,
773
+ placeholder: p.guideCategory || p.tag ? "" : k,
768
774
  onFocusChange: d,
769
- onEscape: Ee,
775
+ onEscape: xe,
770
776
  onEnter: te,
771
- onChange: xe,
777
+ onChange: $e,
772
778
  value: i
773
779
  })
774
780
  ),
@@ -783,13 +789,13 @@ const Xe = (s) => {
783
789
  },
784
790
  /* @__PURE__ */ g.createElement(Y, { size: 27, symbol: { type: "Svg", content: "clear" } })
785
791
  ),
786
- y && !oe && K.map((E) => /* @__PURE__ */ g.createElement(We, { key: E.id, id: E.id, branch: "default" })),
792
+ y && !oe && B.map((x) => /* @__PURE__ */ g.createElement(We, { key: x.id, id: x.id, branch: "default" })),
787
793
  /* @__PURE__ */ g.createElement(
788
794
  et,
789
795
  {
790
796
  inputHasFocus: c,
791
797
  phrase: i,
792
- searchContainerRef: B.current
798
+ searchContainerRef: N.current
793
799
  }
794
800
  )
795
801
  ),
@@ -935,4 +941,4 @@ const Xe = (s) => {
935
941
  export {
936
942
  pt as default
937
943
  };
938
- //# sourceMappingURL=search.b520d18c.js.map
944
+ //# sourceMappingURL=search.cde1b7c0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.cde1b7c0.js","sources":["../src/filter-badges.tsx","../src/utils.ts","../src/quick-filter-item-list.tsx","../src/quick-filter.tsx","../src/use-search.ts","../src/search.tsx"],"sourcesContent":["import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Link,\n SymbolBadge,\n Text,\n Tooltip,\n useDispatch,\n useEventListener,\n useKeyPress,\n useProperties,\n useRouteData,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { SearchComponentProps } from './search-component';\n\nconst FilterBadge: React.FC<any> = ({\n text,\n className,\n filterType,\n handleClick,\n deleteAriaLabel = '',\n ...p\n}) => {\n const ref = useRef<HTMLAnchorElement>();\n\n const [isFocused, setIsFocused] = useState(document.activeElement === ref.current);\n\n return (\n <Text\n className={appendClassNames(\n className,\n 'humany-filter-badge',\n isFocused ? 'humany-filter-badge-focused' : ''\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleClick(e, filterType);\n }\n }}\n >\n {text}\n <Link\n {...p}\n ref={ref}\n tabIndex={0}\n onFocus={() => {\n setIsFocused(true);\n }}\n onBlur={() => {\n setIsFocused(false);\n }}\n role=\"button\"\n aria-label={deleteAriaLabel.replace('{{item}}', text)}\n onClick={(e) => handleClick(e, filterType)}\n >\n <SymbolBadge size={13} symbol={{ type: 'Svg', content: 'close' }} />\n </Link>\n </Text>\n );\n};\n\ntype Props = {\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n showGuideCategory: boolean;\n showTag: boolean;\n position: 'inside' | 'below';\n};\nconst FilterBadges: React.FC<Props> = ({\n inputHasFocus,\n searchContainerRef,\n showTag,\n showGuideCategory,\n position,\n}) => {\n const { activeFilterBadges, deleteFilterBadgeAriaLabel = '' } =\n useProperties<SearchComponentProps>();\n\n const dispatch = useDispatch();\n const { name, params } = useRouteData();\n const [isNavigatingWithKeyBoard, setIsNavigatingWithKeyboard] = useState(false);\n\n const onKeyDown = useCallback((event: KeyboardEvent) => {\n const { key } = event;\n\n if (['ArrowLeft', 'ArrowRight'].indexOf(key) === -1) {\n setIsNavigatingWithKeyboard(false);\n }\n }, []);\n\n useEventListener('keydown', onKeyDown, window);\n\n useEventListener('click', onKeyDown, window);\n\n const { guideCategory, tag, tooltip } = activeFilterBadges || {};\n\n const getFocusedFilterBadge = (container: HTMLElement) => {\n const badges = container.querySelectorAll(\n '.humany-filter-badge > a'\n ) as NodeListOf<HTMLElement>;\n return {\n badges,\n index: Array.from(badges).findIndex((e) => document.activeElement === e),\n };\n };\n\n const handleFilterBadgeClick = useCallback(\n (event: React.MouseEvent | React.KeyboardEvent, filterType: string, id?: string) => {\n event.preventDefault();\n dispatch('quick-filter:remove', { types: [filterType], ids: [id] });\n },\n [dispatch]\n );\n\n const keyboardNavigation = (\n direction: 'left' | 'right',\n inputElem: HTMLInputElement | null\n ) => {\n if (!searchContainerRef) {\n return;\n }\n const { badges, index: currentFocusedIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (badges.length) {\n let toFocus: HTMLElement | null = null;\n\n if (direction === 'left') {\n if (currentFocusedIndex === -1) {\n // if no badge is focused and direction is left\n // focus last badge\n toFocus = badges.item(badges.length - 1);\n } else if (currentFocusedIndex > 0) {\n // if there are more badges to the left, go one step back\n // do nothing if already focusing the most left badge\n toFocus = badges.item(currentFocusedIndex - 1);\n }\n } else if (direction === 'right') {\n if (currentFocusedIndex === badges.length - 1) {\n // if currently focusing the last badge, move focus to search input\n inputElem && inputElem.focus();\n } else if (badges.item(currentFocusedIndex + 1)) {\n toFocus = badges.item(currentFocusedIndex + 1);\n }\n }\n\n if (toFocus) {\n toFocus.focus();\n setIsNavigatingWithKeyboard(true);\n }\n }\n };\n\n useKeyPress(\n 'ArrowLeft',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (inputHasFocus || focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isAtBeginningOfInput =\n inputElem && inputElem.selectionStart !== null && inputElem.selectionStart <= 0;\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isAtBeginningOfInput || isFocusingAFilterBadge) {\n keyboardNavigation('left', inputElem);\n }\n }\n }, [inputHasFocus, searchContainerRef])\n );\n\n useKeyPress(\n 'ArrowRight',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n keyboardNavigation('right', inputElem);\n }\n }\n }, [searchContainerRef])\n );\n\n useKeyPress(\n 'Backspace',\n useCallback(\n (event: any) => {\n if (!searchContainerRef) {\n return;\n }\n let filtersToRemove: string[] = [];\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n if (focusedBadgeIndex === 0) {\n if (showGuideCategory) {\n filtersToRemove = ['guideCategory'];\n } else if (showTag) {\n filtersToRemove = ['tag'];\n }\n } else if (focusedBadgeIndex === 1) {\n filtersToRemove = ['tag'];\n }\n } else {\n const isFocusingInput = document.activeElement === inputElem;\n const isAtBeginningOfInput =\n inputElem &&\n inputElem.selectionStart !== null &&\n inputElem.selectionStart <= 0;\n\n if (isAtBeginningOfInput && isFocusingInput) {\n if (!!activeFilterBadges?.tag.length) {\n filtersToRemove = ['tag'];\n } else if (activeFilterBadges?.guideCategory) {\n filtersToRemove = ['guideCategory'];\n }\n }\n }\n\n if (filtersToRemove.length > 0) {\n event.preventDefault();\n let id: string | undefined = undefined;\n\n if (filtersToRemove.includes('tag')) {\n const lastTag = activeFilterBadges?.tag.at(-1);\n id = lastTag?.id;\n }\n\n dispatch('quick-filter:remove', { types: filtersToRemove, ids: [id] });\n }\n },\n [searchContainerRef, activeFilterBadges, showTag, showGuideCategory, dispatch]\n )\n );\n\n const renderBadge = useCallback(\n (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory' && guideCategory && showGuideCategory) {\n return (\n <StyledFilterBadge\n text={`@${guideCategory.title}`}\n routeName={name}\n filterType=\"guideCategory\"\n handleClick={handleFilterBadgeClick}\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n guideCategory: undefined,\n }}\n />\n );\n }\n if (type === 'tag' && !!tag?.length && showTag) {\n return tag.map((tagItem) => {\n const excludedIds = tag.reduce<string[]>((acc, t) => {\n if (t.id !== tagItem.id) {\n acc.push(t.id);\n }\n return acc;\n }, []);\n\n return (\n <StyledFilterBadge\n key={tagItem.id}\n className=\"humany-filter-badge\"\n text={`#${tagItem.title}`}\n routeName={name}\n filterType=\"tag\"\n handleClick={(event: any) =>\n handleFilterBadgeClick(event, 'tag', tagItem.id)\n }\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n tag: excludedIds,\n }}\n />\n );\n });\n }\n return null;\n },\n [\n guideCategory,\n tag,\n name,\n params,\n showGuideCategory,\n showTag,\n isNavigatingWithKeyBoard,\n handleFilterBadgeClick,\n ]\n );\n\n if (!guideCategory && !tag) {\n return null;\n }\n\n return (\n <Wrapper className=\"humany-filter-badges\" position={position}>\n {guideCategory && tooltip ? (\n <Tooltip content={<>{tooltip}</>} sticky={false}>\n {renderBadge('guideCategory')}\n </Tooltip>\n ) : (\n renderBadge('guideCategory')\n )}\n {tag && renderBadge('tag')}\n </Wrapper>\n );\n};\n\nexport default FilterBadges;\n\nconst Wrapper = styled.div<{ position: 'inside' | 'below' }>`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n\n ${(p) =>\n p.position === 'inside'\n ? css`\n &:not(:first-child) {\n margin: 0 0 0 ${p.theme.sizes?.normal};\n }\n `\n : css`\n margin: ${p.theme.sizes?.small} 0 0 0;\n span:first-child {\n margin-left: 0;\n }\n `}\n`;\n\nconst StyledFilterBadge = styled(FilterBadge)`\n display: flex;\n align-items: center;\n padding: ${(p) => `${p.theme.sizes?.small} calc(${p.theme.sizes?.normal}/2) `};\n background-color: ${(p) => p.theme.colors?.primary};\n border-radius: ${(p) => p.theme.borderRadius};\n font-weight: 300;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-style: italic;\n color: #ffffff;\n text-decoration: none;\n white-space: nowrap;\n\n margin: calc(${(p) => p.theme.sizes?.small} / 2);\n\n &.humany-filter-badge-focused:focus-within {\n ${borderTabStyle}\n background-color: transparent;\n\n svg {\n path {\n stroke: ${(p) => p.theme.colors?.primary};\n }\n }\n a {\n outline: none;\n }\n }\n\n svg {\n width: 17px;\n height: 11px;\n margin: 1px 0 0 ${(p) => p.theme.sizes?.small};\n path {\n stroke: #ffffff;\n stroke-width: 2px;\n }\n order: 1;\n }\n`;\n","import { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport { categoryTrail, deepClone } from '@telia-ace/widget-utilities';\n\nexport const match = (title: string, phrase: string) => {\n if (!phrase || !title) {\n return true;\n }\n\n return !!(title.toLowerCase().indexOf(phrase.toLowerCase()) > -1);\n};\n\nexport const filterItems = (\n items: (Tag | Category)[] = [],\n type: 'tag' | 'guideCategory',\n phrase: string\n): any[] => {\n if (!phrase) {\n return items;\n }\n\n const cloned = deepClone(items);\n\n if (type === 'tag') {\n return cloned.filter((i: Tag) => match(i.title, phrase));\n }\n\n const matchTrail = buildMatchTrail(cloned, phrase);\n const filtered = recursiveFilter(cloned, (c: Category) => matchTrail.indexOf(c.id) > -1);\n\n return filtered;\n};\n\nconst recursiveFilter = (items: Category[], fn: (c: Category) => boolean) => {\n return items.filter((i: Category) => {\n if (i.items && i.items.length) {\n i.items = recursiveFilter(i.items, fn);\n }\n\n return fn(i);\n });\n};\n\nconst buildMatchTrail = (categories: Category[], phrase: string) => {\n const flattened = flatten(categories);\n const matching = flattened.filter((c) => match(c.title, phrase)).map((c) => c.id);\n\n let res: string[] = [];\n\n matching.forEach((id) => {\n const trail = categoryTrail(id, categories);\n\n res = res.concat(trail);\n });\n\n return res;\n};\n\nconst flatten = (categories: Category[]): Category[] => {\n let result: Category[] = [];\n\n categories.forEach((category) => {\n result.push(category);\n\n if (Array.isArray(category.items)) {\n result = result.concat(flatten(category.items));\n }\n });\n\n return result;\n};\n","import { css, Theme } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport {\n ItemTree,\n Link,\n Text,\n useDispatch,\n useEventListener,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { SearchComponentProps } from './search-component';\nimport { filterItems, match } from './utils';\n\ntype Props = {\n filterPhrase: string;\n items: Category[] | Tag[];\n filterType: 'guideCategory' | 'tag';\n searchContainer: HTMLElement | null;\n filterContainer: HTMLElement | null;\n inputHasFocus: boolean;\n};\n\nexport const getFocusedIndex = (elem: HTMLElement) => {\n const anchors = Array.from(elem?.getElementsByTagName('A') || []).filter(\n (a) => a.getAttribute('disabled') === null\n ) as HTMLAnchorElement[];\n return {\n anchors,\n focusedIndex: anchors.findIndex((e) => document.activeElement === e),\n };\n};\n\nconst getInputElem = (searchContainerRef: HTMLElement | null) => {\n return searchContainerRef\n ? (searchContainerRef.querySelector(\n '[data-type=\"search\"], input[type=\"search\"]'\n ) as HTMLElement | null)\n : null;\n};\n\nexport const focusInput = (searchContainerRef: HTMLElement | null) => {\n if (!searchContainerRef) {\n return;\n }\n const inputElem = getInputElem(searchContainerRef);\n if (inputElem) {\n inputElem.focus();\n }\n};\n\nconst QuickFilterItemList: React.FC<Props> = ({\n filterPhrase,\n items: rawItems,\n filterType,\n filterContainer,\n searchContainer,\n inputHasFocus,\n}) => {\n const [items, setItems] = useState<Category[] | Tag[]>(rawItems || []);\n const [first, setFirst] = useState<string | null>(null);\n const dispatch = useDispatch();\n const { activeFilterBadges, quickFilters } = useProperties<SearchComponentProps>();\n const autoSelect =\n (typeof quickFilters === 'object' && !!quickFilters.autoSelect) ||\n (typeof quickFilters === 'boolean' && !!quickFilters);\n\n useEffect(() => {\n setItems(filterItems(rawItems, filterType, filterPhrase));\n }, [filterPhrase, filterType, rawItems]);\n\n useEffect(() => {\n if (filterContainer) {\n const { anchors } = getFocusedIndex(filterContainer);\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n setFirst(id);\n }\n }\n }, [items, filterContainer]);\n\n const handleItemClicked = useCallback(\n (item: Partial<{ id: string }>, type: 'guideCategory' | 'tag') => {\n let tagIds = (activeFilterBadges?.tag || []).map((t) => t.id);\n\n if (type === 'tag' && item.id) {\n tagIds = tagIds.includes(item.id)\n ? tagIds.filter((id) => id !== item.id)\n : [...tagIds, item.id];\n }\n\n const data: { category?: string; tagIds: string[] } = {\n category: activeFilterBadges?.guideCategory\n ? activeFilterBadges.guideCategory.id\n : undefined,\n tagIds,\n };\n\n if (type === 'guideCategory') {\n data.category = item.id;\n }\n dispatch('quick-filter:add', data);\n },\n [activeFilterBadges, dispatch]\n );\n\n const buildListProps = (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory') {\n return {\n renderItem: (item: Category, level: number) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n disabled={!match(item.title, filterPhrase)}\n tabIndex={!match(item.title, filterPhrase) ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n data-level={level}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n }\n return {\n renderLi: true,\n renderItem: (item: Tag) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n symbol=\"#\"\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n };\n\n useEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n const { key } = e;\n if (\n !filterContainer ||\n !(key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter')\n ) {\n return;\n }\n\n const { anchors, focusedIndex } = getFocusedIndex(filterContainer);\n\n if (key === 'Enter') {\n if (inputHasFocus && autoSelect) {\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n handleItemClicked({ id }, filterType);\n }\n }\n return;\n }\n\n const focusFirst = () => anchors[0]?.focus();\n const focusLast = () => anchors[anchors.length - 1]?.focus();\n const focusNext = () => anchors[focusedIndex + 1]?.focus();\n const focusPrev = () => anchors[focusedIndex - 1]?.focus();\n\n if (inputHasFocus) {\n // Input is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n focusFirst();\n } else {\n focusLast();\n }\n } else if (focusedIndex > -1) {\n // A quick-filter-item is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n if (anchors.length > focusedIndex + 1) {\n focusNext();\n } else {\n focusInput(searchContainer);\n }\n } else {\n if (focusedIndex - 1 < 0) {\n focusInput(searchContainer);\n } else {\n focusPrev();\n }\n }\n }\n },\n window\n );\n\n return (\n <ItemTree\n tree={items}\n renderEmpty={false}\n ulProps={{ role: 'listbox' }}\n liProps={{ role: 'option' }}\n {...buildListProps(filterType)}\n />\n );\n};\n\nexport default QuickFilterItemList;\n\ntype TitleProps = {\n title: string;\n phrase: string;\n matches: boolean;\n symbol?: string;\n};\n\nconst Title: React.FC<TitleProps> = ({ title, phrase, matches, symbol = '' }) => {\n const createTitle = () => {\n if (!matches || !phrase) {\n return [title];\n }\n\n const index = title.toLowerCase().indexOf(phrase.toLowerCase());\n const start = title.substr(0, index);\n const bold = title.slice(index, index + phrase.length);\n const end = title.substr(index + phrase.length);\n return [start, bold, end];\n };\n\n const [start, bold, end] = createTitle();\n\n return (\n <Text>\n {symbol}\n {start}\n {bold ? <strong>{bold}</strong> : null}\n {end ? end : null}\n </Text>\n );\n};\n\nconst disabledCss = css`\n opacity: 0.5;\n pointer-events: none;\n`;\n\nconst focused = (p: { theme: Theme; 'data-level'?: number; autoSelect: boolean }) => css`\n background-color: ${p.theme.colors?.text};\n color: #ffffff;\n outline: none;\n\n span:first-child {\n border-color: ${p.theme.colors?.text};\n }\n`;\n\nconst StyledLink = styled(Link)<{ 'data-level'?: number; autoSelect: boolean }>`\n display: block;\n text-decoration: none;\n font-size: ${(p) => p.theme.fonts?.normal};\n\n ${(p) => p.disabled && disabledCss}\n color: ${(p) => p.theme.colors?.text};\n background-color: transparent;\n\n span {\n display: block;\n ${(p) =>\n p['data-level']\n ? `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.normal};`\n : `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.medium}; `}\n ${(p) => p['data-level'] && 'border-left: 2px solid'}\n }\n\n span:first-child {\n border-color: #e7e7e7;\n }\n\n ${(p) => p['data-level'] && `padding: 0 calc(${p.theme.sizes?.medium} * ${p['data-level']});`}\n\n ${(p) => p.autoSelect && focused}\n\n &:hover,\n &:focus {\n ${focused}\n }\n`;\n","import styled from '@emotion/styled';\nimport { Category, Tag, Widget } from '@telia-ace/knowledge-widget-core';\nimport {\n contentBox,\n Loader,\n useContainer,\n useProperties,\n useScroll,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useMemo, useRef } from 'react';\nimport QuickFilterItemList, { focusInput, getFocusedIndex } from './quick-filter-item-list';\nimport { SearchComponentProps } from './search-component';\n\ntype Props = {\n phrase: string;\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n};\n\nexport default ({ phrase = '', inputHasFocus, searchContainerRef }: Props) => {\n const {\n quickFilter = {\n open: false,\n loading: false,\n symbol: '',\n type: '',\n items: [],\n },\n activeFilterBadges,\n noMatchesLabel = 'No matching items',\n } = useProperties<SearchComponentProps>();\n const [css, ref] = useScroll(true);\n const container = useContainer();\n const { events } = container.get('$widget') as Widget;\n const wrapperRef = useRef() as React.MutableRefObject<HTMLDivElement | null>;\n\n const setWrapperRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) {\n node.addEventListener(\n 'keydown',\n () => {\n const listItemFocused = getFocusedIndex(node).focusedIndex > -1;\n if (listItemFocused) {\n events.subscribeOnce('router:changed', () => {\n focusInput(searchContainerRef);\n });\n }\n },\n true\n );\n }\n\n wrapperRef.current = node;\n return node;\n },\n [searchContainerRef]\n );\n\n const { items = [], symbol, type, open, loading } = quickFilter;\n\n const filteredItems = useMemo(() => {\n const activeTags = (activeFilterBadges?.tag || []).map((tag) => tag.id);\n return (items as any[]).filter((item) => !activeTags.includes(item.id)) as\n | Tag[]\n | Category[];\n }, [items, activeFilterBadges]);\n\n if (!open || !symbol) {\n return null;\n }\n\n const filterPhrase = phrase.slice(phrase.indexOf(symbol) + 1);\n\n return (\n <Wrapper\n ref={setWrapperRef}\n data-loading={loading}\n className={appendClassNames(\n 'humany-quick-filter-dropdown',\n [type === 'guideCategory', 'humany-quick-filter-guide-categories'],\n [type === 'tag', 'humany-quick-filter-tags']\n )}\n >\n <Inner className=\"humany-quick-filter-dropdown-inner\" css={css} ref={ref}>\n {filteredItems.length > 0 ? (\n <QuickFilterItemList\n filterType={type as 'guideCategory' | 'tag'}\n items={filteredItems}\n filterPhrase={filterPhrase}\n filterContainer={ref.current}\n searchContainer={searchContainerRef}\n inputHasFocus={inputHasFocus}\n />\n ) : (\n <NoMatches>{noMatchesLabel}</NoMatches>\n )}\n </Inner>\n <Loader loading={loading} />\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n ${(p) => contentBox(p)};\n position: absolute;\n top: calc(100% + ${(p) => p.theme.sizes?.normal});\n left: 0;\n right: 0;\n z-index: 1;\n overflow: hidden;\n`;\n\nconst Inner = styled.div<{ css: string }>`\n max-height: 300px;\n overflow: auto;\n padding: ${(p) => p.theme.sizes?.medium} 0;\n ${(p) => p.css}\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n li div {\n ${(p) => `margin: ${p.theme.sizes?.normal} 0;`}\n }\n`;\n\nconst NoMatches = styled.p`\n margin: 0 ${(p) => p.theme.sizes?.normal};\n color: ${(p) => p.theme.colors?.text};\n`;\n","import {\n useDebounce,\n useDispatch,\n usePrevious,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SearchComponentProps } from './search-component';\n\ntype ReturnType = [\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => void,\n (navigateToHome: boolean) => void,\n React.MutableRefObject<HTMLElement | null>\n];\n\nconst filterChanged = <T extends Optional<{ id: string } | { id: string }[]> | null>(\n newValue: T,\n oldValue: T\n) => {\n if (newValue && !oldValue) {\n return true;\n }\n if (!newValue && oldValue) {\n return true;\n }\n if (newValue && oldValue) {\n if (!Array.isArray(newValue) && !Array.isArray(oldValue)) {\n if (newValue.id !== oldValue.id) {\n return true;\n }\n } else {\n const areEqual = (arr1: T[], arr2: T[]) => {\n if (arr1.length === arr2.length) {\n return arr1.every((item, index) => {\n if (item === arr2[index]) {\n return true;\n }\n return false;\n });\n }\n return false;\n };\n\n if (!areEqual(newValue as T[], oldValue as T[])) {\n return true;\n }\n }\n }\n return false;\n};\n\nexport default (\n phrase: string,\n params: { [key: string]: any } = {},\n debounce = true\n): ReturnType => {\n const dispatch = useDispatch();\n\n const {\n quickFilters = false,\n quickFilter = { open: false },\n activeFilterBadges,\n filterBadges = false,\n incremental = 600,\n } = useProperties<SearchComponentProps>();\n\n const debouncedPhrase = useDebounce(\n phrase,\n typeof incremental === 'boolean' ? 600 : incremental\n );\n const previousDebouncedPhrase = usePrevious(debouncedPhrase);\n const previousFilters = usePrevious(activeFilterBadges);\n const ref = useRef<null | HTMLElement>(null);\n\n const dispatchSearch = useCallback(\n (value: string = '') => {\n if (filterBadges) {\n const filtersChanged =\n filterChanged(\n activeFilterBadges?.guideCategory,\n previousFilters?.guideCategory\n ) || filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n return dispatch('search', {\n value,\n filtersChanged,\n filters: {\n tagIds: (activeFilterBadges?.tag || []).map((t) => t.id),\n guideCategoryId: activeFilterBadges?.guideCategory?.id || null,\n },\n });\n }\n return dispatch('search', { value });\n },\n [dispatch, activeFilterBadges]\n );\n\n const dispatchClear = useCallback(\n (navigateToHome: boolean) => {\n dispatch('clear', { navigateToHome });\n },\n [dispatch]\n );\n\n const removeFilterKeywords = (input: string) => {\n if (quickFilters) {\n return input.replace(/([@#].*)/g, '');\n }\n return input;\n };\n\n const submitSearch = useCallback(\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => {\n if (quickFilter.open && (arg as React.KeyboardEvent).preventDefault) {\n (arg as React.KeyboardEvent).preventDefault();\n return;\n }\n\n const activeElement = document.activeElement as HTMLElement;\n const isSearching =\n ref.current && typeof ref.current.contains === 'function'\n ? ref.current.contains(activeElement)\n : false;\n const cleanedPhrase = removeFilterKeywords(phrase);\n\n if (\n (typeof arg === 'boolean' && arg) ||\n (cleanedPhrase.length && isSearching) ||\n activeFilterBadges?.guideCategory ||\n (!!activeFilterBadges?.tag.length && isSearching)\n ) {\n dispatchSearch(cleanedPhrase);\n } else {\n dispatchClear(isSearching);\n }\n },\n [ref, phrase, quickFilter, dispatchClear, activeFilterBadges, dispatchSearch]\n );\n\n useEffect(() => {\n const filtersChanged =\n filterChanged(activeFilterBadges?.guideCategory, previousFilters?.guideCategory) ||\n filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n\n const phrase = debouncedPhrase ? removeFilterKeywords(debouncedPhrase) : debouncedPhrase;\n const previousPhrase = previousDebouncedPhrase\n ? removeFilterKeywords(previousDebouncedPhrase)\n : previousDebouncedPhrase;\n if (\n typeof previousPhrase !== 'undefined' &&\n previousPhrase !== phrase &&\n phrase !== params.phrase &&\n debounce &&\n !quickFilter.open\n ) {\n submitSearch(filtersChanged);\n }\n }, [debouncedPhrase, quickFilter.open, activeFilterBadges, submitSearch]);\n\n useEffect(() => {\n if (phrase && quickFilters) {\n const quickFiltersGuideCategory =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.guideCategory);\n\n const quickFiltersTag =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.tag);\n\n if (quickFiltersGuideCategory && phrase.indexOf('@') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'guideCategory', symbol: '@' });\n }\n\n if (quickFiltersTag && phrase.indexOf('#') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'tag', symbol: '#' });\n }\n }\n\n if (quickFilter.open && phrase.indexOf('@') === -1 && phrase.indexOf('#') === -1) {\n dispatch('quick-filter:close');\n }\n }, [phrase]);\n\n return [submitSearch, dispatchClear, ref];\n};\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n contentBox,\n convertToStringAttributes,\n Input,\n SymbolBadge,\n useChildren,\n useContainer,\n useDispatch,\n useProperties,\n useRouteData,\n useTransitionEnd,\n useWidgetEvent,\n} from '@telia-ace/knowledge-widget-ui';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { Component } from '@telia-ace/widget-types-grid';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport FilterBadges from './filter-badges';\nimport QuickFilter from './quick-filter';\nimport { SearchComponentProps } from './search-component';\nimport useSearch from './use-search';\n\ntype Props = {\n className: string;\n role?: string;\n};\n\nconst Search: React.FC<Props> = ({ className, ...other }) => {\n const {\n showSearchButton,\n showClearButton,\n role = 'search',\n autoFocus,\n placeholder,\n searchButtonLabel,\n clearButtonLabel,\n ariaLabel,\n route: searchRoute = 'search',\n incremental = true,\n showChildren = false,\n quickFilter,\n quickFilters: quickFiltersEnabled,\n filterBadges,\n } = useProperties<SearchComponentProps>();\n const { params } = useRouteData();\n const [hasFocus, setHasFocus] = useState(false);\n const [phrase, setPhrase] = useState(params.phrase || '');\n const [showFilterBadges, setShowFilterBadges] = useState({\n guideCategory: false,\n tag: false,\n });\n const container = useContainer();\n const children = useChildren();\n const dispatch = useDispatch();\n const { position: filterBadgePosition = 'inside' } =\n typeof filterBadges === 'object' ? filterBadges : {};\n\n useEffect(() => {\n const { guideCategory, tag } = params;\n const showGuideCategory =\n typeof filterBadges === 'object' ? !!filterBadges.guideCategory : !!filterBadges;\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\n\n setShowFilterBadges({\n guideCategory: showGuideCategory && !!guideCategory,\n tag: showTag && !!tag,\n });\n }, [filterBadges, params]);\n\n // Remove quick-filter symbol, quick-filter phrase\n // and close quick-filter when route changed\n useWidgetEvent(\n 'router:changed',\n () => {\n if (quickFilter) {\n const { open, symbol } = quickFilter;\n\n if (open) {\n if (symbol) {\n const cleaned = phrase.replace(phrase.slice(phrase.indexOf(symbol)), '');\n setPhrase(cleaned);\n }\n\n dispatch('quick-filter:close');\n }\n }\n },\n [quickFilter, phrase, setPhrase, dispatch]\n );\n\n const [search, clear, elem] = useSearch(phrase, params, !!incremental);\n\n useEffect(() => {\n setPhrase(params.phrase || '');\n }, [params.phrase]);\n\n const onChange = useCallback(\n (value: string) => {\n setPhrase(value);\n },\n [setPhrase]\n );\n\n const onEscape = useCallback(() => {\n dispatch('quick-filter:close').then(() => clear(true));\n }, [dispatch, clear]);\n\n const autoFocusHandler = useCallback(() => {\n if (autoFocus && !hasFocus) {\n elem.current?.getElementsByTagName('input')[0]?.focus();\n }\n }, [autoFocus, hasFocus, elem]);\n\n const onClearButtonClick = useCallback(() => {\n container.getAsync('router').then((router: RoutingService) => {\n const initialRoute = router.getInitialRoute();\n const currentRoute = router.getRouteData();\n // if we already are on the initial route\n // and it's not the search route, clear the search instead of navigate\n if (initialRoute?.name === currentRoute.name && initialRoute?.name !== searchRoute) {\n setPhrase('');\n } else {\n clear(true);\n }\n });\n }, [container, setPhrase, clear]);\n\n const renderFilterBadges = (position: 'inside' | 'below') => {\n if (position !== filterBadgePosition) {\n return null;\n }\n if (!!showFilterBadges.guideCategory || !!showFilterBadges.tag) {\n return (\n <FilterBadges\n position={position}\n inputHasFocus={hasFocus}\n showGuideCategory={showFilterBadges.guideCategory}\n showTag={showFilterBadges.tag}\n searchContainerRef={elem.current}\n />\n );\n }\n };\n\n useTransitionEnd(autoFocusHandler);\n\n const showClear =\n showClearButton && (showFilterBadges.guideCategory || showFilterBadges.tag || phrase);\n const quickFilterAccessibilityProps = quickFiltersEnabled\n ? convertToStringAttributes({\n role: 'combobox',\n 'aria-autocomplete': 'list',\n autoComplete: 'off',\n 'aria-haspopup': 'listbox',\n })\n : {};\n\n return (\n <StyledSearchWrapper\n {...other}\n ref={elem}\n role={role}\n className={appendClassNames(className, 'humany-search')}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n data-has-search-symbol={showSearchButton ? 'true' : 'false'}\n >\n <Inner\n action=\".\"\n onSubmit={(e: any) => {\n e.preventDefault();\n elem.current?.getElementsByTagName('input')[0]?.blur();\n }}\n data-has-focus={hasFocus}\n >\n {showSearchButton && (\n <SearchButton\n aria-label={searchButtonLabel}\n type=\"submit\"\n title={searchButtonLabel}\n disabled={!phrase}\n onClick={search}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n >\n <SymbolBadge size={32} symbol={{ type: 'Svg', content: 'search' }} />\n </SearchButton>\n )}\n {renderFilterBadges('inside')}\n <Input\n type=\"search\"\n aria-label={ariaLabel}\n {...quickFilterAccessibilityProps}\n placeholder={\n showFilterBadges.guideCategory || showFilterBadges.tag ? '' : placeholder\n }\n onFocusChange={setHasFocus}\n onEscape={onEscape}\n onEnter={search}\n onChange={onChange}\n value={phrase}\n />\n {showClear && (\n <ClearButton\n aria-label={clearButtonLabel}\n type=\"reset\"\n hasFocus={hasFocus}\n title={clearButtonLabel}\n onClick={onClearButtonClick}\n >\n <SymbolBadge size={27} symbol={{ type: 'Svg', content: 'clear' }} />\n </ClearButton>\n )}\n {showChildren &&\n !showClear &&\n children.map((child) => (\n <Component key={child.id} id={child.id} branch=\"default\" />\n ))}\n <QuickFilter\n inputHasFocus={hasFocus}\n phrase={phrase}\n searchContainerRef={elem.current}\n />\n </Inner>\n {renderFilterBadges('below')}\n </StyledSearchWrapper>\n );\n};\n\nexport default Search;\n\nconst StyledSearchWrapper = styled.div<\n {\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n 'data-has-search-symbol': 'true' | 'false';\n } & any\n>`\n ${contentBox};\n width: 100%;\n padding: ${(p) => p.theme.sizes?.large};\n\n input {\n background-color: transparent;\n border: none;\n outline: none;\n min-width: 25%;\n flex: 1;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-weight: 300;\n font-style: italic;\n padding: 1em 0;\n color: ${(p) => p.theme.colors?.text};\n -webkit-appearance: none;\n\n ${(p) => p['data-has-search-symbol'] === 'true' && `text-indent: ${p.theme.sizes?.normal};`}\n\n ::placeholder {\n color: ${(p) => p.theme.colors?.text};\n }\n /* removes the 'X' from IE */\n &[type='search']::-ms-clear {\n display: none;\n width: 0;\n height: 0;\n }\n &[type='search']::-ms-reveal {\n display: none;\n width: 0;\n height: 0;\n }\n\n /* removes the 'X' from Chrome */\n &[type='search']::-webkit-search-decoration,\n &[type='search']::-webkit-search-cancel-button,\n &[type='search']::-webkit-search-results-button,\n &[type='search']::-webkit-search-results-decoration {\n display: none;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n button {\n background: transparent;\n border: none;\n padding: 0;\n font-size: ${(p) => p.theme.fonts?.large};\n transition: color 200ms ease-out;\n color: ${(p) =>\n p['data-has-focus'] || p['data-has-phrase'] ? p.theme.colors?.primary : '#000000'};\n cursor: pointer;\n > svg {\n height: 100%;\n }\n }\n`;\n\nconst Inner = styled.form<{ 'data-has-focus': boolean } & any>`\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n border: ${(p) => p.theme.inputBorder};\n border-radius: ${(p) => p.theme.borderRadius};\n background-color: #ffffff;\n position: relative;\n padding: 0 ${(p) => p.theme.sizes?.normal};\n\n ${(p) =>\n p['data-has-focus'] &&\n css`\n ${p.theme.accessibility?.isTabbing\n ? borderTabStyle(p)\n : `\n border-color: ${p.theme.colors?.primary};\n outline: none;\n input {\n outline: none;\n }\n `}\n `};\n`;\n\nconst SearchButton = styled(Button)<{\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n}>`\n padding: 0;\n height: 2em;\n\n svg {\n circle,\n line {\n stroke: ${(p) => (p['data-has-focus'] ? p.theme.colors?.primary : '#000000')};\n }\n }\n`;\n\nconst ClearButton = styled(Button)<{ hasFocus: boolean } & any>`\n &:focus-visible svg {\n ${borderTabStyle}\n }\n\n svg {\n vertical-align: top;\n\n circle,\n line,\n path {\n stroke: ${(p) => (p.hasFocus ? p.theme.colors?.primary : p.theme.colors?.text)};\n }\n }\n`;\n"],"names":["FilterBadge","_a","_b","text","className","filterType","handleClick","deleteAriaLabel","p","__objRest","ref","useRef","isFocused","setIsFocused","useState","React","Text","appendClassNames","e","Link","__spreadProps","__spreadValues","SymbolBadge","FilterBadges","inputHasFocus","searchContainerRef","showTag","showGuideCategory","position","activeFilterBadges","deleteFilterBadgeAriaLabel","useProperties","dispatch","useDispatch","name","params","useRouteData","isNavigatingWithKeyBoard","setIsNavigatingWithKeyboard","onKeyDown","useCallback","event","key","useEventListener","guideCategory","tag","tooltip","getFocusedFilterBadge","container","badges","handleFilterBadgeClick","id","keyboardNavigation","direction","inputElem","currentFocusedIndex","toFocus","useKeyPress","focusedBadgeIndex","isAtBeginningOfInput","isFocusingAFilterBadge","filtersToRemove","isFocusingInput","lastTag","renderBadge","type","StyledFilterBadge","tagItem","excludedIds","acc","t","Wrapper","Tooltip","FilterBadges$1","styled","css","borderTabStyle","match","title","phrase","filterItems","items","cloned","deepClone","i","matchTrail","buildMatchTrail","recursiveFilter","c","fn","categories","matching","flatten","res","trail","categoryTrail","result","category","getFocusedIndex","elem","anchors","a","getInputElem","focusInput","QuickFilterItemList","filterPhrase","rawItems","filterContainer","searchContainer","setItems","first","setFirst","quickFilters","autoSelect","useEffect","handleItemClicked","item","tagIds","data","buildListProps","level","StyledLink","Title","focusedIndex","focusFirst","focusLast","focusNext","focusPrev","ItemTree","QuickFilterItemList$1","matches","symbol","createTitle","index","start","bold","end","disabledCss","focused","_c","_d","QuickFilter","quickFilter","noMatchesLabel","useScroll","useContainer","events","wrapperRef","setWrapperRef","node","open","loading","filteredItems","useMemo","activeTags","Inner","NoMatches","Loader","contentBox","filterChanged","newValue","oldValue","arr1","arr2","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.44-next.5",
3
+ "version": "1.0.44",
4
4
  "description": "Search component for ACE Knowledge Widgets.",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "Telia Company AB",
@@ -21,12 +21,12 @@
21
21
  },
22
22
  "sideEffects": false,
23
23
  "dependencies": {
24
- "@telia-ace/knowledge-data-client": "1.0.7-next.5",
25
- "@telia-ace/knowledge-widget-core": "1.0.40-next.5",
26
- "@telia-ace/knowledge-widget-ui": "1.0.46-next.5",
27
- "@telia-ace/widget-routing": "^1.0.26-next.1",
28
- "@telia-ace/widget-types-grid": "^1.0.34-next.1",
29
- "@telia-ace/widget-utilities": "^1.0.14-next.1",
24
+ "@telia-ace/knowledge-data-client": "1.0.7",
25
+ "@telia-ace/knowledge-widget-core": "1.0.40",
26
+ "@telia-ace/knowledge-widget-ui": "1.0.46",
27
+ "@telia-ace/widget-routing": "^1.0.26",
28
+ "@telia-ace/widget-types-grid": "^1.0.34",
29
+ "@telia-ace/widget-utilities": "^1.0.14",
30
30
  "@webprovisions/platform": "^1.1.2"
31
31
  },
32
32
  "peerDependencies": {
@@ -36,10 +36,10 @@
36
36
  "react-dom": "^18.2.0"
37
37
  },
38
38
  "devDependencies": {
39
- "@emotion/react": "^11.10.6",
40
- "@emotion/styled": "^11.10.6",
41
- "@types/react": "^18.0.37",
42
- "@types/react-dom": "^18.0.11",
39
+ "@emotion/react": "^11.11.0",
40
+ "@emotion/styled": "^11.11.0",
41
+ "@types/react": "^18.2.6",
42
+ "@types/react-dom": "^18.2.4",
43
43
  "react": "^18.2.0",
44
44
  "react-dom": "^18.2.0"
45
45
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.b520d18c.js","sources":["../src/filter-badges.tsx","../src/utils.ts","../src/quick-filter-item-list.tsx","../src/quick-filter.tsx","../src/use-search.ts","../src/search.tsx"],"sourcesContent":["import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Link,\n SymbolBadge,\n Text,\n Tooltip,\n useDispatch,\n useEventListener,\n useKeyPress,\n useProperties,\n useRouteData,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { SearchComponentProps } from './search-component';\n\nconst FilterBadge: React.FC<any> = ({\n text,\n className,\n filterType,\n handleClick,\n deleteAriaLabel = '',\n ...p\n}) => {\n const ref = useRef<HTMLAnchorElement>();\n\n const [isFocused, setIsFocused] = useState(document.activeElement === ref.current);\n\n return (\n <Text\n className={appendClassNames(\n className,\n 'humany-filter-badge',\n isFocused ? 'humany-filter-badge-focused' : ''\n )}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleClick(e, filterType);\n }\n }}\n >\n {text}\n <Link\n {...p}\n ref={ref}\n tabIndex={0}\n onFocus={() => {\n setIsFocused(true);\n }}\n onBlur={() => {\n setIsFocused(false);\n }}\n role=\"button\"\n aria-label={deleteAriaLabel.replace('{{item}}', text)}\n onClick={(e) => handleClick(e, filterType)}\n >\n <SymbolBadge size={13} symbol={{ type: 'Svg', content: 'close' }} />\n </Link>\n </Text>\n );\n};\n\ntype Props = {\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n showGuideCategory: boolean;\n showTag: boolean;\n position: 'inside' | 'below';\n};\nconst FilterBadges: React.FC<Props> = ({\n inputHasFocus,\n searchContainerRef,\n showTag,\n showGuideCategory,\n position,\n}) => {\n const { activeFilterBadges, deleteFilterBadgeAriaLabel = '' } =\n useProperties<SearchComponentProps>();\n\n const dispatch = useDispatch();\n const { name, params } = useRouteData();\n const [isNavigatingWithKeyBoard, setIsNavigatingWithKeyboard] = useState(false);\n\n const onKeyDown = useCallback((event: KeyboardEvent) => {\n const { key } = event;\n\n if (['ArrowLeft', 'ArrowRight'].indexOf(key) === -1) {\n setIsNavigatingWithKeyboard(false);\n }\n }, []);\n\n useEventListener('keydown', onKeyDown, window);\n\n useEventListener('click', onKeyDown, window);\n\n const { guideCategory, tag, tooltip } = activeFilterBadges || {};\n\n const getFocusedFilterBadge = (container: HTMLElement) => {\n const badges = container.querySelectorAll(\n '.humany-filter-badge > a'\n ) as NodeListOf<HTMLElement>;\n return {\n badges,\n index: Array.from(badges).findIndex((e) => document.activeElement === e),\n };\n };\n\n const handleFilterBadgeClick = useCallback(\n (event: React.MouseEvent | React.KeyboardEvent, filterType: string, id?: string) => {\n event.preventDefault();\n dispatch('quick-filter:remove', { types: [filterType], ids: [id] });\n },\n [dispatch]\n );\n\n const keyboardNavigation = (\n direction: 'left' | 'right',\n inputElem: HTMLInputElement | null\n ) => {\n if (!searchContainerRef) {\n return;\n }\n const { badges, index: currentFocusedIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (badges.length) {\n let toFocus: HTMLElement | null = null;\n\n if (direction === 'left') {\n if (currentFocusedIndex === -1) {\n // if no badge is focused and direction is left\n // focus last badge\n toFocus = badges.item(badges.length - 1);\n } else if (currentFocusedIndex > 0) {\n // if there are more badges to the left, go one step back\n // do nothing if already focusing the most left badge\n toFocus = badges.item(currentFocusedIndex - 1);\n }\n } else if (direction === 'right') {\n if (currentFocusedIndex === badges.length - 1) {\n // if currently focusing the last badge, move focus to search input\n inputElem && inputElem.focus();\n } else if (badges.item(currentFocusedIndex + 1)) {\n toFocus = badges.item(currentFocusedIndex + 1);\n }\n }\n\n if (toFocus) {\n toFocus.focus();\n setIsNavigatingWithKeyboard(true);\n }\n }\n };\n\n useKeyPress(\n 'ArrowLeft',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (inputHasFocus || focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isAtBeginningOfInput =\n inputElem && inputElem.selectionStart !== null && inputElem.selectionStart <= 0;\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isAtBeginningOfInput || isFocusingAFilterBadge) {\n keyboardNavigation('left', inputElem);\n }\n }\n }, [inputHasFocus, searchContainerRef])\n );\n\n useKeyPress(\n 'ArrowRight',\n useCallback(() => {\n if (!searchContainerRef) {\n return;\n }\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n if (focusedBadgeIndex > -1) {\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n keyboardNavigation('right', inputElem);\n }\n }\n }, [searchContainerRef])\n );\n\n useKeyPress(\n 'Backspace',\n useCallback(\n (event: any) => {\n if (!searchContainerRef) {\n return;\n }\n let filtersToRemove: string[] = [];\n const { index: focusedBadgeIndex } = getFocusedFilterBadge(searchContainerRef);\n\n const inputElem: HTMLInputElement | null =\n searchContainerRef.querySelector('[data-type=\"search\"]');\n const isFocusingAFilterBadge = focusedBadgeIndex > -1;\n\n if (isFocusingAFilterBadge) {\n if (focusedBadgeIndex === 0) {\n if (showGuideCategory) {\n filtersToRemove = ['guideCategory'];\n } else if (showTag) {\n filtersToRemove = ['tag'];\n }\n } else if (focusedBadgeIndex === 1) {\n filtersToRemove = ['tag'];\n }\n } else {\n const isAtBeginningOfInput =\n inputElem &&\n inputElem.selectionStart !== null &&\n inputElem.selectionStart <= 0;\n\n if (isAtBeginningOfInput) {\n if (!!activeFilterBadges?.tag.length) {\n filtersToRemove = ['tag'];\n } else if (activeFilterBadges?.guideCategory) {\n filtersToRemove = ['guideCategory'];\n }\n }\n }\n\n if (filtersToRemove.length > 0) {\n event.preventDefault();\n let id: string | undefined = undefined;\n\n if (filtersToRemove.includes('tag')) {\n const lastTag = activeFilterBadges?.tag.at(-1);\n id = lastTag?.id;\n }\n\n dispatch('quick-filter:remove', { types: filtersToRemove, ids: [id] });\n }\n },\n [searchContainerRef, activeFilterBadges, showTag, showGuideCategory, dispatch]\n )\n );\n\n const renderBadge = useCallback(\n (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory' && guideCategory && showGuideCategory) {\n return (\n <StyledFilterBadge\n text={`@${guideCategory.title}`}\n routeName={name}\n filterType=\"guideCategory\"\n handleClick={handleFilterBadgeClick}\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n guideCategory: undefined,\n }}\n />\n );\n }\n if (type === 'tag' && !!tag?.length && showTag) {\n return tag.map((tagItem) => {\n const excludedIds = tag.reduce<string[]>((acc, t) => {\n if (t.id !== tagItem.id) {\n acc.push(t.id);\n }\n return acc;\n }, []);\n\n return (\n <StyledFilterBadge\n key={tagItem.id}\n className=\"humany-filter-badge\"\n text={`#${tagItem.title}`}\n routeName={name}\n filterType=\"tag\"\n handleClick={(event: any) =>\n handleFilterBadgeClick(event, 'tag', tagItem.id)\n }\n deleteAriaLabel={deleteFilterBadgeAriaLabel}\n params={{\n ...params,\n tag: excludedIds,\n }}\n />\n );\n });\n }\n return null;\n },\n [\n guideCategory,\n tag,\n name,\n params,\n showGuideCategory,\n showTag,\n isNavigatingWithKeyBoard,\n handleFilterBadgeClick,\n ]\n );\n\n if (!guideCategory && !tag) {\n return null;\n }\n\n return (\n <Wrapper className=\"humany-filter-badges\" position={position}>\n {guideCategory && tooltip ? (\n <Tooltip content={<>{tooltip}</>} sticky={false}>\n {renderBadge('guideCategory')}\n </Tooltip>\n ) : (\n renderBadge('guideCategory')\n )}\n {tag && renderBadge('tag')}\n </Wrapper>\n );\n};\n\nexport default FilterBadges;\n\nconst Wrapper = styled.div<{ position: 'inside' | 'below' }>`\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n\n ${(p) =>\n p.position === 'inside'\n ? css`\n &:not(:first-child) {\n margin: 0 0 0 ${p.theme.sizes?.normal};\n }\n `\n : css`\n margin: ${p.theme.sizes?.small} 0 0 0;\n span:first-child {\n margin-left: 0;\n }\n `}\n`;\n\nconst StyledFilterBadge = styled(FilterBadge)`\n display: flex;\n align-items: center;\n padding: ${(p) => `${p.theme.sizes?.small} calc(${p.theme.sizes?.normal}/2) `};\n background-color: ${(p) => p.theme.colors?.primary};\n border-radius: ${(p) => p.theme.borderRadius};\n font-weight: 300;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-style: italic;\n color: #ffffff;\n text-decoration: none;\n white-space: nowrap;\n\n margin: calc(${(p) => p.theme.sizes?.small} / 2);\n\n &.humany-filter-badge-focused:focus-within {\n ${borderTabStyle}\n background-color: transparent;\n\n svg {\n path {\n stroke: ${(p) => p.theme.colors?.primary};\n }\n }\n a {\n outline: none;\n }\n }\n\n svg {\n width: 17px;\n height: 11px;\n margin: 1px 0 0 ${(p) => p.theme.sizes?.small};\n path {\n stroke: #ffffff;\n stroke-width: 2px;\n }\n order: 1;\n }\n`;\n","import { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport { categoryTrail, deepClone } from '@telia-ace/widget-utilities';\n\nexport const match = (title: string, phrase: string) => {\n if (!phrase || !title) {\n return true;\n }\n\n return !!(title.toLowerCase().indexOf(phrase.toLowerCase()) > -1);\n};\n\nexport const filterItems = (\n items: (Tag | Category)[] = [],\n type: 'tag' | 'guideCategory',\n phrase: string\n): any[] => {\n if (!phrase) {\n return items;\n }\n\n const cloned = deepClone(items);\n\n if (type === 'tag') {\n return cloned.filter((i: Tag) => match(i.title, phrase));\n }\n\n const matchTrail = buildMatchTrail(cloned, phrase);\n const filtered = recursiveFilter(cloned, (c: Category) => matchTrail.indexOf(c.id) > -1);\n\n return filtered;\n};\n\nconst recursiveFilter = (items: Category[], fn: (c: Category) => boolean) => {\n return items.filter((i: Category) => {\n if (i.items && i.items.length) {\n i.items = recursiveFilter(i.items, fn);\n }\n\n return fn(i);\n });\n};\n\nconst buildMatchTrail = (categories: Category[], phrase: string) => {\n const flattened = flatten(categories);\n const matching = flattened.filter((c) => match(c.title, phrase)).map((c) => c.id);\n\n let res: string[] = [];\n\n matching.forEach((id) => {\n const trail = categoryTrail(id, categories);\n\n res = res.concat(trail);\n });\n\n return res;\n};\n\nconst flatten = (categories: Category[]): Category[] => {\n let result: Category[] = [];\n\n categories.forEach((category) => {\n result.push(category);\n\n if (Array.isArray(category.items)) {\n result = result.concat(flatten(category.items));\n }\n });\n\n return result;\n};\n","import { css, Theme } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport { Category, Tag } from '@telia-ace/knowledge-widget-core';\nimport {\n ItemTree,\n Link,\n Text,\n useDispatch,\n useEventListener,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { SearchComponentProps } from './search-component';\nimport { filterItems, match } from './utils';\n\ntype Props = {\n filterPhrase: string;\n items: Category[] | Tag[];\n filterType: 'guideCategory' | 'tag';\n searchContainer: HTMLElement | null;\n filterContainer: HTMLElement | null;\n inputHasFocus: boolean;\n};\n\nexport const getFocusedIndex = (elem: HTMLElement) => {\n const anchors = Array.from(elem?.getElementsByTagName('A') || []).filter(\n (a) => a.getAttribute('disabled') === null\n ) as HTMLAnchorElement[];\n return {\n anchors,\n focusedIndex: anchors.findIndex((e) => document.activeElement === e),\n };\n};\n\nconst getInputElem = (searchContainerRef: HTMLElement | null) => {\n return searchContainerRef\n ? (searchContainerRef.querySelector(\n '[data-type=\"search\"], input[type=\"search\"]'\n ) as HTMLElement | null)\n : null;\n};\n\nexport const focusInput = (searchContainerRef: HTMLElement | null) => {\n if (!searchContainerRef) {\n return;\n }\n const inputElem = getInputElem(searchContainerRef);\n if (inputElem) {\n inputElem.focus();\n }\n};\n\nconst QuickFilterItemList: React.FC<Props> = ({\n filterPhrase,\n items: rawItems,\n filterType,\n filterContainer,\n searchContainer,\n inputHasFocus,\n}) => {\n const [items, setItems] = useState<Category[] | Tag[]>(rawItems || []);\n const [first, setFirst] = useState<string | null>(null);\n const dispatch = useDispatch();\n const { activeFilterBadges, quickFilters } = useProperties<SearchComponentProps>();\n const autoSelect =\n (typeof quickFilters === 'object' && !!quickFilters.autoSelect) ||\n (typeof quickFilters === 'boolean' && !!quickFilters);\n\n useEffect(() => {\n setItems(filterItems(rawItems, filterType, filterPhrase));\n }, [filterPhrase, filterType, rawItems]);\n\n useEffect(() => {\n if (filterContainer) {\n const { anchors } = getFocusedIndex(filterContainer);\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n setFirst(id);\n }\n }\n }, [items, filterContainer]);\n\n const handleItemClicked = useCallback(\n (item: Partial<{ id: string }>, type: 'guideCategory' | 'tag') => {\n let tagIds = (activeFilterBadges?.tag || []).map((t) => t.id);\n\n if (type === 'tag' && item.id) {\n tagIds = tagIds.includes(item.id)\n ? tagIds.filter((id) => id !== item.id)\n : [...tagIds, item.id];\n }\n\n const data: { category?: string; tagIds: string[] } = {\n category: activeFilterBadges?.guideCategory\n ? activeFilterBadges.guideCategory.id\n : undefined,\n tagIds,\n };\n\n if (type === 'guideCategory') {\n data.category = item.id;\n }\n dispatch('quick-filter:add', data);\n },\n [activeFilterBadges, dispatch]\n );\n\n const buildListProps = (type: 'guideCategory' | 'tag') => {\n if (type === 'guideCategory') {\n return {\n renderItem: (item: Category, level: number) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n disabled={!match(item.title, filterPhrase)}\n tabIndex={!match(item.title, filterPhrase) ? -1 : 0}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n data-level={level}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n }\n return {\n renderLi: true,\n renderItem: (item: Tag) => (\n <StyledLink\n autoSelect={autoSelect && inputHasFocus && item.id === first}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleItemClicked(item, type);\n }\n }}\n onClick={() => {\n handleItemClicked(item, type);\n }}\n data-id={item.id}\n >\n <Title\n symbol=\"#\"\n title={item.title}\n phrase={filterPhrase}\n matches={match(item.title, filterPhrase)}\n />\n </StyledLink>\n ),\n };\n };\n\n useEventListener(\n 'keydown',\n (e: KeyboardEvent) => {\n const { key } = e;\n if (\n !filterContainer ||\n !(key === 'ArrowDown' || key === 'ArrowUp' || key === 'Enter')\n ) {\n return;\n }\n\n const { anchors, focusedIndex } = getFocusedIndex(filterContainer);\n\n if (key === 'Enter') {\n if (inputHasFocus && autoSelect) {\n const id = anchors[0]?.getAttribute('data-id');\n\n if (id) {\n handleItemClicked({ id }, filterType);\n }\n }\n return;\n }\n\n const focusFirst = () => anchors[0]?.focus();\n const focusLast = () => anchors[anchors.length - 1]?.focus();\n const focusNext = () => anchors[focusedIndex + 1]?.focus();\n const focusPrev = () => anchors[focusedIndex - 1]?.focus();\n\n if (inputHasFocus) {\n // Input is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n focusFirst();\n } else {\n focusLast();\n }\n } else if (focusedIndex > -1) {\n // A quick-filter-item is focused\n\n e.preventDefault();\n if (key === 'ArrowDown') {\n if (anchors.length > focusedIndex + 1) {\n focusNext();\n } else {\n focusInput(searchContainer);\n }\n } else {\n if (focusedIndex - 1 < 0) {\n focusInput(searchContainer);\n } else {\n focusPrev();\n }\n }\n }\n },\n window\n );\n\n return (\n <ItemTree\n tree={items}\n renderEmpty={false}\n ulProps={{ role: 'listbox' }}\n liProps={{ role: 'option' }}\n {...buildListProps(filterType)}\n />\n );\n};\n\nexport default QuickFilterItemList;\n\ntype TitleProps = {\n title: string;\n phrase: string;\n matches: boolean;\n symbol?: string;\n};\n\nconst Title: React.FC<TitleProps> = ({ title, phrase, matches, symbol = '' }) => {\n const createTitle = () => {\n if (!matches || !phrase) {\n return [title];\n }\n\n const index = title.toLowerCase().indexOf(phrase.toLowerCase());\n const start = title.substr(0, index);\n const bold = title.slice(index, index + phrase.length);\n const end = title.substr(index + phrase.length);\n return [start, bold, end];\n };\n\n const [start, bold, end] = createTitle();\n\n return (\n <Text>\n {symbol}\n {start}\n {bold ? <strong>{bold}</strong> : null}\n {end ? end : null}\n </Text>\n );\n};\n\nconst disabledCss = css`\n opacity: 0.5;\n pointer-events: none;\n`;\n\nconst focused = (p: { theme: Theme; 'data-level'?: number; autoSelect: boolean }) => css`\n background-color: ${p.theme.colors?.text};\n color: #ffffff;\n outline: none;\n\n span:first-child {\n border-color: ${p.theme.colors?.text};\n }\n`;\n\nconst StyledLink = styled(Link)<{ 'data-level'?: number; autoSelect: boolean }>`\n display: block;\n text-decoration: none;\n font-size: ${(p) => p.theme.fonts?.normal};\n\n ${(p) => p.disabled && disabledCss}\n color: ${(p) => p.theme.colors?.text};\n background-color: transparent;\n\n span {\n display: block;\n ${(p) =>\n p['data-level']\n ? `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.normal};`\n : `padding: calc(${p.theme.sizes?.normal} / 2) ${p.theme.sizes?.medium}; `}\n ${(p) => p['data-level'] && 'border-left: 2px solid'}\n }\n\n span:first-child {\n border-color: #e7e7e7;\n }\n\n ${(p) => p['data-level'] && `padding: 0 calc(${p.theme.sizes?.medium} * ${p['data-level']});`}\n\n ${(p) => p.autoSelect && focused}\n\n &:hover,\n &:focus {\n ${focused}\n }\n`;\n","import styled from '@emotion/styled';\nimport { Category, Tag, Widget } from '@telia-ace/knowledge-widget-core';\nimport {\n contentBox,\n Loader,\n useContainer,\n useProperties,\n useScroll,\n} from '@telia-ace/knowledge-widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useMemo, useRef } from 'react';\nimport QuickFilterItemList, { focusInput, getFocusedIndex } from './quick-filter-item-list';\nimport { SearchComponentProps } from './search-component';\n\ntype Props = {\n phrase: string;\n inputHasFocus: boolean;\n searchContainerRef: HTMLElement | null;\n};\n\nexport default ({ phrase = '', inputHasFocus, searchContainerRef }: Props) => {\n const {\n quickFilter = {\n open: false,\n loading: false,\n symbol: '',\n type: '',\n items: [],\n },\n activeFilterBadges,\n noMatchesLabel = 'No matching items',\n } = useProperties<SearchComponentProps>();\n const [css, ref] = useScroll(true);\n const container = useContainer();\n const { events } = container.get('$widget') as Widget;\n const wrapperRef = useRef() as React.MutableRefObject<HTMLDivElement | null>;\n\n const setWrapperRef = useCallback(\n (node: HTMLDivElement | null) => {\n if (node) {\n node.addEventListener(\n 'keydown',\n () => {\n const listItemFocused = getFocusedIndex(node).focusedIndex > -1;\n if (listItemFocused) {\n events.subscribeOnce('router:changed', () => {\n focusInput(searchContainerRef);\n });\n }\n },\n true\n );\n }\n\n wrapperRef.current = node;\n return node;\n },\n [searchContainerRef]\n );\n\n const { items = [], symbol, type, open, loading } = quickFilter;\n\n const filteredItems = useMemo(() => {\n const activeTags = (activeFilterBadges?.tag || []).map((tag) => tag.id);\n return (items as any[]).filter((item) => !activeTags.includes(item.id)) as\n | Tag[]\n | Category[];\n }, [items, activeFilterBadges]);\n\n if (!open || !symbol) {\n return null;\n }\n\n const filterPhrase = phrase.slice(phrase.indexOf(symbol) + 1);\n\n return (\n <Wrapper\n ref={setWrapperRef}\n data-loading={loading}\n className={appendClassNames(\n 'humany-quick-filter-dropdown',\n [type === 'guideCategory', 'humany-quick-filter-guide-categories'],\n [type === 'tag', 'humany-quick-filter-tags']\n )}\n >\n <Inner className=\"humany-quick-filter-dropdown-inner\" css={css} ref={ref}>\n {filteredItems.length > 0 ? (\n <QuickFilterItemList\n filterType={type as 'guideCategory' | 'tag'}\n items={filteredItems}\n filterPhrase={filterPhrase}\n filterContainer={ref.current}\n searchContainer={searchContainerRef}\n inputHasFocus={inputHasFocus}\n />\n ) : (\n <NoMatches>{noMatchesLabel}</NoMatches>\n )}\n </Inner>\n <Loader loading={loading} />\n </Wrapper>\n );\n};\n\nconst Wrapper = styled.div`\n ${(p) => contentBox(p)};\n position: absolute;\n top: calc(100% + ${(p) => p.theme.sizes?.normal});\n left: 0;\n right: 0;\n z-index: 1;\n overflow: hidden;\n`;\n\nconst Inner = styled.div<{ css: string }>`\n max-height: 300px;\n overflow: auto;\n padding: ${(p) => p.theme.sizes?.medium} 0;\n ${(p) => p.css}\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n }\n li div {\n ${(p) => `margin: ${p.theme.sizes?.normal} 0;`}\n }\n`;\n\nconst NoMatches = styled.p`\n margin: 0 ${(p) => p.theme.sizes?.normal};\n color: ${(p) => p.theme.colors?.text};\n`;\n","import {\n useDebounce,\n useDispatch,\n usePrevious,\n useProperties,\n} from '@telia-ace/knowledge-widget-ui';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { SearchComponentProps } from './search-component';\n\ntype ReturnType = [\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => void,\n (navigateToHome: boolean) => void,\n React.MutableRefObject<HTMLElement | null>\n];\n\nconst filterChanged = <T extends Optional<{ id: string } | { id: string }[]> | null>(\n newValue: T,\n oldValue: T\n) => {\n if (newValue && !oldValue) {\n return true;\n }\n if (!newValue && oldValue) {\n return true;\n }\n if (newValue && oldValue) {\n if (!Array.isArray(newValue) && !Array.isArray(oldValue)) {\n if (newValue.id !== oldValue.id) {\n return true;\n }\n } else {\n const areEqual = (arr1: T[], arr2: T[]) => {\n if (arr1.length === arr2.length) {\n return arr1.every((item, index) => {\n if (item === arr2[index]) {\n return true;\n }\n return false;\n });\n }\n return false;\n };\n\n if (!areEqual(newValue as T[], oldValue as T[])) {\n return true;\n }\n }\n }\n return false;\n};\n\nexport default (\n phrase: string,\n params: { [key: string]: any } = {},\n debounce = true\n): ReturnType => {\n const dispatch = useDispatch();\n\n const {\n quickFilters = false,\n quickFilter = { open: false },\n activeFilterBadges,\n filterBadges = false,\n incremental = 600,\n } = useProperties<SearchComponentProps>();\n\n const debouncedPhrase = useDebounce(\n phrase,\n typeof incremental === 'boolean' ? 600 : incremental\n );\n const previousDebouncedPhrase = usePrevious(debouncedPhrase);\n const previousFilters = usePrevious(activeFilterBadges);\n const ref = useRef<null | HTMLElement>(null);\n\n const dispatchSearch = useCallback(\n (value: string = '') => {\n if (filterBadges) {\n const filtersChanged =\n filterChanged(\n activeFilterBadges?.guideCategory,\n previousFilters?.guideCategory\n ) || filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n return dispatch('search', {\n value,\n filtersChanged,\n filters: {\n tagIds: (activeFilterBadges?.tag || []).map((t) => t.id),\n guideCategoryId: activeFilterBadges?.guideCategory?.id || null,\n },\n });\n }\n return dispatch('search', { value });\n },\n [dispatch, activeFilterBadges]\n );\n\n const dispatchClear = useCallback(\n (navigateToHome: boolean) => {\n dispatch('clear', { navigateToHome });\n },\n [dispatch]\n );\n\n const removeFilterKeywords = (input: string) => {\n if (quickFilters) {\n return input.replace(/([@#].*)/g, '');\n }\n return input;\n };\n\n const submitSearch = useCallback(\n (arg: React.KeyboardEvent | React.MouseEvent | boolean) => {\n if (quickFilter.open && (arg as React.KeyboardEvent).preventDefault) {\n (arg as React.KeyboardEvent).preventDefault();\n return;\n }\n\n const activeElement = document.activeElement as HTMLElement;\n const isSearching =\n ref.current && typeof ref.current.contains === 'function'\n ? ref.current.contains(activeElement)\n : false;\n const cleanedPhrase = removeFilterKeywords(phrase);\n\n if (\n (typeof arg === 'boolean' && arg) ||\n (cleanedPhrase.length && isSearching) ||\n activeFilterBadges?.guideCategory ||\n (!!activeFilterBadges?.tag.length && isSearching)\n ) {\n dispatchSearch(cleanedPhrase);\n } else {\n dispatchClear(isSearching);\n }\n },\n [ref, phrase, quickFilter, dispatchClear, activeFilterBadges, dispatchSearch]\n );\n\n useEffect(() => {\n const filtersChanged =\n filterChanged(activeFilterBadges?.guideCategory, previousFilters?.guideCategory) ||\n filterChanged(activeFilterBadges?.tag, previousFilters?.tag);\n\n const phrase = debouncedPhrase ? removeFilterKeywords(debouncedPhrase) : debouncedPhrase;\n const previousPhrase = previousDebouncedPhrase\n ? removeFilterKeywords(previousDebouncedPhrase)\n : previousDebouncedPhrase;\n if (\n typeof previousPhrase !== 'undefined' &&\n previousPhrase !== phrase &&\n phrase !== params.phrase &&\n debounce &&\n !quickFilter.open\n ) {\n submitSearch(filtersChanged);\n }\n }, [debouncedPhrase, quickFilter.open, activeFilterBadges, submitSearch]);\n\n useEffect(() => {\n if (phrase && quickFilters) {\n const quickFiltersGuideCategory =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.guideCategory);\n\n const quickFiltersTag =\n (typeof quickFilters === 'boolean' && !!quickFilters) ||\n (typeof quickFilters === 'object' && !!quickFilters.tag);\n\n if (quickFiltersGuideCategory && phrase.indexOf('@') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'guideCategory', symbol: '@' });\n }\n\n if (quickFiltersTag && phrase.indexOf('#') === phrase.length - 1) {\n dispatch('quick-filter:open', { type: 'tag', symbol: '#' });\n }\n }\n\n if (quickFilter.open && phrase.indexOf('@') === -1 && phrase.indexOf('#') === -1) {\n dispatch('quick-filter:close');\n }\n }, [phrase]);\n\n return [submitSearch, dispatchClear, ref];\n};\n","import { css } from '@emotion/react';\nimport styled from '@emotion/styled';\nimport {\n borderTabStyle,\n Button,\n contentBox,\n convertToStringAttributes,\n Input,\n SymbolBadge,\n useChildren,\n useContainer,\n useDispatch,\n useProperties,\n useRouteData,\n useTransitionEnd,\n useWidgetEvent,\n} from '@telia-ace/knowledge-widget-ui';\nimport { RoutingService } from '@telia-ace/widget-routing';\nimport { Component } from '@telia-ace/widget-types-grid';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport FilterBadges from './filter-badges';\nimport QuickFilter from './quick-filter';\nimport { SearchComponentProps } from './search-component';\nimport useSearch from './use-search';\n\ntype Props = {\n className: string;\n role?: string;\n};\n\nconst Search: React.FC<Props> = ({ className, ...other }) => {\n const {\n showSearchButton,\n showClearButton,\n role = 'search',\n autoFocus,\n placeholder,\n searchButtonLabel,\n clearButtonLabel,\n ariaLabel,\n route: searchRoute = 'search',\n incremental = true,\n showChildren = false,\n quickFilter,\n quickFilters: quickFiltersEnabled,\n filterBadges,\n } = useProperties<SearchComponentProps>();\n const { params } = useRouteData();\n const [hasFocus, setHasFocus] = useState(false);\n const [phrase, setPhrase] = useState(params.phrase || '');\n const [showFilterBadges, setShowFilterBadges] = useState({\n guideCategory: false,\n tag: false,\n });\n const container = useContainer();\n const children = useChildren();\n const dispatch = useDispatch();\n const { position: filterBadgePosition = 'inside' } =\n typeof filterBadges === 'object' ? filterBadges : {};\n\n useEffect(() => {\n const { guideCategory, tag } = params;\n const showGuideCategory =\n typeof filterBadges === 'object' ? !!filterBadges.guideCategory : !!filterBadges;\n const showTag = typeof filterBadges === 'object' ? !!filterBadges.tag : !!filterBadges;\n\n setShowFilterBadges({\n guideCategory: showGuideCategory && !!guideCategory,\n tag: showTag && !!tag,\n });\n }, [filterBadges, params]);\n\n // Remove quick-filter symbol, quick-filter phrase\n // and close quick-filter when route changed\n useWidgetEvent(\n 'router:changed',\n () => {\n if (quickFilter) {\n const { open, symbol } = quickFilter;\n\n if (open) {\n if (symbol) {\n const cleaned = phrase.replace(phrase.slice(phrase.indexOf(symbol)), '');\n setPhrase(cleaned);\n }\n\n dispatch('quick-filter:close');\n }\n }\n },\n [quickFilter, phrase, setPhrase, dispatch]\n );\n\n const [search, clear, elem] = useSearch(phrase, params, !!incremental);\n\n useEffect(() => {\n setPhrase(params.phrase || '');\n }, [params.phrase]);\n\n const onChange = useCallback(\n (value: string) => {\n setPhrase(value);\n },\n [setPhrase]\n );\n\n const onEscape = useCallback(() => {\n dispatch('quick-filter:close').then(() => clear(true));\n }, [dispatch, clear]);\n\n const autoFocusHandler = useCallback(() => {\n if (autoFocus && !hasFocus) {\n elem.current?.getElementsByTagName('input')[0]?.focus();\n }\n }, [autoFocus, hasFocus, elem]);\n\n const onClearButtonClick = useCallback(() => {\n container.getAsync('router').then((router: RoutingService) => {\n const initialRoute = router.getInitialRoute();\n const currentRoute = router.getRouteData();\n // if we already are on the initial route\n // and it's not the search route, clear the search instead of navigate\n if (initialRoute?.name === currentRoute.name && initialRoute?.name !== searchRoute) {\n setPhrase('');\n } else {\n clear(true);\n }\n });\n }, [container, setPhrase, clear]);\n\n const renderFilterBadges = (position: 'inside' | 'below') => {\n if (position !== filterBadgePosition) {\n return null;\n }\n if (!!showFilterBadges.guideCategory || !!showFilterBadges.tag) {\n return (\n <FilterBadges\n position={position}\n inputHasFocus={hasFocus}\n showGuideCategory={showFilterBadges.guideCategory}\n showTag={showFilterBadges.tag}\n searchContainerRef={elem.current}\n />\n );\n }\n };\n\n useTransitionEnd(autoFocusHandler);\n\n const showClear =\n showClearButton && (showFilterBadges.guideCategory || showFilterBadges.tag || phrase);\n const quickFilterAccessibilityProps = quickFiltersEnabled\n ? convertToStringAttributes({\n role: 'combobox',\n 'aria-autocomplete': 'list',\n autoComplete: 'off',\n 'aria-haspopup': 'listbox',\n })\n : {};\n\n return (\n <StyledSearchWrapper\n {...other}\n ref={elem}\n role={role}\n className={appendClassNames(className, 'humany-search')}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n data-has-search-symbol={showSearchButton ? 'true' : 'false'}\n >\n <Inner\n action=\".\"\n onSubmit={(e: any) => {\n e.preventDefault();\n elem.current?.getElementsByTagName('input')[0]?.blur();\n }}\n data-has-focus={hasFocus}\n >\n {showSearchButton && (\n <SearchButton\n aria-label={searchButtonLabel}\n type=\"submit\"\n title={searchButtonLabel}\n disabled={!phrase}\n onClick={search}\n data-has-phrase={!!phrase}\n data-has-focus={hasFocus}\n >\n <SymbolBadge size={32} symbol={{ type: 'Svg', content: 'search' }} />\n </SearchButton>\n )}\n {renderFilterBadges('inside')}\n <Input\n type=\"search\"\n aria-label={ariaLabel}\n {...quickFilterAccessibilityProps}\n placeholder={\n showFilterBadges.guideCategory || showFilterBadges.tag ? '' : placeholder\n }\n onFocusChange={setHasFocus}\n onEscape={onEscape}\n onEnter={search}\n onChange={onChange}\n value={phrase}\n />\n {showClear && (\n <ClearButton\n aria-label={clearButtonLabel}\n type=\"reset\"\n hasFocus={hasFocus}\n title={clearButtonLabel}\n onClick={onClearButtonClick}\n >\n <SymbolBadge size={27} symbol={{ type: 'Svg', content: 'clear' }} />\n </ClearButton>\n )}\n {showChildren &&\n !showClear &&\n children.map((child) => (\n <Component key={child.id} id={child.id} branch=\"default\" />\n ))}\n <QuickFilter\n inputHasFocus={hasFocus}\n phrase={phrase}\n searchContainerRef={elem.current}\n />\n </Inner>\n {renderFilterBadges('below')}\n </StyledSearchWrapper>\n );\n};\n\nexport default Search;\n\nconst StyledSearchWrapper = styled.div<\n {\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n 'data-has-search-symbol': 'true' | 'false';\n } & any\n>`\n ${contentBox};\n width: 100%;\n padding: ${(p) => p.theme.sizes?.large};\n\n input {\n background-color: transparent;\n border: none;\n outline: none;\n min-width: 25%;\n flex: 1;\n font-size: ${(p) => p.theme.fonts?.normal};\n font-weight: 300;\n font-style: italic;\n padding: 1em 0;\n color: ${(p) => p.theme.colors?.text};\n -webkit-appearance: none;\n\n ${(p) => p['data-has-search-symbol'] === 'true' && `text-indent: ${p.theme.sizes?.normal};`}\n\n ::placeholder {\n color: ${(p) => p.theme.colors?.text};\n }\n /* removes the 'X' from IE */\n &[type='search']::-ms-clear {\n display: none;\n width: 0;\n height: 0;\n }\n &[type='search']::-ms-reveal {\n display: none;\n width: 0;\n height: 0;\n }\n\n /* removes the 'X' from Chrome */\n &[type='search']::-webkit-search-decoration,\n &[type='search']::-webkit-search-cancel-button,\n &[type='search']::-webkit-search-results-button,\n &[type='search']::-webkit-search-results-decoration {\n display: none;\n }\n\n &:focus {\n outline: none;\n }\n }\n\n button {\n background: transparent;\n border: none;\n padding: 0;\n font-size: ${(p) => p.theme.fonts?.large};\n transition: color 200ms ease-out;\n color: ${(p) =>\n p['data-has-focus'] || p['data-has-phrase'] ? p.theme.colors?.primary : '#000000'};\n cursor: pointer;\n > svg {\n height: 100%;\n }\n }\n`;\n\nconst Inner = styled.form<{ 'data-has-focus': boolean } & any>`\n display: flex;\n flex-wrap: nowrap;\n align-items: center;\n border: ${(p) => p.theme.inputBorder};\n border-radius: ${(p) => p.theme.borderRadius};\n background-color: #ffffff;\n position: relative;\n padding: 0 ${(p) => p.theme.sizes?.normal};\n\n ${(p) =>\n p['data-has-focus'] &&\n css`\n ${p.theme.accessibility?.isTabbing\n ? borderTabStyle(p)\n : `\n border-color: ${p.theme.colors?.primary};\n outline: none;\n input {\n outline: none;\n }\n `}\n `};\n`;\n\nconst SearchButton = styled(Button)<{\n 'data-has-focus': boolean;\n 'data-has-phrase': boolean;\n}>`\n padding: 0;\n height: 2em;\n\n svg {\n circle,\n line {\n stroke: ${(p) => (p['data-has-focus'] ? p.theme.colors?.primary : '#000000')};\n }\n }\n`;\n\nconst ClearButton = styled(Button)<{ hasFocus: boolean } & any>`\n &:focus-visible svg {\n ${borderTabStyle}\n }\n\n svg {\n vertical-align: top;\n\n circle,\n line,\n path {\n stroke: ${(p) => (p.hasFocus ? p.theme.colors?.primary : p.theme.colors?.text)};\n }\n }\n`;\n"],"names":["FilterBadge","_a","_b","text","className","filterType","handleClick","deleteAriaLabel","p","__objRest","ref","useRef","isFocused","setIsFocused","useState","React","Text","appendClassNames","e","Link","__spreadProps","__spreadValues","SymbolBadge","FilterBadges","inputHasFocus","searchContainerRef","showTag","showGuideCategory","position","activeFilterBadges","deleteFilterBadgeAriaLabel","useProperties","dispatch","useDispatch","name","params","useRouteData","isNavigatingWithKeyBoard","setIsNavigatingWithKeyboard","onKeyDown","useCallback","event","key","useEventListener","guideCategory","tag","tooltip","getFocusedFilterBadge","container","badges","handleFilterBadgeClick","id","keyboardNavigation","direction","inputElem","currentFocusedIndex","toFocus","useKeyPress","focusedBadgeIndex","isAtBeginningOfInput","isFocusingAFilterBadge","filtersToRemove","lastTag","renderBadge","type","StyledFilterBadge","tagItem","excludedIds","acc","t","Wrapper","Tooltip","FilterBadges$1","styled","css","borderTabStyle","match","title","phrase","filterItems","items","cloned","deepClone","i","matchTrail","buildMatchTrail","recursiveFilter","c","fn","categories","matching","flatten","res","trail","categoryTrail","result","category","getFocusedIndex","elem","anchors","a","getInputElem","focusInput","QuickFilterItemList","filterPhrase","rawItems","filterContainer","searchContainer","setItems","first","setFirst","quickFilters","autoSelect","useEffect","handleItemClicked","item","tagIds","data","buildListProps","level","StyledLink","Title","focusedIndex","focusFirst","focusLast","focusNext","focusPrev","ItemTree","QuickFilterItemList$1","matches","symbol","createTitle","index","start","bold","end","disabledCss","focused","_c","_d","QuickFilter","quickFilter","noMatchesLabel","useScroll","useContainer","events","wrapperRef","setWrapperRef","node","open","loading","filteredItems","useMemo","activeTags","Inner","NoMatches","Loader","contentBox","filterChanged","newValue","oldValue","arr1","arr2","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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"}