PageSourceSearch

https://www.uts.edu.au/dist/assets/js/Search/SearchPrompt/SearchPrompt.js

js uts.edu.au collected 2026-09-24 07:17:34 UTC 35,179 bytes, 843 lines download raw bytes

1var SearchPrompt = (function (React) {
2    'use strict';
3
4    /******************************************************************************
5    Copyright (c) Microsoft Corporation.
6
7    Permission to use, copy, modify, and/or distribute this software for any
8    purpose with or without fee is hereby granted.
9
10    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
11    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
13    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
15    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16    PERFORMANCE OF THIS SOFTWARE.
17    ***************************************************************************** */
18    /* global Reflect, Promise, SuppressedError, Symbol */
19
20
21    var __assign = function() {
22        __assign = Object.assign || function __assign(t) {
23            for (var s, i = 1, n = arguments.length; i < n; i++) {
24                s = arguments[i];
25                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
26            }
27            return t;
28        };
29        return __assign.apply(this, arguments);
30    };
31
32    function __awaiter(thisArg, _arguments, P, generator) {
33        function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
34        return new (P || (P = Promise))(function (resolve, reject) {
35            function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
36            function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
37            function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
38            step((generator = generator.apply(thisArg, _arguments || [])).next());
39        });
40    }
41
42    function __generator(thisArg, body) {
43        var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
44        return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
45        function verb(n) { return function (v) { return step([n, v]); }; }
46        function step(op) {
47            if (f) throw new TypeError("Generator is already executing.");
48            while (g && (g = 0, op[0] && (_ = 0)), _) try {
49                if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
50                if (y = 0, t) op = [op[0] & 2, t.value];
51                switch (op[0]) {
52                    case 0: case 1: t = op; break;
53                    case 4: _.label++; return { value: op[1], done: false };
54                    case 5: _.label++; y = op[1]; op = [0]; continue;
55                    case 7: op = _.ops.pop(); _.trys.pop(); continue;
56                    default:
57                        if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
58                        if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
59                        if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
60                        if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
61                        if (t[2]) _.ops.pop();
62                        _.trys.pop(); continue;
63                }
64                op = body.call(thisArg, _);
65            } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
66            if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
67        }
68    }
69
70    function __read(o, n) {
71        var m = typeof Symbol === "function" && o[Symbol.iterator];
72        if (!m) return o;
73        var i = m.call(o), r, ar = [], e;
74        try {
75            while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
76        }
77        catch (error) { e = { error: error }; }
78        finally {
79            try {
80                if (r && !r.done && (m = i["return"])) m.call(i);
81            }
82            finally { if (e) throw e.error; }
83        }
84        return ar;
85    }
86
87    function __spreadArray(to, from, pack) {
88        if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
89            if (ar || !(i in from)) {
90                if (!ar) ar = Array.prototype.slice.call(from, 0, i);
91                ar[i] = from[i];
92            }
93        }
94        return to.concat(ar || Array.prototype.slice.call(from));
95    }
96
97    typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
98        var e = new Error(message);
99        return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
100    };
101
102    function _typeof(o) {
103      "@babel/helpers - typeof";
104
105      return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
106        return typeof o;
107      } : function (o) {
108        return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
109      }, _typeof(o);
110    }
111
112    var serverURL = '/api/search';
113    var defaults = {
114      error: 'An error has occured, please reload the page or try again later.',
115      minSearchString: 3,
116      group: 'All',
117      groupCourses: 'Courses',
118      pageSize: 10,
119      authorizedKeys: ['filters', 'group', 'scholarshipgroup', 'page', 'pageid', 'pagesize', 'sorttype', 'sortvalue', 'term'],
120      sortOptions: {
121        name: '',
122        label: 'Select sort option',
123        prefix: 'Sort by:',
124        optionsLabel: 'sort by options list'
125      },
126      clearFlag: {
127        filter: 'All',
128        status: false
129      }
130    };
131    var END_POINTS = {
132      search: "".concat(serverURL, "/contentsearch"),
133      autocomplete: "".concat(serverURL, "/quicksearch"),
134      courses: "".concat(serverURL, "/coursesearch"),
135      scholarships: "".concat(serverURL, "/scholarshipsearch")
136    };
137    var filtersJoint = '@@@@@@';
138    /**
139     * This fetches data to an endpoint
140     * @param endpoint string
141     * @param body string - payload
142     * @returns object
143     */
144    var dataFetcher = function dataFetcher(endpoint, body) {
145      return __awaiter(void 0, void 0, void 0, function () {
146        var response, data;
147        return __generator(this, function (_a) {
148          switch (_a.label) {
149            case 0:
150              _a.trys.push([0, 3,, 4]);
151              response = fetch(endpoint, {
152                method: 'POST',
153                headers: {
154                  'Content-type': 'application/json'
155                },
156                body: JSON.stringify(body)
157              });
158              return [4 /*yield*/, response];
159            case 1:
160              if (!_a.sent().ok) {
161                throw new Error('Network response was not Ok');
162              }
163              return [4 /*yield*/, response];
164            case 2:
165              data = _a.sent().json();
166              return [2 /*return*/, data];
167            case 3:
168              _a.sent();
169              return [3 /*break*/, 4];
170            case 4:
171              return [2 /*return*/];
172          }
173        });
174      });
175    };
176    var useDebounce = function useDebounce(inputValue, delay) {
177      var _a = __read(React.useState(inputValue), 2),
178        debouncedValue = _a[0],
179        setDebouncedValue = _a[1];
180      React.useEffect(function () {
181        var handler = setTimeout(function () {
182          setDebouncedValue(inputValue);
183        }, delay);
184        return function () {
185          clearTimeout(handler);
186        };
187      }, [inputValue, delay]);
188      return debouncedValue;
189    };
190    var getType = function getType(obj) {
191      var lowerCaseTheFirstLetter = function lowerCaseTheFirstLetter(str) {
192        return str[0].toLowerCase() + str.slice(1);
193      };
194      var type = _typeof(obj);
195      if (type !== 'object') {
196        return type;
197      }
198      return lowerCaseTheFirstLetter(Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1'));
199    };
200    var validateAutoCompleteData = function validateAutoCompleteData(data) {
201      var defaultResponse = {
202        results: true,
203        suggestions: true,
204        log: []
205      };
206      var updatedResponse = __assign({}, defaultResponse);
207      if (data) {
208        var results = data.results,
209          suggestions = data.suggestions;
210        if (getType(results) === 'array' && getType(suggestions) === 'array') {
211          // Checking data integrity for: Results
212          if (results.length > 0) {
213            var tempInvalidResults_2 = [];
214            results.map(function (result) {
215              if (!result.contentType || !result.title || !result.url) {
216                updatedResponse.results = false;
217                tempInvalidResults_2.push(!result.contentType ? 'contentType' : '', !result.title ? 'title' : '', !result.url ? 'url' : '');
218              }
219            });
220            if (tempInvalidResults_2.length > 0) {
221              updatedResponse.log.push({
222                'Results data missing': __spreadArray([], __read(new Set(tempInvalidResults_2)), false).filter(function (entry) {
223                  return entry !== '';
224                })
225              });
226            }
227          }
228          // Checking data integrity for: Suggestions
229          if (suggestions.length > 0) {
230            var tempInvalidSuggestions_1 = [];
231            suggestions.map(function (suggestion) {
232              if (typeof suggestion !== 'string') {
233                updatedResponse.suggestions = false;
234                tempInvalidSuggestions_1.push('not a string');
235              }
236            });
237            if (tempInvalidSuggestions_1.length > 0) {
238              updatedResponse.log.push({
239                'Suggestions data invalid': __spreadArray([], __read(new Set(tempInvalidSuggestions_1)), false).filter(function (entry) {
240                  return entry !== '';
241                })
242              });
243            }
244          }
245        } else {
246          return {
247            results: false,
248            suggestions: false,
249            log: ['Minimum data structure not met.']
250          };
251        }
252      }
253      return updatedResponse;
254    };
255
256    function getDefaultExportFromCjs (x) {
257    	return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
258    }
259
260    var classnames = {exports: {}};
261
262    (function (module) {
263      /* global define */
264
265      (function () {
266
267        var hasOwn = {}.hasOwnProperty;
268        function classNames() {
269          var classes = '';
270          for (var i = 0; i < arguments.length; i++) {
271            var arg = arguments[i];
272            if (arg) {
273              classes = appendClass(classes, parseValue(arg));
274            }
275          }
276          return classes;
277        }
278        function parseValue(arg) {
279          if (typeof arg === 'string' || typeof arg === 'number') {
280            return arg;
281          }
282          if (_typeof(arg) !== 'object') {
283            return '';
284          }
285          if (Array.isArray(arg)) {
286            return classNames.apply(null, arg);
287          }
288          if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
289            return arg.toString();
290          }
291          var classes = '';
292          for (var key in arg) {
293            if (hasOwn.call(arg, key) && arg[key]) {
294              classes = appendClass(classes, key);
295            }
296          }
297          return classes;
298        }
299        function appendClass(value, newClass) {
300          if (!newClass) {
301            return value;
302          }
303          if (value) {
304            return value + ' ' + newClass;
305          }
306          return value + newClass;
307        }
308        if (module.exports) {
309          classNames["default"] = classNames;
310          module.exports = classNames;
311        } else {
312          window.classNames = classNames;
313        }
314      })();
315    })(classnames);
316    var classnamesExports = classnames.exports;
317    var classNames = /*@__PURE__*/getDefaultExportFromCjs(classnamesExports);
318
319    var ContentTypeFilter = function ContentTypeFilter(props) {
320      var introText = 'Category Filters:';
321      var groupFacets = props.groupFacets,
322        _a = props.callBack,
323        callBack = _a === void 0 ? function () {} : _a,
324        _b = props.allowUnselect,
325        allowUnselect = _b === void 0 ? false : _b,
326        _c = props.isHeader,
327        isHeader = _c === void 0 ? false : _c,
328        preSelected = props.preSelected,
329        _d = props.showCounts,
330        showCounts = _d === void 0 ? true : _d;
331      var _e = __read(React.useState(preSelected), 2),
332        selectedValue = _e[0],
333        setSelectedValue = _e[1];
334      /**
335       * This toggles the contentType buttons (search prompt) or sends the selected value (search results)
336       * @param value string
337       */
338      var handleSelect = function handleSelect(value) {
339        if (value === selectedValue && allowUnselect) {
340          callBack(defaults.group);
341          setSelectedValue(defaults.group);
342        } else {
343          setSelectedValue(value);
344          callBack(value);
345        }
346      };
347      /**
348       * Updates the selected value on change
349       */
350      React.useEffect(function () {
351        setSelectedValue(preSelected);
352      }, [preSelected]);
353      return /*#__PURE__*/React.createElement("div", {
354        className: classNames("contentTypeFilter", {
355          'contentTypeFilter--header': isHeader
356        })
357      }, /*#__PURE__*/React.createElement("div", {
358        role: 'group',
359        "aria-labelledby": 'categoryFiltersLabel',
360        className: 'contentTypeFilter__group'
361      }, /*#__PURE__*/React.createElement("span", {
362        id: 'categoryFiltersLabel',
363        className: 'sr-only'
364      }, introText), groupFacets === null || groupFacets === void 0 ? void 0 : groupFacets.map(function (groupFacet) {
365        var value = groupFacet.value,
366          _a = groupFacet.count,
367          count = _a === void 0 ? 0 : _a,
368          name = groupFacet.name;
369        return /*#__PURE__*/React.createElement("button", {
370          key: groupFacet.value,
371          className: classNames('contentTypeFilter__button', {
372            'contentTypeFilter__button--selected': value === selectedValue
373          }),
374          disabled: !isHeader && count === 0,
375          role: 'radio',
376          "aria-checked": value === selectedValue,
377          "aria-label": count > 0 ? "".concat(name, " item count ").concat(count) : undefined,
378          onClick: function onClick() {
379            return handleSelect(value);
380          }
381        }, name, ' ', showCounts && count > 0 && ( /*#__PURE__*/React.createElement("span", {
382          className: ''
383        }, "(", count.toLocaleString(), ")")));
384      })));
385    };
386
387    var CurrentQuickLinks = function CurrentQuickLinks(props) {
388      var links = props.links,
389        label = props.label;
390      return /*#__PURE__*/React.createElement("div", {
391        className: 'searchPrompt__quick-links'
392      }, /*#__PURE__*/React.createElement("h2", {
393        className: 'searchPrompt__quick-links-label'
394      }, label), /*#__PURE__*/React.createElement("ul", {
395        className: 'searchPrompt__quick-links-list'
396      }, links.map(function (link) {
397        return /*#__PURE__*/React.createElement("li", {
398          key: link.text,
399          className: ''
400        }, /*#__PURE__*/React.createElement("a", {
401          href: link.href,
402          target: link.target,
403          className: 'searchPrompt__link'
404        }, /*#__PURE__*/React.createElement("div", {
405          className: 'searchPrompt__link-item'
406        }, /*#__PURE__*/React.createElement("i", {
407          className: 'searchPrompt__link-icon',
408          "aria-hidden": 'true'
409        }, "arrow_right_alt"), /*#__PURE__*/React.createElement("span", {
410          className: 'searchPrompt__link-text'
411        }, link.text))));
412      })));
413    };
414
415    var getAutoCompletes = function getAutoCompletes(props) {
416      return __awaiter(void 0, void 0, void 0, function () {
417        var _a, baseURL, searchTerm, contentType, callBack, pageId, body, response, validData, aggregatedAutocompleteItems;
418        var _b, _c;
419        return __generator(this, function (_d) {
420          switch (_d.label) {
421            case 0:
422              _a = props.baseURL, baseURL = _a === void 0 ? '' : _a, searchTerm = props.searchTerm, contentType = props.contentType, callBack = props.callBack, pageId = props.pageId;
423              if (!(searchTerm.length >= defaults.minSearchString)) return [3 /*break*/, 2];
424              body = {
425                Term: searchTerm,
426                Group: contentType || defaults.group,
427                Filters: []
428              };
429              if (pageId) {
430                body.PageId = pageId;
431              }
432              return [4 /*yield*/, dataFetcher("".concat(baseURL).concat(END_POINTS.autocomplete), body)];
433            case 1:
434              response = _d.sent();
435              if (response === null || response === void 0 ? void 0 : response.results) {
436                validData = validateAutoCompleteData(response);
437                aggregatedAutocompleteItems = {
438                  items: [],
439                  suggestions: []
440                };
441                if (validData.results) {
442                  (_b = aggregatedAutocompleteItems.items) === null || _b === void 0 ? void 0 : _b.push.apply(_b, __spreadArray([], __read(response.results), false));
443                }
444                if (validData.suggestions) {
445                  (_c = aggregatedAutocompleteItems.suggestions) === null || _c === void 0 ? void 0 : _c.push.apply(_c, __spreadArray([], __read(response.suggestions), false));
446                }
447                if (aggregatedAutocompleteItems.items.length > 0 || aggregatedAutocompleteItems.suggestions.length > 0) {
448                  callBack(aggregatedAutocompleteItems);
449                } else {
450                  callBack([]);
451                }
452              }
453              return [3 /*break*/, 3];
454            case 2:
455              callBack(undefined);
456              _d.label = 3;
457            case 3:
458              return [2 /*return*/];
459          }
460        });
461      });
462    };
463    /**
464     * This breaks up the text to insert a <span /> surrounding the martched "search term"
465     * @param props Object
466     * @returns JSX
467     */
468    var AutoComplete = function AutoComplete(props) {
469      var searchTerm = props.searchTerm,
470        item = props.item;
471      var regex = new RegExp(searchTerm, 'ig');
472      var split = item.split(regex);
473      var matches = item.match(regex) || [];
474      var result = [];
475      for (var i = 0; i <= split.length; i += 1) {
476        result.push(split[i]);
477        if (matches[i]) {
478          result.push( /*#__PURE__*/React.createElement("span", {
479            key: i,
480            className: 'autocompletes__match'
481          }, matches[i]));
482        }
483      }
484      return /*#__PURE__*/React.createElement("span", null, result);
485    };
486    var AutoCompletes = function AutoCompletes(props) {
487      var searchTerm = props.searchTerm,
488        items = props.items,
489        suggestions = props.suggestions,
490        suggestionsCallBack = props.suggestionsCallBack,
491        useAsSearch = props.useAsSearch,
492        itemsCallBack = props.itemsCallBack;
493      return /*#__PURE__*/React.createElement("div", {
494        className: 'autocompletes__list-wrapper'
495      }, /*#__PURE__*/React.createElement("ul", {
496        id: 'suggestions-list',
497        role: 'listbox',
498        "aria-labelledby": 'global-search',
499        className: 'autocompletes__list',
500        tabIndex: 2
501      }, items.slice(0, 3).map(function (item, index) {
502        return /*#__PURE__*/React.createElement("li", {
503          role: 'option',
504          className: 'autocompletes__item',
505          key: "".concat(index, "-").concat(item.title)
506        }, useAsSearch && itemsCallBack ? ( /*#__PURE__*/React.createElement("a", {
507          href: '#',
508          onClick: function onClick(e) {
509            e.preventDefault();
510            itemsCallBack(item.title);
511          },
512          className: 'autocompletes__link link'
513        }, /*#__PURE__*/React.createElement(AutoComplete, {
514          searchTerm: searchTerm,
515          item: item.title
516        }), item.contentType && ( /*#__PURE__*/React.createElement("span", {
517          className: 'autocompletes__type'
518        }, item.contentType)))) : ( /*#__PURE__*/React.createElement("a", {
519          href: item.url,
520          className: 'autocompletes__link link'
521        }, /*#__PURE__*/React.createElement(AutoComplete, {
522          searchTerm: searchTerm,
523          item: item.title
524        }), item.contentType && ( /*#__PURE__*/React.createElement("span", {
525          className: 'autocompletes__type'
526        }, item.contentType)))));
527      }), suggestions.map(function (suggestion, index) {
528        return /*#__PURE__*/React.createElement("li", {
529          role: 'option',
530          className: 'autocompletes__item',
531          key: "".concat(index, "-suggestion-").concat(suggestion)
532        }, /*#__PURE__*/React.createElement("a", {
533          href: '#',
534          onClick: function onClick(e) {
535            e.preventDefault();
536            suggestionsCallBack(suggestion);
537          },
538          className: 'autocompletes__link link'
539        }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(AutoComplete, {
540          searchTerm: searchTerm,
541          item: suggestion
542        }), "...")));
543      })));
544    };
545
546    var SubFilters = function SubFilters(props) {
547      var currentGroupFacetName = props.currentGroupFacetName,
548        filtersCount = props.filtersCount,
549        filtersDropdownOpen = props.filtersDropdownOpen,
550        tempFilters = props.tempFilters,
551        callBack = props.callBack;
552      return /*#__PURE__*/React.createElement("div", {
553        className: 'searchPrompt__filter-dropdown-wrapper'
554      }, /*#__PURE__*/React.createElement("button", {
555        tabIndex: 0,
556        className: classNames("searchPrompt__filter-dropdown-button", {
557          'searchPrompt__filter-dropdown-button--open': filtersDropdownOpen
558        }),
559        onClick: callBack.dropdown
560      }, /*#__PURE__*/React.createElement("span", {
561        className: 'searchPrompt__filter-dropdown-button-content'
562      }, currentGroupFacetName, filtersCount ? ( /*#__PURE__*/React.createElement("span", {
563        className: 'searchPrompt__filters-count'
564      }, filtersCount)) : null), /*#__PURE__*/React.createElement("i", {
565        className: 'icon__lg searchPrompt__filter-dropdown-icon',
566        "aria-hidden": 'true'
567      }, "keyboard_arrow_down")), /*#__PURE__*/React.createElement("div", {
568        "aria-hidden": !filtersDropdownOpen,
569        className: classNames("searchPrompt__filter-dropdown", {
570          'searchPrompt__filter-dropdown--show': filtersDropdownOpen
571        })
572      }, /*#__PURE__*/React.createElement("ul", {
573        className: 'searchPrompt__filter-dropdown-list'
574      }, tempFilters === null || tempFilters === void 0 ? void 0 : tempFilters.options.map(function (option) {
575        return /*#__PURE__*/React.createElement("li", {
576          key: option.value,
577          className: 'searchPrompt__filter-dropdown-list-item'
578        }, /*#__PURE__*/React.createElement("button", {
579          className: 'group searchPrompt__filter-select-button',
580          onClick: function onClick() {
581            return callBack.select(option);
582          },
583          "aria-checked": option.selected
584        }, /*#__PURE__*/React.createElement("span", {
585          className: 'searchPrompt__filter-label'
586        }, option.name), /*#__PURE__*/React.createElement("span", {
587          className: classNames("searchPrompt__filter-selected", {
588            'searchPrompt__filter-selected--active': option.selected
589          })
590        }, /*#__PURE__*/React.createElement("i", {
591          className: 'icon__md',
592          "aria-hidden": 'true'
593        }, "check"))));
594      })), /*#__PURE__*/React.createElement("div", {
595        className: 'searchPrompt__button-wrapper'
596      }, /*#__PURE__*/React.createElement("button", {
597        className: 'button link__color--primary button__type--secondary button__size--base searchPrompt__clear-filter-button',
598        onClick: callBack.clear
599      }, "Clear All"), /*#__PURE__*/React.createElement("button", {
600        className: 'button button__color--primary button__type--primary button__size--base searchPrompt__apply-filter-button',
601        onClick: callBack.apply
602      }, "Apply"))));
603    };
604
605    var SearchPrompt = function SearchPrompt(props) {
606      var _a = props.baseURL,
607        baseURL = _a === void 0 ? '' : _a,
608        resultsURL = props.resultsURL,
609        introText = props.introText,
610        placeholders = props.placeholders,
611        promptContentTypes = props.promptContentTypes;
612      var _b = __read(React.useState(null), 2),
613        currentContentType = _b[0],
614        setContentType = _b[1];
615      var _c = __read(React.useState(false), 2),
616        filtersDropdownOpen = _c[0],
617        setfiltersDropdown = _c[1];
618      var _d = __read(React.useState(''), 2),
619        searchInput = _d[0],
620        setSearchInput = _d[1];
621      var _e = __read(React.useState(), 2),
622        autoCompletes = _e[0],
623        setAutoCompletes = _e[1];
624      var _f = __read(React.useState(null), 2),
625        filters = _f[0],
626        setFilters = _f[1];
627      var _g = __read(React.useState(placeholders["default"]), 2),
628        placeholder = _g[0],
629        setPlaceholder = _g[1];
630      var _h = __read(React.useState(null), 2),
631        tempFilters = _h[0],
632        setTempFilters = _h[1];
633      var debouncedSearchTerm = useDebounce(searchInput, 700);
634      /**
635       * This reads the current filters selected and returns an array of their values.
636       * To be used in data sent to the back-end.
637       * @returns string[]
638       */
639      var getSelectedFilters = function getSelectedFilters() {
640        var appliedFilters = filters === null || filters === void 0 ? void 0 : filters.options.filter(function (option) {
641          return option.selected;
642        });
643        var filtersList = [];
644        appliedFilters === null || appliedFilters === void 0 ? void 0 : appliedFilters.map(function (filter) {
645          filtersList.push(filter.value);
646        });
647        return filtersList;
648      };
649      var toggleDropdown = function toggleDropdown() {
650        setfiltersDropdown(!filtersDropdownOpen);
651      };
652      var filtersCount = React.useMemo(function () {
653        return filters === null || filters === void 0 ? void 0 : filters.options.filter(function (option) {
654          return option.selected;
655        }).length;
656      }, [filters]);
657      var currentQuickLinks = React.useMemo(function () {
658        var _a;
659        return ((_a = promptContentTypes.find(function (item) {
660          return item.value === currentContentType;
661        })) === null || _a === void 0 ? void 0 : _a.quicklinks) || null;
662      }, [currentContentType]);
663      var clearInput = function clearInput() {
664        setSearchInput(''
664);
665      };
666      var currentGroupFacet = React.useMemo(function () {
667        var _a;
668        return (_a = promptContentTypes.find(function (item) {
669          return item.value === currentContentType;
670        })) === null || _a === void 0 ? void 0 : _a.filters;
671      }, [currentContentType]);
672      var clearFilters = function clearFilters() {
673        if (filters) {
674          setFilters(__assign(__assign({}, filters), {
675            options: filters === null || filters === void 0 ? void 0 : filters.options.map(function (option) {
676              return __assign(__assign({}, option), {
677                selected: false
678              });
679            })
680          }));
681          setfiltersDropdown(false);
682        }
683      };
684      var applyFilters = function applyFilters() {
685        setFilters(tempFilters);
686        setfiltersDropdown(false);
687      };
688      var selectFilterOption = function selectFilterOption(_a) {
689        var value = _a.value;
690        if (tempFilters) {
691          var updatedFilters = __assign({}, tempFilters);
692          var updatedOptions = updatedFilters === null || updatedFilters === void 0 ? void 0 : updatedFilters.options.map(function (option) {
693            if (option.value === value) {
694              return __assign(__assign({}, option), {
695                selected: !option.selected
696              });
697            }
698            return option;
699          });
700          updatedFilters.options = updatedOptions;
701          setTempFilters(updatedFilters);
702        }
703      };
704      var handleContentTypeChange = function handleContentTypeChange(value) {
705        setContentType(value);
706        setfiltersDropdown(false);
707      };
708      var sendToResultsPage = function sendToResultsPage() {
709        if (searchInput.length > 0) {
710          var body = {
711            term: searchInput,
712            group: currentContentType || defaults.group,
713            filters: getSelectedFilters().join(filtersJoint)
714          };
715          var bodyToParams = new URLSearchParams(body).toString();
716          location.href = "".concat(resultsURL, "?").concat(bodyToParams);
717        }
718      };
719      /**
720       * This listens to key strokes in the search input, and if there is a search term, and the enter key is hit, it submits the search
721       * @param key string
722       */
723      var supportEnterKey = function supportEnterKey(key) {
724        if (searchInput.length > 0 && key === 'Enter') {
725          sendToResultsPage();
726        }
727      };
728      React.useEffect(function () {
729        if (debouncedSearchTerm) {
730          // Query API and populate the auto completes array
731          getAutoCompletes({
732            baseURL: baseURL,
733            searchTerm: debouncedSearchTerm,
734            contentType: currentContentType,
735            callBack: setAutoCompletes
736          });
737        }
738      }, [debouncedSearchTerm]);
739      React.useEffect(function () {
740        var _a;
741        setFilters(((_a = promptContentTypes.find(function (item) {
742          return item.value === currentContentType;
743        })) === null || _a === void 0 ? void 0 : _a.filters) || null);
744        setPlaceholder(placeholders[(currentContentType || '').toLowerCase()] || placeholders["default"]);
745      }, [currentContentType]);
746      React.useEffect(function () {
747        // Clear the auto-complete array
748        setAutoCompletes(undefined);
749      }, [searchInput, currentContentType]);
750      React.useEffect(function () {
751        if (filtersDropdownOpen) setTempFilters(filters);
752      }, [filtersDropdownOpen]);
753      return /*#__PURE__*/React.createElement("div", {
754        className: 'searchPrompt'
755      }, /*#__PURE__*/React.createElement("div", {
756        className: "searchPrompt__inner"
757      }, /*#__PURE__*/React.createElement("div", {
758        className: 'searchPrompt__heading-wrapper'
759      }, /*#__PURE__*/React.createElement("h2", {
760        className: 'searchPrompt__heading'
761      }, introText), /*#__PURE__*/React.createElement(ContentTypeFilter, {
762        groupFacets: promptContentTypes,
763        callBack: function callBack(value) {
764          return handleContentTypeChange(value);
765        },
766        allowUnselect: true,
767        isHeader: true
768      })), /*#__PURE__*/React.createElement("div", {
769        className: 'searchPrompt__form-wrapper'
770      }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
771        className: 'searchPrompt__search-input-wrapper'
772      }, /*#__PURE__*/React.createElement("label", {
773        htmlFor: 'global-search',
774        className: 'sr-only',
775        id: 'global-search-label'
776      }, "Search:"), /*#__PURE__*/React.createElement("input", {
777        type: 'text',
778        id: 'global-search',
779        "aria-controls": 'suggestions-list',
780        "aria-labelledby": 'global-search-label',
781        className: 'searchPrompt__search-input',
782        placeholder: placeholder,
783        value: searchInput,
784        onChange: function onChange(e) {
785          setSearchInput(e.target.value);
786        },
787        onKeyUp: function onKeyUp(e) {
788          return supportEnterKey(e.key);
789        },
790        autoComplete: 'off'
791      }), (searchInput === null || searchInput === void 0 ? void 0 : searchInput.length) ? ( /*#__PURE__*/React.createElement("button", {
792        className: 'button button__color--tertiary button__type--secondary button__size--base button__icon searchPrompt__input-clear-button',
793        "aria-label": 'clear input',
794        onClick: clearInput,
795        tabIndex: 0
796      }, /*#__PURE__*/React.createElement("i", {
797        className: 'searchPrompt__clear-icon',
798        "aria-hidden": 'true'
799      }, "close"))) : null, currentGroupFacet && typeof filtersCount === 'number' && ( /*#__PURE__*/React.createElement(SubFilters, {
800        filtersCount: filtersCount,
801        currentGroupFacetName: currentGroupFacet.name,
802        filtersDropdownOpen: filtersDropdownOpen,
803        tempFilters: tempFilters,
804        callBack: {
805          dropdown: toggleDropdown,
806          select: selectFilterOption,
807          clear: clearFilters,
808          apply: applyFilters
809        }
810      })), /*#__PURE__*/React.createElement("button", {
811        className: 'button button__color--primary button__type--primary button__size--base button__icon searchPrompt__input-search-button',
812        tabIndex: 0,
813        onClick: function onClick() {
814          return sendToResultsPage();
815        }
816      }, /*#__PURE__*/React.createElement("i", {
817        className: 'icon__lg',
818        "aria-hidden": 'true'
819      }, "search"))), /*#__PURE__*/React.createElement("button", {
820        className: 'button button__color--primary button__type--primary button__size--base button__fullWidth searchPrompt__input-search-button-mobile',
821        onClick: function onClick() {
822          return sendToResultsPage();
823        }
824      }, /*#__PURE__*/React.createElement("span", {
825        className: 'searchPrompt__input-button-mobile-content'
826      }, "Search", /*#__PURE__*/React.createElement("i", {
827        className: 'icon__lg',
828        "aria-hidden": 'true'
829      }, "search")))), searchInput && ((autoCompletes === null || autoCompletes === void 0 ? void 0 : autoCompletes.items) || (autoCompletes === null || autoCompletes === void 0 ? void 0 : autoCompletes.suggestions)) ? ( /*#__PURE__*/React.createElement(AutoCompletes, {
830        items: autoCompletes.items,
831        suggestions: autoCompletes.suggestions,
832        searchTerm: searchInput,
833        suggestionsCallBack: setSearchInput
834      })) : null), (currentQuickLinks === null || currentQuickLinks === void 0 ? void 0 : currentQuickLinks.links.length) && ( /*#__PURE__*/React.createElement(CurrentQuickLinks, {
835        links: currentQuickLinks.links,
836        label: currentQuickLinks.label
837      }))));
838    };
839
840    return SearchPrompt;
841
842})(React);
843//# sourceMappingURL=SearchPrompt.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.