@collectionspace/cspace-public-browser 1.5.1

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 (233) hide show
  1. package/LICENSE.md +71 -0
  2. package/README.md +38 -0
  3. package/dist/cspacePublicBrowser.js +4680 -0
  4. package/dist/cspacePublicBrowser.min.js +2 -0
  5. package/dist/cspacePublicBrowser.min.js.LICENSE.txt +56 -0
  6. package/images/check.svg +3 -0
  7. package/images/close.svg +3 -0
  8. package/images/collapse.svg +3 -0
  9. package/images/collapseActive.svg +3 -0
  10. package/images/expand.svg +3 -0
  11. package/images/expandActive.svg +3 -0
  12. package/images/filter.svg +4 -0
  13. package/images/hideLeft.svg +4 -0
  14. package/images/linkBack.svg +4 -0
  15. package/images/linkDown.svg +4 -0
  16. package/images/linkNext.svg +4 -0
  17. package/images/linkPrev.svg +4 -0
  18. package/images/openNew.svg +4 -0
  19. package/images/search.svg +4 -0
  20. package/images/select.svg +4 -0
  21. package/images/top.svg +1 -0
  22. package/lib/actions/detailActions.js +177 -0
  23. package/lib/actions/filterActions.js +16 -0
  24. package/lib/actions/mediaActions.js +63 -0
  25. package/lib/actions/prefsActions.js +84 -0
  26. package/lib/actions/searchActions.js +140 -0
  27. package/lib/actions/searchEntryFormActions.js +19 -0
  28. package/lib/components/App.js +24 -0
  29. package/lib/components/detail/DetailNavBar.js +98 -0
  30. package/lib/components/detail/DetailPanel.js +171 -0
  31. package/lib/components/detail/DetailPanelContainer.js +22 -0
  32. package/lib/components/detail/ExhibitionSection.js +54 -0
  33. package/lib/components/detail/FieldList.js +95 -0
  34. package/lib/components/detail/FieldValueList.js +30 -0
  35. package/lib/components/detail/ImageGallery.js +137 -0
  36. package/lib/components/detail/ImageGalleryContainer.js +19 -0
  37. package/lib/components/detail/InstitutionHoldingList.js +155 -0
  38. package/lib/components/detail/InstitutionHoldingListContainer.js +22 -0
  39. package/lib/components/detail/InstitutionIndex.js +53 -0
  40. package/lib/components/detail/InstitutionIndexContainer.js +15 -0
  41. package/lib/components/detail/InstitutionSection.js +44 -0
  42. package/lib/components/detail/InstitutionSectionContainer.js +15 -0
  43. package/lib/components/layout/Fixed.js +26 -0
  44. package/lib/components/layout/IconButton.js +41 -0
  45. package/lib/components/layout/Panel.js +56 -0
  46. package/lib/components/layout/PanelContainer.js +19 -0
  47. package/lib/components/layout/PanelTitle.js +38 -0
  48. package/lib/components/layout/ScrollTopButton.js +70 -0
  49. package/lib/components/layout/ToggleFilterPanelButton.js +42 -0
  50. package/lib/components/pages/DetailPage.js +93 -0
  51. package/lib/components/pages/DetailPageContainer.js +20 -0
  52. package/lib/components/pages/RootPage.js +41 -0
  53. package/lib/components/pages/SearchPage.js +130 -0
  54. package/lib/components/pages/SearchPageContainer.js +23 -0
  55. package/lib/components/search/entry/SearchEntryForm.js +74 -0
  56. package/lib/components/search/entry/SearchEntryFormContainer.js +20 -0
  57. package/lib/components/search/entry/SearchEntryPanel.js +30 -0
  58. package/lib/components/search/entry/SearchQueryInput.js +89 -0
  59. package/lib/components/search/entry/SearchSubmitButton.js +22 -0
  60. package/lib/components/search/entry/SortSelect.js +89 -0
  61. package/lib/components/search/entry/SortSelectContainer.js +15 -0
  62. package/lib/components/search/result/ClearSearchParamsLink.js +42 -0
  63. package/lib/components/search/result/Filter.js +186 -0
  64. package/lib/components/search/result/FilterContainer.js +22 -0
  65. package/lib/components/search/result/FilterGroup.js +72 -0
  66. package/lib/components/search/result/FilterList.js +48 -0
  67. package/lib/components/search/result/FilterPanel.js +115 -0
  68. package/lib/components/search/result/FilterPanelContainer.js +16 -0
  69. package/lib/components/search/result/FilterSearchInput.js +63 -0
  70. package/lib/components/search/result/RemoveSearchParamLink.js +66 -0
  71. package/lib/components/search/result/SearchError.js +29 -0
  72. package/lib/components/search/result/SearchLoadMore.js +36 -0
  73. package/lib/components/search/result/SearchParamList.js +41 -0
  74. package/lib/components/search/result/SearchPending.js +21 -0
  75. package/lib/components/search/result/SearchResultImage.js +227 -0
  76. package/lib/components/search/result/SearchResultList.js +119 -0
  77. package/lib/components/search/result/SearchResultPanel.js +139 -0
  78. package/lib/components/search/result/SearchResultPanelContainer.js +23 -0
  79. package/lib/components/search/result/SearchResultStats.js +39 -0
  80. package/lib/components/search/result/SearchResultTile.js +61 -0
  81. package/lib/config/anthro.js +123 -0
  82. package/lib/config/bonsai.js +50 -0
  83. package/lib/config/botgarden.js +10 -0
  84. package/lib/config/default.js +530 -0
  85. package/lib/config/fcart.js +36 -0
  86. package/lib/config/herbarium.js +10 -0
  87. package/lib/config/index.js +53 -0
  88. package/lib/config/lhmc.js +10 -0
  89. package/lib/config/materials.js +982 -0
  90. package/lib/config/publicart.js +10 -0
  91. package/lib/constants/actionCodes.js +46 -0
  92. package/lib/constants/ids.js +12 -0
  93. package/lib/helpers/bodyClassName.js +11 -0
  94. package/lib/helpers/esQueryHelpers.js +206 -0
  95. package/lib/helpers/formatHelpers.js +293 -0
  96. package/lib/helpers/searchDimensions.js +28 -0
  97. package/lib/helpers/urlHelpers.js +43 -0
  98. package/lib/index.js +53 -0
  99. package/lib/intl/index.js +16 -0
  100. package/lib/reducers/detailReducer.js +145 -0
  101. package/lib/reducers/filterReducer.js +22 -0
  102. package/lib/reducers/index.js +66 -0
  103. package/lib/reducers/mediaReducer.js +43 -0
  104. package/lib/reducers/prefsReducer.js +27 -0
  105. package/lib/reducers/searchEntryFormReducer.js +24 -0
  106. package/lib/reducers/searchReducer.js +88 -0
  107. package/package.json +118 -0
  108. package/src/actions/detailActions.js +231 -0
  109. package/src/actions/filterActions.js +10 -0
  110. package/src/actions/mediaActions.js +65 -0
  111. package/src/actions/prefsActions.js +95 -0
  112. package/src/actions/searchActions.js +188 -0
  113. package/src/actions/searchEntryFormActions.js +15 -0
  114. package/src/components/App.jsx +18 -0
  115. package/src/components/detail/DetailNavBar.jsx +132 -0
  116. package/src/components/detail/DetailPanel.jsx +215 -0
  117. package/src/components/detail/DetailPanelContainer.js +29 -0
  118. package/src/components/detail/ExhibitionSection.jsx +71 -0
  119. package/src/components/detail/FieldList.jsx +122 -0
  120. package/src/components/detail/FieldValueList.jsx +31 -0
  121. package/src/components/detail/ImageGallery.jsx +153 -0
  122. package/src/components/detail/ImageGalleryContainer.js +17 -0
  123. package/src/components/detail/InstitutionHoldingList.jsx +188 -0
  124. package/src/components/detail/InstitutionHoldingListContainer.js +29 -0
  125. package/src/components/detail/InstitutionIndex.jsx +57 -0
  126. package/src/components/detail/InstitutionIndexContainer.js +11 -0
  127. package/src/components/detail/InstitutionSection.jsx +48 -0
  128. package/src/components/detail/InstitutionSectionContainer.js +11 -0
  129. package/src/components/layout/Fixed.jsx +29 -0
  130. package/src/components/layout/IconButton.jsx +41 -0
  131. package/src/components/layout/Panel.jsx +60 -0
  132. package/src/components/layout/PanelContainer.js +20 -0
  133. package/src/components/layout/PanelTitle.jsx +43 -0
  134. package/src/components/layout/ScrollTopButton.jsx +76 -0
  135. package/src/components/layout/ToggleFilterPanelButton.jsx +43 -0
  136. package/src/components/pages/DetailPage.jsx +101 -0
  137. package/src/components/pages/DetailPageContainer.js +18 -0
  138. package/src/components/pages/RootPage.jsx +37 -0
  139. package/src/components/pages/SearchPage.jsx +160 -0
  140. package/src/components/pages/SearchPageContainer.js +21 -0
  141. package/src/components/search/entry/SearchEntryForm.jsx +82 -0
  142. package/src/components/search/entry/SearchEntryFormContainer.js +22 -0
  143. package/src/components/search/entry/SearchEntryPanel.jsx +28 -0
  144. package/src/components/search/entry/SearchQueryInput.jsx +95 -0
  145. package/src/components/search/entry/SearchSubmitButton.jsx +22 -0
  146. package/src/components/search/entry/SortSelect.jsx +104 -0
  147. package/src/components/search/entry/SortSelectContainer.js +12 -0
  148. package/src/components/search/result/ClearSearchParamsLink.jsx +43 -0
  149. package/src/components/search/result/Filter.jsx +226 -0
  150. package/src/components/search/result/FilterContainer.js +20 -0
  151. package/src/components/search/result/FilterGroup.jsx +83 -0
  152. package/src/components/search/result/FilterList.jsx +51 -0
  153. package/src/components/search/result/FilterPanel.jsx +143 -0
  154. package/src/components/search/result/FilterPanelContainer.js +16 -0
  155. package/src/components/search/result/FilterSearchInput.jsx +68 -0
  156. package/src/components/search/result/RemoveSearchParamLink.jsx +79 -0
  157. package/src/components/search/result/SearchError.jsx +30 -0
  158. package/src/components/search/result/SearchLoadMore.jsx +37 -0
  159. package/src/components/search/result/SearchParamList.jsx +47 -0
  160. package/src/components/search/result/SearchPending.jsx +19 -0
  161. package/src/components/search/result/SearchResultImage.jsx +275 -0
  162. package/src/components/search/result/SearchResultList.jsx +144 -0
  163. package/src/components/search/result/SearchResultPanel.jsx +169 -0
  164. package/src/components/search/result/SearchResultPanelContainer.js +31 -0
  165. package/src/components/search/result/SearchResultStats.jsx +38 -0
  166. package/src/components/search/result/SearchResultTile.jsx +70 -0
  167. package/src/config/anthro.js +153 -0
  168. package/src/config/bonsai.js +50 -0
  169. package/src/config/botgarden.js +3 -0
  170. package/src/config/default.js +604 -0
  171. package/src/config/fcart.js +38 -0
  172. package/src/config/herbarium.js +3 -0
  173. package/src/config/index.js +51 -0
  174. package/src/config/lhmc.js +3 -0
  175. package/src/config/materials.js +1173 -0
  176. package/src/config/publicart.js +3 -0
  177. package/src/constants/actionCodes.js +26 -0
  178. package/src/constants/ids.js +3 -0
  179. package/src/helpers/bodyClassName.js +5 -0
  180. package/src/helpers/esQueryHelpers.js +224 -0
  181. package/src/helpers/formatHelpers.jsx +361 -0
  182. package/src/helpers/searchDimensions.js +21 -0
  183. package/src/helpers/urlHelpers.js +49 -0
  184. package/src/index.jsx +59 -0
  185. package/src/intl/index.js +16 -0
  186. package/src/reducers/detailReducer.js +201 -0
  187. package/src/reducers/filterReducer.js +16 -0
  188. package/src/reducers/index.js +56 -0
  189. package/src/reducers/mediaReducer.js +44 -0
  190. package/src/reducers/prefsReducer.js +24 -0
  191. package/src/reducers/searchEntryFormReducer.js +19 -0
  192. package/src/reducers/searchReducer.js +118 -0
  193. package/styles/colors.css +7 -0
  194. package/styles/cspace/DetailNavBar.css +17 -0
  195. package/styles/cspace/DetailPage.css +3 -0
  196. package/styles/cspace/DetailPanel.css +69 -0
  197. package/styles/cspace/ExhibitionSection.css +9 -0
  198. package/styles/cspace/FieldList.css +15 -0
  199. package/styles/cspace/FieldListField.css +7 -0
  200. package/styles/cspace/FieldListGroup.css +27 -0
  201. package/styles/cspace/FieldValueList.css +19 -0
  202. package/styles/cspace/Filter.css +64 -0
  203. package/styles/cspace/FilterGroup.css +21 -0
  204. package/styles/cspace/FilterPanel.css +45 -0
  205. package/styles/cspace/FilterSearchInput.css +13 -0
  206. package/styles/cspace/Fixed.css +8 -0
  207. package/styles/cspace/IconButton.css +11 -0
  208. package/styles/cspace/ImageGallery.css +43 -0
  209. package/styles/cspace/InstitutionHoldingList.css +109 -0
  210. package/styles/cspace/InstitutionIndex.css +13 -0
  211. package/styles/cspace/InstitutionSection.css +4 -0
  212. package/styles/cspace/Link.css +39 -0
  213. package/styles/cspace/Panel.css +53 -0
  214. package/styles/cspace/PanelTitle.css +48 -0
  215. package/styles/cspace/RemoveSearchParamLink.css +15 -0
  216. package/styles/cspace/RootPage.css +60 -0
  217. package/styles/cspace/ScrollTopButton.css +32 -0
  218. package/styles/cspace/SearchEntryForm.css +4 -0
  219. package/styles/cspace/SearchEntryPanel.css +11 -0
  220. package/styles/cspace/SearchPage.css +2 -0
  221. package/styles/cspace/SearchParamLink.css +21 -0
  222. package/styles/cspace/SearchParamList.css +6 -0
  223. package/styles/cspace/SearchQueryInput.css +30 -0
  224. package/styles/cspace/SearchResultImage.css +29 -0
  225. package/styles/cspace/SearchResultList.css +10 -0
  226. package/styles/cspace/SearchResultPanel.css +31 -0
  227. package/styles/cspace/SearchResultStats.css +4 -0
  228. package/styles/cspace/SearchResultTile.css +67 -0
  229. package/styles/cspace/SearchStatus.css +12 -0
  230. package/styles/cspace/SearchSubmitButton.css +3 -0
  231. package/styles/cspace/SortSelect.css +19 -0
  232. package/styles/cspace/ToggleFilterPanelButton.css +44 -0
  233. package/styles/dimensions.css +9 -0
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = ClearSearchParamsLink;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactIntl = require("react-intl");
10
+ var _reactRouterDom = require("react-router-dom");
11
+ var _immutable = _interopRequireDefault(require("immutable"));
12
+ var _ids = require("../../../constants/ids");
13
+ var _urlHelpers = require("../../../helpers/urlHelpers");
14
+ var _SearchParamLink = _interopRequireDefault(require("../../../../styles/cspace/SearchParamLink.css"));
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ const propTypes = {
17
+ params: _propTypes.default.instanceOf(_immutable.default.Map).isRequired
18
+ };
19
+ const messages = (0, _reactIntl.defineMessages)({
20
+ label: {
21
+ "id": "clearSearchParamsLink.label",
22
+ "defaultMessage": "Clear all"
23
+ }
24
+ });
25
+ function ClearSearchParamsLink(props) {
26
+ const {
27
+ params
28
+ } = props;
29
+ const sortParam = params.filter((value, key) => key === _ids.SORT_ID);
30
+ const hasNonSortParam = params.size > sortParam.size;
31
+ if (hasNonSortParam) {
32
+ const queryString = (0, _urlHelpers.searchParamsToQueryString)(sortParam);
33
+ return /*#__PURE__*/_react.default.createElement(_reactRouterDom.Link, {
34
+ className: _SearchParamLink.default.common,
35
+ to: {
36
+ search: `?${queryString}`
37
+ }
38
+ }, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.label));
39
+ }
40
+ return null;
41
+ }
42
+ ClearSearchParamsLink.propTypes = propTypes;
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactIntl = require("react-intl");
10
+ var _reactRouter = require("react-router");
11
+ var _immutable = _interopRequireDefault(require("immutable"));
12
+ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
13
+ var _FilterSearchInput = _interopRequireDefault(require("./FilterSearchInput"));
14
+ var _PanelContainer = _interopRequireDefault(require("../../layout/PanelContainer"));
15
+ var _Filter = _interopRequireDefault(require("../../../../styles/cspace/Filter.css"));
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
20
+ const propTypes = {
21
+ aggregation: _propTypes.default.instanceOf(_immutable.default.Map),
22
+ field: _propTypes.default.string.isRequired,
23
+ formatValue: _propTypes.default.func,
24
+ history: _propTypes.default.shape({
25
+ push: _propTypes.default.func.isRequired
26
+ }).isRequired,
27
+ id: _propTypes.default.string.isRequired,
28
+ messages: _propTypes.default.shape({
29
+ label: _propTypes.default.object.isRequired
30
+ }).isRequired,
31
+ onSearchValueCommit: _propTypes.default.func,
32
+ onValueCommit: _propTypes.default.func,
33
+ params: _propTypes.default.instanceOf(_immutable.default.Map).isRequired,
34
+ searchValue: _propTypes.default.string,
35
+ showSearch: _propTypes.default.bool
36
+ };
37
+ const defaultProps = {
38
+ aggregation: _immutable.default.Map(),
39
+ formatValue: undefined,
40
+ onSearchValueCommit: () => undefined,
41
+ onValueCommit: () => undefined,
42
+ searchValue: undefined,
43
+ showSearch: true
44
+ };
45
+ const messages = (0, _reactIntl.defineMessages)({
46
+ count: {
47
+ "id": "filter.count",
48
+ "defaultMessage": "({count, number})"
49
+ }
50
+ });
51
+ const getFormattedValues = (0, _memoizeOne.default)((aggregation, formatValue) => {
52
+ if (!formatValue) {
53
+ return undefined;
54
+ }
55
+ const formattedValues = {};
56
+ aggregation.get('buckets').forEach(bucket => {
57
+ const value = bucket.get('key');
58
+ const formattedValue = formatValue(value);
59
+ formattedValues[value] = formattedValue;
60
+ });
61
+ return formattedValues;
62
+ });
63
+ const handleCheckboxFocus = event => {
64
+ const {
65
+ target: focusedFieldElement
66
+ } = event;
67
+ const fieldIndex = focusedFieldElement.getAttribute('data-number');
68
+ const focusedFieldLiElement = focusedFieldElement.parentElement.parentElement;
69
+ const focusedFieldUlElement = focusedFieldLiElement.parentElement;
70
+ const newScrollPosition = focusedFieldLiElement.getBoundingClientRect().height * fieldIndex;
71
+ focusedFieldUlElement.scrollTop = newScrollPosition;
72
+ focusedFieldUlElement.scrollIntoView({
73
+ block: 'end',
74
+ behavior: 'instant'
75
+ });
76
+ };
77
+ class Filter extends _react.Component {
78
+ constructor() {
79
+ super();
80
+ this.handleCheckboxChange = this.handleCheckboxChange.bind(this);
81
+ this.handleSearchInputCommit = this.handleSearchInputCommit.bind(this);
82
+ }
83
+ handleSearchInputCommit(value) {
84
+ const {
85
+ id,
86
+ onSearchValueCommit
87
+ } = this.props;
88
+ onSearchValueCommit(id, value);
89
+ }
90
+ handleCheckboxChange(event) {
91
+ const {
92
+ history,
93
+ id,
94
+ onValueCommit
95
+ } = this.props;
96
+ const {
97
+ target: checkbox
98
+ } = event;
99
+ const {
100
+ dataset,
101
+ name
102
+ } = checkbox;
103
+ const {
104
+ type
105
+ } = dataset;
106
+ const value = type === 'number' ? Number.parseInt(name, 10) : name;
107
+ onValueCommit(history, id, value, checkbox.checked);
108
+ }
109
+ renderBuckets() {
110
+ const {
111
+ aggregation,
112
+ formatValue,
113
+ id,
114
+ params,
115
+ searchValue
116
+ } = this.props;
117
+ const formattedValues = getFormattedValues(aggregation, formatValue);
118
+ const buckets = aggregation.get('buckets');
119
+ let matchingBuckets = buckets;
120
+ if (searchValue) {
121
+ const needle = searchValue.toLowerCase();
122
+ matchingBuckets = buckets.filter(bucket => {
123
+ const value = bucket.get('key');
124
+ const formattedValue = formattedValues ? formattedValues[value] : value;
125
+ const haystack = formattedValue.toLowerCase();
126
+ return haystack.includes(needle);
127
+ });
128
+ }
129
+ let selectedValues = params.get(id) || _immutable.default.List();
130
+ if (!_immutable.default.List.isList(selectedValues)) {
131
+ selectedValues = _immutable.default.List.of(selectedValues);
132
+ }
133
+ return matchingBuckets.map((bucket, index) => {
134
+ const value = bucket.get('key');
135
+ const type = typeof value;
136
+ const count = bucket.get('doc_count');
137
+ const isSelected = selectedValues.indexOf(value) >= 0;
138
+ const formattedValue = formattedValues ? formattedValues[value] : value;
139
+ return /*#__PURE__*/_react.default.createElement("li", {
140
+ key: value
141
+ }, /*#__PURE__*/_react.default.createElement("label", null, /*#__PURE__*/_react.default.createElement("input", {
142
+ checked: isSelected,
143
+ "data-type": type !== 'string' ? type : undefined,
144
+ "data-number": index,
145
+ name: value,
146
+ type: "checkbox",
147
+ onChange: this.handleCheckboxChange,
148
+ onFocus: handleCheckboxFocus
149
+ }), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", null, formattedValue, ' ', /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _extends({}, messages.count, {
150
+ values: {
151
+ count
152
+ }
153
+ }))))));
154
+ });
155
+ }
156
+ render() {
157
+ const {
158
+ aggregation,
159
+ id,
160
+ messages: filterMessages,
161
+ searchValue,
162
+ showSearch
163
+ } = this.props;
164
+ const buckets = aggregation.get('buckets');
165
+ const isEmpty = !buckets || buckets.size === 0;
166
+ if (isEmpty) {
167
+ return null;
168
+ }
169
+
170
+ // eslint-disable-next-line react/jsx-props-no-spreading
171
+ const title = /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, filterMessages.label);
172
+ return /*#__PURE__*/_react.default.createElement(_PanelContainer.default, {
173
+ id: `Filter-${id}`,
174
+ title: title
175
+ }, /*#__PURE__*/_react.default.createElement("div", {
176
+ className: _Filter.default.common
177
+ }, showSearch && /*#__PURE__*/_react.default.createElement(_FilterSearchInput.default, {
178
+ value: searchValue,
179
+ onCommit: this.handleSearchInputCommit
180
+ }), /*#__PURE__*/_react.default.createElement("ul", null, this.renderBuckets(buckets))));
181
+ }
182
+ }
183
+ Filter.propTypes = propTypes;
184
+ Filter.defaultProps = defaultProps;
185
+ var _default = (0, _reactRouter.withRouter)(Filter);
186
+ exports.default = _default;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _reactRedux = require("react-redux");
8
+ var _Filter = _interopRequireDefault(require("./Filter"));
9
+ var _filterActions = require("../../../actions/filterActions");
10
+ var _searchActions = require("../../../actions/searchActions");
11
+ var _reducers = require("../../../reducers");
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ const mapStateToProps = (state, ownProps) => ({
14
+ searchValue: (0, _reducers.getFilterSearchValue)(state, ownProps.id),
15
+ params: (0, _reducers.getSearchParams)(state)
16
+ });
17
+ const mapDispatchToProps = {
18
+ onSearchValueCommit: _filterActions.setFilterSearchValue,
19
+ onValueCommit: _searchActions.applyFilter
20
+ };
21
+ var _default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_Filter.default);
22
+ exports.default = _default;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = FilterGroup;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactIntl = require("react-intl");
10
+ var _immutable = _interopRequireDefault(require("immutable"));
11
+ var _FilterContainer = _interopRequireDefault(require("./FilterContainer"));
12
+ var _FilterGroup = _interopRequireDefault(require("../../../../styles/cspace/FilterGroup.css"));
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ const propTypes = {
15
+ config: _propTypes.default.shape({
16
+ fields: _propTypes.default.arrayOf(_propTypes.default.string).isRequired,
17
+ label: _propTypes.default.string,
18
+ messages: _propTypes.default.object
19
+ }).isRequired,
20
+ fieldsConfig: _propTypes.default.objectOf(_propTypes.default.object).isRequired,
21
+ id: _propTypes.default.string.isRequired,
22
+ isPending: _propTypes.default.bool,
23
+ aggregations: _propTypes.default.instanceOf(_immutable.default.Map)
24
+ };
25
+ const defaultProps = {
26
+ isPending: false,
27
+ aggregations: _immutable.default.Map()
28
+ };
29
+ function FilterGroup(props) {
30
+ const {
31
+ aggregations,
32
+ config,
33
+ fieldsConfig
34
+ } = props;
35
+ const {
36
+ fields,
37
+ label,
38
+ messages
39
+ } = config;
40
+ const isEmpty = aggregations.isEmpty() || !fields.find(fieldId => {
41
+ const buckets = aggregations.getIn([fieldId, 'buckets']);
42
+ return buckets && buckets.size > 0;
43
+ });
44
+ if (isEmpty) {
45
+ return null;
46
+ }
47
+ const labelMessage = messages && messages.label;
48
+
49
+ // eslint-disable-next-line react/jsx-props-no-spreading
50
+ const headerContent = labelMessage ? /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, labelMessage) : label;
51
+ return /*#__PURE__*/_react.default.createElement("div", {
52
+ className: _FilterGroup.default.common
53
+ }, headerContent && /*#__PURE__*/_react.default.createElement("h1", null, headerContent), fields.map(fieldId => {
54
+ const {
55
+ field,
56
+ formatValue,
57
+ messages: fieldMessages,
58
+ showSearch
59
+ } = fieldsConfig[fieldId];
60
+ return /*#__PURE__*/_react.default.createElement(_FilterContainer.default, {
61
+ aggregation: aggregations.get(fieldId),
62
+ id: fieldId,
63
+ field: field,
64
+ formatValue: formatValue,
65
+ key: fieldId,
66
+ messages: fieldMessages,
67
+ showSearch: showSearch
68
+ });
69
+ }));
70
+ }
71
+ FilterGroup.propTypes = propTypes;
72
+ FilterGroup.defaultProps = defaultProps;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = FilterList;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _immutable = _interopRequireDefault(require("immutable"));
10
+ var _FilterGroup = _interopRequireDefault(require("./FilterGroup"));
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ const propTypes = {
13
+ config: _propTypes.default.shape({
14
+ fields: _propTypes.default.object.isRequired,
15
+ groups: _propTypes.default.object.isRequired,
16
+ layout: _propTypes.default.object.isRequired
17
+ }).isRequired,
18
+ isPending: _propTypes.default.bool,
19
+ aggregations: _propTypes.default.instanceOf(_immutable.default.Map)
20
+ };
21
+ const defaultProps = {
22
+ aggregations: _immutable.default.Map(),
23
+ isPending: _propTypes.default.bool
24
+ };
25
+ function FilterList(props) {
26
+ const {
27
+ aggregations,
28
+ config,
29
+ isPending
30
+ } = props;
31
+ const {
32
+ fields,
33
+ groups,
34
+ layout
35
+ } = config;
36
+ return Object.keys(layout).map(layoutId => /*#__PURE__*/_react.default.createElement("div", {
37
+ key: layoutId
38
+ }, layout[layoutId].map(groupId => /*#__PURE__*/_react.default.createElement(_FilterGroup.default, {
39
+ aggregations: aggregations,
40
+ config: groups[groupId],
41
+ fieldsConfig: fields,
42
+ id: groupId,
43
+ isPending: isPending,
44
+ key: groupId
45
+ }))));
46
+ }
47
+ FilterList.propTypes = propTypes;
48
+ FilterList.defaultProps = defaultProps;
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactIntl = require("react-intl");
10
+ var _immutable = _interopRequireDefault(require("immutable"));
11
+ var _FilterList = _interopRequireDefault(require("./FilterList"));
12
+ var _config = _interopRequireDefault(require("../../../config"));
13
+ var _FilterPanel = _interopRequireDefault(require("../../../../styles/cspace/FilterPanel.css"));
14
+ var _dimensions = _interopRequireDefault(require("../../../../styles/dimensions.css"));
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
+ /* global window */
19
+
20
+ const propTypes = {
21
+ api: _propTypes.default.func,
22
+ isExpanded: _propTypes.default.bool,
23
+ isPending: _propTypes.default.bool,
24
+ result: _propTypes.default.instanceOf(_immutable.default.Map)
25
+ };
26
+ const defaultProps = {
27
+ api: () => undefined,
28
+ isExpanded: false,
29
+ isPending: false,
30
+ result: _immutable.default.Map()
31
+ };
32
+ const messages = (0, _reactIntl.defineMessages)({
33
+ title: {
34
+ "id": "FilterPanel.title",
35
+ "defaultMessage": "Refine results:"
36
+ }
37
+ });
38
+ const {
39
+ filterPanelCutoffWidth: cssFilterPanelCutoffWidth
40
+ } = _dimensions.default;
41
+ const filterPanelCutoffWidth = parseInt(cssFilterPanelCutoffWidth, 10);
42
+ class FilterPanel extends _react.Component {
43
+ constructor() {
44
+ super();
45
+ this.handleResize = this.handleResize.bind(this);
46
+ this.handleScroll = this.handleScroll.bind(this);
47
+ this.ref = /*#__PURE__*/_react.default.createRef();
48
+ this.state = {};
49
+ }
50
+ componentDidMount() {
51
+ const {
52
+ api
53
+ } = this.props;
54
+ window.addEventListener('resize', this.handleResize);
55
+ window.addEventListener('scroll', this.handleScroll);
56
+ api({
57
+ setHeight: this.setHeight.bind(this)
58
+ });
59
+ this.setHeight();
60
+ }
61
+ componentWillUnmount() {
62
+ window.removeEventListener('resize', this.handleResize);
63
+ window.removeEventListener('scroll', this.handleScroll);
64
+ }
65
+ handleResize() {
66
+ this.setHeight();
67
+ }
68
+ handleScroll() {
69
+ this.setHeight();
70
+ }
71
+ setHeight() {
72
+ const height = window.innerHeight;
73
+ const rect = this.ref.current.getBoundingClientRect();
74
+ const maxHeight = height - rect.top;
75
+ this.setState({
76
+ height: maxHeight
77
+ });
78
+ }
79
+ renderContent() {
80
+ const {
81
+ isExpanded,
82
+ isPending,
83
+ result
84
+ } = this.props;
85
+ const isVisible = window.innerWidth > filterPanelCutoffWidth || isExpanded;
86
+ if (!isVisible || !result.get('total')) {
87
+ return undefined;
88
+ }
89
+ return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("header", null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.title)), /*#__PURE__*/_react.default.createElement(_FilterList.default, {
90
+ aggregations: result.get('aggregations'),
91
+ config: _config.default.get('filters'),
92
+ isPending: isPending
93
+ }));
94
+ }
95
+ render() {
96
+ const {
97
+ isExpanded
98
+ } = this.props;
99
+ const {
100
+ height
101
+ } = this.state;
102
+ const className = isExpanded ? _FilterPanel.default.expanded : _FilterPanel.default.collapsed;
103
+ const inlineStyle = height ? {
104
+ height
105
+ } : undefined;
106
+ return /*#__PURE__*/_react.default.createElement("div", {
107
+ className: className,
108
+ ref: this.ref,
109
+ style: inlineStyle
110
+ }, this.renderContent());
111
+ }
112
+ }
113
+ exports.default = FilterPanel;
114
+ FilterPanel.propTypes = propTypes;
115
+ FilterPanel.defaultProps = defaultProps;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _reactRedux = require("react-redux");
8
+ var _FilterPanel = _interopRequireDefault(require("./FilterPanel"));
9
+ var _reducers = require("../../../reducers");
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ const mapStateToProps = state => ({
12
+ isPending: (0, _reducers.isSearchPending)(state),
13
+ result: (0, _reducers.getSearchResult)(state)
14
+ });
15
+ var _default = (0, _reactRedux.connect)(mapStateToProps)(_FilterPanel.default);
16
+ exports.default = _default;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactIntl = require("react-intl");
10
+ var _FilterSearchInput = _interopRequireDefault(require("../../../../styles/cspace/FilterSearchInput.css"));
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
13
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
14
+ const propTypes = {
15
+ intl: _propTypes.default.shape({
16
+ formatMessage: _propTypes.default.func.isRequired
17
+ }).isRequired,
18
+ onCommit: _propTypes.default.func,
19
+ value: _propTypes.default.string
20
+ };
21
+ const defaultProps = {
22
+ onCommit: () => undefined,
23
+ value: ''
24
+ };
25
+ const messages = (0, _reactIntl.defineMessages)({
26
+ label: {
27
+ "id": "filterSearchInput.label",
28
+ "defaultMessage": "Search"
29
+ }
30
+ });
31
+ class FilterSearchInput extends _react.Component {
32
+ constructor() {
33
+ super();
34
+ this.handleChange = this.handleChange.bind(this);
35
+ }
36
+ handleChange(event) {
37
+ const {
38
+ onCommit
39
+ } = this.props;
40
+ onCommit(event.target.value);
41
+ }
42
+ render() {
43
+ const {
44
+ intl,
45
+ value
46
+ } = this.props;
47
+ const label = intl.formatMessage(messages.label);
48
+ return (
49
+ /*#__PURE__*/
50
+ // eslint-disable-next-line jsx-a11y/label-has-associated-control
51
+ _react.default.createElement("label", null, label, /*#__PURE__*/_react.default.createElement("input", {
52
+ className: _FilterSearchInput.default.common,
53
+ type: "search",
54
+ value: value,
55
+ onChange: this.handleChange
56
+ }))
57
+ );
58
+ }
59
+ }
60
+ FilterSearchInput.propTypes = propTypes;
61
+ FilterSearchInput.defaultProps = defaultProps;
62
+ var _default = (0, _reactIntl.injectIntl)(FilterSearchInput);
63
+ exports.default = _default;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = RemoveSearchParamLink;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactIntl = require("react-intl");
10
+ var _reactRouterDom = require("react-router-dom");
11
+ var _immutable = _interopRequireDefault(require("immutable"));
12
+ var _get = _interopRequireDefault(require("lodash/get"));
13
+ var _SearchQueryInput = require("../entry/SearchQueryInput");
14
+ var _config = _interopRequireDefault(require("../../../config"));
15
+ var _ids = require("../../../constants/ids");
16
+ var _urlHelpers = require("../../../helpers/urlHelpers");
17
+ var _RemoveSearchParamLink = _interopRequireDefault(require("../../../../styles/cspace/RemoveSearchParamLink.css"));
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+ const propTypes = {
20
+ id: _propTypes.default.string.isRequired,
21
+ params: _propTypes.default.instanceOf(_immutable.default.Map).isRequired
22
+ };
23
+ const VALUE_DELIMITER = ', ';
24
+ const getLabelMessage = (id, filterFieldConfig) => {
25
+ if (id === _ids.SEARCH_QUERY_ID) {
26
+ return _SearchQueryInput.messages.shortLabel;
27
+ }
28
+ if (filterFieldConfig) {
29
+ const {
30
+ messages: filterFieldMessages
31
+ } = filterFieldConfig;
32
+ return filterFieldMessages.shortLabel || filterFieldMessages.label;
33
+ }
34
+ return undefined;
35
+ };
36
+ const renderLabel = (id, filterFieldConfig) => {
37
+ const labelMessage = getLabelMessage(id, filterFieldConfig);
38
+ return labelMessage
39
+ // eslint-disable-next-line react/jsx-props-no-spreading
40
+ ? /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, labelMessage) : id;
41
+ };
42
+ const renderValue = (id, filterFieldConfig, params) => {
43
+ const value = params.get(id);
44
+ const formatValue = (0, _get.default)(filterFieldConfig, 'formatValue');
45
+ if (_immutable.default.List.isList(value)) {
46
+ return formatValue ? value.map(v => formatValue(v)).join(VALUE_DELIMITER) : value.join(VALUE_DELIMITER);
47
+ }
48
+ return formatValue ? formatValue(value) : value;
49
+ };
50
+ function RemoveSearchParamLink(props) {
51
+ const {
52
+ id,
53
+ params
54
+ } = props;
55
+ const filterFieldConfig = _config.default.getFilterFieldConfig(id);
56
+ const queryString = (0, _urlHelpers.searchParamsToQueryString)(params.delete(id));
57
+ const label = renderLabel(id, filterFieldConfig);
58
+ const value = renderValue(id, filterFieldConfig, params);
59
+ return /*#__PURE__*/_react.default.createElement(_reactRouterDom.Link, {
60
+ className: _RemoveSearchParamLink.default.common,
61
+ to: {
62
+ search: `?${queryString}`
63
+ }
64
+ }, label, ":", ' ', value);
65
+ }
66
+ RemoveSearchParamLink.propTypes = propTypes;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = SearchError;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _SearchStatus = _interopRequireDefault(require("../../../../styles/cspace/SearchStatus.css"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ const propTypes = {
12
+ error: _propTypes.default.instanceOf(Error)
13
+ };
14
+ const defaultProps = {
15
+ error: undefined
16
+ };
17
+ function SearchError(props) {
18
+ const {
19
+ error
20
+ } = props;
21
+ if (!error) {
22
+ return undefined;
23
+ }
24
+ return /*#__PURE__*/_react.default.createElement("div", {
25
+ className: _SearchStatus.default.common
26
+ }, error.message);
27
+ }
28
+ SearchError.propTypes = propTypes;
29
+ SearchError.defaultProps = defaultProps;