cspace-ui
Version:
CollectionSpace user interface for browsers
208 lines (198 loc) • 8.53 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.storeInvocationDescriptor = exports.storageKey = exports.normalizeInvocationDescriptor = exports.loadInvocationDescriptor = exports.getReportViewerPath = exports.getExportViewerPath = exports.createInvocationData = exports.VIEWER_WINDOW_NAME = void 0;
var _immutable = _interopRequireDefault(require("immutable"));
var _get = _interopRequireDefault(require("lodash/get"));
var _upperFirst = _interopRequireDefault(require("lodash/upperFirst"));
var _qs = _interopRequireDefault(require("qs"));
var _configHelpers = require("./configHelpers");
var _dataTypes = require("../constants/dataTypes");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* global window */
const VIEWER_WINDOW_NAME = exports.VIEWER_WINDOW_NAME = undefined;
const storageKey = exports.storageKey = 'cspace-ui-invocation';
const prepareIncludeFields = (config, recordType, includeFields) => {
if (includeFields) {
return {
field: includeFields.filter(field => !!field).flatMap(field => {
const fieldSegments = field.split('/');
const fieldDescriptor = (0, _get.default)(config, ['recordTypes', recordType, 'fields', 'document', ...fieldSegments]);
const fieldDataType = fieldDescriptor && (0, _configHelpers.getFieldDataType)(fieldDescriptor);
const [schema, ...path] = fieldSegments;
const partName = schema.substring(schema.indexOf(':') + 1);
const fieldSpec = `${partName}:${path.join('/')}`;
if (fieldDataType === _dataTypes.DATA_TYPE_STRUCTURED_DATE) {
// TODO: Do this for export only? Currently don't know at this point if this is an export.
// Will need an additional arg.
// For struct date groups, append dateDisplayDate to the field path, and specify the
// group name as the name. This causes exports to use the group name as the column name,
// but the display date as the value, which is expected by the converter tool.
return {
'@name': fieldSegments[fieldSegments.length - 1],
'.': `${fieldSpec}/dateDisplayDate`
};
}
if ((0, _configHelpers.isAutocompleteField)(fieldDescriptor)) {
// TODO: Do this for export only. Currently don't know at this point if this is an export.
// Will need an additional arg.
// For authority-controlled fields, if values can be sourced from multiple authorities,
// create a separate column for each authority. This is expected by the converter tool.
const fieldName = path[path.length - 1];
const sourceSpec = (0, _get.default)(fieldDescriptor, [_configHelpers.configKey, 'view', 'props', 'source']);
const sources = sourceSpec.split(',');
return sources.map(source => {
const [authority, vocabulary] = source.split('/');
const authorityConfig = (0, _get.default)(config, ['recordTypes', authority]);
if (authorityConfig) {
const authorityServicePath = (0, _get.default)(authorityConfig, ['serviceConfig', 'servicePath']);
const vocabularyServicePath = (0, _get.default)(authorityConfig, ['vocabularies', vocabulary, 'serviceConfig', 'servicePath']);
if (vocabularyServicePath) {
const match = vocabularyServicePath.match(/urn:cspace:name\((.*?)\)/);
const vocabularyShortId = match ? match[1] : '';
return {
'@name': `${fieldName}${(0, _upperFirst.default)(authority)}${(0, _upperFirst.default)(vocabulary)}`,
'.': `${fieldSpec}[contains(., ':${authorityServicePath}:name(${vocabularyShortId}):')]`
};
}
}
return null;
}).filter(item => !!item);
}
return fieldSpec;
})
};
}
return undefined;
};
const prepareParams = params => {
if (params) {
const paramPairs = [];
Object.keys(params).forEach(key => {
const value = params[key];
if (Array.isArray(value)) {
value.forEach(v => paramPairs.push({
key,
value: v
}));
} else {
paramPairs.push({
key,
value
});
}
});
if (paramPairs.length > 0) {
return {
param: paramPairs
};
}
}
return undefined;
};
const createInvocationData = (config, invocationDescriptor, params) => {
const {
includeFields,
mode,
outputMIME,
recordType: invocationRecordType,
csid: invocationCsid
} = invocationDescriptor.toJS();
const invocationContext = {
mode,
outputMIME,
includeFields: prepareIncludeFields(config, invocationRecordType, includeFields),
params: prepareParams(params),
docType: (0, _get.default)(config, ['recordTypes', invocationRecordType, 'serviceConfig', 'objectName'])
};
if (mode === 'single') {
invocationContext.singleCSID = invocationCsid;
} else if (mode === 'list') {
invocationContext.listCSIDs = {
csid: invocationCsid
};
} else if (mode === 'group') {
invocationContext.groupCSID = invocationCsid;
}
return {
'ns2:invocationContext': {
'@xmlns:ns2': 'http://collectionspace.org/services/common/invocable',
...invocationContext
}
};
};
exports.createInvocationData = createInvocationData;
const normalizeInvocationDescriptor = (invocationDescriptor, invocationMetadata) => {
let normalizedInvocationDescriptor = invocationDescriptor;
if (!normalizedInvocationDescriptor) {
normalizedInvocationDescriptor = _immutable.default.Map();
}
const outputMIME = normalizedInvocationDescriptor.get('outputMIME');
if (!outputMIME && invocationMetadata) {
const defaultOutputMIME = invocationMetadata.getIn(['document', 'ns2:reports_common', 'outputMIME']) || 'application/pdf';
normalizedInvocationDescriptor = normalizedInvocationDescriptor.set('outputMIME', defaultOutputMIME);
}
return normalizedInvocationDescriptor;
};
exports.normalizeInvocationDescriptor = normalizeInvocationDescriptor;
const getReportViewerPath = (config, reportCsid, invocationDescriptor, reportParams) => {
const {
basename
} = config;
const reportParamsJson = reportParams && JSON.stringify(reportParams);
const queryParams = {
mode: invocationDescriptor.get('mode'),
csid: invocationDescriptor.get('csid'),
outputMIME: invocationDescriptor.get('outputMIME'),
recordType: invocationDescriptor.get('recordType'),
params: reportParamsJson
};
return `${basename || ''}/report/${reportCsid}?${_qs.default.stringify(queryParams, {
arrayFormat: 'brackets'
})}`;
};
// export const getExportViewerPath = (config, invocationDescriptor) => {
// const {
// basename,
// } = config;
// const csid = invocationDescriptor.get('csid');
// const includeFields = invocationDescriptor.get('includeFields');
// const queryParams = {
// mode: invocationDescriptor.get('mode'),
// csid: Immutable.List.isList(csid) ? csid.toJS() : csid,
// outputMIME: invocationDescriptor.get('outputMIME'),
// recordType: invocationDescriptor.get('recordType'),
// vocabulary: invocationDescriptor.get('vocabulary'),
// includeFields: Immutable.List.isList(includeFields) ? includeFields.toJS() : includeFields,
// };
// return `${basename || ''}/export?${qs.stringify(queryParams, { arrayFormat: 'brackets' })}`;
// };
exports.getReportViewerPath = getReportViewerPath;
const getExportViewerPath = config => {
const {
basename
} = config;
return `${basename || ''}/export`;
};
exports.getExportViewerPath = getExportViewerPath;
const storeInvocationDescriptor = invocationDescriptor => {
window.localStorage.setItem(storageKey, JSON.stringify(invocationDescriptor.toJS()));
};
exports.storeInvocationDescriptor = storeInvocationDescriptor;
const loadInvocationDescriptor = deleteAfterLoad => {
const serializedInvocationDescriptor = window.localStorage.getItem(storageKey);
let invocationDescriptor = null;
if (serializedInvocationDescriptor) {
try {
invocationDescriptor = _immutable.default.fromJS(JSON.parse(serializedInvocationDescriptor));
} catch (error) {
invocationDescriptor = null;
}
}
if (deleteAfterLoad) {
window.localStorage.removeItem(storageKey);
}
return invocationDescriptor;
};
exports.loadInvocationDescriptor = loadInvocationDescriptor;