UNPKG

d2-ui

Version:
204 lines (181 loc) 7.57 kB
import React, { Component } from 'react'; import PropTypes from 'prop-types'; import log from 'loglevel'; import { config } from 'd2/lib/d2'; import Tabs from 'material-ui/Tabs/Tabs'; import Tab from 'material-ui/Tabs/Tab'; import ListSelect from '../list-select/ListSelect.component'; import DropDownForSchemaReference from './DropDownForSchemaReference'; config.i18n.strings.add('please_select_a_program'); config.i18n.strings.add('no_tracked_entity_attributes'); config.i18n.strings.add('no_program_indicators'); config.i18n.strings.add('no_program_data_elements'); const styles = { listStyle: { width: '100%', outline: 'none', border: 'none', padding: '0rem 1rem', }, noValueMessageStyle: { padding: '1rem', }, tabLabel: { color: '#333', }, tabItemContainerStyle: { backgroundColor: '#FFF', }, dropDownStyle: { margin: '0 1rem', }, }; class ProgramOperandSelector extends Component { constructor(props, context) { super(props, context); const i18n = this.context.d2.i18n; this.getTranslation = i18n.getTranslation.bind(i18n); } state = { programTrackedEntityAttributeOptions: [], programIndicatorOptions: [], programDataElementOptions: [], programMenuItems: [], }; componentDidMount() { this.context.d2.models.program.list( { paging: false, fields: 'id,displayName,programTrackedEntityAttributes[id,displayName,trackedEntityAttribute],programIndicators[id,displayName,dimensionItem]', }) .then(programCollection => programCollection.toArray()) .then((programs) => { const programMenuItems = programs .map(program => ({ payload: program.id, text: program.displayName, })) .sort((left, right) => left.text.localeCompare(right.text.toLowerCase())); this.setState({ programMenuItems, programAttributes: new Map(programs.map(program => [ program.id, program.programTrackedEntityAttributes .map(ptea => ({ value: ptea.trackedEntityAttribute.id, label: ptea.displayName, })) .sort((left, right) => left.label.toLowerCase().localeCompare(right.label.toLowerCase())), ])), programIndicators: new Map(programs.map(program => [ program.id, Array.from(program.programIndicators.values ? program.programIndicators.values() : []) .map(pi => ({ value: pi.dimensionItem, label: pi.displayName, })) .sort((left, right) => left.label.toLowerCase().localeCompare(right.label.toLowerCase())), ])), }); }) .catch(e => log.error(e)); } onLoadProgramDataOperands = (event) => { const api = this.context.d2.Api.getApi(); const programId = event.target.value; api.get('programDataElements', { program: programId, fields: 'id,displayName,dimensionItem', paging: false, order: 'displayName:asc', }) .then((programDataElements) => { this.setState({ selectedProgramID: programId, programDataElementOptions: programDataElements.programDataElements .map(programDataElement => ( { value: programDataElement.dimensionItem, label: programDataElement.displayName, } )), programIndicatorOptions: this.state.programIndicators.get(programId) || [], programTrackedEntityAttributeOptions: this.state.programAttributes.get(programId) || [], }); }) .catch(error => log.error(error)); } onProgramTrackedEntityAttributeSelected = (trackedEntityAttributeID) => { const programTrackedEntityAttributeFormula = `A{${this.state.selectedProgramID}.${trackedEntityAttributeID}}`; this.props.onSelect(programTrackedEntityAttributeFormula); } onProgramIndicatorSelected = (programIndicatorID) => { const programIndicatorFormula = `I{${programIndicatorID}}`; this.props.onSelect(programIndicatorFormula); } onProgramDataElementSelected = (programDataElementID) => { const programDataElementSelected = `D{${programDataElementID}}`; this.props.onSelect(programDataElementSelected); } renderTab(tabName, source, onItemDoubleClick, noValueMessage, listLength) { return ( <Tab label={this.getTranslation(tabName)} style={styles.tabLabel}> {!listLength ? <div style={styles.noValueMessageStyle}>{this.getTranslation(noValueMessage)}</div> : <ListSelect onItemDoubleClick={onItemDoubleClick} source={source} listStyle={styles.listStyle} size={10} />} </Tab> ); } renderTabs() { return ( <Tabs tabItemContainerStyle={styles.tabItemContainerStyle}> {this.renderTab('program_data_elements', this.state.programDataElementOptions, this.onProgramDataElementSelected, 'no_program_data_elements', this.state.programDataElementOptions.length)} {this.renderTab('program_tracked_entity_attributes', this.state.programTrackedEntityAttributeOptions, this.onProgramTrackedEntityAttributeSelected, 'no_tracked_entity_attributes', this.state.programTrackedEntityAttributeOptions.length)} {this.renderTab('program_indicators', this.state.programIndicatorOptions, this.onProgramIndicatorSelected, 'no_program_indicators', this.state.programIndicatorOptions.length)} </Tabs> ); } render() { return ( <div> <div style={styles.dropDownStyle}> <DropDownForSchemaReference schema="program" value={this.state.selectedProgramID} fullWidth onChange={this.onLoadProgramDataOperands} hintText={this.getTranslation('please_select_a_program')} /> </div> {this.state.selectedProgramID ? this.renderTabs() : null} </div> ); } } ProgramOperandSelector.propTypes = { onSelect: PropTypes.func.isRequired, }; ProgramOperandSelector.contextTypes = { d2: PropTypes.object, }; export default ProgramOperandSelector;