@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.
- package/LICENSE.md +71 -0
- package/README.md +38 -0
- package/dist/cspacePublicBrowser.js +4680 -0
- package/dist/cspacePublicBrowser.min.js +2 -0
- package/dist/cspacePublicBrowser.min.js.LICENSE.txt +56 -0
- package/images/check.svg +3 -0
- package/images/close.svg +3 -0
- package/images/collapse.svg +3 -0
- package/images/collapseActive.svg +3 -0
- package/images/expand.svg +3 -0
- package/images/expandActive.svg +3 -0
- package/images/filter.svg +4 -0
- package/images/hideLeft.svg +4 -0
- package/images/linkBack.svg +4 -0
- package/images/linkDown.svg +4 -0
- package/images/linkNext.svg +4 -0
- package/images/linkPrev.svg +4 -0
- package/images/openNew.svg +4 -0
- package/images/search.svg +4 -0
- package/images/select.svg +4 -0
- package/images/top.svg +1 -0
- package/lib/actions/detailActions.js +177 -0
- package/lib/actions/filterActions.js +16 -0
- package/lib/actions/mediaActions.js +63 -0
- package/lib/actions/prefsActions.js +84 -0
- package/lib/actions/searchActions.js +140 -0
- package/lib/actions/searchEntryFormActions.js +19 -0
- package/lib/components/App.js +24 -0
- package/lib/components/detail/DetailNavBar.js +98 -0
- package/lib/components/detail/DetailPanel.js +171 -0
- package/lib/components/detail/DetailPanelContainer.js +22 -0
- package/lib/components/detail/ExhibitionSection.js +54 -0
- package/lib/components/detail/FieldList.js +95 -0
- package/lib/components/detail/FieldValueList.js +30 -0
- package/lib/components/detail/ImageGallery.js +137 -0
- package/lib/components/detail/ImageGalleryContainer.js +19 -0
- package/lib/components/detail/InstitutionHoldingList.js +155 -0
- package/lib/components/detail/InstitutionHoldingListContainer.js +22 -0
- package/lib/components/detail/InstitutionIndex.js +53 -0
- package/lib/components/detail/InstitutionIndexContainer.js +15 -0
- package/lib/components/detail/InstitutionSection.js +44 -0
- package/lib/components/detail/InstitutionSectionContainer.js +15 -0
- package/lib/components/layout/Fixed.js +26 -0
- package/lib/components/layout/IconButton.js +41 -0
- package/lib/components/layout/Panel.js +56 -0
- package/lib/components/layout/PanelContainer.js +19 -0
- package/lib/components/layout/PanelTitle.js +38 -0
- package/lib/components/layout/ScrollTopButton.js +70 -0
- package/lib/components/layout/ToggleFilterPanelButton.js +42 -0
- package/lib/components/pages/DetailPage.js +93 -0
- package/lib/components/pages/DetailPageContainer.js +20 -0
- package/lib/components/pages/RootPage.js +41 -0
- package/lib/components/pages/SearchPage.js +130 -0
- package/lib/components/pages/SearchPageContainer.js +23 -0
- package/lib/components/search/entry/SearchEntryForm.js +74 -0
- package/lib/components/search/entry/SearchEntryFormContainer.js +20 -0
- package/lib/components/search/entry/SearchEntryPanel.js +30 -0
- package/lib/components/search/entry/SearchQueryInput.js +89 -0
- package/lib/components/search/entry/SearchSubmitButton.js +22 -0
- package/lib/components/search/entry/SortSelect.js +89 -0
- package/lib/components/search/entry/SortSelectContainer.js +15 -0
- package/lib/components/search/result/ClearSearchParamsLink.js +42 -0
- package/lib/components/search/result/Filter.js +186 -0
- package/lib/components/search/result/FilterContainer.js +22 -0
- package/lib/components/search/result/FilterGroup.js +72 -0
- package/lib/components/search/result/FilterList.js +48 -0
- package/lib/components/search/result/FilterPanel.js +115 -0
- package/lib/components/search/result/FilterPanelContainer.js +16 -0
- package/lib/components/search/result/FilterSearchInput.js +63 -0
- package/lib/components/search/result/RemoveSearchParamLink.js +66 -0
- package/lib/components/search/result/SearchError.js +29 -0
- package/lib/components/search/result/SearchLoadMore.js +36 -0
- package/lib/components/search/result/SearchParamList.js +41 -0
- package/lib/components/search/result/SearchPending.js +21 -0
- package/lib/components/search/result/SearchResultImage.js +227 -0
- package/lib/components/search/result/SearchResultList.js +119 -0
- package/lib/components/search/result/SearchResultPanel.js +139 -0
- package/lib/components/search/result/SearchResultPanelContainer.js +23 -0
- package/lib/components/search/result/SearchResultStats.js +39 -0
- package/lib/components/search/result/SearchResultTile.js +61 -0
- package/lib/config/anthro.js +123 -0
- package/lib/config/bonsai.js +50 -0
- package/lib/config/botgarden.js +10 -0
- package/lib/config/default.js +530 -0
- package/lib/config/fcart.js +36 -0
- package/lib/config/herbarium.js +10 -0
- package/lib/config/index.js +53 -0
- package/lib/config/lhmc.js +10 -0
- package/lib/config/materials.js +982 -0
- package/lib/config/publicart.js +10 -0
- package/lib/constants/actionCodes.js +46 -0
- package/lib/constants/ids.js +12 -0
- package/lib/helpers/bodyClassName.js +11 -0
- package/lib/helpers/esQueryHelpers.js +206 -0
- package/lib/helpers/formatHelpers.js +293 -0
- package/lib/helpers/searchDimensions.js +28 -0
- package/lib/helpers/urlHelpers.js +43 -0
- package/lib/index.js +53 -0
- package/lib/intl/index.js +16 -0
- package/lib/reducers/detailReducer.js +145 -0
- package/lib/reducers/filterReducer.js +22 -0
- package/lib/reducers/index.js +66 -0
- package/lib/reducers/mediaReducer.js +43 -0
- package/lib/reducers/prefsReducer.js +27 -0
- package/lib/reducers/searchEntryFormReducer.js +24 -0
- package/lib/reducers/searchReducer.js +88 -0
- package/package.json +118 -0
- package/src/actions/detailActions.js +231 -0
- package/src/actions/filterActions.js +10 -0
- package/src/actions/mediaActions.js +65 -0
- package/src/actions/prefsActions.js +95 -0
- package/src/actions/searchActions.js +188 -0
- package/src/actions/searchEntryFormActions.js +15 -0
- package/src/components/App.jsx +18 -0
- package/src/components/detail/DetailNavBar.jsx +132 -0
- package/src/components/detail/DetailPanel.jsx +215 -0
- package/src/components/detail/DetailPanelContainer.js +29 -0
- package/src/components/detail/ExhibitionSection.jsx +71 -0
- package/src/components/detail/FieldList.jsx +122 -0
- package/src/components/detail/FieldValueList.jsx +31 -0
- package/src/components/detail/ImageGallery.jsx +153 -0
- package/src/components/detail/ImageGalleryContainer.js +17 -0
- package/src/components/detail/InstitutionHoldingList.jsx +188 -0
- package/src/components/detail/InstitutionHoldingListContainer.js +29 -0
- package/src/components/detail/InstitutionIndex.jsx +57 -0
- package/src/components/detail/InstitutionIndexContainer.js +11 -0
- package/src/components/detail/InstitutionSection.jsx +48 -0
- package/src/components/detail/InstitutionSectionContainer.js +11 -0
- package/src/components/layout/Fixed.jsx +29 -0
- package/src/components/layout/IconButton.jsx +41 -0
- package/src/components/layout/Panel.jsx +60 -0
- package/src/components/layout/PanelContainer.js +20 -0
- package/src/components/layout/PanelTitle.jsx +43 -0
- package/src/components/layout/ScrollTopButton.jsx +76 -0
- package/src/components/layout/ToggleFilterPanelButton.jsx +43 -0
- package/src/components/pages/DetailPage.jsx +101 -0
- package/src/components/pages/DetailPageContainer.js +18 -0
- package/src/components/pages/RootPage.jsx +37 -0
- package/src/components/pages/SearchPage.jsx +160 -0
- package/src/components/pages/SearchPageContainer.js +21 -0
- package/src/components/search/entry/SearchEntryForm.jsx +82 -0
- package/src/components/search/entry/SearchEntryFormContainer.js +22 -0
- package/src/components/search/entry/SearchEntryPanel.jsx +28 -0
- package/src/components/search/entry/SearchQueryInput.jsx +95 -0
- package/src/components/search/entry/SearchSubmitButton.jsx +22 -0
- package/src/components/search/entry/SortSelect.jsx +104 -0
- package/src/components/search/entry/SortSelectContainer.js +12 -0
- package/src/components/search/result/ClearSearchParamsLink.jsx +43 -0
- package/src/components/search/result/Filter.jsx +226 -0
- package/src/components/search/result/FilterContainer.js +20 -0
- package/src/components/search/result/FilterGroup.jsx +83 -0
- package/src/components/search/result/FilterList.jsx +51 -0
- package/src/components/search/result/FilterPanel.jsx +143 -0
- package/src/components/search/result/FilterPanelContainer.js +16 -0
- package/src/components/search/result/FilterSearchInput.jsx +68 -0
- package/src/components/search/result/RemoveSearchParamLink.jsx +79 -0
- package/src/components/search/result/SearchError.jsx +30 -0
- package/src/components/search/result/SearchLoadMore.jsx +37 -0
- package/src/components/search/result/SearchParamList.jsx +47 -0
- package/src/components/search/result/SearchPending.jsx +19 -0
- package/src/components/search/result/SearchResultImage.jsx +275 -0
- package/src/components/search/result/SearchResultList.jsx +144 -0
- package/src/components/search/result/SearchResultPanel.jsx +169 -0
- package/src/components/search/result/SearchResultPanelContainer.js +31 -0
- package/src/components/search/result/SearchResultStats.jsx +38 -0
- package/src/components/search/result/SearchResultTile.jsx +70 -0
- package/src/config/anthro.js +153 -0
- package/src/config/bonsai.js +50 -0
- package/src/config/botgarden.js +3 -0
- package/src/config/default.js +604 -0
- package/src/config/fcart.js +38 -0
- package/src/config/herbarium.js +3 -0
- package/src/config/index.js +51 -0
- package/src/config/lhmc.js +3 -0
- package/src/config/materials.js +1173 -0
- package/src/config/publicart.js +3 -0
- package/src/constants/actionCodes.js +26 -0
- package/src/constants/ids.js +3 -0
- package/src/helpers/bodyClassName.js +5 -0
- package/src/helpers/esQueryHelpers.js +224 -0
- package/src/helpers/formatHelpers.jsx +361 -0
- package/src/helpers/searchDimensions.js +21 -0
- package/src/helpers/urlHelpers.js +49 -0
- package/src/index.jsx +59 -0
- package/src/intl/index.js +16 -0
- package/src/reducers/detailReducer.js +201 -0
- package/src/reducers/filterReducer.js +16 -0
- package/src/reducers/index.js +56 -0
- package/src/reducers/mediaReducer.js +44 -0
- package/src/reducers/prefsReducer.js +24 -0
- package/src/reducers/searchEntryFormReducer.js +19 -0
- package/src/reducers/searchReducer.js +118 -0
- package/styles/colors.css +7 -0
- package/styles/cspace/DetailNavBar.css +17 -0
- package/styles/cspace/DetailPage.css +3 -0
- package/styles/cspace/DetailPanel.css +69 -0
- package/styles/cspace/ExhibitionSection.css +9 -0
- package/styles/cspace/FieldList.css +15 -0
- package/styles/cspace/FieldListField.css +7 -0
- package/styles/cspace/FieldListGroup.css +27 -0
- package/styles/cspace/FieldValueList.css +19 -0
- package/styles/cspace/Filter.css +64 -0
- package/styles/cspace/FilterGroup.css +21 -0
- package/styles/cspace/FilterPanel.css +45 -0
- package/styles/cspace/FilterSearchInput.css +13 -0
- package/styles/cspace/Fixed.css +8 -0
- package/styles/cspace/IconButton.css +11 -0
- package/styles/cspace/ImageGallery.css +43 -0
- package/styles/cspace/InstitutionHoldingList.css +109 -0
- package/styles/cspace/InstitutionIndex.css +13 -0
- package/styles/cspace/InstitutionSection.css +4 -0
- package/styles/cspace/Link.css +39 -0
- package/styles/cspace/Panel.css +53 -0
- package/styles/cspace/PanelTitle.css +48 -0
- package/styles/cspace/RemoveSearchParamLink.css +15 -0
- package/styles/cspace/RootPage.css +60 -0
- package/styles/cspace/ScrollTopButton.css +32 -0
- package/styles/cspace/SearchEntryForm.css +4 -0
- package/styles/cspace/SearchEntryPanel.css +11 -0
- package/styles/cspace/SearchPage.css +2 -0
- package/styles/cspace/SearchParamLink.css +21 -0
- package/styles/cspace/SearchParamList.css +6 -0
- package/styles/cspace/SearchQueryInput.css +30 -0
- package/styles/cspace/SearchResultImage.css +29 -0
- package/styles/cspace/SearchResultList.css +10 -0
- package/styles/cspace/SearchResultPanel.css +31 -0
- package/styles/cspace/SearchResultStats.css +4 -0
- package/styles/cspace/SearchResultTile.css +67 -0
- package/styles/cspace/SearchStatus.css +12 -0
- package/styles/cspace/SearchSubmitButton.css +3 -0
- package/styles/cspace/SortSelect.css +19 -0
- package/styles/cspace/ToggleFilterPanelButton.css +44 -0
- 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;
|