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.