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