@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.
- package/CHANGELOG.md +1125 -0
- package/ClearCurrentRefinements.js +47 -0
- package/ClearCurrentRefinements.js.map +1 -0
- package/CurrentRefinements.js +152 -0
- package/CurrentRefinements.js.map +1 -0
- package/FacetDropdown.js +40 -0
- package/FacetDropdown.js.map +1 -0
- package/FacetItem.js +50 -0
- package/FacetItem.js.map +1 -0
- package/FacetListBase.js +140 -0
- package/FacetListBase.js.map +1 -0
- package/FacetListRefinement.js +25 -0
- package/FacetListRefinement.js.map +1 -0
- package/LICENSE +661 -0
- package/LearningTypeRadioFacet.js +165 -0
- package/LearningTypeRadioFacet.js.map +1 -0
- package/MobileFilterMenu.js +122 -0
- package/MobileFilterMenu.js.map +1 -0
- package/PrequerySearchSuggestionItem.js +48 -0
- package/PrequerySearchSuggestionItem.js.map +1 -0
- package/README.md +10 -0
- package/SearchBox.js +266 -0
- package/SearchBox.js.map +1 -0
- package/SearchContext.js +115 -0
- package/SearchContext.js.map +1 -0
- package/SearchFilters.js +73 -0
- package/SearchFilters.js.map +1 -0
- package/SearchHeader.js +117 -0
- package/SearchHeader.js.map +1 -0
- package/SearchPagination.js +78 -0
- package/SearchPagination.js.map +1 -0
- package/SearchSuggestionItem.js +58 -0
- package/SearchSuggestionItem.js.map +1 -0
- package/SearchSuggestions.js +137 -0
- package/SearchSuggestions.js.map +1 -0
- package/TypeaheadFacetDropdown.js +58 -0
- package/TypeaheadFacetDropdown.js.map +1 -0
- package/config/index.js +18 -0
- package/config/index.js.map +1 -0
- package/data/actions.js +46 -0
- package/data/actions.js.map +1 -0
- package/data/constants.js +92 -0
- package/data/constants.js.map +1 -0
- package/data/hooks.js +97 -0
- package/data/hooks.js.map +1 -0
- package/data/reducer.js +70 -0
- package/data/reducer.js.map +1 -0
- package/data/tests/constants.js +13 -0
- package/data/tests/constants.js.map +1 -0
- package/data/utils.js +69 -0
- package/data/utils.js.map +1 -0
- package/index.js +9 -0
- package/index.js.map +1 -0
- package/index.scss +3 -0
- package/messages.js +166 -0
- package/messages.js.map +1 -0
- package/package.json +68 -0
- package/styles/_CurrentRefinements.scss +19 -0
- package/styles/_FacetList.scss +49 -0
- package/styles/_MobileSearchFilters.scss +59 -0
- package/styles/_SearchBox.scss +8 -0
- package/styles/_SearchField.scss +14 -0
- package/styles/_SearchPagination.scss +5 -0
- package/styles/_SearchSuggestions.scss +97 -0
- package/styles/_index.scss +7 -0
- package/tests/utils.js +22 -0
- package/tests/utils.js.map +1 -0
- package/utils.js +159 -0
- 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
|
package/SearchBox.js.map
ADDED
|
@@ -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":[]}
|
package/SearchContext.js
ADDED
|
@@ -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":[]}
|
package/SearchFilters.js
ADDED
|
@@ -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":[]}
|