UNPKG

@nateradebaugh/react-datetime

Version:

A lightweight but complete datetime picker React.js component

130 lines (108 loc) 3.4 kB
import React, { Component } from "react"; import getYear from "date-fns/get_year"; import setYear from "date-fns/set_year"; import getDaysInYear from "date-fns/get_days_in_year"; import setDayOfYear from "date-fns/set_day_of_year"; import onClickOutside from "react-onclickoutside"; class YearsView extends Component { constructor(props) { super(props); // Bind functions this.renderYears = this.renderYears.bind(this); this.updateSelectedYear = this.updateSelectedYear.bind(this); this.renderYear = this.renderYear.bind(this); this.alwaysValidDate = this.alwaysValidDate.bind(this); } render() { const year = parseInt(getYear(this.props.viewDate) / 10, 10) * 10; return ( <div className="rdtYears"> <table> <thead> <tr> <th className="rdtPrev" onClick={this.props.subtractTime(10, "years")} > <span></span> </th> <th className="rdtSwitch" onClick={this.props.showView("years")} colSpan={2} > {year}-{year + 9} </th> <th className="rdtNext" onClick={this.props.addTime(10, "years")}> <span></span> </th> </tr> </thead> </table> <table> <tbody>{this.renderYears(year)}</tbody> </table> </div> ); } renderYears(year) { const renderer = this.props.renderYear || this.renderYear; const selectedDate = this.props.selectedDate; const date = this.props.viewDate || new Date(); const isValid = this.props.isValidDate || this.alwaysValidDate; let years = []; const rows = []; year--; for (let i = -1; i < 11; i++, year++) { let classes = "rdtYear"; const currentYear = setYear(date, year); const noOfDaysInYear = getDaysInYear(date); const daysInYear = Array.from({ length: noOfDaysInYear }, (e, i) => { return i + 1; }); const validDay = daysInYear.find(d => { const day = setDayOfYear(currentYear, d); return isValid(day); }); const isDisabled = validDay === undefined; if (isDisabled) { classes += " rdtDisabled"; } if (selectedDate && getYear(selectedDate) === year) { classes += " rdtActive"; } const props = { key: year, "data-value": year, className: classes }; if (!isDisabled) { props.onClick = this.props.updateOn === "years" ? this.updateSelectedYear : this.props.setDate("year"); } years.push( renderer(props, year, selectedDate && new Date(selectedDate.getTime())) ); if (years.length === 4) { rows.push(<tr key={i}>{years}</tr>); years = []; } } return rows; } updateSelectedYear(event) { this.props.updateSelectedDate(event); } renderYear(props, year) { return <td {...props}>{year}</td>; } alwaysValidDate() { return 1; } handleClickOutside() { this.props.handleClickOutside(); } } export default onClickOutside(YearsView);