cspace-ui
Version:
CollectionSpace user interface for browsers
91 lines (71 loc) • 2.1 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import get from 'lodash/get';
import { injectIntl, intlShape } from 'react-intl';
import { baseComponents as components } from 'cspace-input';
import styles from '../../../styles/cspace-ui/RecordFormSelector.css';
const { DropdownMenuInput } = components;
const formOptions = (forms, intl) => Object.keys(forms)
.filter((formName) => !forms[formName].disabled)
.sort((nameA, nameB) => {
const configA = forms[nameA];
const configB = forms[nameB];
// Primary sort by sortOrder
let sortOrderA = configA.sortOrder;
let sortOrderB = configB.sortOrder;
if (typeof sortOrderA !== 'number') {
sortOrderA = Number.MAX_VALUE;
}
if (typeof sortOrderB !== 'number') {
sortOrderB = Number.MAX_VALUE;
}
if (sortOrderA !== sortOrderB) {
return (sortOrderA > sortOrderB ? 1 : -1);
}
// Secondary sort by label
const labelA = intl.formatMessage(configA.messages.name);
const labelB = intl.formatMessage(configB.messages.name);
// FIXME: This should be locale aware
return labelA.localeCompare(labelB);
})
.map((formName) => ({
label: intl.formatMessage(forms[formName].messages.name),
value: formName,
}));
const propTypes = {
config: PropTypes.shape({
recordTypes: PropTypes.object,
}),
intl: intlShape,
formName: PropTypes.string,
recordType: PropTypes.string,
onCommit: PropTypes.func,
};
function RecordFormSelector(props) {
const {
config,
intl,
formName,
recordType,
onCommit,
} = props;
const forms = get(config, ['recordTypes', recordType, 'forms']);
if (!forms || Object.keys(forms).length < 2) {
return null;
}
const options = formOptions(forms, intl);
if (options.length < 2) {
return null;
}
return (
<div className={styles.common}>
<DropdownMenuInput
options={options}
value={formName}
onCommit={onCommit}
/>
</div>
);
}
RecordFormSelector.propTypes = propTypes;
export default injectIntl(RecordFormSelector);