UNPKG

cspace-ui

Version:
293 lines (277 loc) 11.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = CreatePage; var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactIntl = require("react-intl"); var _reactRouterDom = require("react-router-dom"); var _immutable = _interopRequireDefault(require("immutable")); var _TitleBar = _interopRequireDefault(require("../sections/TitleBar")); var _permissionHelpers = require("../../helpers/permissionHelpers"); var _workflowStateHelpers = require("../../helpers/workflowStateHelpers"); var _CreatePage = _interopRequireDefault(require("../../../styles/cspace-ui/CreatePage.css")); var _CreatePagePanel = _interopRequireDefault(require("../../../styles/cspace-ui/CreatePagePanel.css")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const serviceTypes = ['object', 'procedure', 'authority']; const messages = (0, _reactIntl.defineMessages)({ title: { "id": "createPage.title", "defaultMessage": "Create New" }, object: { "id": "createPage.object", "defaultMessage": "Objects" }, procedure: { "id": "createPage.procedure", "defaultMessage": "Procedures" }, authority: { "id": "createPage.authority", "defaultMessage": "Authorities" } }); const tagMessages = (0, _reactIntl.defineMessages)({ nagpra: { "id": "createPage.tag.nagpra", "defaultMessage": "NAGPRA Procedures" }, legacy: { "id": "createPage.tag.legacy", "defaultMessage": "Legacy Procedures" } }); const getRecordTypesByServiceType = (recordTypes, perms, intl) => { const recordTypesByServiceType = {}; serviceTypes.forEach(serviceType => { const recordTypeNames = Object.keys(recordTypes).filter(recordTypeName => { const recordTypeConfig = recordTypes[recordTypeName]; return recordTypeConfig.serviceConfig.serviceType === serviceType && !recordTypeConfig.disabled && (0, _permissionHelpers.canCreate)(recordTypeName, perms); }).sort((nameA, nameB) => { const configA = recordTypes[nameA]; const configB = recordTypes[nameB]; // Primary sort by sortOrder let sortOrderA = configA.sortOrder; let sortOrderB = configB.sortOrder; if (typeof sortOrderA !== 'number') { sortOrderA = Number.MAX_VALUE; } if (typeof sortOrderB !== 'number') { sortOrderB = Number.MAX_VALUE; } if (sortOrderA !== sortOrderB) { return sortOrderA > sortOrderB ? 1 : -1; } // Secondary sort by label const labelA = intl.formatMessage(configA.messages.record.name); const labelB = intl.formatMessage(configB.messages.record.name); // FIXME: This should be locale aware return labelA.localeCompare(labelB); }); recordTypesByServiceType[serviceType] = recordTypeNames; }); return recordTypesByServiceType; }; const getVocabularies = (recordTypeConfig, intl, getAuthorityVocabWorkflowState) => { const recordTypeName = recordTypeConfig.name; const { vocabularies } = recordTypeConfig; let vocabularyNames; if (vocabularies) { vocabularyNames = Object.keys(vocabularies).filter(vocabularyName => { // Filter out vocabularies that don't exist in the services layer, vocabularies that are // locked, and vocabularies that are disabled. Always include the 'all' vocabulary. const workflowState = getAuthorityVocabWorkflowState(recordTypeName, vocabularyName); return vocabularyName !== 'all' && workflowState // Empty workflow state means vocab doesn't exist. && !(0, _workflowStateHelpers.isLocked)(workflowState) && !vocabularies[vocabularyName].disabled; }).sort((nameA, nameB) => { const configA = vocabularies[nameA]; const configB = vocabularies[nameB]; // Primary sort by sortOrder let sortOrderA = configA.sortOrder; let sortOrderB = configB.sortOrder; if (typeof sortOrderA !== 'number') { sortOrderA = Number.MAX_VALUE; } if (typeof sortOrderB !== 'number') { sortOrderB = Number.MAX_VALUE; } if (sortOrderA !== sortOrderB) { return sortOrderA > sortOrderB ? 1 : -1; } // Secondary sort by label const labelA = intl.formatMessage(configA.messages.name); const labelB = intl.formatMessage(configB.messages.name); // FIXME: This should be locale aware return labelA.localeCompare(labelB); }); } return vocabularyNames; }; const renderListItem = (recordType, config) => { const recordConfig = config[recordType]; const recordDisplayName = /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, recordConfig.messages.record.name); const recordLink = /*#__PURE__*/_react.default.createElement(_reactRouterDom.Link, { id: recordType, to: `/record/${recordType}` }, recordDisplayName); return /*#__PURE__*/_react.default.createElement("li", { key: recordType }, recordLink); }; /** * Render the panel for a group of Procedures * * @param {String} serviceType the name of the service type (object, procedure, authority) * @param {Array} items the array of list items to display for the service * @returns */ const renderPanel = (serviceType, items) => items && items.length > 0 ? /*#__PURE__*/_react.default.createElement("div", { className: _CreatePagePanel.default[serviceType], key: serviceType }, /*#__PURE__*/_react.default.createElement("h2", null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages[serviceType])), /*#__PURE__*/_react.default.createElement("ul", null, items)) : null; /** * Render the div for Object records * * @param {Array} recordTypes the object records * @param {Object} config the cspace config * @returns the div */ const renderObjects = (recordTypes = [], config) => { const serviceType = 'object'; const items = recordTypes.map(recordType => renderListItem(recordType, config)); return renderPanel(serviceType, items); }; /** * Render the div for procedure records. The procedures are grouped together by their service tags * in order to display procedures in a workflow together. Each tag has its own header in order to * act as a delimiter within the div. Procedures without a tag do not have a header and are part * of a default group. * * @param {Array} recordTypes the procedure record types * @param {Object} config the cspace config * @param {Function} getTagsForRecord function to query the service tag of a record * @param {Object} tagConfig the configuration for the service tags containing their sortOrder * @returns */ const renderProcedures = (recordTypes = [], config, getTagsForRecord, tagConfig) => { const serviceType = 'procedure'; const grouped = {}; recordTypes.forEach(recordType => { const tag = getTagsForRecord(recordType) || 'defaultGroup'; if (grouped[tag] === undefined) { grouped[tag] = [recordType]; } else { grouped[tag].push(recordType); } }); const { defaultGroup: defaultRecordTypes = [], ...taggedRecordTypes } = grouped; const defaultItems = defaultRecordTypes.map(recordType => renderListItem(recordType, config)); const taggedItems = Object.keys(taggedRecordTypes).sort((lhs, rhs) => { const lhsConfig = tagConfig[lhs] || {}; const rhsConfig = tagConfig[rhs] || {}; const { sortOrder: lhsOrder = Number.MAX_SAFE_INTEGER } = lhsConfig; const { sortOrder: rhsOrder = Number.MAX_SAFE_INTEGER } = rhsConfig; return lhsOrder > rhsOrder ? 1 : -1; }).map(tag => { const tagRecordTypes = taggedRecordTypes[tag]; const items = tagRecordTypes.map(recordType => renderListItem(recordType, config)); return /*#__PURE__*/_react.default.createElement("li", { className: _CreatePagePanel.default.tag }, /*#__PURE__*/_react.default.createElement("h3", { id: tag }, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, tagMessages[tag])), /*#__PURE__*/_react.default.createElement("ul", null, items)); }); return renderPanel(serviceType, defaultItems.concat(taggedItems)); }; /** * Render the div for creating authority items. Each authority is a header and its vocabulary items * are represented as a sub-list. * * @param {Array} recordTypes the authority records * @param {Object} config the cspace config * @param {intlShape} intl the intl object * @param {Function} getAuthorityVocabWorkflowState function to get workflow states */ const renderAuthorities = (recordTypes = [], config, intl, getAuthorityVocabWorkflowState) => { const authorityItems = recordTypes.map(recordType => { const recordConfig = config[recordType]; const vocabularies = getVocabularies(recordConfig, intl, getAuthorityVocabWorkflowState); if (!vocabularies || vocabularies.length === 0) { return null; } const vocabularyItems = vocabularies.map(vocabulary => /*#__PURE__*/_react.default.createElement("li", { key: vocabulary }, /*#__PURE__*/_react.default.createElement(_reactRouterDom.Link, { id: `${recordType}/${vocabulary}`, to: `/record/${recordType}/${vocabulary}` }, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, recordConfig.vocabularies[vocabulary].messages.name)))); const vocabularyList = /*#__PURE__*/_react.default.createElement("ul", null, vocabularyItems); const recordDisplayName = /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, recordConfig.messages.record.name); const recordLink = /*#__PURE__*/_react.default.createElement("h3", { id: recordType }, recordDisplayName); return /*#__PURE__*/_react.default.createElement("li", { key: recordType }, recordLink, vocabularyList); }); return renderPanel('authority', authorityItems); }; const contextTypes = { config: _propTypes.default.shape({ recordTypes: _propTypes.default.object }) }; const propTypes = { intl: _reactIntl.intlShape, perms: _propTypes.default.instanceOf(_immutable.default.Map), getAuthorityVocabWorkflowState: _propTypes.default.func, getTagsForRecord: _propTypes.default.func }; const defaultProps = { getAuthorityVocabWorkflowState: () => null }; function CreatePage(props, context) { const { intl, perms, getAuthorityVocabWorkflowState, getTagsForRecord } = props; const { config } = context; const { tags: tagConfig, recordTypes } = config; let objectPanel; let procedurePanel; let authorityPanel; if (recordTypes) { const recordTypesByServiceType = getRecordTypesByServiceType(recordTypes, perms, intl); objectPanel = renderObjects(recordTypesByServiceType.object, recordTypes); procedurePanel = renderProcedures(recordTypesByServiceType.procedure, recordTypes, getTagsForRecord, tagConfig); authorityPanel = renderAuthorities(recordTypesByServiceType.authority, recordTypes, intl, getAuthorityVocabWorkflowState); } const title = /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.title); return /*#__PURE__*/_react.default.createElement("div", { className: _CreatePage.default.common }, /*#__PURE__*/_react.default.createElement(_TitleBar.default, { title: title, updateDocumentTitle: true }), /*#__PURE__*/_react.default.createElement("div", null, objectPanel, procedurePanel, authorityPanel)); } CreatePage.propTypes = propTypes; CreatePage.defaultProps = defaultProps; CreatePage.contextTypes = contextTypes;