@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
@@ -0,0 +1,117 @@
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
+ import React, { useContext } from 'react';
8
+ import PropTypes from 'prop-types';
9
+ import { Container, Row, Col } from '@openedx/paragon';
10
+ import classNames from 'classnames';
11
+ import SearchBox from './SearchBox';
12
+ import SearchFilters from './SearchFilters';
13
+ import { STYLE_VARIANTS } from './data/constants';
14
+ import { SearchContext } from './SearchContext';
15
+ export var searchHeaderTestId = 'search-header';
16
+ export var searchBoxColTestId = 'search-box-col';
17
+ export var filtersColTestId = 'filters-col';
18
+ var SearchHeader = function SearchHeader(_ref) {
19
+ var variant = _ref.variant,
20
+ containerSize = _ref.containerSize,
21
+ headerTitle = _ref.headerTitle,
22
+ hideTitle = _ref.hideTitle,
23
+ index = _ref.index,
24
+ filters = _ref.filters,
25
+ suggestionSubmitOverride = _ref.suggestionSubmitOverride,
26
+ _ref$enterpriseConfig = _ref.enterpriseConfig,
27
+ slug = _ref$enterpriseConfig.slug,
28
+ enablePathways = _ref$enterpriseConfig.enablePathways,
29
+ disableSuggestionRedirect = _ref.disableSuggestionRedirect,
30
+ hideSearchBox = _ref.hideSearchBox;
31
+ var _useContext = useContext(SearchContext),
32
+ refinements = _useContext.refinements;
33
+ var searchQueryFromRefinements;
34
+ // Sometimes the query is set to an array of one string instead of just the string
35
+ if (Array.isArray(refinements.q)) {
36
+ var _refinements$q = _slicedToArray(refinements.q, 1);
37
+ searchQueryFromRefinements = _refinements$q[0];
38
+ } else {
39
+ searchQueryFromRefinements = refinements.q;
40
+ }
41
+
42
+ // Add filter to only include course and program content_types
43
+ // as we are currently not supporting videos and pathways
44
+ var modifiedFilters = filters ? "".concat(filters, " AND (content_type:\"course\" OR content_type:\"program\")") : '(content_type:"course" OR content_type:"program")';
45
+ return /*#__PURE__*/React.createElement("div", {
46
+ "data-testid": searchHeaderTestId,
47
+ className: classNames({
48
+ 'bg-brand-primary': variant === STYLE_VARIANTS.inverse
49
+ })
50
+ }, /*#__PURE__*/React.createElement(Container, {
51
+ size: containerSize
52
+ }, /*#__PURE__*/React.createElement(Row, {
53
+ className: "pt-4 pb-3"
54
+ }, /*#__PURE__*/React.createElement(Col, {
55
+ "data-testid": searchBoxColTestId,
56
+ className: classNames('fe__searchbox-col', {
57
+ 'fe__searchbox-col--default': variant === STYLE_VARIANTS["default"]
58
+ }),
59
+ xs: 12,
60
+ md: 8
61
+ }, !hideSearchBox && /*#__PURE__*/React.createElement(SearchBox, {
62
+ className: "mb-4",
63
+ defaultRefinement: searchQueryFromRefinements,
64
+ variant: variant,
65
+ headerTitle: headerTitle,
66
+ hideTitle: hideTitle,
67
+ index: index,
68
+ filters: modifiedFilters,
69
+ enterpriseSlug: slug,
70
+ suggestionSubmitOverride: suggestionSubmitOverride,
71
+ disableSuggestionRedirect: disableSuggestionRedirect
72
+ })), /*#__PURE__*/React.createElement(Col, {
73
+ "data-testid": filtersColTestId,
74
+ className: classNames('fe__searchbox-col', {
75
+ 'fe__searchbox-col--default': variant === STYLE_VARIANTS["default"]
76
+ }),
77
+ xs: 12
78
+ }, /*#__PURE__*/React.createElement(SearchFilters, {
79
+ className: "mb-3",
80
+ variant: variant,
81
+ enablePathways: enablePathways
82
+ })))));
83
+ };
84
+ SearchHeader.defaultProps = {
85
+ variant: STYLE_VARIANTS.inverse,
86
+ containerSize: null,
87
+ headerTitle: undefined,
88
+ hideTitle: false,
89
+ filters: '',
90
+ enterpriseConfig: {
91
+ slug: undefined,
92
+ enablePathways: undefined
93
+ },
94
+ suggestionSubmitOverride: undefined,
95
+ disableSuggestionRedirect: false,
96
+ index: undefined,
97
+ hideSearchBox: false
98
+ };
99
+ SearchHeader.propTypes = {
100
+ headerTitle: PropTypes.string,
101
+ containerSize: PropTypes.string,
102
+ variant: PropTypes.oneOf([STYLE_VARIANTS["default"], STYLE_VARIANTS.inverse]),
103
+ hideTitle: PropTypes.bool,
104
+ index: PropTypes.shape({
105
+ search: PropTypes.func.isRequired
106
+ }),
107
+ filters: PropTypes.string,
108
+ enterpriseConfig: PropTypes.shape({
109
+ slug: PropTypes.string,
110
+ enablePathways: PropTypes.bool
111
+ }),
112
+ suggestionSubmitOverride: PropTypes.func,
113
+ disableSuggestionRedirect: PropTypes.bool,
114
+ hideSearchBox: PropTypes.bool
115
+ };
116
+ export default SearchHeader;
117
+ //# sourceMappingURL=SearchHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchHeader.js","names":["React","useContext","PropTypes","Container","Row","Col","classNames","SearchBox","SearchFilters","STYLE_VARIANTS","SearchContext","searchHeaderTestId","searchBoxColTestId","filtersColTestId","SearchHeader","_ref","variant","containerSize","headerTitle","hideTitle","index","filters","suggestionSubmitOverride","_ref$enterpriseConfig","enterpriseConfig","slug","enablePathways","disableSuggestionRedirect","hideSearchBox","_useContext","refinements","searchQueryFromRefinements","Array","isArray","q","_refinements$q","_slicedToArray","modifiedFilters","concat","createElement","className","inverse","size","xs","md","defaultRefinement","enterpriseSlug","defaultProps","undefined","propTypes","string","oneOf","bool","shape","search","func","isRequired"],"sources":["../src/SearchHeader.jsx"],"sourcesContent":["import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { Container, Row, Col } from '@openedx/paragon';\nimport classNames from 'classnames';\n\nimport SearchBox from './SearchBox';\nimport SearchFilters from './SearchFilters';\nimport { STYLE_VARIANTS } from './data/constants';\n\nimport { SearchContext } from './SearchContext';\n\nexport const searchHeaderTestId = 'search-header';\nexport const searchBoxColTestId = 'search-box-col';\nexport const filtersColTestId = 'filters-col';\n\nconst SearchHeader = ({\n variant,\n containerSize,\n headerTitle,\n hideTitle,\n index,\n filters,\n suggestionSubmitOverride,\n enterpriseConfig: { slug, enablePathways },\n disableSuggestionRedirect,\n hideSearchBox,\n}) => {\n const { refinements } = useContext(SearchContext);\n let searchQueryFromRefinements;\n // Sometimes the query is set to an array of one string instead of just the string\n if (Array.isArray(refinements.q)) {\n [searchQueryFromRefinements] = refinements.q;\n } else {\n searchQueryFromRefinements = refinements.q;\n }\n\n // Add filter to only include course and program content_types\n // as we are currently not supporting videos and pathways\n const modifiedFilters = filters\n ? `${filters} AND (content_type:\"course\" OR content_type:\"program\")`\n : '(content_type:\"course\" OR content_type:\"program\")';\n\n return (\n <div\n data-testid={searchHeaderTestId}\n className={classNames({ 'bg-brand-primary': variant === STYLE_VARIANTS.inverse })}\n >\n <Container size={containerSize}>\n <Row className=\"pt-4 pb-3\">\n <Col\n data-testid={searchBoxColTestId}\n className={classNames('fe__searchbox-col', { 'fe__searchbox-col--default': variant === STYLE_VARIANTS.default })}\n xs={12}\n md={8}\n >\n {!hideSearchBox && (\n <SearchBox\n className=\"mb-4\"\n defaultRefinement={searchQueryFromRefinements}\n variant={variant}\n headerTitle={headerTitle}\n hideTitle={hideTitle}\n index={index}\n filters={modifiedFilters}\n enterpriseSlug={slug}\n suggestionSubmitOverride={suggestionSubmitOverride}\n disableSuggestionRedirect={disableSuggestionRedirect}\n />\n )}\n </Col>\n <Col\n data-testid={filtersColTestId}\n className={classNames('fe__searchbox-col', { 'fe__searchbox-col--default': variant === STYLE_VARIANTS.default })}\n xs={12}\n >\n <SearchFilters className=\"mb-3\" variant={variant} enablePathways={enablePathways} />\n </Col>\n </Row>\n </Container>\n </div>\n );\n};\n\nSearchHeader.defaultProps = {\n variant: STYLE_VARIANTS.inverse,\n containerSize: null,\n headerTitle: undefined,\n hideTitle: false,\n filters: '',\n enterpriseConfig: { slug: undefined, enablePathways: undefined },\n suggestionSubmitOverride: undefined,\n disableSuggestionRedirect: false,\n index: undefined,\n hideSearchBox: false,\n};\n\nSearchHeader.propTypes = {\n headerTitle: PropTypes.string,\n containerSize: PropTypes.string,\n variant: PropTypes.oneOf([STYLE_VARIANTS.default, STYLE_VARIANTS.inverse]),\n hideTitle: PropTypes.bool,\n index: PropTypes.shape({ search: PropTypes.func.isRequired }),\n filters: PropTypes.string,\n enterpriseConfig: PropTypes.shape(\n {\n slug: PropTypes.string,\n enablePathways: PropTypes.bool,\n },\n ),\n suggestionSubmitOverride: PropTypes.func,\n disableSuggestionRedirect: PropTypes.bool,\n hideSearchBox: PropTypes.bool,\n};\n\nexport default SearchHeader;\n"],"mappings":";;;;;;AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,SAAS,EAAEC,GAAG,EAAEC,GAAG,QAAQ,kBAAkB;AACtD,OAAOC,UAAU,MAAM,YAAY;AAEnC,OAAOC,SAAS,MAAM,aAAa;AACnC,OAAOC,aAAa,MAAM,iBAAiB;AAC3C,SAASC,cAAc,QAAQ,kBAAkB;AAEjD,SAASC,aAAa,QAAQ,iBAAiB;AAE/C,OAAO,IAAMC,kBAAkB,GAAG,eAAe;AACjD,OAAO,IAAMC,kBAAkB,GAAG,gBAAgB;AAClD,OAAO,IAAMC,gBAAgB,GAAG,aAAa;AAE7C,IAAMC,YAAY,GAAG,SAAfA,YAAYA,CAAAC,IAAA,EAWZ;EAAA,IAVJC,OAAO,GAAAD,IAAA,CAAPC,OAAO;IACPC,aAAa,GAAAF,IAAA,CAAbE,aAAa;IACbC,WAAW,GAAAH,IAAA,CAAXG,WAAW;IACXC,SAAS,GAAAJ,IAAA,CAATI,SAAS;IACTC,KAAK,GAAAL,IAAA,CAALK,KAAK;IACLC,OAAO,GAAAN,IAAA,CAAPM,OAAO;IACPC,wBAAwB,GAAAP,IAAA,CAAxBO,wBAAwB;IAAAC,qBAAA,GAAAR,IAAA,CACxBS,gBAAgB;IAAIC,IAAI,GAAAF,qBAAA,CAAJE,IAAI;IAAEC,cAAc,GAAAH,qBAAA,CAAdG,cAAc;IACxCC,yBAAyB,GAAAZ,IAAA,CAAzBY,yBAAyB;IACzBC,aAAa,GAAAb,IAAA,CAAba,aAAa;EAEb,IAAAC,WAAA,GAAwB5B,UAAU,CAACS,aAAa,CAAC;IAAzCoB,WAAW,GAAAD,WAAA,CAAXC,WAAW;EACnB,IAAIC,0BAA0B;EAC9B;EACA,IAAIC,KAAK,CAACC,OAAO,CAACH,WAAW,CAACI,CAAC,CAAC,EAAE;IAAA,IAAAC,cAAA,GAAAC,cAAA,CACDN,WAAW,CAACI,CAAC;IAA3CH,0BAA0B,GAAAI,cAAA;EAC7B,CAAC,MAAM;IACLJ,0BAA0B,GAAGD,WAAW,CAACI,CAAC;EAC5C;;EAEA;EACA;EACA,IAAMG,eAAe,GAAGhB,OAAO,MAAAiB,MAAA,CACxBjB,OAAO,kEACV,mDAAmD;EAEvD,oBACErB,KAAA,CAAAuC,aAAA;IACE,eAAa5B,kBAAmB;IAChC6B,SAAS,EAAElC,UAAU,CAAC;MAAE,kBAAkB,EAAEU,OAAO,KAAKP,cAAc,CAACgC;IAAQ,CAAC;EAAE,gBAElFzC,KAAA,CAAAuC,aAAA,CAACpC,SAAS;IAACuC,IAAI,EAAEzB;EAAc,gBAC7BjB,KAAA,CAAAuC,aAAA,CAACnC,GAAG;IAACoC,SAAS,EAAC;EAAW,gBACxBxC,KAAA,CAAAuC,aAAA,CAAClC,GAAG;IACF,eAAaO,kBAAmB;IAChC4B,SAAS,EAAElC,UAAU,CAAC,mBAAmB,EAAE;MAAE,4BAA4B,EAAEU,OAAO,KAAKP,cAAc;IAAS,CAAC,CAAE;IACjHkC,EAAE,EAAE,EAAG;IACPC,EAAE,EAAE;EAAE,GAEL,CAAChB,aAAa,iBACb5B,KAAA,CAAAuC,aAAA,CAAChC,SAAS;IACRiC,SAAS,EAAC,MAAM;IAChBK,iBAAiB,EAAEd,0BAA2B;IAC9Cf,OAAO,EAAEA,OAAQ;IACjBE,WAAW,EAAEA,WAAY;IACzBC,SAAS,EAAEA,SAAU;IACrBC,KAAK,EAAEA,KAAM;IACbC,OAAO,EAAEgB,eAAgB;IACzBS,cAAc,EAAErB,IAAK;IACrBH,wBAAwB,EAAEA,wBAAyB;IACnDK,yBAAyB,EAAEA;EAA0B,CACtD,CAEA,CAAC,eACN3B,KAAA,CAAAuC,aAAA,CAAClC,GAAG;IACF,eAAaQ,gBAAiB;IAC9B2B,SAAS,EAAElC,UAAU,CAAC,mBAAmB,EAAE;MAAE,4BAA4B,EAAEU,OAAO,KAAKP,cAAc;IAAS,CAAC,CAAE;IACjHkC,EAAE,EAAE;EAAG,gBAEP3C,KAAA,CAAAuC,aAAA,CAAC/B,aAAa;IAACgC,SAAS,EAAC,MAAM;IAACxB,OAAO,EAAEA,OAAQ;IAACU,cAAc,EAAEA;EAAe,CAAE,CAChF,CACF,CACI,CACR,CAAC;AAEV,CAAC;AAEDZ,YAAY,CAACiC,YAAY,GAAG;EAC1B/B,OAAO,EAAEP,cAAc,CAACgC,OAAO;EAC/BxB,aAAa,EAAE,IAAI;EACnBC,WAAW,EAAE8B,SAAS;EACtB7B,SAAS,EAAE,KAAK;EAChBE,OAAO,EAAE,EAAE;EACXG,gBAAgB,EAAE;IAAEC,IAAI,EAAEuB,SAAS;IAAEtB,cAAc,EAAEsB;EAAU,CAAC;EAChE1B,wBAAwB,EAAE0B,SAAS;EACnCrB,yBAAyB,EAAE,KAAK;EAChCP,KAAK,EAAE4B,SAAS;EAChBpB,aAAa,EAAE;AACjB,CAAC;AAEDd,YAAY,CAACmC,SAAS,GAAG;EACvB/B,WAAW,EAAEhB,SAAS,CAACgD,MAAM;EAC7BjC,aAAa,EAAEf,SAAS,CAACgD,MAAM;EAC/BlC,OAAO,EAAEd,SAAS,CAACiD,KAAK,CAAC,CAAC1C,cAAc,WAAQ,EAAEA,cAAc,CAACgC,OAAO,CAAC,CAAC;EAC1EtB,SAAS,EAAEjB,SAAS,CAACkD,IAAI;EACzBhC,KAAK,EAAElB,SAAS,CAACmD,KAAK,CAAC;IAAEC,MAAM,EAAEpD,SAAS,CAACqD,IAAI,CAACC;EAAW,CAAC,CAAC;EAC7DnC,OAAO,EAAEnB,SAAS,CAACgD,MAAM;EACzB1B,gBAAgB,EAAEtB,SAAS,CAACmD,KAAK,CAC/B;IACE5B,IAAI,EAAEvB,SAAS,CAACgD,MAAM;IACtBxB,cAAc,EAAExB,SAAS,CAACkD;EAC5B,CACF,CAAC;EACD9B,wBAAwB,EAAEpB,SAAS,CAACqD,IAAI;EACxC5B,yBAAyB,EAAEzB,SAAS,CAACkD,IAAI;EACzCxB,aAAa,EAAE1B,SAAS,CAACkD;AAC3B,CAAC;AAED,eAAetC,YAAY","ignoreList":[]}
@@ -0,0 +1,78 @@
1
+ import React, { useContext } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { connectPagination } from 'react-instantsearch-dom';
4
+ import { Pagination } from '@openedx/paragon';
5
+ import { ArrowBackIos, ArrowForwardIos } from '@openedx/paragon/icons';
6
+ import { useIntl } from '@edx/frontend-platform/i18n';
7
+ import { SearchContext } from './SearchContext';
8
+ import { setRefinementAction, deleteRefinementAction } from './data/actions';
9
+ export var SearchPaginationBase = function SearchPaginationBase(_ref) {
10
+ var nbPages = _ref.nbPages,
11
+ currentRefinement = _ref.currentRefinement,
12
+ maxPagesDisplayed = _ref.maxPagesDisplayed;
13
+ var _useContext = useContext(SearchContext),
14
+ dispatch = _useContext.dispatch;
15
+ var intl = useIntl();
16
+ var buttonLabels = {
17
+ previous: intl.formatMessage({
18
+ id: 'catalog.search.pagination.previous',
19
+ defaultMessage: 'Previous',
20
+ description: 'Label for the previous page button in the pagination component'
21
+ }),
22
+ next: intl.formatMessage({
23
+ id: 'catalog.search.pagination.next',
24
+ defaultMessage: 'Next',
25
+ description: 'Label for the next page button in the pagination component'
26
+ }),
27
+ page: intl.formatMessage({
28
+ id: 'catalog.search.pagination.page',
29
+ defaultMessage: 'Page',
30
+ description: 'Label for the page number in the pagination component'
31
+ }),
32
+ currentPage: intl.formatMessage({
33
+ id: 'catalog.search.pagination.current.page',
34
+ defaultMessage: 'Current Page',
35
+ description: 'Label for the current page number in the pagination component'
36
+ }),
37
+ pageOfCount: intl.formatMessage({
38
+ id: 'catalog.search.pagination.page.of.count',
39
+ defaultMessage: 'of',
40
+ description: 'Label for the page of count in the pagination component'
41
+ })
42
+ };
43
+ var handlePageSelect = function handlePageSelect(page) {
44
+ if (page > 1) {
45
+ dispatch(setRefinementAction('page', page));
46
+ } else {
47
+ dispatch(deleteRefinementAction('page'));
48
+ }
49
+ };
50
+ return /*#__PURE__*/React.createElement(Pagination, {
51
+ variant: "secondary",
52
+ paginationLabel: intl.formatMessage({
53
+ id: 'catalog.search.pagination.label',
54
+ defaultMessage: 'search results navigation',
55
+ description: 'Label for the pagination component'
56
+ }),
57
+ pageCount: nbPages,
58
+ currentPage: currentRefinement,
59
+ onPageSelect: handlePageSelect,
60
+ maxPagesDisplayed: maxPagesDisplayed,
61
+ buttonLabels: buttonLabels,
62
+ icons: {
63
+ leftIcon: ArrowBackIos,
64
+ rightIcon: ArrowForwardIos
65
+ }
66
+ });
67
+ };
68
+ SearchPaginationBase.propTypes = {
69
+ nbPages: PropTypes.number.isRequired,
70
+ currentRefinement: PropTypes.number,
71
+ maxPagesDisplayed: PropTypes.number
72
+ };
73
+ SearchPaginationBase.defaultProps = {
74
+ currentRefinement: 1,
75
+ maxPagesDisplayed: 7
76
+ };
77
+ export default connectPagination(SearchPaginationBase);
78
+ //# sourceMappingURL=SearchPagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchPagination.js","names":["React","useContext","PropTypes","connectPagination","Pagination","ArrowBackIos","ArrowForwardIos","useIntl","SearchContext","setRefinementAction","deleteRefinementAction","SearchPaginationBase","_ref","nbPages","currentRefinement","maxPagesDisplayed","_useContext","dispatch","intl","buttonLabels","previous","formatMessage","id","defaultMessage","description","next","page","currentPage","pageOfCount","handlePageSelect","createElement","variant","paginationLabel","pageCount","onPageSelect","icons","leftIcon","rightIcon","propTypes","number","isRequired","defaultProps"],"sources":["../src/SearchPagination.jsx"],"sourcesContent":["import React, { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { connectPagination } from 'react-instantsearch-dom';\nimport { Pagination } from '@openedx/paragon';\nimport { ArrowBackIos, ArrowForwardIos } from '@openedx/paragon/icons';\n\nimport { useIntl } from '@edx/frontend-platform/i18n';\nimport { SearchContext } from './SearchContext';\nimport { setRefinementAction, deleteRefinementAction } from './data/actions';\n\nexport const SearchPaginationBase = ({\n nbPages,\n currentRefinement,\n maxPagesDisplayed,\n}) => {\n const { dispatch } = useContext(SearchContext);\n const intl = useIntl();\n\n const buttonLabels = {\n previous: intl.formatMessage({\n id: 'catalog.search.pagination.previous',\n defaultMessage: 'Previous',\n description: 'Label for the previous page button in the pagination component',\n }),\n next: intl.formatMessage({\n id: 'catalog.search.pagination.next',\n defaultMessage: 'Next',\n description: 'Label for the next page button in the pagination component',\n }),\n page: intl.formatMessage({\n id: 'catalog.search.pagination.page',\n defaultMessage: 'Page',\n description: 'Label for the page number in the pagination component',\n }),\n currentPage: intl.formatMessage({\n id: 'catalog.search.pagination.current.page',\n defaultMessage: 'Current Page',\n description: 'Label for the current page number in the pagination component',\n }),\n pageOfCount: intl.formatMessage({\n id: 'catalog.search.pagination.page.of.count',\n defaultMessage: 'of',\n description: 'Label for the page of count in the pagination component',\n }),\n };\n\n const handlePageSelect = (page) => {\n if (page > 1) {\n dispatch(setRefinementAction('page', page));\n } else {\n dispatch(deleteRefinementAction('page'));\n }\n };\n\n return (\n <Pagination\n variant=\"secondary\"\n paginationLabel={intl.formatMessage({\n id: 'catalog.search.pagination.label',\n defaultMessage: 'search results navigation',\n description: 'Label for the pagination component',\n })}\n pageCount={nbPages}\n currentPage={currentRefinement}\n onPageSelect={handlePageSelect}\n maxPagesDisplayed={maxPagesDisplayed}\n buttonLabels={buttonLabels}\n icons={{\n leftIcon: ArrowBackIos,\n rightIcon: ArrowForwardIos,\n }}\n />\n );\n};\n\nSearchPaginationBase.propTypes = {\n nbPages: PropTypes.number.isRequired,\n currentRefinement: PropTypes.number,\n maxPagesDisplayed: PropTypes.number,\n};\n\nSearchPaginationBase.defaultProps = {\n currentRefinement: 1,\n maxPagesDisplayed: 7,\n};\n\nexport default connectPagination(SearchPaginationBase);\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;AACzC,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,iBAAiB,QAAQ,yBAAyB;AAC3D,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,YAAY,EAAEC,eAAe,QAAQ,wBAAwB;AAEtE,SAASC,OAAO,QAAQ,6BAA6B;AACrD,SAASC,aAAa,QAAQ,iBAAiB;AAC/C,SAASC,mBAAmB,EAAEC,sBAAsB,QAAQ,gBAAgB;AAE5E,OAAO,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAAC,IAAA,EAI3B;EAAA,IAHJC,OAAO,GAAAD,IAAA,CAAPC,OAAO;IACPC,iBAAiB,GAAAF,IAAA,CAAjBE,iBAAiB;IACjBC,iBAAiB,GAAAH,IAAA,CAAjBG,iBAAiB;EAEjB,IAAAC,WAAA,GAAqBf,UAAU,CAACO,aAAa,CAAC;IAAtCS,QAAQ,GAAAD,WAAA,CAARC,QAAQ;EAChB,IAAMC,IAAI,GAAGX,OAAO,CAAC,CAAC;EAEtB,IAAMY,YAAY,GAAG;IACnBC,QAAQ,EAAEF,IAAI,CAACG,aAAa,CAAC;MAC3BC,EAAE,EAAE,oCAAoC;MACxCC,cAAc,EAAE,UAAU;MAC1BC,WAAW,EAAE;IACf,CAAC,CAAC;IACFC,IAAI,EAAEP,IAAI,CAACG,aAAa,CAAC;MACvBC,EAAE,EAAE,gCAAgC;MACpCC,cAAc,EAAE,MAAM;MACtBC,WAAW,EAAE;IACf,CAAC,CAAC;IACFE,IAAI,EAAER,IAAI,CAACG,aAAa,CAAC;MACvBC,EAAE,EAAE,gCAAgC;MACpCC,cAAc,EAAE,MAAM;MACtBC,WAAW,EAAE;IACf,CAAC,CAAC;IACFG,WAAW,EAAET,IAAI,CAACG,aAAa,CAAC;MAC9BC,EAAE,EAAE,wCAAwC;MAC5CC,cAAc,EAAE,cAAc;MAC9BC,WAAW,EAAE;IACf,CAAC,CAAC;IACFI,WAAW,EAAEV,IAAI,CAACG,aAAa,CAAC;MAC9BC,EAAE,EAAE,yCAAyC;MAC7CC,cAAc,EAAE,IAAI;MACpBC,WAAW,EAAE;IACf,CAAC;EACH,CAAC;EAED,IAAMK,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAIH,IAAI,EAAK;IACjC,IAAIA,IAAI,GAAG,CAAC,EAAE;MACZT,QAAQ,CAACR,mBAAmB,CAAC,MAAM,EAAEiB,IAAI,CAAC,CAAC;IAC7C,CAAC,MAAM;MACLT,QAAQ,CAACP,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC1C;EACF,CAAC;EAED,oBACEV,KAAA,CAAA8B,aAAA,CAAC1B,UAAU;IACT2B,OAAO,EAAC,WAAW;IACnBC,eAAe,EAAEd,IAAI,CAACG,aAAa,CAAC;MAClCC,EAAE,EAAE,iCAAiC;MACrCC,cAAc,EAAE,2BAA2B;MAC3CC,WAAW,EAAE;IACf,CAAC,CAAE;IACHS,SAAS,EAAEpB,OAAQ;IACnBc,WAAW,EAAEb,iBAAkB;IAC/BoB,YAAY,EAAEL,gBAAiB;IAC/Bd,iBAAiB,EAAEA,iBAAkB;IACrCI,YAAY,EAAEA,YAAa;IAC3BgB,KAAK,EAAE;MACLC,QAAQ,EAAE/B,YAAY;MACtBgC,SAAS,EAAE/B;IACb;EAAE,CACH,CAAC;AAEN,CAAC;AAEDK,oBAAoB,CAAC2B,SAAS,GAAG;EAC/BzB,OAAO,EAAEX,SAAS,CAACqC,MAAM,CAACC,UAAU;EACpC1B,iBAAiB,EAAEZ,SAAS,CAACqC,MAAM;EACnCxB,iBAAiB,EAAEb,SAAS,CAACqC;AAC/B,CAAC;AAED5B,oBAAoB,CAAC8B,YAAY,GAAG;EAClC3B,iBAAiB,EAAE,CAAC;EACpBC,iBAAiB,EAAE;AACrB,CAAC;AAED,eAAeZ,iBAAiB,CAACQ,oBAAoB,CAAC","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import { Link } from 'react-router-dom';
3
+ import PropTypes from 'prop-types';
4
+ var SearchSuggestionItem = function SearchSuggestionItem(_ref) {
5
+ var url = _ref.url,
6
+ suggestionItemHandler = _ref.suggestionItemHandler,
7
+ hit = _ref.hit,
8
+ disableSuggestionRedirect = _ref.disableSuggestionRedirect;
9
+ var authoringOrganization = hit.key && hit.key.split('+')[0];
10
+ // If the disable redirect bool is provided, prevent the redirect from happening and instead call the provided submit
11
+ // handler
12
+ var handleLinkDisable = function handleLinkDisable(e) {
13
+ if (disableSuggestionRedirect) {
14
+ e.preventDefault();
15
+ suggestionItemHandler(hit);
16
+ }
17
+ };
18
+ return /*#__PURE__*/React.createElement(Link, {
19
+ to: url,
20
+ key: hit.title,
21
+ className: "suggestion-item",
22
+ onClick: handleLinkDisable
23
+ }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
24
+ dangerouslySetInnerHTML: {
25
+ __html: hit._highlightResult.title.value
26
+ }
27
+ }), authoringOrganization && /*#__PURE__*/React.createElement("div", {
28
+ className: "badge badge-light ml-3 font-weight-light authoring-org-badge"
29
+ }, authoringOrganization)), hit.program_type && /*#__PURE__*/React.createElement("p", {
30
+ className: "font-weight-light text-gray-400 program-type"
31
+ }, hit.program_type));
32
+ };
33
+ SearchSuggestionItem.propTypes = {
34
+ url: PropTypes.string.isRequired,
35
+ suggestionItemHandler: PropTypes.func,
36
+ hit: PropTypes.shape({
37
+ key: PropTypes.string,
38
+ course_keys: PropTypes.arrayOf(PropTypes.string),
39
+ title: PropTypes.string,
40
+ program_type: PropTypes.string,
41
+ _highlightResult: PropTypes.shape({
42
+ title: PropTypes.shape({
43
+ value: PropTypes.string
44
+ })
45
+ }),
46
+ card_image_url: PropTypes.string,
47
+ partners: PropTypes.arrayOf(PropTypes.shape({
48
+ name: PropTypes.string
49
+ })),
50
+ learning_type: PropTypes.string
51
+ }).isRequired,
52
+ disableSuggestionRedirect: PropTypes.bool.isRequired
53
+ };
54
+ SearchSuggestionItem.defaultProps = {
55
+ suggestionItemHandler: undefined
56
+ };
57
+ export default SearchSuggestionItem;
58
+ //# sourceMappingURL=SearchSuggestionItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchSuggestionItem.js","names":["React","Link","PropTypes","SearchSuggestionItem","_ref","url","suggestionItemHandler","hit","disableSuggestionRedirect","authoringOrganization","key","split","handleLinkDisable","e","preventDefault","createElement","to","title","className","onClick","dangerouslySetInnerHTML","__html","_highlightResult","value","program_type","propTypes","string","isRequired","func","shape","course_keys","arrayOf","card_image_url","partners","name","learning_type","bool","defaultProps","undefined"],"sources":["../src/SearchSuggestionItem.jsx"],"sourcesContent":["import React from 'react';\nimport { Link } from 'react-router-dom';\nimport PropTypes from 'prop-types';\n\nconst SearchSuggestionItem = ({\n url, suggestionItemHandler, hit, disableSuggestionRedirect,\n}) => {\n const authoringOrganization = hit.key && hit.key.split('+')[0];\n // If the disable redirect bool is provided, prevent the redirect from happening and instead call the provided submit\n // handler\n const handleLinkDisable = (e) => {\n if (disableSuggestionRedirect) {\n e.preventDefault();\n suggestionItemHandler(hit);\n }\n };\n return (\n <Link to={url} key={hit.title} className=\"suggestion-item\" onClick={handleLinkDisable}>\n <div>\n { /* eslint-disable-next-line react/no-danger, no-underscore-dangle */}\n <div dangerouslySetInnerHTML={{ __html: hit._highlightResult.title.value }} />\n {\n authoringOrganization && (\n <div className=\"badge badge-light ml-3 font-weight-light authoring-org-badge\">\n {authoringOrganization}\n </div>\n )\n }\n </div>\n {\n hit.program_type && (\n <p className=\"font-weight-light text-gray-400 program-type\">\n {hit.program_type}\n </p>\n )\n }\n </Link>\n );\n};\n\nSearchSuggestionItem.propTypes = {\n url: PropTypes.string.isRequired,\n suggestionItemHandler: PropTypes.func,\n hit: PropTypes.shape({\n key: PropTypes.string,\n course_keys: PropTypes.arrayOf(PropTypes.string),\n title: PropTypes.string,\n program_type: PropTypes.string,\n _highlightResult: PropTypes.shape({ title: PropTypes.shape({ value: PropTypes.string }) }),\n card_image_url: PropTypes.string,\n partners: PropTypes.arrayOf(\n PropTypes.shape({\n name: PropTypes.string,\n }),\n ),\n learning_type: PropTypes.string,\n }).isRequired,\n disableSuggestionRedirect: PropTypes.bool.isRequired,\n};\n\nSearchSuggestionItem.defaultProps = {\n suggestionItemHandler: undefined,\n};\n\nexport default SearchSuggestionItem;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,IAAI,QAAQ,kBAAkB;AACvC,OAAOC,SAAS,MAAM,YAAY;AAElC,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAAC,IAAA,EAEpB;EAAA,IADJC,GAAG,GAAAD,IAAA,CAAHC,GAAG;IAAEC,qBAAqB,GAAAF,IAAA,CAArBE,qBAAqB;IAAEC,GAAG,GAAAH,IAAA,CAAHG,GAAG;IAAEC,yBAAyB,GAAAJ,IAAA,CAAzBI,yBAAyB;EAE1D,IAAMC,qBAAqB,GAAGF,GAAG,CAACG,GAAG,IAAIH,GAAG,CAACG,GAAG,CAACC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;EAC9D;EACA;EACA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAIC,CAAC,EAAK;IAC/B,IAAIL,yBAAyB,EAAE;MAC7BK,CAAC,CAACC,cAAc,CAAC,CAAC;MAClBR,qBAAqB,CAACC,GAAG,CAAC;IAC5B;EACF,CAAC;EACD,oBACEP,KAAA,CAAAe,aAAA,CAACd,IAAI;IAACe,EAAE,EAAEX,GAAI;IAACK,GAAG,EAAEH,GAAG,CAACU,KAAM;IAACC,SAAS,EAAC,iBAAiB;IAACC,OAAO,EAAEP;EAAkB,gBACpFZ,KAAA,CAAAe,aAAA,2BAEEf,KAAA,CAAAe,aAAA;IAAKK,uBAAuB,EAAE;MAAEC,MAAM,EAAEd,GAAG,CAACe,gBAAgB,CAACL,KAAK,CAACM;IAAM;EAAE,CAAE,CAAC,EAE5Ed,qBAAqB,iBACnBT,KAAA,CAAAe,aAAA;IAAKG,SAAS,EAAC;EAA8D,GAC1ET,qBACE,CAGN,CAAC,EAEJF,GAAG,CAACiB,YAAY,iBACdxB,KAAA,CAAAe,aAAA;IAAGG,SAAS,EAAC;EAA8C,GACxDX,GAAG,CAACiB,YACJ,CAGH,CAAC;AAEX,CAAC;AAEDrB,oBAAoB,CAACsB,SAAS,GAAG;EAC/BpB,GAAG,EAAEH,SAAS,CAACwB,MAAM,CAACC,UAAU;EAChCrB,qBAAqB,EAAEJ,SAAS,CAAC0B,IAAI;EACrCrB,GAAG,EAAEL,SAAS,CAAC2B,KAAK,CAAC;IACnBnB,GAAG,EAAER,SAAS,CAACwB,MAAM;IACrBI,WAAW,EAAE5B,SAAS,CAAC6B,OAAO,CAAC7B,SAAS,CAACwB,MAAM,CAAC;IAChDT,KAAK,EAAEf,SAAS,CAACwB,MAAM;IACvBF,YAAY,EAAEtB,SAAS,CAACwB,MAAM;IAC9BJ,gBAAgB,EAAEpB,SAAS,CAAC2B,KAAK,CAAC;MAAEZ,KAAK,EAAEf,SAAS,CAAC2B,KAAK,CAAC;QAAEN,KAAK,EAAErB,SAAS,CAACwB;MAAO,CAAC;IAAE,CAAC,CAAC;IAC1FM,cAAc,EAAE9B,SAAS,CAACwB,MAAM;IAChCO,QAAQ,EAAE/B,SAAS,CAAC6B,OAAO,CACzB7B,SAAS,CAAC2B,KAAK,CAAC;MACdK,IAAI,EAAEhC,SAAS,CAACwB;IAClB,CAAC,CACH,CAAC;IACDS,aAAa,EAAEjC,SAAS,CAACwB;EAC3B,CAAC,CAAC,CAACC,UAAU;EACbnB,yBAAyB,EAAEN,SAAS,CAACkC,IAAI,CAACT;AAC5C,CAAC;AAEDxB,oBAAoB,CAACkC,YAAY,GAAG;EAClC/B,qBAAqB,EAAEgC;AACzB,CAAC;AAED,eAAenC,oBAAoB","ignoreList":[]}
@@ -0,0 +1,137 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { FormattedMessage } from '@edx/frontend-platform/i18n';
4
+ import { MAX_NUM_SUGGESTIONS, LEARNING_TYPE_COURSE, LEARNING_TYPE_PROGRAM, LEARNING_TYPE_EXECUTIVE_EDUCATION, COURSE_TYPE_EXECUTIVE_EDUCATION, MAX_NUM_PRE_QUERY_SUGGESTIONS } from './data/constants';
5
+ import PrequerySearchSuggestionItem from './PrequerySearchSuggestionItem';
6
+ import SearchSuggestionItem from './SearchSuggestionItem';
7
+ var SearchSuggestions = function SearchSuggestions(_ref) {
8
+ var preQueryHits = _ref.preQueryHits,
9
+ autoCompleteHits = _ref.autoCompleteHits,
10
+ enterpriseSlug = _ref.enterpriseSlug,
11
+ handleSubmit = _ref.handleSubmit,
12
+ handleSuggestionClickSubmit = _ref.handleSuggestionClickSubmit,
13
+ disableSuggestionRedirect = _ref.disableSuggestionRedirect;
14
+ var getLinkToCourse = function getLinkToCourse(course) {
15
+ var learningType = course.learning_type;
16
+ if (learningType === LEARNING_TYPE_EXECUTIVE_EDUCATION) {
17
+ return "/".concat(enterpriseSlug, "/").concat(COURSE_TYPE_EXECUTIVE_EDUCATION, "/course/").concat(course.key);
18
+ }
19
+ return "/".concat(enterpriseSlug, "/course/").concat(course.key);
20
+ };
21
+ var getLinkToProgram = function getLinkToProgram(program) {
22
+ return "/".concat(enterpriseSlug, "/program/").concat(program.aggregation_key.split(':').pop());
23
+ };
24
+ var preQuerySuggestions = [];
25
+ var courses = [];
26
+ var programs = [];
27
+ var execEdCourses = [];
28
+ if (preQueryHits) {
29
+ preQueryHits.forEach(function (hit) {
30
+ preQuerySuggestions.push(hit);
31
+ });
32
+ }
33
+ autoCompleteHits.forEach(function (hit) {
34
+ var learningType = hit.learning_type;
35
+ if (learningType === LEARNING_TYPE_COURSE) {
36
+ courses.push(hit);
37
+ }
38
+ if (learningType === LEARNING_TYPE_PROGRAM) {
39
+ programs.push(hit);
40
+ }
41
+ if (learningType === LEARNING_TYPE_EXECUTIVE_EDUCATION) {
42
+ execEdCourses.push(hit);
43
+ }
44
+ });
45
+ return /*#__PURE__*/React.createElement("div", {
46
+ className: "suggestions",
47
+ "data-testid": "suggestions"
48
+ }, preQuerySuggestions.length > 0 && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
49
+ className: "mb-2 ml-2 mt-1 font-weight-bold suggestions-section"
50
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
51
+ id: "search.suggestions.topRatedCourses",
52
+ defaultMessage: "Top-rated courses",
53
+ description: "Top-rated courses suggestion section title"
54
+ })), preQuerySuggestions.slice(0, MAX_NUM_PRE_QUERY_SUGGESTIONS).map(function (hit) {
55
+ var getUrl = function getUrl(course) {
56
+ var learningType = course.learning_type;
57
+ if (learningType === LEARNING_TYPE_COURSE || learningType === LEARNING_TYPE_EXECUTIVE_EDUCATION) {
58
+ return getLinkToCourse(course);
59
+ }
60
+ return getLinkToProgram(course);
61
+ };
62
+ return /*#__PURE__*/React.createElement(PrequerySearchSuggestionItem, {
63
+ key: hit.title,
64
+ url: getUrl(hit),
65
+ hit: hit
66
+ });
67
+ })), courses.length > 0 && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
68
+ className: "mb-2 ml-2 mt-1 font-weight-bold suggestions-section"
69
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
70
+ id: "search.suggestions.courses",
71
+ defaultMessage: "Courses",
72
+ description: "Courses suggestion section title"
73
+ })), courses.slice(0, MAX_NUM_SUGGESTIONS).map(function (hit) {
74
+ return /*#__PURE__*/React.createElement(SearchSuggestionItem, {
75
+ key: hit.title,
76
+ url: getLinkToCourse(hit),
77
+ hit: hit,
78
+ disableSuggestionRedirect: disableSuggestionRedirect,
79
+ suggestionItemHandler: handleSuggestionClickSubmit
80
+ });
81
+ })), programs.length > 0 && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
82
+ className: "mb-2 mt-5 ml-2 font-weight-bold suggestions-section"
83
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
84
+ id: "search.suggestions.programs",
85
+ defaultMessage: "Programs",
86
+ description: "Programs suggestion section title"
87
+ })), programs.slice(0, MAX_NUM_SUGGESTIONS).map(function (hit) {
88
+ return /*#__PURE__*/React.createElement(SearchSuggestionItem, {
89
+ key: hit.title,
90
+ url: getLinkToProgram(hit),
91
+ hit: hit,
92
+ disableSuggestionRedirect: disableSuggestionRedirect,
93
+ suggestionItemHandler: handleSuggestionClickSubmit
94
+ });
95
+ })), execEdCourses.length > 0 && /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
96
+ className: "mb-2 mt-5 ml-2 font-weight-bold suggestions-section"
97
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
98
+ id: "search.suggestions.execEd",
99
+ defaultMessage: "Executive Education",
100
+ description: "Executive Education suggestion section title"
101
+ })), execEdCourses.slice(0, MAX_NUM_SUGGESTIONS).map(function (hit) {
102
+ return /*#__PURE__*/React.createElement(SearchSuggestionItem, {
103
+ key: hit.title,
104
+ url: getLinkToCourse(hit),
105
+ hit: hit,
106
+ disableSuggestionRedirect: disableSuggestionRedirect,
107
+ suggestionItemHandler: handleSuggestionClickSubmit
108
+ });
109
+ })), !preQuerySuggestions.length && /*#__PURE__*/React.createElement("button", {
110
+ type: "button",
111
+ className: "btn btn-light w-100 view-all-btn",
112
+ onClick: handleSubmit
113
+ }, /*#__PURE__*/React.createElement(FormattedMessage, {
114
+ id: "search.suggestions.viewAllResults",
115
+ defaultMessage: "View all results",
116
+ description: "View all results button text"
117
+ })));
118
+ };
119
+ SearchSuggestions.propTypes = {
120
+ autoCompleteHits: PropTypes.arrayOf(PropTypes.shape({
121
+ content_type: PropTypes.string
122
+ })).isRequired,
123
+ enterpriseSlug: PropTypes.string,
124
+ handleSubmit: PropTypes.func,
125
+ handleSuggestionClickSubmit: PropTypes.func,
126
+ disableSuggestionRedirect: PropTypes.bool,
127
+ preQueryHits: PropTypes.arrayOf(PropTypes.shape())
128
+ };
129
+ SearchSuggestions.defaultProps = {
130
+ handleSubmit: undefined,
131
+ enterpriseSlug: '',
132
+ handleSuggestionClickSubmit: undefined,
133
+ disableSuggestionRedirect: false,
134
+ preQueryHits: undefined
135
+ };
136
+ export default SearchSuggestions;
137
+ //# sourceMappingURL=SearchSuggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchSuggestions.js","names":["React","PropTypes","FormattedMessage","MAX_NUM_SUGGESTIONS","LEARNING_TYPE_COURSE","LEARNING_TYPE_PROGRAM","LEARNING_TYPE_EXECUTIVE_EDUCATION","COURSE_TYPE_EXECUTIVE_EDUCATION","MAX_NUM_PRE_QUERY_SUGGESTIONS","PrequerySearchSuggestionItem","SearchSuggestionItem","SearchSuggestions","_ref","preQueryHits","autoCompleteHits","enterpriseSlug","handleSubmit","handleSuggestionClickSubmit","disableSuggestionRedirect","getLinkToCourse","course","learningType","learning_type","concat","key","getLinkToProgram","program","aggregation_key","split","pop","preQuerySuggestions","courses","programs","execEdCourses","forEach","hit","push","createElement","className","length","id","defaultMessage","description","slice","map","getUrl","title","url","suggestionItemHandler","type","onClick","propTypes","arrayOf","shape","content_type","string","isRequired","func","bool","defaultProps","undefined"],"sources":["../src/SearchSuggestions.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\n\nimport { FormattedMessage } from '@edx/frontend-platform/i18n';\nimport {\n MAX_NUM_SUGGESTIONS, LEARNING_TYPE_COURSE, LEARNING_TYPE_PROGRAM,\n LEARNING_TYPE_EXECUTIVE_EDUCATION, COURSE_TYPE_EXECUTIVE_EDUCATION,\n MAX_NUM_PRE_QUERY_SUGGESTIONS,\n} from './data/constants';\nimport PrequerySearchSuggestionItem from './PrequerySearchSuggestionItem';\nimport SearchSuggestionItem from './SearchSuggestionItem';\n\nconst SearchSuggestions = ({\n preQueryHits,\n autoCompleteHits,\n enterpriseSlug,\n handleSubmit,\n handleSuggestionClickSubmit,\n disableSuggestionRedirect,\n}) => {\n const getLinkToCourse = (course) => {\n const { learning_type: learningType } = course;\n if (learningType === LEARNING_TYPE_EXECUTIVE_EDUCATION) {\n return `/${enterpriseSlug}/${COURSE_TYPE_EXECUTIVE_EDUCATION}/course/${course.key}`;\n }\n\n return `/${enterpriseSlug}/course/${course.key}`;\n };\n const getLinkToProgram = (program) => `/${enterpriseSlug}/program/${program.aggregation_key.split(':').pop()}`;\n\n const preQuerySuggestions = [];\n const courses = [];\n const programs = [];\n const execEdCourses = [];\n\n if (preQueryHits) {\n preQueryHits.forEach((hit) => {\n preQuerySuggestions.push(hit);\n });\n }\n autoCompleteHits.forEach((hit) => {\n const { learning_type: learningType } = hit;\n if (learningType === LEARNING_TYPE_COURSE) { courses.push(hit); }\n if (learningType === LEARNING_TYPE_PROGRAM) { programs.push(hit); }\n if (learningType === LEARNING_TYPE_EXECUTIVE_EDUCATION) { execEdCourses.push(hit); }\n });\n return (\n <div className=\"suggestions\" data-testid=\"suggestions\">\n {preQuerySuggestions.length > 0 && (\n <div>\n <div className=\"mb-2 ml-2 mt-1 font-weight-bold suggestions-section\">\n <FormattedMessage\n id=\"search.suggestions.topRatedCourses\"\n defaultMessage=\"Top-rated courses\"\n description=\"Top-rated courses suggestion section title\"\n />\n </div>\n {\n preQuerySuggestions.slice(0, MAX_NUM_PRE_QUERY_SUGGESTIONS)\n .map((hit) => {\n const getUrl = (course) => {\n const { learning_type: learningType } = course;\n if (learningType === LEARNING_TYPE_COURSE || learningType === LEARNING_TYPE_EXECUTIVE_EDUCATION) {\n return getLinkToCourse(course);\n }\n return getLinkToProgram(course);\n };\n return (\n <PrequerySearchSuggestionItem\n key={hit.title}\n url={getUrl(hit)}\n hit={hit}\n />\n );\n })\n }\n </div>\n )}\n {courses.length > 0 && (\n <div>\n <div className=\"mb-2 ml-2 mt-1 font-weight-bold suggestions-section\">\n <FormattedMessage\n id=\"search.suggestions.courses\"\n defaultMessage=\"Courses\"\n description=\"Courses suggestion section title\"\n />\n </div>\n {\n courses.slice(0, MAX_NUM_SUGGESTIONS)\n .map((hit) => (\n <SearchSuggestionItem\n key={hit.title}\n url={getLinkToCourse(hit)}\n hit={hit}\n disableSuggestionRedirect={disableSuggestionRedirect}\n suggestionItemHandler={handleSuggestionClickSubmit}\n />\n ))\n }\n </div>\n )}\n {programs.length > 0 && (\n <div>\n <div className=\"mb-2 mt-5 ml-2 font-weight-bold suggestions-section\">\n <FormattedMessage\n id=\"search.suggestions.programs\"\n defaultMessage=\"Programs\"\n description=\"Programs suggestion section title\"\n />\n </div>\n {\n programs.slice(0, MAX_NUM_SUGGESTIONS)\n .map((hit) => (\n <SearchSuggestionItem\n key={hit.title}\n url={getLinkToProgram(hit)}\n hit={hit}\n disableSuggestionRedirect={disableSuggestionRedirect}\n suggestionItemHandler={handleSuggestionClickSubmit}\n />\n ))\n }\n </div>\n )}\n {execEdCourses.length > 0 && (\n <div>\n <div className=\"mb-2 mt-5 ml-2 font-weight-bold suggestions-section\">\n <FormattedMessage\n id=\"search.suggestions.execEd\"\n defaultMessage=\"Executive Education\"\n description=\"Executive Education suggestion section title\"\n />\n </div>\n {\n execEdCourses.slice(0, MAX_NUM_SUGGESTIONS)\n .map((hit) => (\n <SearchSuggestionItem\n key={hit.title}\n url={getLinkToCourse(hit)}\n hit={hit}\n disableSuggestionRedirect={disableSuggestionRedirect}\n suggestionItemHandler={handleSuggestionClickSubmit}\n />\n ))\n }\n </div>\n )}\n {!preQuerySuggestions.length && (\n <button type=\"button\" className=\"btn btn-light w-100 view-all-btn\" onClick={handleSubmit}>\n <FormattedMessage\n id=\"search.suggestions.viewAllResults\"\n defaultMessage=\"View all results\"\n description=\"View all results button text\"\n />\n </button>\n )}\n </div>\n );\n};\n\nSearchSuggestions.propTypes = {\n autoCompleteHits: PropTypes.arrayOf(PropTypes.shape({\n content_type: PropTypes.string,\n })).isRequired,\n enterpriseSlug: PropTypes.string,\n handleSubmit: PropTypes.func,\n handleSuggestionClickSubmit: PropTypes.func,\n disableSuggestionRedirect: PropTypes.bool,\n preQueryHits: PropTypes.arrayOf(PropTypes.shape()),\n};\n\nSearchSuggestions.defaultProps = {\n handleSubmit: undefined,\n enterpriseSlug: '',\n handleSuggestionClickSubmit: undefined,\n disableSuggestionRedirect: false,\n preQueryHits: undefined,\n};\n\nexport default SearchSuggestions;\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ var _excluded = ["title", "items", "isBold", "options", "searchForItems"];
2
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
3
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
4
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
5
+ import React from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import debounce from 'lodash.debounce';
8
+ import { Input } from '@openedx/paragon';
9
+ import FacetDropdown from './FacetDropdown';
10
+ var TypeaheadFacetDropdown = function TypeaheadFacetDropdown(_ref) {
11
+ var title = _ref.title,
12
+ items = _ref.items,
13
+ isBold = _ref.isBold,
14
+ options = _ref.options,
15
+ searchForItems = _ref.searchForItems,
16
+ props = _objectWithoutProperties(_ref, _excluded);
17
+ var handleSearch = debounce(function (value) {
18
+ // when user is erasing the input and input is empty we need to reset the filtering
19
+ if (value.length >= options.minLength || value.length === 0) {
20
+ searchForItems(value);
21
+ }
22
+ }, 200);
23
+ var transformMenuOptions = function transformMenuOptions(menuOptions) {
24
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
25
+ className: "pr-2 pl-2 pb-2"
26
+ }, /*#__PURE__*/React.createElement(Input, {
27
+ autoFocus: true,
28
+ type: "search",
29
+ className: "typeahead-dropdown-input",
30
+ onChange: function onChange(event) {
31
+ return handleSearch(event.currentTarget.value);
32
+ },
33
+ placeholder: options.placeholder,
34
+ "aria-label": options.ariaLabel
35
+ })), /*#__PURE__*/React.createElement("div", {
36
+ className: "typeahead-dropdown-menu-scrollable-items"
37
+ }, menuOptions));
38
+ };
39
+ return /*#__PURE__*/React.createElement(FacetDropdown, _extends({
40
+ items: transformMenuOptions(items),
41
+ title: title,
42
+ isBold: isBold,
43
+ className: "typeahead"
44
+ }, props));
45
+ };
46
+ TypeaheadFacetDropdown.propTypes = {
47
+ title: PropTypes.string.isRequired,
48
+ items: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,
49
+ isBold: PropTypes.bool.isRequired,
50
+ options: PropTypes.shape({
51
+ placeholder: PropTypes.string.isRequired,
52
+ ariaLabel: PropTypes.string.isRequired,
53
+ minLength: PropTypes.number.isRequired
54
+ }).isRequired,
55
+ searchForItems: PropTypes.func.isRequired
56
+ };
57
+ export default TypeaheadFacetDropdown;
58
+ //# sourceMappingURL=TypeaheadFacetDropdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeaheadFacetDropdown.js","names":["React","PropTypes","debounce","Input","FacetDropdown","TypeaheadFacetDropdown","_ref","title","items","isBold","options","searchForItems","props","_objectWithoutProperties","_excluded","handleSearch","value","length","minLength","transformMenuOptions","menuOptions","createElement","Fragment","className","autoFocus","type","onChange","event","currentTarget","placeholder","ariaLabel","_extends","propTypes","string","isRequired","oneOfType","arrayOf","node","bool","shape","number","func"],"sources":["../src/TypeaheadFacetDropdown.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport debounce from 'lodash.debounce';\nimport { Input } from '@openedx/paragon';\n\nimport FacetDropdown from './FacetDropdown';\n\nconst TypeaheadFacetDropdown = ({\n title,\n items,\n isBold,\n options,\n searchForItems,\n ...props\n}) => {\n const handleSearch = debounce((value) => {\n // when user is erasing the input and input is empty we need to reset the filtering\n if (value.length >= options.minLength || value.length === 0) {\n searchForItems(value);\n }\n }, 200);\n\n const transformMenuOptions = (menuOptions) => (\n <>\n <div className=\"pr-2 pl-2 pb-2\">\n <Input\n autoFocus\n type=\"search\"\n className=\"typeahead-dropdown-input\"\n onChange={event => handleSearch(event.currentTarget.value)}\n placeholder={options.placeholder}\n aria-label={options.ariaLabel}\n />\n </div>\n <div className=\"typeahead-dropdown-menu-scrollable-items\">\n {menuOptions}\n </div>\n </>\n );\n\n return (\n <FacetDropdown\n items={transformMenuOptions(items)}\n title={title}\n isBold={isBold}\n className=\"typeahead\"\n {...props}\n />\n );\n};\n\nTypeaheadFacetDropdown.propTypes = {\n title: PropTypes.string.isRequired,\n items: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,\n isBold: PropTypes.bool.isRequired,\n options: PropTypes.shape({\n placeholder: PropTypes.string.isRequired,\n ariaLabel: PropTypes.string.isRequired,\n minLength: PropTypes.number.isRequired,\n }).isRequired,\n searchForItems: PropTypes.func.isRequired,\n};\n\nexport default TypeaheadFacetDropdown;\n"],"mappings":";;;;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,SAAS,MAAM,YAAY;AAClC,OAAOC,QAAQ,MAAM,iBAAiB;AACtC,SAASC,KAAK,QAAQ,kBAAkB;AAExC,OAAOC,aAAa,MAAM,iBAAiB;AAE3C,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAAC,IAAA,EAOtB;EAAA,IANJC,KAAK,GAAAD,IAAA,CAALC,KAAK;IACLC,KAAK,GAAAF,IAAA,CAALE,KAAK;IACLC,MAAM,GAAAH,IAAA,CAANG,MAAM;IACNC,OAAO,GAAAJ,IAAA,CAAPI,OAAO;IACPC,cAAc,GAAAL,IAAA,CAAdK,cAAc;IACXC,KAAK,GAAAC,wBAAA,CAAAP,IAAA,EAAAQ,SAAA;EAER,IAAMC,YAAY,GAAGb,QAAQ,CAAC,UAACc,KAAK,EAAK;IACvC;IACA,IAAIA,KAAK,CAACC,MAAM,IAAIP,OAAO,CAACQ,SAAS,IAAIF,KAAK,CAACC,MAAM,KAAK,CAAC,EAAE;MAC3DN,cAAc,CAACK,KAAK,CAAC;IACvB;EACF,CAAC,EAAE,GAAG,CAAC;EAEP,IAAMG,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAIC,WAAW;IAAA,oBACvCpB,KAAA,CAAAqB,aAAA,CAAArB,KAAA,CAAAsB,QAAA,qBACEtB,KAAA,CAAAqB,aAAA;MAAKE,SAAS,EAAC;IAAgB,gBAC7BvB,KAAA,CAAAqB,aAAA,CAAClB,KAAK;MACJqB,SAAS;MACTC,IAAI,EAAC,QAAQ;MACbF,SAAS,EAAC,0BAA0B;MACpCG,QAAQ,EAAE,SAAVA,QAAQA,CAAEC,KAAK;QAAA,OAAIZ,YAAY,CAACY,KAAK,CAACC,aAAa,CAACZ,KAAK,CAAC;MAAA,CAAC;MAC3Da,WAAW,EAAEnB,OAAO,CAACmB,WAAY;MACjC,cAAYnB,OAAO,CAACoB;IAAU,CAC/B,CACE,CAAC,eACN9B,KAAA,CAAAqB,aAAA;MAAKE,SAAS,EAAC;IAA0C,GACtDH,WACE,CACL,CAAC;EAAA,CACJ;EAED,oBACEpB,KAAA,CAAAqB,aAAA,CAACjB,aAAa,EAAA2B,QAAA;IACZvB,KAAK,EAAEW,oBAAoB,CAACX,KAAK,CAAE;IACnCD,KAAK,EAAEA,KAAM;IACbE,MAAM,EAAEA,MAAO;IACfc,SAAS,EAAC;EAAW,GACjBX,KAAK,CACV,CAAC;AAEN,CAAC;AAEDP,sBAAsB,CAAC2B,SAAS,GAAG;EACjCzB,KAAK,EAAEN,SAAS,CAACgC,MAAM,CAACC,UAAU;EAClC1B,KAAK,EAAEP,SAAS,CAACkC,SAAS,CAAC,CAAClC,SAAS,CAACmC,OAAO,CAACnC,SAAS,CAACoC,IAAI,CAAC,EAAEpC,SAAS,CAACoC,IAAI,CAAC,CAAC,CAACH,UAAU;EAC1FzB,MAAM,EAAER,SAAS,CAACqC,IAAI,CAACJ,UAAU;EACjCxB,OAAO,EAAET,SAAS,CAACsC,KAAK,CAAC;IACvBV,WAAW,EAAE5B,SAAS,CAACgC,MAAM,CAACC,UAAU;IACxCJ,SAAS,EAAE7B,SAAS,CAACgC,MAAM,CAACC,UAAU;IACtChB,SAAS,EAAEjB,SAAS,CAACuC,MAAM,CAACN;EAC9B,CAAC,CAAC,CAACA,UAAU;EACbvB,cAAc,EAAEV,SAAS,CAACwC,IAAI,CAACP;AACjC,CAAC;AAED,eAAe7B,sBAAsB","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ import { hasFeatureFlagEnabled } from '@edx/frontend-enterprise-utils';
2
+ export var FEATURE_ENROLL_WITH_CODES = 'ENROLL_WITH_CODES';
3
+ export var FEATURE_LANGUAGE_FACET = 'LANGUAGE_FACET';
4
+ export var FEATURE_PROGRAM_TITLES_FACET = 'PROGRAM_TITLES_FACET';
5
+ export var LEARNING_TYPE_FACET = 'LEARNING_TYPE_FACET';
6
+ export var FEATURE_ENABLE_PATHWAYS = 'ENABLE_PATHWAYS';
7
+ export var FEATURE_SUBTITLE_FACET = 'SUBTITLE_FACET';
8
+
9
+ // eslint-disable-next-line import/prefer-default-export
10
+ export var features = {
11
+ ENROLL_WITH_CODES: process.env.FEATURE_ENROLL_WITH_CODES || hasFeatureFlagEnabled(FEATURE_ENROLL_WITH_CODES),
12
+ LANGUAGE_FACET: process.env.FEATURE_LANGUAGE_FACET || hasFeatureFlagEnabled(FEATURE_LANGUAGE_FACET),
13
+ PROGRAM_TITLES_FACET: process.env.FEATURE_PROGRAM_TITLES_FACET || hasFeatureFlagEnabled(FEATURE_PROGRAM_TITLES_FACET),
14
+ LEARNING_TYPE_FACET: process.env.LEARNING_TYPE_FACET || hasFeatureFlagEnabled(LEARNING_TYPE_FACET),
15
+ ENABlE_PATHWAYS: process.env.FEATURE_ENABLE_PATHWAYS || hasFeatureFlagEnabled(FEATURE_ENABLE_PATHWAYS),
16
+ SUBTITLE_FACET: process.env.FEATURE_SUBTITLE_FACET || hasFeatureFlagEnabled(FEATURE_SUBTITLE_FACET)
17
+ };
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["hasFeatureFlagEnabled","FEATURE_ENROLL_WITH_CODES","FEATURE_LANGUAGE_FACET","FEATURE_PROGRAM_TITLES_FACET","LEARNING_TYPE_FACET","FEATURE_ENABLE_PATHWAYS","FEATURE_SUBTITLE_FACET","features","ENROLL_WITH_CODES","process","env","LANGUAGE_FACET","PROGRAM_TITLES_FACET","ENABlE_PATHWAYS","SUBTITLE_FACET"],"sources":["../../src/config/index.js"],"sourcesContent":["import { hasFeatureFlagEnabled } from '@edx/frontend-enterprise-utils';\n\nexport const FEATURE_ENROLL_WITH_CODES = 'ENROLL_WITH_CODES';\nexport const FEATURE_LANGUAGE_FACET = 'LANGUAGE_FACET';\nexport const FEATURE_PROGRAM_TITLES_FACET = 'PROGRAM_TITLES_FACET';\nexport const LEARNING_TYPE_FACET = 'LEARNING_TYPE_FACET';\nexport const FEATURE_ENABLE_PATHWAYS = 'ENABLE_PATHWAYS';\nexport const FEATURE_SUBTITLE_FACET = 'SUBTITLE_FACET';\n\n// eslint-disable-next-line import/prefer-default-export\nexport const features = {\n ENROLL_WITH_CODES: process.env.FEATURE_ENROLL_WITH_CODES || hasFeatureFlagEnabled(FEATURE_ENROLL_WITH_CODES),\n LANGUAGE_FACET: process.env.FEATURE_LANGUAGE_FACET || hasFeatureFlagEnabled(FEATURE_LANGUAGE_FACET),\n PROGRAM_TITLES_FACET: (\n process.env.FEATURE_PROGRAM_TITLES_FACET || hasFeatureFlagEnabled(FEATURE_PROGRAM_TITLES_FACET)\n ),\n LEARNING_TYPE_FACET: (\n process.env.LEARNING_TYPE_FACET || hasFeatureFlagEnabled(LEARNING_TYPE_FACET)\n ),\n ENABlE_PATHWAYS: (\n process.env.FEATURE_ENABLE_PATHWAYS || hasFeatureFlagEnabled(FEATURE_ENABLE_PATHWAYS)\n ),\n SUBTITLE_FACET: (\n process.env.FEATURE_SUBTITLE_FACET || hasFeatureFlagEnabled(FEATURE_SUBTITLE_FACET)\n ),\n};\n"],"mappings":"AAAA,SAASA,qBAAqB,QAAQ,gCAAgC;AAEtE,OAAO,IAAMC,yBAAyB,GAAG,mBAAmB;AAC5D,OAAO,IAAMC,sBAAsB,GAAG,gBAAgB;AACtD,OAAO,IAAMC,4BAA4B,GAAG,sBAAsB;AAClE,OAAO,IAAMC,mBAAmB,GAAG,qBAAqB;AACxD,OAAO,IAAMC,uBAAuB,GAAG,iBAAiB;AACxD,OAAO,IAAMC,sBAAsB,GAAG,gBAAgB;;AAEtD;AACA,OAAO,IAAMC,QAAQ,GAAG;EACtBC,iBAAiB,EAAEC,OAAO,CAACC,GAAG,CAACT,yBAAyB,IAAID,qBAAqB,CAACC,yBAAyB,CAAC;EAC5GU,cAAc,EAAEF,OAAO,CAACC,GAAG,CAACR,sBAAsB,IAAIF,qBAAqB,CAACE,sBAAsB,CAAC;EACnGU,oBAAoB,EAClBH,OAAO,CAACC,GAAG,CAACP,4BAA4B,IAAIH,qBAAqB,CAACG,4BAA4B,CAC/F;EACDC,mBAAmB,EACjBK,OAAO,CAACC,GAAG,CAACN,mBAAmB,IAAIJ,qBAAqB,CAACI,mBAAmB,CAC7E;EACDS,eAAe,EACbJ,OAAO,CAACC,GAAG,CAACL,uBAAuB,IAAIL,qBAAqB,CAACK,uBAAuB,CACrF;EACDS,cAAc,EACZL,OAAO,CAACC,GAAG,CAACJ,sBAAsB,IAAIN,qBAAqB,CAACM,sBAAsB;AAEtF,CAAC","ignoreList":[]}
@@ -0,0 +1,46 @@
1
+ export var DELETE_REFINEMENT = 'DELETE_REFINEMENT';
2
+ export var SET_REFINEMENT = 'SET_REFINEMENT';
3
+ export var CLEAR_REFINEMENTS = 'CLEAR_REFINEMENTS';
4
+ export var SET_REFINEMENTS_FROM_QUERY_PARAMS = 'SET_REFINEMENTS_FROM_QUERY_PARAMS';
5
+ export var ADD_TO_REFINEMENT_ARRAY = 'ADD_TO_REFINEMENT_ARRAY';
6
+ export var REMOVE_FROM_REFINEMENT_ARRAY = 'REMOVE_FROM_REFINEMENT_ARRAY';
7
+ export var deleteRefinementAction = function deleteRefinementAction(key) {
8
+ return {
9
+ type: DELETE_REFINEMENT,
10
+ key: key
11
+ };
12
+ };
13
+ export var setRefinementAction = function setRefinementAction(key, value) {
14
+ return {
15
+ type: SET_REFINEMENT,
16
+ key: key,
17
+ value: value
18
+ };
19
+ };
20
+ export var setMultipleRefinementsAction = function setMultipleRefinementsAction() {
21
+ var newKeyValues = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
22
+ return {
23
+ type: SET_REFINEMENTS_FROM_QUERY_PARAMS,
24
+ payload: newKeyValues
25
+ };
26
+ };
27
+ export var clearRefinementsAction = function clearRefinementsAction() {
28
+ return {
29
+ type: CLEAR_REFINEMENTS
30
+ };
31
+ };
32
+ export var addToRefinementArray = function addToRefinementArray(key, value) {
33
+ return {
34
+ type: ADD_TO_REFINEMENT_ARRAY,
35
+ key: key,
36
+ value: value
37
+ };
38
+ };
39
+ export var removeFromRefinementArray = function removeFromRefinementArray(key, value) {
40
+ return {
41
+ type: REMOVE_FROM_REFINEMENT_ARRAY,
42
+ key: key,
43
+ value: value
44
+ };
45
+ };
46
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","names":["DELETE_REFINEMENT","SET_REFINEMENT","CLEAR_REFINEMENTS","SET_REFINEMENTS_FROM_QUERY_PARAMS","ADD_TO_REFINEMENT_ARRAY","REMOVE_FROM_REFINEMENT_ARRAY","deleteRefinementAction","key","type","setRefinementAction","value","setMultipleRefinementsAction","newKeyValues","arguments","length","undefined","payload","clearRefinementsAction","addToRefinementArray","removeFromRefinementArray"],"sources":["../../src/data/actions.js"],"sourcesContent":["export const DELETE_REFINEMENT = 'DELETE_REFINEMENT';\nexport const SET_REFINEMENT = 'SET_REFINEMENT';\nexport const CLEAR_REFINEMENTS = 'CLEAR_REFINEMENTS';\nexport const SET_REFINEMENTS_FROM_QUERY_PARAMS = 'SET_REFINEMENTS_FROM_QUERY_PARAMS';\nexport const ADD_TO_REFINEMENT_ARRAY = 'ADD_TO_REFINEMENT_ARRAY';\nexport const REMOVE_FROM_REFINEMENT_ARRAY = 'REMOVE_FROM_REFINEMENT_ARRAY';\n\nexport const deleteRefinementAction = key => ({\n type: DELETE_REFINEMENT,\n key,\n});\n\nexport const setRefinementAction = (key, value) => ({\n type: SET_REFINEMENT,\n key,\n value,\n});\n\nexport const setMultipleRefinementsAction = (newKeyValues = {}) => ({\n type: SET_REFINEMENTS_FROM_QUERY_PARAMS,\n payload: newKeyValues,\n});\n\nexport const clearRefinementsAction = () => ({ type: CLEAR_REFINEMENTS });\n\nexport const addToRefinementArray = (key, value) => ({\n type: ADD_TO_REFINEMENT_ARRAY,\n key,\n value,\n});\n\nexport const removeFromRefinementArray = (key, value) => ({\n type: REMOVE_FROM_REFINEMENT_ARRAY,\n key,\n value,\n});\n"],"mappings":"AAAA,OAAO,IAAMA,iBAAiB,GAAG,mBAAmB;AACpD,OAAO,IAAMC,cAAc,GAAG,gBAAgB;AAC9C,OAAO,IAAMC,iBAAiB,GAAG,mBAAmB;AACpD,OAAO,IAAMC,iCAAiC,GAAG,mCAAmC;AACpF,OAAO,IAAMC,uBAAuB,GAAG,yBAAyB;AAChE,OAAO,IAAMC,4BAA4B,GAAG,8BAA8B;AAE1E,OAAO,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAGC,GAAG;EAAA,OAAK;IAC5CC,IAAI,EAAER,iBAAiB;IACvBO,GAAG,EAAHA;EACF,CAAC;AAAA,CAAC;AAEF,OAAO,IAAME,mBAAmB,GAAG,SAAtBA,mBAAmBA,CAAIF,GAAG,EAAEG,KAAK;EAAA,OAAM;IAClDF,IAAI,EAAEP,cAAc;IACpBM,GAAG,EAAHA,GAAG;IACHG,KAAK,EAALA;EACF,CAAC;AAAA,CAAC;AAEF,OAAO,IAAMC,4BAA4B,GAAG,SAA/BA,4BAA4BA,CAAA;EAAA,IAAIC,YAAY,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAAA,OAAM;IAClEL,IAAI,EAAEL,iCAAiC;IACvCa,OAAO,EAAEJ;EACX,CAAC;AAAA,CAAC;AAEF,OAAO,IAAMK,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAA;EAAA,OAAU;IAAET,IAAI,EAAEN;EAAkB,CAAC;AAAA,CAAC;AAEzE,OAAO,IAAMgB,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAIX,GAAG,EAAEG,KAAK;EAAA,OAAM;IACnDF,IAAI,EAAEJ,uBAAuB;IAC7BG,GAAG,EAAHA,GAAG;IACHG,KAAK,EAALA;EACF,CAAC;AAAA,CAAC;AAEF,OAAO,IAAMS,yBAAyB,GAAG,SAA5BA,yBAAyBA,CAAIZ,GAAG,EAAEG,KAAK;EAAA,OAAM;IACxDF,IAAI,EAAEH,4BAA4B;IAClCE,GAAG,EAAHA,GAAG;IACHG,KAAK,EAALA;EACF,CAAC;AAAA,CAAC","ignoreList":[]}