UNPKG

cspace-ui

Version:
179 lines (148 loc) 7.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.ConnectedAutocompleteInput = void 0; var _propTypes = _interopRequireDefault(require("prop-types")); var _reactRedux = require("react-redux"); var _reactIntl = require("react-intl"); var _get = _interopRequireDefault(require("lodash/get")); var _cspaceInput = require("cspace-input"); var _warning = _interopRequireDefault(require("warning")); var _permissionHelpers = require("../../helpers/permissionHelpers"); var _parseResourceID = _interopRequireDefault(require("../../helpers/parseResourceID")); var _workflowStateHelpers = require("../../helpers/workflowStateHelpers"); var _partialTermSearch = require("../../actions/partialTermSearch"); var _withConfig = _interopRequireDefault(require("../../enhancers/withConfig")); var _reducers = require("../../reducers"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } const { AutocompleteInput } = _cspaceInput.components; const messages = (0, _reactIntl.defineMessages)({ count: { "id": "autocompleteInputContainer.count", "defaultMessage": "{count, plural, =0 {No matching terms} one {# matching term} other {# matching terms}} found" }, moreCharsRequired: { "id": "autocompleteInputContainer.moreCharsRequired", "defaultMessage": "Continue typing to find matching terms" }, addPrompt: { "id": "autocompleteInputContainer.addPrompt", "defaultMessage": "Add \"{displayName}\" to {destinationName}" }, cloneOptionLabel: { "id": "autocompleteInputContainer.cloneOptionLabel", "defaultMessage": "Clone current record" }, createNewOptionLabel: { "id": "autocompleteInputContainer.createNewOptionLabel", "defaultMessage": "Create new record" } }); const filterSource = (source, perms) => { // Filter out sources for which we don't have list permission. if (!source) { return source; } const filtered = source.split(',').filter(sourceID => (0, _permissionHelpers.canList)(sourceID.split('/', 1)[0], perms)).join(','); return filtered; }; const filterQuickAddTo = (source, perms, state) => { // Filter out sources for which we don't have create permission, or are locked. if (!source) { return source; } return source.split(',').filter(sourceID => { const [recordType, vocabulary] = sourceID.split('/'); return (0, _permissionHelpers.canCreate)(recordType, perms) && !(0, _workflowStateHelpers.isLocked)((0, _reducers.getAuthorityVocabWorkflowState)(state, recordType, vocabulary)); }).join(','); }; const mapStateToProps = (state, ownProps) => { const { intl, config, source } = ownProps; const perms = (0, _reducers.getUserPerms)(state); return { findDelay: config.autocompleteFindDelay, minLength: config.autocompleteMinLength, matches: (0, _reducers.getPartialTermSearchMatches)(state), recordTypes: config.recordTypes, source: filterSource(source, perms), quickAddTo: filterQuickAddTo(source, perms, state), formatAddPrompt: function formatAddPrompt(displayName) { let destinationName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; return intl.formatMessage(messages.addPrompt, { displayName, destinationName }); }, formatCloneOptionLabel: () => intl.formatMessage(messages.cloneOptionLabel), formatCreateNewOptionLabel: () => intl.formatMessage(messages.createNewOptionLabel), formatMoreCharsRequiredMessage: () => intl.formatMessage(messages.moreCharsRequired), formatSearchResultMessage: count => intl.formatMessage(messages.count, { count }), formatSourceName: (recordTypeConfig, vocabulary) => intl.formatMessage(vocabulary ? (0, _get.default)(recordTypeConfig, ['vocabularies', vocabulary, 'messages', 'collectionName']) : (0, _get.default)(recordTypeConfig, ['messages', 'record', 'collectionName'])) }; }; const mapDispatchToProps = (dispatch, ownProps) => { const { config, onClose: _onClose } = ownProps; return { addTerm: (recordType, vocabulary, displayName, partialTerm, clone) => { const recordTypeConfig = (0, _get.default)(config, ['recordTypes', recordType]); process.env.NODE_ENV !== "production" ? (0, _warning.default)(recordTypeConfig, "The record type '".concat(recordType, "' is not configured. Check the source prop of the input with name '").concat(ownProps.name, "'.")) : void 0; if (recordTypeConfig) { dispatch((0, _partialTermSearch.addTerm)(recordTypeConfig, vocabulary, displayName, partialTerm, clone)); } }, findMatchingTerms: (source, partialTerm) => { const sources = (0, _parseResourceID.default)(source); sources.forEach(sourceSpec => { const { recordType, vocabulary } = sourceSpec; const recordTypeConfig = config.recordTypes[recordType]; process.env.NODE_ENV !== "production" ? (0, _warning.default)(recordTypeConfig, "The record type '".concat(recordType, "' is not configured. Check the source prop of the input with name '").concat(ownProps.name, "'.")) : void 0; if (recordTypeConfig) { dispatch((0, _partialTermSearch.findMatchingTerms)(recordTypeConfig, vocabulary, partialTerm)); } }); }, onClose: () => { dispatch((0, _partialTermSearch.clearMatchedTerms)()); if (_onClose) { _onClose(); } } }; }; const mergeProps = (stateProps, dispatchProps, ownProps) => { const { /* eslint-disable no-unused-vars */ intl, config } = ownProps, remainingOwnProps = _objectWithoutProperties(ownProps, ["intl", "config"]); return _objectSpread({}, remainingOwnProps, stateProps, dispatchProps); }; const ConnectedAutocompleteInput = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps, mergeProps)(AutocompleteInput); exports.ConnectedAutocompleteInput = ConnectedAutocompleteInput; const IntlizedConnectedAutocompleteInput = (0, _reactIntl.injectIntl)((0, _withConfig.default)(ConnectedAutocompleteInput)); IntlizedConnectedAutocompleteInput.propTypes = _objectSpread({}, AutocompleteInput.propTypes, { source: _propTypes.default.string.isRequired, config: _propTypes.default.object }); var _default = IntlizedConnectedAutocompleteInput; exports.default = _default;