@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,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = SearchLoadMore;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactIntl = require("react-intl");
10
+ var _SearchStatus = _interopRequireDefault(require("../../../../styles/cspace/SearchStatus.css"));
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ const messages = (0, _reactIntl.defineMessages)({
13
+ label: {
14
+ "id": "searchLoadMore.label",
15
+ "defaultMessage": "Load more"
16
+ }
17
+ });
18
+ const propTypes = {
19
+ onClick: _propTypes.default.func
20
+ };
21
+ const defaultProps = {
22
+ onClick: () => undefined
23
+ };
24
+ function SearchLoadMore(props) {
25
+ const {
26
+ onClick
27
+ } = props;
28
+ return /*#__PURE__*/_react.default.createElement("div", {
29
+ className: _SearchStatus.default.common
30
+ }, /*#__PURE__*/_react.default.createElement("button", {
31
+ type: "button",
32
+ onClick: onClick
33
+ }, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.label)));
34
+ }
35
+ SearchLoadMore.propTypes = propTypes;
36
+ SearchLoadMore.defaultProps = defaultProps;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = SearchParamList;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _immutable = _interopRequireDefault(require("immutable"));
10
+ var _ClearSearchParamsLink = _interopRequireDefault(require("./ClearSearchParamsLink"));
11
+ var _RemoveSearchParamLink = _interopRequireDefault(require("./RemoveSearchParamLink"));
12
+ var _ids = require("../../../constants/ids");
13
+ var _SearchParamList = _interopRequireDefault(require("../../../../styles/cspace/SearchParamList.css"));
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+ const propTypes = {
16
+ params: _propTypes.default.instanceOf(_immutable.default.Map)
17
+ };
18
+ const defaultProps = {
19
+ params: _immutable.default.Map()
20
+ };
21
+ function SearchParamList(props) {
22
+ const {
23
+ params
24
+ } = props;
25
+ const removableParams = params.delete(_ids.SORT_ID);
26
+ if (removableParams.size === 0) {
27
+ return null;
28
+ }
29
+ const paramButtons = removableParams.keySeq().map(id => /*#__PURE__*/_react.default.createElement(_RemoveSearchParamLink.default, {
30
+ id: id,
31
+ key: id,
32
+ params: params
33
+ }));
34
+ return /*#__PURE__*/_react.default.createElement("div", {
35
+ className: _SearchParamList.default.common
36
+ }, paramButtons, /*#__PURE__*/_react.default.createElement(_ClearSearchParamsLink.default, {
37
+ params: params
38
+ }));
39
+ }
40
+ SearchParamList.propTypes = propTypes;
41
+ SearchParamList.defaultProps = defaultProps;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = SearchPending;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _reactIntl = require("react-intl");
9
+ var _SearchStatus = _interopRequireDefault(require("../../../../styles/cspace/SearchStatus.css"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ const messages = (0, _reactIntl.defineMessages)({
12
+ loading: {
13
+ "id": "searchPending.loading",
14
+ "defaultMessage": "Loading..."
15
+ }
16
+ });
17
+ function SearchPending() {
18
+ return /*#__PURE__*/_react.default.createElement("div", {
19
+ className: _SearchStatus.default.common
20
+ }, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.loading));
21
+ }
@@ -0,0 +1,227 @@
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 _cspaceRefname = require("cspace-refname");
11
+ var _immutable = _interopRequireDefault(require("immutable"));
12
+ var _urlHelpers = require("../../../helpers/urlHelpers");
13
+ var _config = _interopRequireDefault(require("../../../config"));
14
+ var _SearchResultImage = _interopRequireDefault(require("../../../../styles/cspace/SearchResultImage.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 fetch, window, AbortController */
19
+
20
+ const propTypes = {
21
+ gatewayUrl: _propTypes.default.string.isRequired,
22
+ holdingInstitutions: _propTypes.default.instanceOf(_immutable.default.List),
23
+ loadImageImmediately: _propTypes.default.bool,
24
+ mediaCsid: _propTypes.default.string,
25
+ referenceValue: _propTypes.default.string.isRequired
26
+ };
27
+ const defaultProps = {
28
+ holdingInstitutions: _immutable.default.List(),
29
+ loadImageImmediately: false,
30
+ mediaCsid: undefined
31
+ };
32
+ const messages = (0, _reactIntl.defineMessages)({
33
+ noimage: {
34
+ "id": "searchResultImage.noimage",
35
+ "defaultMessage": "no image available"
36
+ }
37
+ });
38
+ class SearchResultImage extends _react.Component {
39
+ constructor(props) {
40
+ super();
41
+ this.handleScroll = this.handleScroll.bind(this);
42
+ this.ref = /*#__PURE__*/_react.default.createRef();
43
+ this.state = {
44
+ gatewayUrl: props.gatewayUrl
45
+ };
46
+ if (AbortController) {
47
+ this.abortController = new AbortController();
48
+ }
49
+ }
50
+ componentDidMount() {
51
+ const {
52
+ holdingInstitutions,
53
+ loadImageImmediately,
54
+ mediaCsid,
55
+ referenceValue
56
+ } = this.props;
57
+ window.setTimeout(() => {
58
+ if (this.isInView()) {
59
+ this.init(referenceValue, mediaCsid, holdingInstitutions);
60
+ } else {
61
+ window.addEventListener('scroll', this.handleScroll);
62
+ }
63
+ }, loadImageImmediately ? 0 : _config.default.get('imageLoadDelay'));
64
+ }
65
+ componentDidUpdate(prevProps) {
66
+ const {
67
+ gatewayUrl: prevGatewayUrl,
68
+ mediaCsid: prevMediaCsid,
69
+ referenceValue: prevReferenceValue
70
+ } = prevProps;
71
+ const {
72
+ holdingInstitutions,
73
+ gatewayUrl,
74
+ mediaCsid,
75
+ referenceValue
76
+ } = this.props;
77
+ if (mediaCsid !== prevMediaCsid || gatewayUrl !== prevGatewayUrl || referenceValue !== prevReferenceValue) {
78
+ // FIXME: Make this component stateless.
79
+ // eslint-disable-next-line react/no-did-update-set-state
80
+ this.setState({
81
+ gatewayUrl
82
+ });
83
+ this.init(referenceValue, mediaCsid, holdingInstitutions);
84
+ }
85
+ }
86
+ componentWillUnmount() {
87
+ if (this.abortController) {
88
+ this.abortController.abort();
89
+ }
90
+ window.removeEventListener('scroll', this.handleScroll);
91
+ }
92
+ handleScroll() {
93
+ if (this.isInView()) {
94
+ window.setTimeout(() => {
95
+ if (this.isInView()) {
96
+ const {
97
+ holdingInstitutions,
98
+ mediaCsid,
99
+ referenceValue
100
+ } = this.props;
101
+ window.removeEventListener('scroll', this.handleScroll);
102
+ this.init(referenceValue, mediaCsid, holdingInstitutions);
103
+ }
104
+ }, _config.default.get('imageLoadDelay'));
105
+ }
106
+ }
107
+ getMediaCsid(gatewayUrl, indexName, referenceValue) {
108
+ const url = `${gatewayUrl}/es/doc/_search`;
109
+ const referenceField = _config.default.get('referenceField');
110
+ const query = {
111
+ _source: 'collectionspace_denorm:mediaCsid',
112
+ query: {
113
+ term: {
114
+ [referenceField]: referenceValue
115
+ }
116
+ },
117
+ size: 1,
118
+ terminate_after: 1
119
+ };
120
+ return fetch(url, {
121
+ method: 'POST',
122
+ headers: {
123
+ 'Content-Type': 'application/json'
124
+ },
125
+ body: JSON.stringify(query),
126
+ signal: this.abortController ? this.abortController.signal : undefined
127
+ }).then(response => response.json())
128
+ // eslint-disable-next-line no-underscore-dangle
129
+ .then(data => data.hits.hits[0]._source['collectionspace_denorm:mediaCsid'][0]).catch(() => undefined);
130
+ }
131
+ init(referenceValue, mediaCsid, holdingInstitutions) {
132
+ if (typeof mediaCsid !== 'undefined') {
133
+ this.setState({
134
+ mediaCsid
135
+ });
136
+ return;
137
+ }
138
+
139
+ // Attempt to resove a mediaCsid from holding instutitions. This is really only used by the
140
+ // materials browser. In other profiles, the media csid will have been received in the search
141
+ // result.
142
+
143
+ const cachedGatewayMediaCsid = window.sessionStorage.getItem(`image-${referenceValue}`);
144
+ if (cachedGatewayMediaCsid) {
145
+ const [cachedGatewayUrl, cachedMediaCsid] = cachedGatewayMediaCsid.split(',');
146
+ this.setState({
147
+ gatewayUrl: cachedGatewayUrl,
148
+ mediaCsid: cachedMediaCsid
149
+ });
150
+ return;
151
+ }
152
+ const institutions = holdingInstitutions.filter(value => !!value);
153
+ if (institutions.size === 0) {
154
+ this.setState({
155
+ mediaCsid: null
156
+ });
157
+ return;
158
+ }
159
+ const findImage = institutions.reduce((promise, institution) => promise.catch(() => {
160
+ const instShortId = (0, _cspaceRefname.getItemShortID)(institution);
161
+ const instGatewayUrl = _config.default.get(['institutions', instShortId, 'gatewayUrl']);
162
+ const instIndexName = _config.default.get(['institutions', instShortId, 'esIndexName']);
163
+ if (!instGatewayUrl) {
164
+ return Promise.reject();
165
+ }
166
+ return this.getMediaCsid(instGatewayUrl, instIndexName, referenceValue).then(instMediaCsid => {
167
+ if (!instMediaCsid) {
168
+ return Promise.reject();
169
+ }
170
+ return Promise.resolve({
171
+ instGatewayUrl,
172
+ instMediaCsid
173
+ });
174
+ });
175
+ }), Promise.reject());
176
+ findImage.then(_ref => {
177
+ let {
178
+ instGatewayUrl,
179
+ instMediaCsid
180
+ } = _ref;
181
+ try {
182
+ window.sessionStorage.setItem(`image-${referenceValue}`, `${instGatewayUrl},${instMediaCsid}`);
183
+ } catch (err) {
184
+ // Ignore storage error.
185
+ }
186
+ this.setState({
187
+ gatewayUrl: instGatewayUrl,
188
+ mediaCsid: instMediaCsid
189
+ });
190
+ }).catch(() => {});
191
+ }
192
+ isInView() {
193
+ const domNode = this.ref.current;
194
+ if (domNode) {
195
+ const rect = domNode.getBoundingClientRect();
196
+ return rect.top >= 0 && rect.top < window.innerHeight;
197
+ }
198
+ return false;
199
+ }
200
+ render() {
201
+ const {
202
+ gatewayUrl,
203
+ mediaCsid
204
+ } = this.state;
205
+ if (mediaCsid === null) {
206
+ return /*#__PURE__*/_react.default.createElement("div", {
207
+ "aria-hidden": true,
208
+ className: _SearchResultImage.default.noimage
209
+ }, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.noimage));
210
+ }
211
+ const imageUrl = mediaCsid && (0, _urlHelpers.blobUrl)(gatewayUrl, mediaCsid, _config.default.get('searchResultImageDerivative'));
212
+ let style;
213
+ if (imageUrl) {
214
+ style = {
215
+ backgroundImage: `url(${imageUrl})`
216
+ };
217
+ }
218
+ return /*#__PURE__*/_react.default.createElement("div", {
219
+ className: _SearchResultImage.default.common,
220
+ style: style,
221
+ ref: this.ref
222
+ });
223
+ }
224
+ }
225
+ exports.default = SearchResultImage;
226
+ SearchResultImage.propTypes = propTypes;
227
+ SearchResultImage.defaultProps = defaultProps;
@@ -0,0 +1,119 @@
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 _immutable = _interopRequireDefault(require("immutable"));
10
+ var _reactIntl = require("react-intl");
11
+ var _SearchError = _interopRequireDefault(require("./SearchError"));
12
+ var _SearchLoadMore = _interopRequireDefault(require("./SearchLoadMore"));
13
+ var _SearchPending = _interopRequireDefault(require("./SearchPending"));
14
+ var _SearchResultTile = _interopRequireDefault(require("./SearchResultTile"));
15
+ var _config = _interopRequireDefault(require("../../../config"));
16
+ var _searchDimensions = require("../../../helpers/searchDimensions");
17
+ var _SearchResultList = _interopRequireDefault(require("../../../../styles/cspace/SearchResultList.css"));
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+ 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); }
20
+ 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; }
21
+ const propTypes = {
22
+ error: _propTypes.default.instanceOf(Error),
23
+ hits: _propTypes.default.instanceOf(_immutable.default.List),
24
+ isPending: _propTypes.default.bool,
25
+ onHitsUpdated: _propTypes.default.func,
26
+ onLoadMoreClick: _propTypes.default.func,
27
+ params: _propTypes.default.instanceOf(_immutable.default.Map).isRequired,
28
+ showLoadMore: _propTypes.default.bool
29
+ };
30
+ const defaultProps = {
31
+ error: undefined,
32
+ hits: _immutable.default.List(),
33
+ isPending: false,
34
+ onHitsUpdated: () => undefined,
35
+ onLoadMoreClick: () => undefined,
36
+ showLoadMore: false
37
+ };
38
+ const messages = (0, _reactIntl.defineMessages)({
39
+ noResult: {
40
+ "id": "searchResultList.noResult",
41
+ "defaultMessage": "No results found"
42
+ }
43
+ });
44
+ class SearchResultList extends _react.Component {
45
+ componentDidUpdate(prevProps) {
46
+ const {
47
+ hits,
48
+ onHitsUpdated
49
+ } = this.props;
50
+ const {
51
+ hits: prevHits
52
+ } = prevProps;
53
+ if (hits !== prevHits) {
54
+ onHitsUpdated();
55
+ }
56
+ }
57
+ renderError() {
58
+ const {
59
+ error
60
+ } = this.props;
61
+ if (!error) {
62
+ return undefined;
63
+ }
64
+ return /*#__PURE__*/_react.default.createElement(_SearchError.default, {
65
+ error: error
66
+ });
67
+ }
68
+ renderLoadMore() {
69
+ const {
70
+ isPending,
71
+ onLoadMoreClick,
72
+ showLoadMore
73
+ } = this.props;
74
+ if (!showLoadMore || isPending) {
75
+ return undefined;
76
+ }
77
+ return /*#__PURE__*/_react.default.createElement(_SearchLoadMore.default, {
78
+ onClick: onLoadMoreClick
79
+ });
80
+ }
81
+ renderPending() {
82
+ const {
83
+ isPending
84
+ } = this.props;
85
+ if (!isPending) {
86
+ return undefined;
87
+ }
88
+ return /*#__PURE__*/_react.default.createElement(_SearchPending.default, null);
89
+ }
90
+ renderHits() {
91
+ const {
92
+ error,
93
+ params,
94
+ hits,
95
+ isPending
96
+ } = this.props;
97
+ if (hits.size === 0 && !isPending && !error) {
98
+ return /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.noResult));
99
+ }
100
+ const gatewayUrl = _config.default.get('gatewayUrl');
101
+ const pageSize = (0, _searchDimensions.calculateSearchPageSize)();
102
+ return hits.map((result, index) => /*#__PURE__*/_react.default.createElement(_SearchResultTile.default, {
103
+ gatewayUrl: gatewayUrl,
104
+ loadImageImmediately: index < pageSize,
105
+ index: index,
106
+ key: result.getIn(['_source', 'ecm:name']),
107
+ params: params,
108
+ result: result
109
+ }));
110
+ }
111
+ render() {
112
+ return /*#__PURE__*/_react.default.createElement("div", {
113
+ className: _SearchResultList.default.common
114
+ }, this.renderHits(), this.renderLoadMore(), this.renderPending(), this.renderError());
115
+ }
116
+ }
117
+ exports.default = SearchResultList;
118
+ SearchResultList.propTypes = propTypes;
119
+ SearchResultList.defaultProps = defaultProps;
@@ -0,0 +1,139 @@
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 _immutable = _interopRequireDefault(require("immutable"));
10
+ var _SearchParamList = _interopRequireDefault(require("./SearchParamList"));
11
+ var _SearchResultList = _interopRequireDefault(require("./SearchResultList"));
12
+ var _SearchResultStats = _interopRequireDefault(require("./SearchResultStats"));
13
+ var _SortSelectContainer = _interopRequireDefault(require("../entry/SortSelectContainer"));
14
+ var _config = _interopRequireDefault(require("../../../config"));
15
+ var _ids = require("../../../constants/ids");
16
+ var _searchDimensions = require("../../../helpers/searchDimensions");
17
+ var _SearchResultPanel = _interopRequireDefault(require("../../../../styles/cspace/SearchResultPanel.css"));
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+ 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); }
20
+ 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; }
21
+ /* global window */
22
+
23
+ const propTypes = {
24
+ error: _propTypes.default.instanceOf(Error),
25
+ isPending: _propTypes.default.bool,
26
+ nextOffset: _propTypes.default.number,
27
+ onHitsUpdated: _propTypes.default.func,
28
+ result: _propTypes.default.instanceOf(_immutable.default.Map),
29
+ params: _propTypes.default.instanceOf(_immutable.default.Map),
30
+ search: _propTypes.default.func,
31
+ setSearchPageSize: _propTypes.default.func
32
+ };
33
+ const defaultProps = {
34
+ error: undefined,
35
+ isPending: false,
36
+ nextOffset: undefined,
37
+ onHitsUpdated: undefined,
38
+ params: _immutable.default.Map(),
39
+ result: undefined,
40
+ search: () => undefined,
41
+ setSearchPageSize: () => undefined
42
+ };
43
+ class SearchResultPanel extends _react.Component {
44
+ constructor() {
45
+ super();
46
+ this.handleLoadMoreClick = this.handleLoadMoreClick.bind(this);
47
+ this.handleScroll = this.handleScroll.bind(this);
48
+ this.ref = /*#__PURE__*/_react.default.createRef();
49
+ }
50
+ componentDidMount() {
51
+ const {
52
+ setSearchPageSize
53
+ } = this.props;
54
+ window.addEventListener('scroll', this.handleScroll, false);
55
+ setSearchPageSize((0, _searchDimensions.calculateSearchPageSize)());
56
+ this.search();
57
+ }
58
+ componentDidUpdate(prevProps) {
59
+ const {
60
+ params
61
+ } = this.props;
62
+ const {
63
+ params: prevParams
64
+ } = prevProps;
65
+ if (params !== prevParams) {
66
+ this.search();
67
+ }
68
+ }
69
+ componentWillUnmount() {
70
+ window.removeEventListener('scroll', this.handleScroll, false);
71
+ }
72
+ handleLoadMoreClick() {
73
+ this.search();
74
+ }
75
+ handleScroll() {
76
+ const {
77
+ nextOffset
78
+ } = this.props;
79
+ if (nextOffset < _config.default.get('pageAutoLoadLimit')) {
80
+ const {
81
+ search
82
+ } = this.props;
83
+ const rect = this.ref.current.getBoundingClientRect();
84
+ const bottomOffset = rect.bottom - window.innerHeight;
85
+ if (bottomOffset <= _searchDimensions.tileHeight) {
86
+ search(_config.default.get('pageLoadDelay'));
87
+ }
88
+ }
89
+ }
90
+ search(fetchDelay) {
91
+ const {
92
+ search
93
+ } = this.props;
94
+ search(fetchDelay);
95
+ }
96
+ renderError() {
97
+ const {
98
+ error
99
+ } = this.props;
100
+ return /*#__PURE__*/_react.default.createElement("div", null, error.message);
101
+ }
102
+ renderResult() {
103
+ const {
104
+ error,
105
+ isPending,
106
+ nextOffset,
107
+ onHitsUpdated,
108
+ params,
109
+ result
110
+ } = this.props;
111
+ const hitCount = result && result.get('total');
112
+ const hits = result && result.get('hits');
113
+ const showLoadMore = result && hits.size < hitCount && nextOffset >= _config.default.get('pageAutoLoadLimit');
114
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("header", null, /*#__PURE__*/_react.default.createElement(_SearchParamList.default, {
115
+ params: params
116
+ }), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_SearchResultStats.default, {
117
+ count: hitCount
118
+ }), /*#__PURE__*/_react.default.createElement(_SortSelectContainer.default, {
119
+ value: params.get(_ids.SORT_ID)
120
+ }))), /*#__PURE__*/_react.default.createElement(_SearchResultList.default, {
121
+ error: error,
122
+ isPending: isPending,
123
+ onHitsUpdated: onHitsUpdated,
124
+ onLoadMoreClick: this.handleLoadMoreClick,
125
+ params: params,
126
+ hits: hits,
127
+ showLoadMore: showLoadMore
128
+ }));
129
+ }
130
+ render() {
131
+ return /*#__PURE__*/_react.default.createElement("div", {
132
+ className: _SearchResultPanel.default.common,
133
+ ref: this.ref
134
+ }, this.renderResult());
135
+ }
136
+ }
137
+ exports.default = SearchResultPanel;
138
+ SearchResultPanel.propTypes = propTypes;
139
+ SearchResultPanel.defaultProps = defaultProps;
@@ -0,0 +1,23 @@
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 _SearchResultPanel = _interopRequireDefault(require("./SearchResultPanel"));
9
+ var _searchActions = require("../../../actions/searchActions");
10
+ var _reducers = require("../../../reducers");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ const mapStateToProps = state => ({
13
+ error: (0, _reducers.getSearchError)(state),
14
+ isPending: (0, _reducers.isSearchPending)(state),
15
+ nextOffset: (0, _reducers.getSearchNextOffset)(state),
16
+ result: (0, _reducers.getSearchResult)(state)
17
+ });
18
+ const mapDispatchToProps = {
19
+ search: _searchActions.search,
20
+ setSearchPageSize: _searchActions.setSearchPageSize
21
+ };
22
+ var _default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(_SearchResultPanel.default);
23
+ exports.default = _default;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = SearchResultStats;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactIntl = require("react-intl");
10
+ var _SearchResultStats = _interopRequireDefault(require("../../../../styles/cspace/SearchResultStats.css"));
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ 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); }
13
+ const propTypes = {
14
+ count: _propTypes.default.number
15
+ };
16
+ const defaultProps = {
17
+ count: undefined
18
+ };
19
+ const messages = (0, _reactIntl.defineMessages)({
20
+ count: {
21
+ "id": "searchResultStats.count",
22
+ "defaultMessage": "{count, plural,\n one {# item}\n other {# items}\n } found"
23
+ }
24
+ });
25
+ function SearchResultStats(props) {
26
+ const {
27
+ count
28
+ } = props;
29
+ return /*#__PURE__*/_react.default.createElement("div", {
30
+ className: _SearchResultStats.default.common,
31
+ "aria-live": "polite"
32
+ }, count ? /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _extends({}, messages.count, {
33
+ values: {
34
+ count
35
+ }
36
+ })) : undefined);
37
+ }
38
+ SearchResultStats.propTypes = propTypes;
39
+ SearchResultStats.defaultProps = defaultProps;