UNPKG

@collectionspace/cspace-public-browser

Version:
136 lines (133 loc) 4.66 kB
"use strict"; 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;