cspace-ui
Version:
CollectionSpace user interface for browsers
284 lines (278 loc) • 9.17 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.setResultItemSelected = exports.setAllResultItemsSelected = exports.searchCsid = exports.search = exports.findFirst = exports.deselectResultItem = exports.clearSelected = exports.clearSearchResults = void 0;
var _get = _interopRequireDefault(require("lodash/get"));
var _reducers = require("../reducers");
var _session = _interopRequireDefault(require("../helpers/session"));
var _searchHelpers = require("../helpers/searchHelpers");
var _errorCodes = require("../constants/errorCodes");
var _actionCodes = require("../constants/actionCodes");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const toJS = obj => obj && typeof obj === 'object' && obj.toJS ? obj.toJS() : obj;
const getSortParam = (config, searchDescriptor, columnSetName) => {
const sortSpec = searchDescriptor.getIn(['searchQuery', 'sort']);
const [sortColumnName, sortDir] = sortSpec.split(' ');
if (sortDir && sortDir !== 'desc') {
return null;
}
const column = (0, _get.default)(config, ['recordTypes', searchDescriptor.get('recordType'), 'columns', columnSetName, sortColumnName]);
if (column && column.sortBy) {
return column.sortBy + (sortDir ? ' DESC' : '');
}
return null;
};
const clearSelected = searchName => ({
type: _actionCodes.CLEAR_SELECTED,
meta: {
searchName
}
});
exports.clearSelected = clearSelected;
const clearSearchResults = searchName => ({
type: _actionCodes.CLEAR_SEARCH_RESULTS,
meta: {
searchName
}
});
exports.clearSearchResults = clearSearchResults;
const search = (config, searchName, searchDescriptor, listType = 'common', columnSetName = 'default') => (dispatch, getState) => {
const recordType = searchDescriptor.get('recordType');
const vocabulary = searchDescriptor.get('vocabulary');
const csid = searchDescriptor.get('csid');
const subresource = searchDescriptor.get('subresource');
const searchQuery = searchDescriptor.get('searchQuery');
if ((0, _reducers.isSearchPending)(getState(), searchName, searchDescriptor) || (0, _reducers.getSearchResult)(getState(), searchName, searchDescriptor) && !(0, _reducers.isSearchDirty)(getState(), searchName)) {
// There's already a result for this search. Just set this search to be the most recent.
dispatch({
type: _actionCodes.SET_MOST_RECENT_SEARCH,
meta: {
searchName,
searchDescriptor
}
});
return Promise.resolve();
}
const listTypeConfig = config.listTypes[listType];
dispatch({
type: _actionCodes.SEARCH_STARTED,
meta: {
listTypeConfig,
searchName,
searchDescriptor
}
});
const recordTypeConfig = config.recordTypes[recordType];
if (!recordTypeConfig) {
dispatch({
type: _actionCodes.SEARCH_REJECTED,
payload: {
code: _errorCodes.ERR_UNKNOWN_RECORD_TYPE
},
meta: {
searchName,
searchDescriptor
}
});
return Promise.reject();
}
const recordTypeServicePath = (0, _get.default)(recordTypeConfig, ['serviceConfig', 'servicePath']);
if (!recordTypeServicePath) {
dispatch({
type: _actionCodes.SEARCH_REJECTED,
payload: {
code: _errorCodes.ERR_UNKNOWN_RECORD_TYPE
},
meta: {
searchName,
searchDescriptor
}
});
return Promise.reject();
}
const vocabularyServicePath = vocabulary ? (0, _get.default)(recordTypeConfig, ['vocabularies', vocabulary, 'serviceConfig', 'servicePath']) : null;
if (vocabulary && !vocabularyServicePath) {
dispatch({
type: _actionCodes.SEARCH_REJECTED,
payload: {
code: _errorCodes.ERR_UNKNOWN_VOCABULARY
},
meta: {
searchName,
searchDescriptor
}
});
return Promise.reject();
}
// Check for conditions where we just want to create an empty result.
// These happen when a new record is being created.
if (
// A related record search for an empty csid.
searchQuery.get('rel') === ''
// A subresource query without a csid.
|| typeof subresource !== 'undefined' && !searchDescriptor.get('csid')) {
dispatch({
type: _actionCodes.CREATE_EMPTY_SEARCH_RESULT,
meta: {
listTypeConfig,
searchName,
searchDescriptor
}
});
return Promise.resolve();
}
const nxql = (0, _searchHelpers.convertAdvancedSearchConditionToNXQL)(recordTypeConfig.fields, searchQuery.get('as'));
const requestConfig = {
params: {
as: nxql ? `(${nxql})` : undefined,
csid: searchQuery.get('csid'),
doctype: searchQuery.get('doctype'),
kw: searchQuery.get('kw'),
mkRtSbj: searchQuery.get('mkRtSbj'),
mode: toJS(searchQuery.get('mode')),
pgNum: searchQuery.get('p'),
pgSz: searchQuery.get('size'),
rtSbj: searchQuery.get('rel'),
rtPredicate: searchQuery.get('relType'),
servicetag: searchQuery.get('serviceTag'),
sn: searchQuery.get('sn'),
// accounts screen name
dn: searchQuery.get('dn'),
// role display name
wf_deleted: false
}
};
if (searchQuery.get('sort')) {
const sortParam = getSortParam(config, searchDescriptor, columnSetName);
if (!sortParam) {
dispatch({
type: _actionCodes.SEARCH_REJECTED,
payload: {
code: _errorCodes.ERR_INVALID_SORT
},
meta: {
searchName,
searchDescriptor
}
});
return Promise.reject();
}
requestConfig.params.sortBy = sortParam;
}
const pathParts = [recordTypeServicePath];
if (vocabularyServicePath) {
pathParts.push(vocabularyServicePath);
pathParts.push('items');
}
if (csid) {
pathParts.push(csid);
}
if (subresource) {
const subresourceConfig = config.subresources[subresource];
const subresourceServicePath = subresourceConfig.serviceConfig.servicePath;
pathParts.push(subresourceServicePath);
}
const path = pathParts.join('/');
return (0, _session.default)().read(path, requestConfig)
// Insert an artificial delay for testing.
// .then(response => new Promise((resolve) => {
// window.setTimeout(() => {
// resolve(response);
// }, 1000);
// }))
.then(response => dispatch({
type: _actionCodes.SEARCH_FULFILLED,
payload: response,
meta: {
listTypeConfig,
searchName,
searchDescriptor
}
})).catch(error => dispatch({
type: _actionCodes.SEARCH_REJECTED,
payload: {
code: _errorCodes.ERR_API,
error
},
meta: {
searchName,
searchDescriptor
}
}));
};
exports.search = search;
const validFieldNamePattern = /^[a-zA-Z_]+:[a-zA-Z_]+$/;
const validateFieldName = asFieldName => validFieldNamePattern.test(asFieldName);
const findFirst = (config, recordType, asFieldName, asValue) => {
if (!validateFieldName(asFieldName)) {
return Promise.reject();
}
const value = asValue.replaceAll('"', '\\"');
const requestConfig = {
params: {
as: `(${asFieldName} = "${value}")`,
pgSz: 1,
wf_deleted: false
}
};
const recordTypeConfig = config.recordTypes[recordType];
if (!recordTypeConfig) {
return Promise.reject();
}
const recordTypeServicePath = (0, _get.default)(recordTypeConfig, ['serviceConfig', 'servicePath']);
if (!recordTypeServicePath) {
return Promise.reject();
}
const pathParts = [recordTypeServicePath];
const serviceType = (0, _get.default)(recordTypeConfig, ['serviceConfig', 'serviceType']);
if (serviceType === 'authority') {
const vocabularyServicePath = (0, _get.default)(recordTypeConfig, ['vocabularies', 'all', 'serviceConfig', 'servicePath']);
if (!vocabularyServicePath) {
return Promise.reject();
}
pathParts.push(vocabularyServicePath);
pathParts.push('items');
}
const path = pathParts.join('/');
return (0, _session.default)().read(path, requestConfig);
};
exports.findFirst = findFirst;
const searchCsid = (config, recordType, csid) => () => findFirst(config, recordType, 'ecm:name', csid);
exports.searchCsid = searchCsid;
const setResultItemSelected = (config, searchName, searchDescriptor, listType = 'common', index, isSelected) => {
const listTypeConfig = config.listTypes[listType];
return {
type: _actionCodes.SET_RESULT_ITEM_SELECTED,
payload: isSelected,
meta: {
listTypeConfig,
searchName,
searchDescriptor,
index
}
};
};
exports.setResultItemSelected = setResultItemSelected;
const setAllResultItemsSelected = (config, searchName, searchDescriptor, listType = 'common', isSelected, filter) => {
const listTypeConfig = config.listTypes[listType];
return {
type: _actionCodes.SET_ALL_RESULT_ITEMS_SELECTED,
payload: isSelected,
meta: {
filter,
listTypeConfig,
searchName,
searchDescriptor
}
};
};
exports.setAllResultItemsSelected = setAllResultItemsSelected;
const deselectResultItem = (searchName, csid) => ({
type: _actionCodes.DESELECT_RESULT_ITEM,
meta: {
searchName,
csid
}
});
exports.deselectResultItem = deselectResultItem;