UNPKG

cspace-ui

Version:
120 lines (97 loc) 2.94 kB
import React from 'react'; import PropTypes from 'prop-types'; import { defineMessages, FormattedMessage, intlShape } from 'react-intl'; import Immutable from 'immutable'; import { findVocabularyUses } from '../../helpers/configHelpers'; import { ConnectedPanel as Panel } from '../../containers/layout/PanelContainer'; import styles from '../../../styles/cspace-ui/VocabularyUsedByPanel.css'; const messages = defineMessages({ title: { id: 'vocabularyUsedByPanel.title', defaultMessage: 'Used By', }, notUsed: { id: 'vocabularyUsedByPanel.notUsed', defaultMessage: 'No uses found.', }, }); const formatFieldName = (fieldConfig, intl) => { const formattedParentName = fieldConfig.extensionParentConfig ? formatFieldName(fieldConfig.extensionParentConfig, intl) : null; const { fullName, name, } = fieldConfig.messages; const formattedName = intl.formatMessage(fullName || name); return [formattedParentName, formattedName].filter(part => !!part).join(' - '); }; const renderUses = (uses, config, intl) => { const usedByRecordTypes = uses ? Object.keys(uses) : null; if (!usedByRecordTypes || usedByRecordTypes.length === 0) { return <div><FormattedMessage {...messages.notUsed} /></div>; } const { recordTypes, } = config; const formattedUses = {}; usedByRecordTypes.forEach((recordType) => { const formattedRecordName = intl.formatMessage(recordTypes[recordType].messages.record.name); const formattedFieldNames = uses[recordType] .map(fieldConfig => formatFieldName(fieldConfig, intl)) .sort(); formattedUses[formattedRecordName] = formattedFieldNames; }); const items = Object.keys(formattedUses).sort().map((formattedRecordName, index) => <li key={index}> <div>{formattedRecordName}</div> <ul> {formattedUses[formattedRecordName].map((formattedFieldName, fieldIndex) => <li key={fieldIndex}>{formattedFieldName}</li> )} </ul> </li> ); return ( <ul> {items} </ul> ); }; const propTypes = { config: PropTypes.object, data: PropTypes.instanceOf(Immutable.Map), }; const contextTypes = { intl: intlShape, }; export default function VocabularyUsedByPanel(props, context) { const { config, data, } = props; const { intl, } = context; if (!data) { return null; } const shortId = data.getIn(['document', 'ns2:vocabularies_common', 'shortIdentifier']); const uses = findVocabularyUses(config, shortId); const title = <h3><FormattedMessage {...messages.title} /></h3>; return ( <Panel className={styles.common} collapsible collapsed config={config} header={title} name="usedBy" recordType="vocabulary" > {renderUses(uses, config, intl)} </Panel> ); } VocabularyUsedByPanel.propTypes = propTypes; VocabularyUsedByPanel.contextTypes = contextTypes;