@collectionspace/cspace-public-browser
Version:
CollectionSpace public browser
136 lines (133 loc) • 4.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.setSearchParams = exports.setSearchPageSize = exports.search = exports.openSearch = exports.applySortOrder = exports.applyFilter = void 0;
var _immutable = _interopRequireDefault(require("immutable"));
var _config = _interopRequireDefault(require("../config"));
var _ids = require("../constants/ids");
var _urlHelpers = require("../helpers/urlHelpers");
var _reducers = require("../reducers");
var _actionCodes = require("../constants/actionCodes");
var _esQueryHelpers = require("../helpers/esQueryHelpers");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/* global fetch, window */
const openSearch = (history, params = _immutable.default.Map()) => {
const queryString = (0, _urlHelpers.searchParamsToQueryString)(params);
history.push({
search: `?${queryString}`
});
return {
type: _actionCodes.OPEN_SEARCH,
payload: queryString
};
};
exports.openSearch = openSearch;
const search = (fetchDelay = 0) => (dispatch, getState) => {
const params = (0, _reducers.getSearchParams)(getState());
if (!params || (0, _reducers.isSearchPending)(getState()) || !(0, _reducers.searchHasMore)(getState())) {
return Promise.resolve();
}
const gatewayUrl = _config.default.get('gatewayUrl');
const url = `${gatewayUrl}/es/doc/_msearch`;
const offset = (0, _reducers.getSearchNextOffset)(getState()) || 0;
const pageSize = (0, _reducers.getSearchPageSize)(getState()) || 15;
const resultPayload = (0, _esQueryHelpers.getSearchResultPayload)(params, pageSize, offset);
let filterAggPayloads = [];
if (offset === 0) {
// When loading the first page, get aggregations.
resultPayload.aggs = (0, _esQueryHelpers.getAggs)(params);
filterAggPayloads = params.delete(_ids.SORT_ID).delete(_ids.SEARCH_QUERY_ID).keySeq().flatMap(id => {
const filterFieldConfig = _config.default.getFilterFieldConfig(id);
return [{
preference: id
}, {
query: (0, _esQueryHelpers.getQuery)(params.delete(id)),
size: 0,
aggs: {
[id]: (0, _esQueryHelpers.getFilterAgg)(filterFieldConfig)
}
}];
}).toJS();
}
dispatch({
type: _actionCodes.SEARCH_STARTED
});
const delay = new Promise(resolve => {
window.setTimeout(() => {
resolve();
}, fetchDelay);
});
return delay.then(() => fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-ndjson'
},
body: [JSON.stringify({
preference: 'result'
}), JSON.stringify(resultPayload), ...filterAggPayloads.map(payload => JSON.stringify(payload))].join('\n')
})).then(response => {
if (!response.ok) {
const error = new Error();
error.response = response;
return Promise.reject(error);
}
return response.json();
}).then(data => {
dispatch({
type: _actionCodes.SEARCH_FULFILLED,
payload: data,
meta: {
offset,
pageSize,
params
}
});
}).catch(error => {
dispatch({
type: _actionCodes.SEARCH_REJECTED,
payload: error,
meta: {
offset,
pageSize,
params
}
});
});
};
exports.search = search;
const setSearchPageSize = pageSize => ({
type: _actionCodes.SET_SEARCH_PAGE_SIZE,
payload: pageSize
});
exports.setSearchPageSize = setSearchPageSize;
const setSearchParams = location => {
const params = (0, _urlHelpers.locationToSearchParams)(location);
return {
type: _actionCodes.SET_SEARCH_PARAMS,
payload: params
};
};
exports.setSearchParams = setSearchParams;
const applyFilter = (history, id, value, isSelected) => (dispatch, getState) => {
const params = (0, _reducers.getSearchParams)(getState());
let selectedValues = params.get(id) || _immutable.default.List();
if (!_immutable.default.List.isList(selectedValues)) {
selectedValues = _immutable.default.List.of(selectedValues);
}
let nextParams;
if (isSelected) {
nextParams = params.set(id, selectedValues.push(value));
} else {
const selectedIndex = selectedValues.indexOf(value);
if (selectedIndex >= 0) {
nextParams = selectedValues.size > 1 ? params.set(id, selectedValues.delete(selectedIndex)) : params.delete(id);
} else {
nextParams = params;
}
}
return dispatch(openSearch(history, nextParams));
};
exports.applyFilter = applyFilter;
const applySortOrder = (history, sortOrder) => (dispatch, getState) => dispatch(openSearch(history, (0, _reducers.getSearchParams)(getState()).set(_ids.SORT_ID, sortOrder)));
exports.applySortOrder = applySortOrder;