cspace-ui
Version:
CollectionSpace user interface for browsers
389 lines (384 loc) • 14.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.confirmUnrelateModalName = void 0;
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _immutable = _interopRequireDefault(require("immutable"));
var _reactIntl = require("react-intl");
var _get = _interopRequireDefault(require("lodash/get"));
var _CheckboxInput = _interopRequireDefault(require("cspace-input/lib/components/CheckboxInput"));
var _configHelpers = require("../../helpers/configHelpers");
var _permissionHelpers = require("../../helpers/permissionHelpers");
var _recordDataHelpers = require("../../helpers/recordDataHelpers");
var _modalNames = require("../../constants/modalNames");
var _SearchPanelContainer = _interopRequireDefault(require("../../containers/search/SearchPanelContainer"));
var _ConfirmRecordUnrelateModal = _interopRequireDefault(require("./ConfirmRecordUnrelateModal"));
var _SelectBar = _interopRequireDefault(require("../search/SelectBar"));
var _UnrelateButton = _interopRequireDefault(require("./UnrelateButton"));
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 confirmUnrelateModalName = exports.confirmUnrelateModalName = `RelatedRecordPanel-${_modalNames.MODAL_CONFIRM_RECORD_UNRELATE}`;
const messages = (0, _reactIntl.defineMessages)({
title: {
"id": "relatedRecordPanel.title",
"defaultMessage": "Related {collectionName}"
}
});
const getSearchDescriptor = props => {
const {
config,
csid,
initialSort,
recordRelationUpdatedTimestamp,
relatedRecordType,
serviceTag
} = props;
return _immutable.default.fromJS({
recordType: relatedRecordType,
searchQuery: {
rel: csid,
relType: 'affects',
p: 0,
size: config.defaultSearchPanelSize || 5,
sort: initialSort,
serviceTag
},
seqID: recordRelationUpdatedTimestamp
});
};
const stopPropagation = event => {
event.stopPropagation();
};
const propTypes = {
collapsed: _propTypes.default.bool,
color: _propTypes.default.string,
columnSetName: _propTypes.default.string,
config: _propTypes.default.shape({
listTypes: _propTypes.default.object
}),
csid: _propTypes.default.string,
listType: _propTypes.default.string,
linkItems: _propTypes.default.bool,
name: _propTypes.default.string,
perms: _propTypes.default.instanceOf(_immutable.default.Map),
recordData: _propTypes.default.instanceOf(_immutable.default.Map),
// These uses aren't detected by eslint.
/* eslint-disable react/no-unused-prop-types */
initialSort: _propTypes.default.string,
recordRelationUpdatedTimestamp: _propTypes.default.string,
/* eslint-enable react/no-unused-prop-types */
recordType: _propTypes.default.string,
relatedRecordType: _propTypes.default.string,
selectedItems: _propTypes.default.instanceOf(_immutable.default.Map),
serviceTag: _propTypes.default.string,
showCheckboxColumn: _propTypes.default.bool,
showSearchButton: _propTypes.default.bool,
showAddButton: _propTypes.default.bool,
panelId: _propTypes.default.string,
// not set on this prop name yet
openModalName: _propTypes.default.string,
closeModal: _propTypes.default.func,
openModal: _propTypes.default.func,
clearSelected: _propTypes.default.func,
setAllItemsSelected: _propTypes.default.func,
unrelateRecords: _propTypes.default.func,
getItemLocation: _propTypes.default.func,
onItemClick: _propTypes.default.func,
onItemSelectChange: _propTypes.default.func,
onUnrelated: _propTypes.default.func
};
const defaultProps = {
collapsed: true,
listType: 'common'
};
class RelatedRecordPanel extends _react.Component {
constructor(props) {
super(props);
this.handleCheckboxCommit = this.handleCheckboxCommit.bind(this);
this.handleConfirmUnrelateButtonClick = this.handleConfirmUnrelateButtonClick.bind(this);
this.handleModalCancelButtonClick = this.handleModalCancelButtonClick.bind(this);
this.handleSearchDescriptorChange = this.handleSearchDescriptorChange.bind(this);
this.handleUnrelateButtonClick = this.handleUnrelateButtonClick.bind(this);
this.renderCheckbox = this.renderCheckbox.bind(this);
this.renderTableHeader = this.renderTableHeader.bind(this);
this.shouldShowCheckbox = this.shouldShowCheckbox.bind(this);
this.state = {
isUnrelating: false,
searchDescriptor: getSearchDescriptor(props)
};
}
// eslint-disable-next-line camelcase
UNSAFE_componentWillReceiveProps(nextProps) {
const searchDescriptor = getSearchDescriptor(this.props);
let nextSearchDescriptor = getSearchDescriptor(nextProps);
if (!_immutable.default.is(searchDescriptor, nextSearchDescriptor)) {
if (searchDescriptor.get('recordType') === nextSearchDescriptor.get('recordType') && searchDescriptor.getIn(['searchQuery', 'rel']) === nextSearchDescriptor.getIn(['searchQuery', 'rel'])) {
// The record type and related csid didn't change, so carry over the page number, size, and
// sort from the current search descriptor.
const {
searchDescriptor: currentSearchDescriptor
} = this.state;
const searchQuery = currentSearchDescriptor.get('searchQuery');
const nextSearchQuery = nextSearchDescriptor.get('searchQuery').set('p', searchQuery.get('p')).set('size', searchQuery.get('size')).set('sort', searchQuery.get('sort'));
nextSearchDescriptor = nextSearchDescriptor.set('searchQuery', nextSearchQuery);
}
this.setState({
searchDescriptor: nextSearchDescriptor
});
}
}
handleCheckboxCommit(path, value) {
const index = parseInt(path[0], 10);
const checked = value;
const {
config,
name,
listType,
onItemSelectChange
} = this.props;
const {
searchDescriptor
} = this.state;
if (onItemSelectChange) {
onItemSelectChange(config, name, searchDescriptor, listType, index, checked);
}
}
handleConfirmUnrelateButtonClick() {
const {
config,
csid,
name,
recordType,
relatedRecordType,
selectedItems,
clearSelected,
closeModal,
unrelateRecords,
onUnrelated
} = this.props;
if (unrelateRecords) {
this.setState({
isUnrelating: true
});
const subject = {
csid,
recordType
};
const objects = selectedItems.valueSeq().map(item => ({
csid: item.get('csid'),
recordType: relatedRecordType // TODO: Check the item's docType first
})).toJS();
unrelateRecords(config, subject, objects, 'affects').then(() => {
if (clearSelected) {
clearSelected(name);
}
if (onUnrelated) {
onUnrelated(objects);
}
if (closeModal) {
closeModal(false);
}
this.setState({
isUnrelating: false
});
}).catch(() => {
this.setState({
isUnrelating: false
});
});
}
}
handleModalCancelButtonClick() {
const {
closeModal
} = this.props;
if (closeModal) {
closeModal(false);
}
}
handleSearchDescriptorChange(searchDescriptor) {
this.setState({
searchDescriptor
});
}
handleUnrelateButtonClick() {
const {
openModal
} = this.props;
if (openModal) {
openModal(confirmUnrelateModalName);
}
}
shouldShowCheckbox(item) {
const {
config,
perms
} = this.props;
return item.get('workflowState') !== 'locked' && (0, _permissionHelpers.canUnrelate)((0, _configHelpers.getRecordTypeNameByUri)(config, item.get('uri')), perms, config);
}
renderCheckbox({
rowData,
rowIndex
}) {
const {
selectedItems
} = this.props;
if (this.shouldShowCheckbox(rowData)) {
const itemCsid = rowData.get('csid');
const selected = selectedItems ? selectedItems.has(itemCsid) : false;
return /*#__PURE__*/_react.default.createElement(_CheckboxInput.default, {
embedded: true,
name: `${rowIndex}`,
value: selected,
onCommit: this.handleCheckboxCommit
// Prevent clicking on the checkbox from selecting the record.
,
onClick: stopPropagation
});
}
return null;
}
renderConfirmRecordUnrelateModal() {
const {
config,
openModalName,
relatedRecordType,
selectedItems
} = this.props;
const {
isUnrelating
} = this.state;
const recordCount = selectedItems ? selectedItems.size : 0;
return /*#__PURE__*/_react.default.createElement(_ConfirmRecordUnrelateModal.default, {
config: config,
recordType: relatedRecordType,
isMultiSelect: true,
isOpen: openModalName === confirmUnrelateModalName,
isUnrelating: isUnrelating,
recordCount: recordCount,
onCancelButtonClick: this.handleModalCancelButtonClick,
onCloseButtonClick: this.handleModalCancelButtonClick,
onUnrelateButtonClick: this.handleConfirmUnrelateButtonClick
});
}
renderTableHeader({
searchError,
searchResult
}) {
const {
config,
name,
perms,
listType,
relatedRecordType,
selectedItems,
showCheckboxColumn,
setAllItemsSelected
} = this.props;
const {
searchDescriptor
} = this.state;
if (searchError || !showCheckboxColumn || !(0, _permissionHelpers.canUnrelate)(relatedRecordType, perms, config)) {
return null;
}
const selectedCount = selectedItems ? selectedItems.size : 0;
const unrelateButton = /*#__PURE__*/_react.default.createElement(_UnrelateButton.default, {
disabled: selectedCount < 1,
key: "unrelate",
name: "unrelate",
onClick: this.handleUnrelateButtonClick
});
return /*#__PURE__*/_react.default.createElement("header", null, /*#__PURE__*/_react.default.createElement(_SelectBar.default, {
buttons: [unrelateButton],
config: config,
listType: listType,
searchDescriptor: searchDescriptor,
searchName: name,
searchResult: searchResult,
selectedItems: selectedItems,
setAllItemsSelected: setAllItemsSelected,
showCheckboxFilter: this.shouldShowCheckbox
}), this.renderConfirmRecordUnrelateModal());
}
renderTitle() {
const {
config,
recordType,
relatedRecordType,
panelId
} = this.props;
const sidebarMessage = (0, _get.default)(config, ['recordTypes', recordType, 'messages', 'sidebar', panelId]);
const collectionNameMessage = (0, _get.default)(config, ['recordTypes', relatedRecordType, 'messages', 'record', 'collectionName']);
const collectionName = sidebarMessage != null ? /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, sidebarMessage) : /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, collectionNameMessage);
return /*#__PURE__*/_react.default.createElement(_reactIntl.FormattedMessage, _extends({}, messages.title, {
values: {
collectionName
}
}));
}
render() {
const {
collapsed,
color,
columnSetName,
config,
csid,
listType,
linkItems,
name,
perms,
recordData,
recordType,
relatedRecordType,
showCheckboxColumn,
showSearchButton,
showAddButton,
getItemLocation,
onItemClick
} = this.props;
const {
searchDescriptor
} = this.state;
const relatedServiceType = (0, _get.default)(config, ['recordTypes', relatedRecordType, 'serviceConfig', 'serviceType']);
if (relatedServiceType === 'object' || relatedServiceType === 'procedure' || relatedServiceType === 'authority') {
// Don't render if list permissions are not present for the related record type.
if (!(0, _permissionHelpers.canList)(relatedRecordType, perms)) {
return null;
}
}
if (!(0, _recordDataHelpers.getUpdatedTimestamp)(recordData)) {
// Don't render until after the record has loaded.
return null;
}
const renderCheckbox = showCheckboxColumn ? this.renderCheckbox : undefined;
return /*#__PURE__*/_react.default.createElement(_SearchPanelContainer.default, {
collapsed: collapsed,
color: color,
columnSetName: columnSetName,
config: config,
csid: csid,
listType: listType,
linkItems: linkItems,
name: name,
searchDescriptor: searchDescriptor,
recordType: recordType,
recordData: recordData,
title: this.renderTitle(),
showAddButton: showAddButton,
showSearchButton: showSearchButton,
showCheckboxColumn: showCheckboxColumn,
renderCheckbox: renderCheckbox,
renderTableHeader: this.renderTableHeader,
getItemLocation: getItemLocation,
onItemClick: onItemClick,
onSearchDescriptorChange: this.handleSearchDescriptorChange
});
}
}
exports.default = RelatedRecordPanel;
RelatedRecordPanel.propTypes = propTypes;
RelatedRecordPanel.defaultProps = defaultProps;