instantjob-recruiter-client
Version:
a set of tools for creating an instantjob recruiter react client
111 lines (99 loc) • 2.37 kB
JSX
import React, {Component} from 'react'
import styled, {css} from 'styled-components'
import Periods from './periods'
import get_week_periods from './get_week_periods'
import auto_bind from 'common/auto_bind'
import moment from 'common/moment'
import event_system from 'common/event_system'
import {capitalize_first_letter} from 'common/utilities'
import {color} from 'common/styles'
export default class Week extends Component {
constructor(props) {
super(props)
this.state = {
week: moment(),
}
auto_bind(this)
}
componentDidMount() {
this.stop_retrieving_calendar_week = event_system.retrieve(`calendar-week`, (week) => {
this.setState({week})
})
}
componentWillUnmount() {
this.stop_retrieving_calendar_week()
}
get_days() {
const start = moment(this.state.week).startOf('week')
return get_week_periods(start)(this.props).map((periods, index) => ({
periods,
date: moment(start).add(index, 'day'),
}))
}
render_day(day, index) {
return <Day key={index} {...day} />
}
render() {
return (
<Container>
{this.get_days().map(this.render_day)}
</Container>
)
}
}
class Day extends Component {
constructor(props) {
super(props)
auto_bind(this)
}
render() {
const {date, periods} = this.props
return (
<DayContainer>
<Header>
<WeekDay>
{capitalize_first_letter(date.format("dddd"))}
</WeekDay>
<FullDate>
{date.format("D/M")}
</FullDate>
</Header>
<Content>
<Periods periods={periods} />
</Content>
</DayContainer>
)
}
}
const border = css`solid 1px ${color('black', 'pale')}`
const Container = styled.div`
flex: 1;
display: flex;
align-items: stretch;
`
const DayContainer = styled.div`
flex: 1;
display: flex;
align-items: stretch;
flex-direction: column;
`
const Header = styled.div`
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
border-bottom: ${border};
`
const WeekDay = styled.div``
const FullDate = styled.div`
font-size: 12px;
`
const Content = styled.div`
border-left: ${border};
background-color: ${color('black', 'translucent')};
flex: 1;
overflow: scroll;
&:last-of-type {
border-right: ${border};
}
`