@2uinc/frontend-enterprise-catalog-search 11.0.2

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.
Files changed (69) hide show
  1. package/CHANGELOG.md +1125 -0
  2. package/ClearCurrentRefinements.js +47 -0
  3. package/ClearCurrentRefinements.js.map +1 -0
  4. package/CurrentRefinements.js +152 -0
  5. package/CurrentRefinements.js.map +1 -0
  6. package/FacetDropdown.js +40 -0
  7. package/FacetDropdown.js.map +1 -0
  8. package/FacetItem.js +50 -0
  9. package/FacetItem.js.map +1 -0
  10. package/FacetListBase.js +140 -0
  11. package/FacetListBase.js.map +1 -0
  12. package/FacetListRefinement.js +25 -0
  13. package/FacetListRefinement.js.map +1 -0
  14. package/LICENSE +661 -0
  15. package/LearningTypeRadioFacet.js +165 -0
  16. package/LearningTypeRadioFacet.js.map +1 -0
  17. package/MobileFilterMenu.js +122 -0
  18. package/MobileFilterMenu.js.map +1 -0
  19. package/PrequerySearchSuggestionItem.js +48 -0
  20. package/PrequerySearchSuggestionItem.js.map +1 -0
  21. package/README.md +10 -0
  22. package/SearchBox.js +266 -0
  23. package/SearchBox.js.map +1 -0
  24. package/SearchContext.js +115 -0
  25. package/SearchContext.js.map +1 -0
  26. package/SearchFilters.js +73 -0
  27. package/SearchFilters.js.map +1 -0
  28. package/SearchHeader.js +117 -0
  29. package/SearchHeader.js.map +1 -0
  30. package/SearchPagination.js +78 -0
  31. package/SearchPagination.js.map +1 -0
  32. package/SearchSuggestionItem.js +58 -0
  33. package/SearchSuggestionItem.js.map +1 -0
  34. package/SearchSuggestions.js +137 -0
  35. package/SearchSuggestions.js.map +1 -0
  36. package/TypeaheadFacetDropdown.js +58 -0
  37. package/TypeaheadFacetDropdown.js.map +1 -0
  38. package/config/index.js +18 -0
  39. package/config/index.js.map +1 -0
  40. package/data/actions.js +46 -0
  41. package/data/actions.js.map +1 -0
  42. package/data/constants.js +92 -0
  43. package/data/constants.js.map +1 -0
  44. package/data/hooks.js +97 -0
  45. package/data/hooks.js.map +1 -0
  46. package/data/reducer.js +70 -0
  47. package/data/reducer.js.map +1 -0
  48. package/data/tests/constants.js +13 -0
  49. package/data/tests/constants.js.map +1 -0
  50. package/data/utils.js +69 -0
  51. package/data/utils.js.map +1 -0
  52. package/index.js +9 -0
  53. package/index.js.map +1 -0
  54. package/index.scss +3 -0
  55. package/messages.js +166 -0
  56. package/messages.js.map +1 -0
  57. package/package.json +68 -0
  58. package/styles/_CurrentRefinements.scss +19 -0
  59. package/styles/_FacetList.scss +49 -0
  60. package/styles/_MobileSearchFilters.scss +59 -0
  61. package/styles/_SearchBox.scss +8 -0
  62. package/styles/_SearchField.scss +14 -0
  63. package/styles/_SearchPagination.scss +5 -0
  64. package/styles/_SearchSuggestions.scss +97 -0
  65. package/styles/_index.scss +7 -0
  66. package/tests/utils.js +22 -0
  67. package/tests/utils.js.map +1 -0
  68. package/utils.js +159 -0
  69. package/utils.js.map +1 -0
package/SearchBox.js ADDED
@@ -0,0 +1,266 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
4
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
5
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
6
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
8
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
9
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
10
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
11
+ /* eslint-disable react-hooks/exhaustive-deps */
12
+ import React, { useContext, useEffect, useState, useCallback } from 'react';
13
+ import PropTypes from 'prop-types';
14
+ import classNames from 'classnames';
15
+ import { SearchField } from '@openedx/paragon';
16
+ import debounce from 'lodash.debounce';
17
+ import { connectSearchBox } from 'react-instantsearch-dom';
18
+ import { useIntl, defineMessages } from '@edx/frontend-platform/i18n';
19
+ import { sendTrackEvent } from '@edx/frontend-platform/analytics';
20
+ import { deleteRefinementAction, setRefinementAction } from './data/actions';
21
+ import { useActiveElement } from './data/hooks';
22
+ import { SearchContext } from './SearchContext';
23
+ import { STYLE_VARIANTS, QUERY_PARAM_FOR_PAGE, QUERY_PARAM_FOR_SEARCH_QUERY, ALGOLIA_ATTRIBUTES_TO_RETRIEVE, SEARCH_BOX_CLASS_NAME, DEBOUNCE_TIME_MS } from './data/constants';
24
+ import SearchSuggestions from './SearchSuggestions';
25
+ var messages = defineMessages({
26
+ searchCoursesText: {
27
+ id: 'header.search.input.box.placeholder',
28
+ description: 'Placeholder text for the search input box',
29
+ defaultMessage: 'Search courses'
30
+ }
31
+ });
32
+ export var searchText = messages.searchCoursesText.defaultMessage;
33
+ // this prefix will be combined with one of the SearchBox props to create a full tracking event name
34
+ // only if event name prop is provided by user. In the absence of the tracking name prop,
35
+ // no tracking event will be sent.
36
+ export var SEARCH_EVENT_NAME_PREFIX = 'edx.enterprise';
37
+ export var QUERY_SUBMITTED_EVENT = 'catalog_search.query_submitted';
38
+ export var SearchBoxBase = function SearchBoxBase(_ref) {
39
+ var className = _ref.className,
40
+ defaultRefinement = _ref.defaultRefinement,
41
+ variant = _ref.variant,
42
+ headerTitle = _ref.headerTitle,
43
+ hideTitle = _ref.hideTitle,
44
+ index = _ref.index,
45
+ filters = _ref.filters,
46
+ enterpriseSlug = _ref.enterpriseSlug,
47
+ suggestionSubmitOverride = _ref.suggestionSubmitOverride,
48
+ disableSuggestionRedirect = _ref.disableSuggestionRedirect;
49
+ var _useContext = useContext(SearchContext),
50
+ dispatch = _useContext.dispatch,
51
+ trackingName = _useContext.trackingName;
52
+ var _useState = useState([]),
53
+ _useState2 = _slicedToArray(_useState, 2),
54
+ autocompleteHits = _useState2[0],
55
+ setAutocompleteHits = _useState2[1];
56
+ var _useState3 = useState(false),
57
+ _useState4 = _slicedToArray(_useState3, 2),
58
+ showSuggestions = _useState4[0],
59
+ setShowSuggestions = _useState4[1];
60
+ var _useState5 = useState(''),
61
+ _useState6 = _slicedToArray(_useState5, 2),
62
+ searchQuery = _useState6[0],
63
+ setSearchQuery = _useState6[1];
64
+ var _useState7 = useState([]),
65
+ _useState8 = _slicedToArray(_useState7, 2),
66
+ preQueryHits = _useState8[0],
67
+ setPreQueryHits = _useState8[1];
68
+ var intl = useIntl();
69
+
70
+ /**
71
+ * Handles when a search is submitted by adding the user's search
72
+ * query as a query parameter. Note that it must preserved any other
73
+ * existing query parameters must be preserved.
74
+ */
75
+ var _handleSubmit = function handleSubmit(query) {
76
+ setShowSuggestions(false);
77
+ dispatch(setRefinementAction(QUERY_PARAM_FOR_SEARCH_QUERY, query));
78
+ dispatch(deleteRefinementAction(QUERY_PARAM_FOR_PAGE));
79
+ if (trackingName) {
80
+ sendTrackEvent("".concat(SEARCH_EVENT_NAME_PREFIX, ".").concat(trackingName, ".").concat(QUERY_SUBMITTED_EVENT), {
81
+ query: query
82
+ });
83
+ }
84
+ };
85
+ var handleSuggestionSubmit = function handleSuggestionSubmit(hit) {
86
+ // If an override is provided, call it with the hit
87
+ if (typeof suggestionSubmitOverride === 'function') {
88
+ suggestionSubmitOverride(hit);
89
+ }
90
+
91
+ // When a suggested search is clicked, set the course tile to the search query
92
+ setSearchQuery(hit.title);
93
+ // Do all the regular submit stuff
94
+ _handleSubmit(hit.title);
95
+ };
96
+ var handleClickListener = function handleClickListener() {
97
+ return setShowSuggestions(false);
98
+ };
99
+ useEffect(function () {
100
+ document.addEventListener('click', handleClickListener);
101
+ // Clean up the event listener when the component unmounts-
102
+ // https://blog.logrocket.com/understanding-react-useeffect-cleanup-function/
103
+ return function () {
104
+ document.removeEventListener('click', handleClickListener);
105
+ };
106
+ });
107
+
108
+ // Track the focused element
109
+ var focusedElement = useActiveElement();
110
+ // Function to be called when the user stops typing, will fetch algolia hits for query after `DEBOUNCE_TIME_MS` has
111
+ // elapsed
112
+ var debounceFunc = /*#__PURE__*/function () {
113
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(query) {
114
+ var _yield$index$search, hits, nbHits, _yield$index$search2, _hits;
115
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
116
+ while (1) switch (_context.prev = _context.next) {
117
+ case 0:
118
+ if (!(query !== '')) {
119
+ _context.next = 9;
120
+ break;
121
+ }
122
+ _context.next = 3;
123
+ return index.search(query, {
124
+ filters: filters,
125
+ attributesToHighlight: ['title'],
126
+ attributesToRetrieve: ALGOLIA_ATTRIBUTES_TO_RETRIEVE
127
+ });
128
+ case 3:
129
+ _yield$index$search = _context.sent;
130
+ hits = _yield$index$search.hits;
131
+ nbHits = _yield$index$search.nbHits;
132
+ if (nbHits > 0) {
133
+ setPreQueryHits([]);
134
+ setAutocompleteHits(hits);
135
+ setShowSuggestions(true);
136
+ } else {
137
+ // If there are no results of the suggested search, hide the empty suggestion component
138
+ setShowSuggestions(false);
139
+ }
140
+ // Display the prequery results when user clicks on search box but has not began typing
141
+ _context.next = 17;
142
+ break;
143
+ case 9:
144
+ if (!(query === '')) {
145
+ _context.next = 17;
146
+ break;
147
+ }
148
+ _context.next = 12;
149
+ return index.search(query, {
150
+ filters: filters,
151
+ attributesToHighlight: ['title'],
152
+ attributesToRetrieve: ALGOLIA_ATTRIBUTES_TO_RETRIEVE
153
+ });
154
+ case 12:
155
+ _yield$index$search2 = _context.sent;
156
+ _hits = _yield$index$search2.hits;
157
+ setAutocompleteHits([]);
158
+ setPreQueryHits(_hits);
159
+ setShowSuggestions(true);
160
+ case 17:
161
+ case "end":
162
+ return _context.stop();
163
+ }
164
+ }, _callee);
165
+ }));
166
+ return function debounceFunc(_x) {
167
+ return _ref2.apply(this, arguments);
168
+ };
169
+ }();
170
+ // Since the debounced method is called in a useEffect hook, use `useCallback` to account for repeated invoking of the
171
+ // method.
172
+ var debounceHandler = useCallback(debounce(debounceFunc, DEBOUNCE_TIME_MS), []);
173
+ useEffect(function () {
174
+ // If the component is provided an index and the current focused element is the input field,
175
+ // start the suggestion request to algolia
176
+ if (index !== undefined && focusedElement.classList.contains(SEARCH_BOX_CLASS_NAME)) {
177
+ debounceHandler(searchQuery);
178
+ }
179
+ // Retry this method if the focused element or the search query changes
180
+ }, [searchQuery, focusedElement]);
181
+
182
+ /**
183
+ * Handles when a search is cleared by removing the user's search query
184
+ * from the query parameters.
185
+ */
186
+ var handleClear = function handleClear() {
187
+ setSearchQuery('');
188
+ dispatch(deleteRefinementAction(QUERY_PARAM_FOR_SEARCH_QUERY));
189
+ dispatch(deleteRefinementAction(QUERY_PARAM_FOR_PAGE));
190
+ };
191
+
192
+ // Changing or removing New Relic synthetic data attributes will trigger a failure alert on our synthetics tests
193
+ // these should be disabled before removing the data attrs.
194
+ // https://docs.newrelic.com/docs/synthetics/synthetic-monitoring/scripting-monitors/introduction-scripted-browser-monitors/
195
+ return /*#__PURE__*/React.createElement("div", {
196
+ className: className
197
+ }, !hideTitle &&
198
+ /*#__PURE__*/
199
+ /* eslint-disable-next-line jsx-a11y/label-has-associated-control */
200
+ React.createElement("label", {
201
+ id: "search-input-box",
202
+ className: "fe__searchfield-input-box text-brand-primary"
203
+ }, headerTitle || intl.formatMessage(messages.searchCoursesText)), /*#__PURE__*/React.createElement(SearchField.Advanced, {
204
+ className: classNames('fe__searchfield', {
205
+ 'fe__searchfield--inverse': variant === STYLE_VARIANTS.inverse
206
+ }),
207
+ value: defaultRefinement,
208
+ onSubmit: _handleSubmit,
209
+ onClear: handleClear,
210
+ onFocus: function onFocus(query) {
211
+ setSearchQuery(query);
212
+ },
213
+ onChange: function onChange(query) {
214
+ setSearchQuery(query);
215
+ }
216
+ }, /*#__PURE__*/React.createElement(SearchField.Input, {
217
+ className: "form-control-lg ".concat(SEARCH_BOX_CLASS_NAME),
218
+ "aria-labelledby": "search-input-box",
219
+ "data-nr-synth-id": "catalog-search-input-field",
220
+ "data-hj-whitelist": true,
221
+ autoComplete: "off"
222
+ }), /*#__PURE__*/React.createElement(SearchField.ClearButton, {
223
+ "data-nr-synth-id": "catalog-search-clear-button"
224
+ }), /*#__PURE__*/React.createElement(SearchField.SubmitButton, {
225
+ "data-nr-synth-id": "catalog-search-submit-button"
226
+ })), showSuggestions && /*#__PURE__*/React.createElement(SearchSuggestions, {
227
+ enterpriseSlug: enterpriseSlug,
228
+ preQueryHits: preQueryHits,
229
+ autoCompleteHits: autocompleteHits,
230
+ handleSubmit: function handleSubmit() {
231
+ return _handleSubmit(searchQuery);
232
+ },
233
+ handleSuggestionClickSubmit: function handleSuggestionClickSubmit(hit) {
234
+ return handleSuggestionSubmit(hit);
235
+ },
236
+ disableSuggestionRedirect: disableSuggestionRedirect
237
+ }));
238
+ };
239
+ SearchBoxBase.propTypes = {
240
+ defaultRefinement: PropTypes.string,
241
+ className: PropTypes.string,
242
+ variant: PropTypes.oneOf([STYLE_VARIANTS["default"], STYLE_VARIANTS.inverse]),
243
+ headerTitle: PropTypes.string,
244
+ hideTitle: PropTypes.bool,
245
+ index: PropTypes.shape({
246
+ search: PropTypes.func.isRequired
247
+ }),
248
+ filters: PropTypes.string,
249
+ enterpriseSlug: PropTypes.string,
250
+ suggestionSubmitOverride: PropTypes.func,
251
+ disableSuggestionRedirect: PropTypes.bool
252
+ };
253
+ SearchBoxBase.defaultProps = {
254
+ className: undefined,
255
+ defaultRefinement: '',
256
+ variant: STYLE_VARIANTS.inverse,
257
+ headerTitle: undefined,
258
+ hideTitle: false,
259
+ filters: '',
260
+ enterpriseSlug: undefined,
261
+ index: undefined,
262
+ suggestionSubmitOverride: undefined,
263
+ disableSuggestionRedirect: false
264
+ };
265
+ export default connectSearchBox(SearchBoxBase);
266
+ //# sourceMappingURL=SearchBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchBox.js","names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","_catch","delegateYield","asyncGeneratorStep","_asyncToGenerator","arguments","apply","_next","_throw","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_arrayLikeToArray","toString","Array","from","test","isArray","React","useContext","useEffect","useState","useCallback","PropTypes","classNames","SearchField","debounce","connectSearchBox","useIntl","defineMessages","sendTrackEvent","deleteRefinementAction","setRefinementAction","useActiveElement","SearchContext","STYLE_VARIANTS","QUERY_PARAM_FOR_PAGE","QUERY_PARAM_FOR_SEARCH_QUERY","ALGOLIA_ATTRIBUTES_TO_RETRIEVE","SEARCH_BOX_CLASS_NAME","DEBOUNCE_TIME_MS","SearchSuggestions","messages","searchCoursesText","id","description","defaultMessage","searchText","SEARCH_EVENT_NAME_PREFIX","QUERY_SUBMITTED_EVENT","SearchBoxBase","_ref","className","defaultRefinement","variant","headerTitle","hideTitle","index","filters","enterpriseSlug","suggestionSubmitOverride","disableSuggestionRedirect","_useContext","dispatch","trackingName","_useState","_useState2","autocompleteHits","setAutocompleteHits","_useState3","_useState4","showSuggestions","setShowSuggestions","_useState5","_useState6","searchQuery","setSearchQuery","_useState7","_useState8","preQueryHits","setPreQueryHits","intl","handleSubmit","query","concat","handleSuggestionSubmit","hit","title","handleClickListener","document","addEventListener","removeEventListener","focusedElement","debounceFunc","_ref2","_callee","_yield$index$search","hits","nbHits","_yield$index$search2","_hits","_callee$","_context","search","attributesToHighlight","attributesToRetrieve","_x","debounceHandler","undefined","classList","contains","handleClear","createElement","formatMessage","Advanced","inverse","onSubmit","onClear","onFocus","onChange","Input","autoComplete","ClearButton","SubmitButton","autoCompleteHits","handleSuggestionClickSubmit","propTypes","string","oneOf","bool","shape","func","isRequired","defaultProps"],"sources":["../src/SearchBox.jsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport React, {\n useContext,\n useEffect,\n useState,\n useCallback,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { SearchField } from '@openedx/paragon';\nimport debounce from 'lodash.debounce';\nimport { connectSearchBox } from 'react-instantsearch-dom';\nimport { useIntl, defineMessages } from '@edx/frontend-platform/i18n';\n\nimport { sendTrackEvent } from '@edx/frontend-platform/analytics';\n\nimport { deleteRefinementAction, setRefinementAction } from './data/actions';\nimport { useActiveElement } from './data/hooks';\nimport { SearchContext } from './SearchContext';\nimport {\n STYLE_VARIANTS,\n QUERY_PARAM_FOR_PAGE,\n QUERY_PARAM_FOR_SEARCH_QUERY,\n ALGOLIA_ATTRIBUTES_TO_RETRIEVE,\n SEARCH_BOX_CLASS_NAME,\n DEBOUNCE_TIME_MS,\n} from './data/constants';\nimport SearchSuggestions from './SearchSuggestions';\n\nconst messages = defineMessages({\n searchCoursesText: {\n id: 'header.search.input.box.placeholder',\n description: 'Placeholder text for the search input box',\n defaultMessage: 'Search courses',\n },\n});\n\nexport const searchText = messages.searchCoursesText.defaultMessage;\n// this prefix will be combined with one of the SearchBox props to create a full tracking event name\n// only if event name prop is provided by user. In the absence of the tracking name prop,\n// no tracking event will be sent.\nexport const SEARCH_EVENT_NAME_PREFIX = 'edx.enterprise';\nexport const QUERY_SUBMITTED_EVENT = 'catalog_search.query_submitted';\n\nexport const SearchBoxBase = ({\n className,\n defaultRefinement,\n variant,\n headerTitle,\n hideTitle,\n index,\n filters,\n enterpriseSlug,\n suggestionSubmitOverride,\n disableSuggestionRedirect,\n}) => {\n const { dispatch, trackingName } = useContext(SearchContext);\n\n const [autocompleteHits, setAutocompleteHits] = useState([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [preQueryHits, setPreQueryHits] = useState([]);\n const intl = useIntl();\n\n /**\n * Handles when a search is submitted by adding the user's search\n * query as a query parameter. Note that it must preserved any other\n * existing query parameters must be preserved.\n */\n const handleSubmit = (query) => {\n setShowSuggestions(false);\n dispatch(setRefinementAction(QUERY_PARAM_FOR_SEARCH_QUERY, query));\n dispatch(deleteRefinementAction(QUERY_PARAM_FOR_PAGE));\n if (trackingName) {\n sendTrackEvent(`${SEARCH_EVENT_NAME_PREFIX}.${trackingName}.${QUERY_SUBMITTED_EVENT}`, {\n query,\n });\n }\n };\n\n const handleSuggestionSubmit = (hit) => {\n // If an override is provided, call it with the hit\n if (typeof suggestionSubmitOverride === 'function') {\n suggestionSubmitOverride(hit);\n }\n\n // When a suggested search is clicked, set the course tile to the search query\n setSearchQuery(hit.title);\n // Do all the regular submit stuff\n handleSubmit(hit.title);\n };\n\n const handleClickListener = () => setShowSuggestions(false);\n useEffect(() => {\n document.addEventListener('click', handleClickListener);\n // Clean up the event listener when the component unmounts-\n // https://blog.logrocket.com/understanding-react-useeffect-cleanup-function/\n return () => {\n document.removeEventListener('click', handleClickListener);\n };\n });\n\n // Track the focused element\n const focusedElement = useActiveElement();\n // Function to be called when the user stops typing, will fetch algolia hits for query after `DEBOUNCE_TIME_MS` has\n // elapsed\n const debounceFunc = async (query) => {\n // Skip suggesting anything until there's something typed\n if (query !== '') {\n const { hits, nbHits } = await index.search(query, {\n filters,\n attributesToHighlight: ['title'],\n attributesToRetrieve: ALGOLIA_ATTRIBUTES_TO_RETRIEVE,\n });\n if (nbHits > 0) {\n setPreQueryHits([]);\n setAutocompleteHits(hits);\n setShowSuggestions(true);\n } else {\n // If there are no results of the suggested search, hide the empty suggestion component\n setShowSuggestions(false);\n }\n // Display the prequery results when user clicks on search box but has not began typing\n } else if (query === '') {\n const { hits } = await index.search(query, {\n filters,\n attributesToHighlight: ['title'],\n attributesToRetrieve: ALGOLIA_ATTRIBUTES_TO_RETRIEVE,\n });\n setAutocompleteHits([]);\n setPreQueryHits(hits);\n setShowSuggestions(true);\n }\n };\n // Since the debounced method is called in a useEffect hook, use `useCallback` to account for repeated invoking of the\n // method.\n const debounceHandler = useCallback(debounce(debounceFunc, DEBOUNCE_TIME_MS), []);\n\n useEffect(() => {\n // If the component is provided an index and the current focused element is the input field,\n // start the suggestion request to algolia\n if (index !== undefined && focusedElement.classList.contains(SEARCH_BOX_CLASS_NAME)) {\n debounceHandler(searchQuery);\n }\n // Retry this method if the focused element or the search query changes\n }, [searchQuery, focusedElement]);\n\n /**\n * Handles when a search is cleared by removing the user's search query\n * from the query parameters.\n */\n const handleClear = () => {\n setSearchQuery('');\n dispatch(deleteRefinementAction(QUERY_PARAM_FOR_SEARCH_QUERY));\n dispatch(deleteRefinementAction(QUERY_PARAM_FOR_PAGE));\n };\n\n // Changing or removing New Relic synthetic data attributes will trigger a failure alert on our synthetics tests\n // these should be disabled before removing the data attrs.\n // https://docs.newrelic.com/docs/synthetics/synthetic-monitoring/scripting-monitors/introduction-scripted-browser-monitors/\n return (\n <div className={className}>\n {!hideTitle && (\n /* eslint-disable-next-line jsx-a11y/label-has-associated-control */\n <label id=\"search-input-box\" className=\"fe__searchfield-input-box text-brand-primary\">\n {headerTitle || intl.formatMessage(messages.searchCoursesText)}\n </label>\n )}\n <SearchField.Advanced\n className={classNames('fe__searchfield', {\n 'fe__searchfield--inverse': variant === STYLE_VARIANTS.inverse,\n })}\n value={defaultRefinement}\n onSubmit={handleSubmit}\n onClear={handleClear}\n onFocus={(query) => {\n setSearchQuery(query);\n }}\n onChange={(query) => {\n setSearchQuery(query);\n }}\n >\n <SearchField.Input\n className={`form-control-lg ${SEARCH_BOX_CLASS_NAME}`}\n aria-labelledby=\"search-input-box\"\n data-nr-synth-id=\"catalog-search-input-field\"\n data-hj-whitelist\n autoComplete=\"off\"\n />\n <SearchField.ClearButton data-nr-synth-id=\"catalog-search-clear-button\" />\n <SearchField.SubmitButton data-nr-synth-id=\"catalog-search-submit-button\" />\n </SearchField.Advanced>\n {showSuggestions && (\n <SearchSuggestions\n enterpriseSlug={enterpriseSlug}\n preQueryHits={preQueryHits}\n autoCompleteHits={autocompleteHits}\n handleSubmit={() => handleSubmit(searchQuery)}\n handleSuggestionClickSubmit={hit => handleSuggestionSubmit(hit)}\n disableSuggestionRedirect={disableSuggestionRedirect}\n />\n )}\n </div>\n );\n};\n\nSearchBoxBase.propTypes = {\n defaultRefinement: PropTypes.string,\n className: PropTypes.string,\n variant: PropTypes.oneOf([STYLE_VARIANTS.default, STYLE_VARIANTS.inverse]),\n headerTitle: PropTypes.string,\n hideTitle: PropTypes.bool,\n index: PropTypes.shape({ search: PropTypes.func.isRequired }),\n filters: PropTypes.string,\n enterpriseSlug: PropTypes.string,\n suggestionSubmitOverride: PropTypes.func,\n disableSuggestionRedirect: PropTypes.bool,\n};\n\nSearchBoxBase.defaultProps = {\n className: undefined,\n defaultRefinement: '',\n variant: STYLE_VARIANTS.inverse,\n headerTitle: undefined,\n hideTitle: false,\n filters: '',\n enterpriseSlug: undefined,\n index: undefined,\n suggestionSubmitOverride: undefined,\n disableSuggestionRedirect: false,\n};\n\nexport default connectSearchBox(SearchBoxBase);\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,115 @@
1
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
4
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7
+ /* eslint-disable react-hooks/exhaustive-deps */
8
+ import React, { createContext, useReducer, useMemo, useEffect } from 'react';
9
+ import PropTypes from 'prop-types';
10
+ import { useLocation, useNavigate } from 'react-router-dom';
11
+ import { useIsFirstRender } from '@edx/frontend-enterprise-utils';
12
+ import { useIntl } from '@edx/frontend-platform/i18n';
13
+ import { BOOLEAN_FILTERS, ADDITIONAL_FACET_FILTERS, URL_FILTERS } from './data/constants';
14
+ import { refinementsReducer } from './data/reducer';
15
+ import { setMultipleRefinementsAction } from './data/actions';
16
+ import { searchParamsToObject, stringifyRefinements } from './data/utils';
17
+ import { getSearchFacetFilters } from './utils';
18
+ export var SearchContext = /*#__PURE__*/createContext();
19
+ export var getRefinementsToSet = function getRefinementsToSet(queryParams, activeFacetAttributes) {
20
+ var refinementsToSet = {};
21
+ Object.entries(queryParams).forEach(function (_ref) {
22
+ var _ref2 = _slicedToArray(_ref, 2),
23
+ key = _ref2[0],
24
+ value = _ref2[1];
25
+ // Any additional facet filter to SEARCH_FACET_FILTERS who's data needs to be kept in an
26
+ // array can live in ADDITIONAL_FACET_FILTERS.
27
+ if (activeFacetAttributes.includes(key) || ADDITIONAL_FACET_FILTERS.includes(key) || URL_FILTERS.includes(key)) {
28
+ var valueAsArray = Array.isArray(value) ? value : [value];
29
+ refinementsToSet[key] = valueAsArray;
30
+ } else if (BOOLEAN_FILTERS.includes(key)) {
31
+ // convert a string into a number (this should be a 1 or 0)
32
+ refinementsToSet[key] = +value;
33
+ } else {
34
+ refinementsToSet[key] = value;
35
+ }
36
+ });
37
+ return refinementsToSet;
38
+ };
39
+ var SearchData = function SearchData(_ref3) {
40
+ var children = _ref3.children,
41
+ searchFacetFilters = _ref3.searchFacetFilters,
42
+ trackingName = _ref3.trackingName,
43
+ enableVideos = _ref3.enableVideos;
44
+ var _useReducer = useReducer(refinementsReducer, {}),
45
+ _useReducer2 = _slicedToArray(_useReducer, 2),
46
+ refinements = _useReducer2[0],
47
+ dispatch = _useReducer2[1];
48
+ var intl = useIntl();
49
+ var searchFilters = searchFacetFilters || getSearchFacetFilters(intl);
50
+ var _useLocation = useLocation(),
51
+ pathname = _useLocation.pathname,
52
+ search = _useLocation.search;
53
+ var navigate = useNavigate();
54
+
55
+ /**
56
+ * Applies initial URL query params on page load to the refinements
57
+ * reducer to update search results. Note the empty dependency list
58
+ * here is important; we only want to set the refinements reducer with
59
+ * the initial query parameters, *not* any time the query parameters change.
60
+ *
61
+ * The URL query parameters will be kept in sync with any updates to the
62
+ * reducer state below.
63
+ */
64
+ useEffect(function () {
65
+ var initialQueryParams = searchParamsToObject(new URLSearchParams(search));
66
+ var activeFacetAttributes = searchFilters.map(function (filter) {
67
+ return filter.attribute;
68
+ });
69
+ var refinementsToSet = getRefinementsToSet(initialQueryParams, activeFacetAttributes);
70
+ dispatch(setMultipleRefinementsAction(refinementsToSet));
71
+ }, []);
72
+ var isFirstRender = useIsFirstRender();
73
+
74
+ /**
75
+ * Syncs the refinements reducer state with the URL query parameters.
76
+ */
77
+ useEffect(function () {
78
+ if (!isFirstRender) {
79
+ var newQueryString = stringifyRefinements(refinements);
80
+ navigate({
81
+ pathname: pathname,
82
+ search: newQueryString
83
+ });
84
+ }
85
+ }, [JSON.stringify(refinements)]);
86
+ var value = useMemo(function () {
87
+ return {
88
+ refinements: refinements,
89
+ dispatch: dispatch,
90
+ searchFacetFilters: searchFilters,
91
+ trackingName: trackingName,
92
+ enableVideos: enableVideos
93
+ };
94
+ }, [JSON.stringify(refinements), dispatch, searchFilters, trackingName, enableVideos]);
95
+ return /*#__PURE__*/React.createElement(SearchContext.Provider, {
96
+ value: value
97
+ }, children);
98
+ };
99
+ SearchData.defaultProps = {
100
+ searchFacetFilters: null,
101
+ trackingName: null,
102
+ enableVideos: false
103
+ };
104
+ SearchData.propTypes = {
105
+ children: PropTypes.node.isRequired,
106
+ searchFacetFilters: PropTypes.arrayOf(PropTypes.shape({
107
+ attribute: PropTypes.string.isRequired,
108
+ title: PropTypes.string.isRequired,
109
+ isSortedAlphabetical: PropTypes.bool
110
+ })),
111
+ trackingName: PropTypes.string,
112
+ enableVideos: PropTypes.bool
113
+ };
114
+ export default SearchData;
115
+ //# sourceMappingURL=SearchContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchContext.js","names":["React","createContext","useReducer","useMemo","useEffect","PropTypes","useLocation","useNavigate","useIsFirstRender","useIntl","BOOLEAN_FILTERS","ADDITIONAL_FACET_FILTERS","URL_FILTERS","refinementsReducer","setMultipleRefinementsAction","searchParamsToObject","stringifyRefinements","getSearchFacetFilters","SearchContext","getRefinementsToSet","queryParams","activeFacetAttributes","refinementsToSet","Object","entries","forEach","_ref","_ref2","_slicedToArray","key","value","includes","valueAsArray","Array","isArray","SearchData","_ref3","children","searchFacetFilters","trackingName","enableVideos","_useReducer","_useReducer2","refinements","dispatch","intl","searchFilters","_useLocation","pathname","search","navigate","initialQueryParams","URLSearchParams","map","filter","attribute","isFirstRender","newQueryString","JSON","stringify","createElement","Provider","defaultProps","propTypes","node","isRequired","arrayOf","shape","string","title","isSortedAlphabetical","bool"],"sources":["../src/SearchContext.jsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport React, {\n createContext, useReducer, useMemo, useEffect,\n} from 'react';\nimport PropTypes from 'prop-types';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { useIsFirstRender } from '@edx/frontend-enterprise-utils';\nimport { useIntl } from '@edx/frontend-platform/i18n';\n\nimport {\n BOOLEAN_FILTERS,\n ADDITIONAL_FACET_FILTERS,\n URL_FILTERS,\n} from './data/constants';\nimport { refinementsReducer } from './data/reducer';\nimport { setMultipleRefinementsAction } from './data/actions';\nimport { searchParamsToObject, stringifyRefinements } from './data/utils';\nimport { getSearchFacetFilters } from './utils';\n\nexport const SearchContext = createContext();\n\nexport const getRefinementsToSet = (queryParams, activeFacetAttributes) => {\n const refinementsToSet = {};\n Object.entries(queryParams).forEach(([key, value]) => {\n // Any additional facet filter to SEARCH_FACET_FILTERS who's data needs to be kept in an\n // array can live in ADDITIONAL_FACET_FILTERS.\n if (activeFacetAttributes.includes(key) || ADDITIONAL_FACET_FILTERS.includes(key) || URL_FILTERS.includes(key)) {\n const valueAsArray = Array.isArray(value) ? value : [value];\n refinementsToSet[key] = valueAsArray;\n } else if (BOOLEAN_FILTERS.includes(key)) {\n // convert a string into a number (this should be a 1 or 0)\n refinementsToSet[key] = +value;\n } else {\n refinementsToSet[key] = value;\n }\n });\n\n return refinementsToSet;\n};\n\nconst SearchData = ({\n children, searchFacetFilters, trackingName, enableVideos,\n}) => {\n const [refinements, dispatch] = useReducer(\n refinementsReducer,\n {},\n );\n const intl = useIntl();\n const searchFilters = searchFacetFilters || getSearchFacetFilters(intl);\n\n const { pathname, search } = useLocation();\n const navigate = useNavigate();\n\n /**\n * Applies initial URL query params on page load to the refinements\n * reducer to update search results. Note the empty dependency list\n * here is important; we only want to set the refinements reducer with\n * the initial query parameters, *not* any time the query parameters change.\n *\n * The URL query parameters will be kept in sync with any updates to the\n * reducer state below.\n */\n useEffect(() => {\n const initialQueryParams = searchParamsToObject(new URLSearchParams(search));\n const activeFacetAttributes = searchFilters.map(filter => filter.attribute);\n const refinementsToSet = getRefinementsToSet(initialQueryParams, activeFacetAttributes);\n dispatch(setMultipleRefinementsAction(refinementsToSet));\n }, []);\n\n const isFirstRender = useIsFirstRender();\n\n /**\n * Syncs the refinements reducer state with the URL query parameters.\n */\n useEffect(() => {\n if (!isFirstRender) {\n const newQueryString = stringifyRefinements(refinements);\n navigate({ pathname, search: newQueryString });\n }\n }, [JSON.stringify(refinements)]);\n\n const value = useMemo(\n () => ({\n refinements,\n dispatch,\n searchFacetFilters: searchFilters,\n trackingName,\n enableVideos,\n }),\n [JSON.stringify(refinements), dispatch, searchFilters, trackingName, enableVideos],\n );\n\n return (\n <SearchContext.Provider value={value}>{children}</SearchContext.Provider>\n );\n};\n\nSearchData.defaultProps = {\n searchFacetFilters: null,\n trackingName: null,\n enableVideos: false,\n};\n\nSearchData.propTypes = {\n children: PropTypes.node.isRequired,\n searchFacetFilters: PropTypes.arrayOf(PropTypes.shape({\n attribute: PropTypes.string.isRequired,\n title: PropTypes.string.isRequired,\n isSortedAlphabetical: PropTypes.bool,\n })),\n trackingName: PropTypes.string,\n enableVideos: PropTypes.bool,\n};\n\nexport default SearchData;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,73 @@
1
+ /* eslint-disable react-hooks/exhaustive-deps */
2
+ import React, { useMemo, useContext } from 'react';
3
+ import PropTypes from 'prop-types';
4
+ import { breakpoints, MediaQuery } from '@openedx/paragon';
5
+ import FacetListRefinement from './FacetListRefinement';
6
+ import CurrentRefinements from './CurrentRefinements';
7
+ import MobileFilterMenu from './MobileFilterMenu';
8
+ import { STYLE_VARIANTS } from './data/constants';
9
+ import { sortItemsByLabelAsc } from './data/utils';
10
+ import { SearchContext } from './SearchContext';
11
+ import { features } from './config';
12
+ import LearningTypeRadioFacet from './LearningTypeRadioFacet';
13
+ export var FREE_ALL_TITLE = 'Free / All';
14
+ var SearchFilters = function SearchFilters(_ref) {
15
+ var variant = _ref.variant,
16
+ enablePathways = _ref.enablePathways;
17
+ var _useContext = useContext(SearchContext),
18
+ refinements = _useContext.refinements,
19
+ searchFacetFilters = _useContext.searchFacetFilters;
20
+ var searchFacets = useMemo(function () {
21
+ var filtersFromRefinements = searchFacetFilters.map(function (_ref2) {
22
+ var title = _ref2.title,
23
+ attribute = _ref2.attribute,
24
+ isSortedAlphabetical = _ref2.isSortedAlphabetical,
25
+ typeaheadOptions = _ref2.typeaheadOptions,
26
+ noDisplay = _ref2.noDisplay;
27
+ return /*#__PURE__*/React.createElement(FacetListRefinement, {
28
+ key: attribute,
29
+ title: title,
30
+ attribute: attribute,
31
+ limit: 300 // this is replicating the B2C search experience
32
+ ,
33
+ transformItems: function transformItems(items) {
34
+ if (isSortedAlphabetical) {
35
+ return sortItemsByLabelAsc(items);
36
+ }
37
+ return items;
38
+ },
39
+ refinements: refinements,
40
+ defaultRefinement: refinements[attribute],
41
+ facetValueType: "array",
42
+ typeaheadOptions: typeaheadOptions,
43
+ searchable: !!typeaheadOptions,
44
+ variant: variant,
45
+ noDisplay: noDisplay
46
+ });
47
+ });
48
+ return /*#__PURE__*/React.createElement(React.Fragment, null, filtersFromRefinements, features.LEARNING_TYPE_FACET && /*#__PURE__*/React.createElement(LearningTypeRadioFacet, {
49
+ enablePathways: enablePathways
50
+ }));
51
+ }, [JSON.stringify(refinements)]);
52
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(MediaQuery, {
53
+ maxWidth: breakpoints.large.maxWidth
54
+ }, /*#__PURE__*/React.createElement(MobileFilterMenu, {
55
+ className: "mb-3"
56
+ }, searchFacets)), /*#__PURE__*/React.createElement(MediaQuery, {
57
+ minWidth: breakpoints.extraLarge.minWidth
58
+ }, /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
59
+ className: "d-flex"
60
+ }, searchFacets), /*#__PURE__*/React.createElement(CurrentRefinements, {
61
+ variant: variant
62
+ }))));
63
+ };
64
+ SearchFilters.defaultProps = {
65
+ variant: STYLE_VARIANTS.inverse,
66
+ enablePathways: null
67
+ };
68
+ SearchFilters.propTypes = {
69
+ variant: PropTypes.oneOf([STYLE_VARIANTS["default"], STYLE_VARIANTS.inverse]),
70
+ enablePathways: PropTypes.bool
71
+ };
72
+ export default SearchFilters;
73
+ //# sourceMappingURL=SearchFilters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchFilters.js","names":["React","useMemo","useContext","PropTypes","breakpoints","MediaQuery","FacetListRefinement","CurrentRefinements","MobileFilterMenu","STYLE_VARIANTS","sortItemsByLabelAsc","SearchContext","features","LearningTypeRadioFacet","FREE_ALL_TITLE","SearchFilters","_ref","variant","enablePathways","_useContext","refinements","searchFacetFilters","searchFacets","filtersFromRefinements","map","_ref2","title","attribute","isSortedAlphabetical","typeaheadOptions","noDisplay","createElement","key","limit","transformItems","items","defaultRefinement","facetValueType","searchable","Fragment","LEARNING_TYPE_FACET","JSON","stringify","maxWidth","large","className","minWidth","extraLarge","defaultProps","inverse","propTypes","oneOf","bool"],"sources":["../src/SearchFilters.jsx"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useMemo, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { breakpoints, MediaQuery } from '@openedx/paragon';\n\nimport FacetListRefinement from './FacetListRefinement';\nimport CurrentRefinements from './CurrentRefinements';\n\nimport MobileFilterMenu from './MobileFilterMenu';\n\nimport { STYLE_VARIANTS } from './data/constants';\nimport { sortItemsByLabelAsc } from './data/utils';\n\nimport { SearchContext } from './SearchContext';\nimport { features } from './config';\nimport LearningTypeRadioFacet from './LearningTypeRadioFacet';\n\nexport const FREE_ALL_TITLE = 'Free / All';\n\nconst SearchFilters = ({ variant, enablePathways }) => {\n const { refinements, searchFacetFilters } = useContext(SearchContext);\n\n const searchFacets = useMemo(\n () => {\n const filtersFromRefinements = searchFacetFilters.map(({\n title, attribute, isSortedAlphabetical, typeaheadOptions, noDisplay,\n }) => (\n <FacetListRefinement\n key={attribute}\n title={title}\n attribute={attribute}\n limit={300} // this is replicating the B2C search experience\n transformItems={(items) => {\n if (isSortedAlphabetical) {\n return sortItemsByLabelAsc(items);\n }\n return items;\n }}\n refinements={refinements}\n defaultRefinement={refinements[attribute]}\n facetValueType=\"array\"\n typeaheadOptions={typeaheadOptions}\n searchable={!!typeaheadOptions}\n variant={variant}\n noDisplay={noDisplay}\n />\n ));\n return (\n <>\n {filtersFromRefinements}\n {features.LEARNING_TYPE_FACET && (<LearningTypeRadioFacet enablePathways={enablePathways} />)}\n </>\n );\n },\n [JSON.stringify(refinements)],\n );\n\n return (\n <>\n <MediaQuery maxWidth={breakpoints.large.maxWidth}>\n <MobileFilterMenu className=\"mb-3\">\n {searchFacets}\n </MobileFilterMenu>\n </MediaQuery>\n <MediaQuery minWidth={breakpoints.extraLarge.minWidth}>\n <>\n <div className=\"d-flex\">\n {searchFacets}\n </div>\n <CurrentRefinements variant={variant} />\n </>\n </MediaQuery>\n </>\n );\n};\n\nSearchFilters.defaultProps = {\n variant: STYLE_VARIANTS.inverse,\n enablePathways: null,\n};\n\nSearchFilters.propTypes = {\n variant: PropTypes.oneOf([STYLE_VARIANTS.default, STYLE_VARIANTS.inverse]),\n enablePathways: PropTypes.bool,\n};\n\nexport default SearchFilters;\n"],"mappings":"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","ignoreList":[]}