import React from "react"
import ReactDOM from "react-dom"
import moment from "moment"
const initDatepicker = ({ elementId, never, setDate }) => {
const element = document.getElementById(elementId)
if (!element) console.error("Element with id " + element + "doesn't exist!")
element.type = "hidden"
const name = element.name
const value = element.value.length ? moment(element.value) : null
if (value) value.local()
const container = document.createElement("div")
element.parentNode.insertBefore(container, element)
element.remove()
ReactDOM.render(
,
container
)
}
class DatePicker extends React.Component {
state = {
defaultValue: this.props.value,
value: this.props.value
}
setNever = () => {
this.setState({ value: null })
}
setInitialValue = () => {
this.setState(({ defaultValue, value }) => {
if (defaultValue) return { value: defaultValue }
const newValue = moment()
newValue.add(1, "hour")
return { value: newValue }
})
}
setValue = value => {
this.setState({ value })
}
render() {
const { name, never, setDate } = this.props
const { value } = this.state
return (
)
}
}
const getButtonClassName = active => {
if (active) return "btn btn-outline-primary btn-sm"
return "btn btn-outline-secondary btn-sm"
}
const Input = ({ value, onChange }) => {
if (!value) return null
return (
)
}
const weeks = [1, 2, 3, 4, 5, 6]
const days = [1, 2, 3, 4, 5, 6, 7]
class SelectMonth extends React.Component {
decreaseMonth = () => {
this.setState((_, props) => {
const value = props.value.clone()
value.subtract(1, "month")
props.onChange(value)
})
}
increaseMonth = () => {
this.setState((_, props) => {
const value = props.value.clone()
value.add(1, "month")
props.onChange(value)
})
}
render() {
const { value, onChange } = this.props
const startOfMonth = value
.clone()
.startOf("month")
.isoWeekday()
const calendar = value.clone()
calendar.date(1)
calendar.hour(value.hour())
calendar.minute(value.minute())
calendar.subtract(startOfMonth + 1, "day")
return (
{weeks.map(w => (
{days.map(d => (
))}
))}
)
}
}
const CalendarHeader = ({ decreaseMonth, increaseMonth, value }) => (
{value.format("MMMM YYYY")}
)
const WeekdaysNames = () => (
{moment.weekdaysMin(false).map((name, i) => (
{name}
))}
)
const Weekday = ({ calendar, value, onSelect }) => {
calendar.add(1, "day")
const day = calendar.clone()
const active = day.format("D M Y") === value.format("D M Y")
return (
)
}
class SelectTime extends React.Component {
handleHourChange = ({ target }) => {
const { value: time } = target
if (!time.match(/^[0-2][0-9]?[0-9]?$/)) return
this.setState((_, props) => {
const hour = cleanTimeValue(time, 2)
const value = props.value.clone()
value.hour(hour)
props.onChange(value)
})
}
handleMinuteChange = ({ target }) => {
const { value: time } = target
if (!time.match(/^[0-5][0-9]?[0-9]?$/)) return
this.setState((_, props) => {
const minute = cleanTimeValue(time, 5)
const value = props.value.clone()
value.minute(minute)
props.onChange(value)
})
}
render() {
return (
)
}
}
const cleanTimeValue = (time, maxFirstDigit) => {
let value = time
if (value.length === 3) {
value = value.substring(1, 3)
if (parseInt(value[0]) > maxFirstDigit) {
value = maxFirstDigit + "" + value[1]
}
}
return value
}
const TimeInput = ({ format, value, onChange }) => (
)
export default initDatepicker