examples/create-react-app/src/components/org-unit-tree.js

Summary

Maintainability
F
4 days
Test Coverage
import React from 'react';
import PropTypes from 'prop-types';

import Card from 'material-ui/Card/Card';
import CardText from 'material-ui/Card/CardText';

import InitiallyExpanded from './org-unit-tree/initially-expanded';
import SingleSelection from './org-unit-tree/single-selection';
import SingleSelectionNoCheckbox from './org-unit-tree/single-selection-no-checkbox';
import SingleSelectionMultipleRoots from './org-unit-tree/single-selection-multiple-roots';
import MultipleSelection from './org-unit-tree/multiple-selection';
import MultipleSelectionNoCheckbox from './org-unit-tree/multiple-selection-no-checkbox';
import MultipleSelectionMultipleRoots from './org-unit-tree/multiple-selection-multiple-roots';
import ChangeRoot from './org-unit-tree/change-root';
import MultipleSelectionChangeRoot from './org-unit-tree/multiple-selection-change-root';

import { OrgUnitTreeMultipleRoots, OrgUnitTree } from '@dhis2/d2-ui-org-unit-tree';

const styles = {
    card: {
        margin: 16,
        width: 350,
        float: 'left',
        transition: 'all 175ms ease-out',
    },
    cardText: {
        paddingTop: 0,
    },
    cardHeader: {
        padding: '0 16px 16px',
        margin: '16px -16px',
        borderBottom: '1px solid #eeeeee',
    },
    customLabel: {
        fontStyle: 'italic',
    },
    customLabelSelected: {
        color: 'blue',
        weight: 900,
    },
};

styles.cardWide = Object.assign({}, styles.card, {
    width: (styles.card.width * 3) + (styles.card.margin * 4),
});

export default class OrgUnitTreeExample extends React.Component {
    constructor (props) {
        super(props);

        const d2 = props.d2;
        this.state = {
            d2: d2,
            roots: [],
            root: undefined,
            preRoot: undefined
        };

        const childFields = 'id,path,displayName,children::isNotEmpty';

        d2.models.organisationUnits
            .list({
                paging: false,
                level: 1,
                fields: childFields,
            })
            .then(rootLevel => rootLevel.toArray()[0])
            .then((loadRootUnit) => {
                this.setState({
                    root: loadRootUnit,
                    roots: []
                })
            })
            .then(() => Promise.all([
                d2.models.organisationUnits.get('at6UHUQatSo', { fields: childFields }),
                d2.models.organisationUnits.get('fdc6uOvgoji', { fields: childFields }),
                d2.models.organisationUnits.list({
                    paging: false,
                    level: 1,
                    fields: 'id,path,displayName,children[id,path,displayName,children::isNotEmpty]',
                }),
            ]))
            .then(roots => [roots[0], roots[1], roots[2].toArray()[0]])
            .then((roots) => {
                this.setState({
                    roots
                });
                d2.models.organisationUnits.list({
                    paging: false,
                    level: 1,
                    fields: `id,path,displayName,children[id,path,displayName,children[${childFields}]]`,
                })
                .then(preRoot => preRoot.toArray()[0])
                .then((preRoot) => {
                    this.setState({
                        preRoot
                    })
                });
            })
    }

    render () {
        const { root, roots, preRoot } = this.state;

        if (!root || !roots || !preRoot) {
            return null;
        }

        return (
            <div>
                <section>Plain Organisation Unit Trees</section>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Plain OrgUnitTree</h3>
                        <OrgUnitTree root={root} />
                    </CardText>
                </Card>
                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Plain OrgUnitTree with filter</h3>
                        <OrgUnitTree
                            root={root}
                            orgUnitsPathsToInclude={['/ImspTQPwCqd/Vth0fbpFcsO/EjnIQNVAXGp', '/ImspTQPwCqd/TEQlaapDQoK/ZiOVcrSjSYe']}
                        />
                    </CardText>
                </Card>
                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Three Independent Trees</h3>
                        {roots.length > 0 ? (
                            <div>
                                <OrgUnitTree root={roots[0]} />
                                <OrgUnitTree root={roots[1]} />
                                <OrgUnitTree root={roots[2]} />
                            </div>
                        ) : 'Loading...' }
                    </CardText>
                </Card>
                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Tree with multiple roots</h3>
                        {roots.length > 0 ? (
                            <OrgUnitTreeMultipleRoots roots={roots} />
                        ) : 'Loading...' }
                    </CardText>
                </Card>
                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Custom Styling</h3>
                        <OrgUnitTree
                            root={root}
                            labelStyle={styles.customLabel}
                            selectedLabelStyle={styles.customLabelSelected}
                            selected={[
                                '/ImspTQPwCqd/O6uvpzGd5pu',
                                '/ImspTQPwCqd/lc3eMKXaEfw',
                                '/ImspTQPwCqd/PMa2VCrupOd',
                                '/ImspTQPwCqd/qhqAxPSTUXp',
                                '/ImspTQPwCqd/jmIPBj66vD6',
                            ]}
                            arrowSymbol="+"
                        />
                    </CardText>
                </Card>

                <section>Single Selection</section>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Single Selection Tree</h3>
                        <SingleSelection root={root} />
                    </CardText>
                </Card>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Single Selection Tree without Checkboxes</h3>
                        <SingleSelectionNoCheckbox root={root} />
                    </CardText>
                </Card>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Single Selection with multiple roots</h3>
                        {roots.length > 0 ? (
                            <SingleSelectionMultipleRoots roots={roots} />
                        ) : 'Loading...' }
                    </CardText>
                </Card>

                <section>Multiple Selection</section>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Multiple Selection Tree</h3>
                        <MultipleSelection root={root} />
                    </CardText>
                </Card>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Multiple Selection without Checkboxes</h3>
                        <MultipleSelectionNoCheckbox root={root} />
                    </CardText>
                </Card>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Multiple Selection with multiple roots</h3>
                        {roots.length > 0 ? (
                            <MultipleSelectionMultipleRoots root={root} roots={roots} />
                        ) : 'Loading...' }
                    </CardText>
                </Card>

                <section>Initially Expanded and Pre-Loaded Trees</section>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Initially Expanded</h3>
                        <InitiallyExpanded root={root} roots={root} />
                    </CardText>
                </Card>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Initially Expanded Multiple Roots</h3>
                        <InitiallyExpanded
                            root={root}
                            roots={roots}
                            selected={['/ImspTQPwCqd', '/ImspTQPwCqd/fdc6uOvgoji']}
                        />
                    </CardText>
                </Card>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Initially Expanded, 3 levels pre-loaded</h3>
                        { preRoot ? <InitiallyExpanded root={root} roots={preRoot} /> : 'Loading...' }
                    </CardText>
                </Card>

                <section>Root Selection</section>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Root Selection</h3>
                        <ChangeRoot root={root} />
                    </CardText>
                </Card>

                <Card style={styles.card}>
                    <CardText style={styles.cardText}>
                        <h3 style={styles.cardHeader}>Root Selection & Multiple Selection</h3>
                        <MultipleSelectionChangeRoot root={root} />
                    </CardText>
                </Card>
            </div>
        );
    }
}

OrgUnitTreeExample.propTypes = {
    d2: PropTypes.object.isRequired,
};