cspace-ui
Version:
CollectionSpace user interface for browsers
187 lines (186 loc) • 7.97 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactIntl = require("react-intl");
var _immutable = _interopRequireDefault(require("immutable"));
var _cspaceLayout = require("cspace-layout");
var _configHelpers = require("../../helpers/configHelpers");
var _permissionHelpers = require("../../helpers/permissionHelpers");
var _SearchToSelectModalContainer = _interopRequireDefault(require("../../containers/search/SearchToSelectModalContainer"));
var _RelateButton = _interopRequireDefault(require("../../../styles/cspace-ui/RelateButton.css"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
const isSingleSubject = subjects => Array.isArray(subjects) && subjects.length === 1;
const messages = (0, _reactIntl.defineMessages)({
label: {
"id": "searchToRelateModal.label",
"defaultMessage": "Relate records"
},
accept: {
"id": "searchToRelateModal.accept",
"defaultMessage": "Relate selected"
},
relating: {
"id": "searchToRelateModal.relating",
"defaultMessage": "Relating\u2026"
},
multipleSubjectsRelated: {
"id": "searchToRelateModal.multipleSubjectsRelated",
"defaultMessage": "{objectCount, plural, =0 {No records} one {# record} other {# records}} related to each of {subjectCount, number} search results."
},
title: {
"id": "searchToRelateModal.title",
"defaultMessage": "Relate {typeName} {query}"
},
errorTitle: {
"id": "searchToRelateModal.errorTitle",
"defaultMessage": "Can't Relate"
}
});
const errorMessages = (0, _reactIntl.defineMessages)({
locked: {
"id": "searchToRelateModal.error.locked",
"defaultMessage": "Locked records are selected. Relations cannot be made to locked records."
},
notPermitted: {
"id": "searchToRelateModal.error.notPermitted",
"defaultMessage": "{name} records are selected. You are not permitted to create relations to {collectionName}."
}
});
const renderRelatingMessage = () => /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.relating));
const propTypes = {
config: _propTypes.default.shape({
recordTypes: _propTypes.default.object
}),
error: _propTypes.default.shape({
code: _propTypes.default.string
}),
isOpen: _propTypes.default.bool,
perms: _propTypes.default.instanceOf(_immutable.default.Map),
subjects: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.shape({
/* eslint-disable react/no-unused-prop-types */
csid: _propTypes.default.string,
recordType: _propTypes.default.string
/* eslint-enable react/no-unused-prop-types */
})), _propTypes.default.func]),
createRelations: _propTypes.default.func,
showRelationNotification: _propTypes.default.func,
onCancelButtonClick: _propTypes.default.func,
onCloseButtonClick: _propTypes.default.func,
onRelationsCreated: _propTypes.default.func
};
class SearchToRelateModal extends _react.Component {
constructor(props) {
super(props);
this.customizeSearchDescriptor = this.customizeSearchDescriptor.bind(this);
this.handleAccept = this.handleAccept.bind(this);
this.shouldShowCheckbox = this.shouldShowCheckbox.bind(this);
}
handleAccept(selectedItems, searchDescriptor) {
return this.relate(selectedItems, searchDescriptor);
}
customizeSearchDescriptor(searchDescriptor) {
const {
subjects
} = this.props;
if (isSingleSubject(subjects)) {
return searchDescriptor.setIn(['searchQuery', 'mkRtSbj'], subjects[0].csid);
}
return searchDescriptor;
}
relate(selectedItems, searchDescriptor) {
const {
createRelations,
onRelationsCreated
} = this.props;
if (createRelations) {
let {
subjects
} = this.props;
if (typeof subjects === 'function') {
subjects = subjects();
}
if (subjects && subjects.length > 0) {
const objects = selectedItems.valueSeq().map(item => ({
csid: item.get('csid'),
recordType: searchDescriptor.get('recordType')
})).toJS();
return Promise.all(subjects.map(subject => createRelations(subject, objects, 'affects'))).then(() => {
if (subjects.length > 1) {
const {
showRelationNotification
} = this.props;
if (showRelationNotification) {
showRelationNotification(messages.multipleSubjectsRelated, {
objectCount: objects.length,
subjectCount: subjects.length
});
}
}
if (onRelationsCreated) {
onRelationsCreated();
}
});
}
}
return undefined;
}
shouldShowCheckbox(item) {
if (item.get('workflowState') === 'locked') {
return false;
}
if (item.get('related') === 'true') {
return false;
}
const {
config,
perms,
subjects
} = this.props;
if (isSingleSubject(subjects) && item.get('csid') === subjects[0].csid) {
return false;
}
return (0, _permissionHelpers.canRelate)((0, _configHelpers.getRecordTypeNameByUri)(config, item.get('uri')), perms, config);
}
render() {
const {
error,
subjects,
createRelations,
showRelationNotification,
onRelationsCreated,
...remainingProps
} = this.props;
const {
isOpen,
onCancelButtonClick,
onCloseButtonClick
} = remainingProps;
if (isOpen && error) {
return /*#__PURE__*/_react.default.createElement(_cspaceLayout.Modal, {
isOpen: true,
showCancelButton: false,
title: /*#__PURE__*/_react.default.createElement("h1", null, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.errorTitle)),
onAcceptButtonClick: onCancelButtonClick,
onCloseButtonClick: onCloseButtonClick
}, /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, errorMessages[error.code]));
}
return /*#__PURE__*/_react.default.createElement(_SearchToSelectModalContainer.default, _extends({
acceptButtonClassName: _RelateButton.default.common,
acceptButtonLabel: /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, messages.accept),
customizeSearchDescriptor: this.customizeSearchDescriptor,
titleMessage: messages.title,
renderAcceptPending: renderRelatingMessage,
shouldShowCheckbox: this.shouldShowCheckbox,
onAccept: this.handleAccept
}, remainingProps));
}
}
exports.default = SearchToRelateModal;
SearchToRelateModal.propTypes = propTypes;