cspace-ui
Version:
CollectionSpace user interface for browsers
146 lines (122 loc) • 3.89 kB
JSX
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage } from 'react-intl';
import Immutable from 'immutable';
import { components as inputComponents } from 'cspace-input';
import FieldInput from './input/FieldInput';
import styles from '../../../styles/cspace-ui/ExportFieldEditor.css';
import {
getRecordFieldOptionListName,
getRecordGroupOptionListName,
} from '../../helpers/configHelpers';
const propTypes = {
config: PropTypes.shape({
locale: PropTypes.string,
}).isRequired,
includeFields: PropTypes.instanceOf(Immutable.List),
recordType: PropTypes.string,
buildRecordFieldOptionLists: PropTypes.func,
deleteOptionList: PropTypes.func,
onIncludeFieldsAddInstance: PropTypes.func,
onIncludeFieldsCommit: PropTypes.func,
onIncludeFieldsMoveInstance: PropTypes.func,
onIncludeFieldsRemoveInstance: PropTypes.func,
};
const { RepeatingInput } = inputComponents;
const messages = defineMessages({
prompt: {
id: 'exportFieldEditor.prompt',
description: 'Prompt message in the field editor for exports.',
defaultMessage: 'Select fields to include.',
},
});
export default class ExportFieldEditor extends Component {
constructor(props) {
super(props);
this.handleIncludeFieldsAddInstance = this.handleIncludeFieldsAddInstance.bind(this);
this.handleIncludeFieldsCommit = this.handleIncludeFieldsCommit.bind(this);
this.handleIncludeFieldsMoveInstance = this.handleIncludeFieldsMoveInstance.bind(this);
this.handleIncludeFieldsRemoveInstance = this.handleIncludeFieldsRemoveInstance.bind(this);
}
componentDidMount() {
const {
config,
recordType,
buildRecordFieldOptionLists,
} = this.props;
if (buildRecordFieldOptionLists) {
// Converter doesn't support importing struct date parts, so set the includeStructDateFields
// arg to false.
buildRecordFieldOptionLists(config, recordType, undefined, false);
}
}
componentWillUnmount() {
const {
recordType,
deleteOptionList,
} = this.props;
if (deleteOptionList) {
deleteOptionList(getRecordFieldOptionListName(recordType));
deleteOptionList(getRecordGroupOptionListName(recordType));
}
}
handleIncludeFieldsAddInstance(path, position) {
const {
onIncludeFieldsAddInstance,
} = this.props;
if (onIncludeFieldsAddInstance) {
onIncludeFieldsAddInstance(position);
}
}
handleIncludeFieldsCommit(path, value) {
const {
onIncludeFieldsCommit,
} = this.props;
if (onIncludeFieldsCommit) {
onIncludeFieldsCommit(path[0], value);
}
}
handleIncludeFieldsMoveInstance(path, newPosition) {
const {
onIncludeFieldsMoveInstance,
} = this.props;
if (onIncludeFieldsMoveInstance) {
onIncludeFieldsMoveInstance(path[1], newPosition);
}
}
handleIncludeFieldsRemoveInstance(path) {
const {
onIncludeFieldsRemoveInstance,
} = this.props;
if (onIncludeFieldsRemoveInstance) {
onIncludeFieldsRemoveInstance(path[1]);
}
}
render() {
const {
config,
includeFields,
recordType,
} = this.props;
return (
<div className={styles.common}>
<p><FormattedMessage {...messages.prompt} /></p>
<RepeatingInput
name="includeFields"
value={includeFields}
onAddInstance={this.handleIncludeFieldsAddInstance}
onCommit={this.handleIncludeFieldsCommit}
onMoveInstance={this.handleIncludeFieldsMoveInstance}
onRemoveInstance={this.handleIncludeFieldsRemoveInstance}
>
<FieldInput
config={config}
embedded
recordType={recordType}
/>
</RepeatingInput>
</div>
);
}
}
ExportFieldEditor.propTypes = propTypes;