cspace-ui
Version:
CollectionSpace user interface for browsers
126 lines (125 loc) • 4.45 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactIntl = require("react-intl");
var _immutable = _interopRequireDefault(require("immutable"));
var _get = _interopRequireDefault(require("lodash/get"));
var _cspaceRefname = require("cspace-refname");
var _notificationStatusCodes = require("../../constants/notificationStatusCodes");
var _refNameHelpers = require("../../helpers/refNameHelpers");
var _relationListHelpers = require("../../helpers/relationListHelpers");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const notificationID = 'hierarchyReparentNotifier';
const messages = (0, _reactIntl.defineMessages)({
reparentWarning: {
"id": "hierarchyReparentNotifier.reparentWarning",
"defaultMessage": "{childName} currently has the broader record {parentName}. Its broader record will be changed when this record is saved."
}
});
const propTypes = {
config: _propTypes.default.shape({
recordTypes: _propTypes.default.object
}).isRequired,
csid: _propTypes.default.string.isRequired,
childData: _propTypes.default.instanceOf(_immutable.default.Map).isRequired,
readRecord: _propTypes.default.func.isRequired,
removeNotification: _propTypes.default.func.isRequired,
showNotification: _propTypes.default.func.isRequired
};
class HierarchyReparentNotifier extends _react.Component {
componentDidMount() {
const {
childData
} = this.props;
this.readRecords(childData.keySeq().filter(refName => !!refName));
this.showNotification();
}
componentDidUpdate(prevProps) {
const {
childData
} = this.props;
const {
childData: prevChildData
} = prevProps;
const newRefNames = childData.keySeq().filter(refName => refName && !prevChildData.has(refName));
this.readRecords(newRefNames);
if (!childData.equals(prevChildData)) {
this.showNotification();
}
}
readRecords(refNames) {
const {
config,
readRecord
} = this.props;
refNames.forEach(refName => {
const childRecordType = (0, _refNameHelpers.getRecordType)(config, refName);
if (!childRecordType) {
return;
}
const childVocabulary = (0, _refNameHelpers.getVocabulary)(config, refName);
if (!childVocabulary) {
return;
}
const childRecordTypeConfig = (0, _get.default)(config, ['recordTypes', childRecordType]);
const childVocabularyConfig = (0, _get.default)(childRecordTypeConfig, ['vocabularies', childVocabulary]);
const childCsid = (0, _refNameHelpers.refNameToCsid)(refName);
readRecord(config, childRecordTypeConfig, childVocabularyConfig, childCsid, {
initSubrecords: false
});
});
}
showNotification() {
const {
csid,
childData,
removeNotification,
showNotification
} = this.props;
const items = [];
childData.forEach((data, childRefName) => {
if (!childRefName || !data) {
return;
}
const childCsid = (0, _refNameHelpers.refNameToCsid)(childRefName);
const relations = (0, _relationListHelpers.normalizeRelationList)(data.getIn(['document', 'rel:relations-common-list', 'relation-list-item']));
if (!relations) {
return;
}
const relation = (0, _relationListHelpers.findBroaderRelation)(childCsid, relations);
if (relation) {
const parentCsid = relation.getIn(['object', 'csid']);
if (parentCsid && parentCsid !== csid) {
const childName = (0, _cspaceRefname.getDisplayName)(childRefName);
const parentName = (0, _cspaceRefname.getDisplayName)(relation.getIn(['object', 'refName']));
items.push({
message: messages.reparentWarning,
values: {
childName,
parentName
}
});
}
}
});
if (items.length > 0) {
showNotification({
items,
date: new Date(),
status: _notificationStatusCodes.STATUS_WARNING
}, notificationID);
} else {
removeNotification(notificationID);
}
}
render() {
return null;
}
}
exports.default = HierarchyReparentNotifier;
HierarchyReparentNotifier.propTypes = propTypes;
HierarchyReparentNotifier.notificationID = notificationID;
;