src/components/year.js
import React, {Component, PropTypes} from 'react'
import Immutable from 'immutable'
import studentActions from '../flux/student-actions'
import Student from '../models/student'
import Button from './button'
import Semester from './semester'
import isCurrentYear from '../helpers/is-current-year'
import expandYear from '../helpers/expand-year'
import semesterName from '../helpers/semester-name'
import findFirstAvailableSemester from '../helpers/find-first-available-semester'
import './year.scss'
export default class Year extends Component {
static propTypes = {
courses: PropTypes.instanceOf(Immutable.List),
coursesLoaded: PropTypes.bool.isRequired,
showSearchSidebar: PropTypes.func.isRequired,
student: PropTypes.instanceOf(Student).isRequired,
year: PropTypes.number.isRequired,
}
canAddSemester = () => {
return findFirstAvailableSemester(this.props.student.schedules, this.props.year) <= 5
}
addSemester = () => {
const nextAvailableSemester = findFirstAvailableSemester(this.props.student.schedules, this.props.year)
studentActions.addSchedule(this.props.student.id, {
year: this.props.year, semester: nextAvailableSemester,
index: 1, active: true,
})
}
removeYear = () => {
const scheduleIds = this.props.student.schedules
.filter(isCurrentYear(this.props.year))
.map(sched => sched.id)
studentActions.destroyMultipleSchedules(this.props.student.id, scheduleIds)
}
render() {
// console.log('Year#render')
const terms = this.props.student.schedules
.filter(sched => sched.active)
.filter(sched => sched.year === this.props.year)
.sortBy(schedule => schedule.semester)
.map(schedule =>
<Semester
key={`${schedule.year}-${schedule.semester}-${schedule.id}`}
student={this.props.student}
semester={schedule.semester}
year={this.props.year}
courses={this.props.courses.filter(c => schedule.clbids.includes(c.clbid))}
coursesLoaded={this.props.coursesLoaded}
showSearchSidebar={this.props.showSearchSidebar}
/>)
.toList()
const niceYear = expandYear(this.props.year)
const nextAvailableSemester = findFirstAvailableSemester(this.props.student.schedules, this.props.year)
const isAddSemesterDisabled = !(this.canAddSemester())
return (
<div className='year'>
<header className='year-title'>
<h1>{niceYear}</h1>
<span className='buttons'>
{!isAddSemesterDisabled &&
<Button className='add-semester'
type='flat'
title='Add Semester'
disabled={isAddSemesterDisabled}
onClick={this.addSemester}>
{`Add ‘${semesterName(nextAvailableSemester)}’`}
</Button>}
<Button className='remove-year' type='flat'
title={`Remove the year ${niceYear}`}
onClick={this.removeYear}>
Remove Year
</Button>
</span>
</header>
<div className='row'>
<div className='semester-list'>
{terms.toArray()}
</div>
</div>
</div>
)
}
}