UNPKG

trc-client-core

Version:
95 lines (82 loc) 3.76 kB
import React from 'react'; import {Map, List} from 'immutable'; import {Link} from 'react-router'; import Widget from 'trc-client-core/src/components/Widget'; import Grid from 'trc-client-core/src/components/Grid'; import Col from 'trc-client-core/src/components/Col'; import {IconPlus} from 'trc-client-core/src/components/Icons'; class PrerequisiteChart extends React.Component { constructor(props) { super(props); this.displayName = 'PrerequisiteChart'; } mergeLeftRight(left, right) { var prerequisites = List(); prerequisites = (List.isList(left)) ? prerequisites.concat(left) : prerequisites.push(left); prerequisites = (List.isList(right)) ? prerequisites.concat(right) : prerequisites.push(right); return prerequisites; } flattenPrerequisites(branch, parentType) { // If there are no prerequisites exit early with branch if(!branch.get('prerequisite1')) { return branch; } const type = branch.get('type'); const left = this.flattenPrerequisites(branch.get('prerequisite1'), type); const right = this.flattenPrerequisites(branch.get('prerequisite2'), type); // If the parentType and type are equal return the recusion as a list // this lets us flatten our recursion to a single point. if (parentType === type) { return this.mergeLeftRight(left, right); } // The main case grabs the left and right cases. Then if the case is a list // generated from the above clause affect a flatten by concatenating instead of pushing. else { return Map({ type: type, prerequisites: this.mergeLeftRight(left, right) }); } } render() { if(this.props.prerequisite.getIn(['prerequisite','type']) === "NONE"){ return null } var flatPrerequisites = this.flattenPrerequisites(this.props.prerequisite.get('prerequisite')); var prerequisites = this.renderPrequisitesRecursively(flatPrerequisites); return <section className="margin-row2"> {(flatPrerequisites.has('prerequisites')) ? prerequisites : <Widget modifier="clear">{prerequisites}</Widget>} </section>; } renderPrequisitesRecursively(branch, key) { var {courseCode, prerequisites} = branch.toObject(); var course = this.props.prerequisite .get('prerequisiteCourses') .filter(ii => ii.get('courseCode') === courseCode) .get(0); if (!branch.get('prerequisites')) { return <Link key={key} to={`/course/${course.get('courseCode')}`}> <Widget> <span>{course.get('workshopName')}</span> <span>{(branch.get('type') === 'COURSE_ENROLLED') ? ' (Enrolled)' : null}</span> </Widget> </Link> } if(branch.get('type') === 'AND') { var ands = prerequisites.map(this.renderPrequisitesRecursively.bind(this)).interpose(<IconPlus className="margin-row05" size="small" />) return <Widget modifier="clear" className="t-center"> {ands.map((ii, key) => <div key={key}>{ii}</div>)} </Widget> } else { return <Widget modifier="clear" className="t-center" key={key}> <div className="margin-bottom">Either</div> <Grid modifier="tight"> {prerequisites.map((pp, key) => { return <Col key={key}>{this.renderPrequisitesRecursively(pp)}</Col> })} </Grid> </Widget> } } } export default PrerequisiteChart;