Untitled
unknown
plain_text
8 months ago
10 kB
3
Indexable
Never
//MyDatePicker.js import React, {Component} from 'react'; import ReactDOM from 'react-dom'; import './MyDatePicker.css'; let oneDay = 60 * 60 * 24 * 1000; let todayTimestamp = Date.now() - (Date.now() % oneDay) + (new Date().getTimezoneOffset() * 1000 * 60); let inputRef = React.createRef(); export default class MyDatePicker extends Component { state = { getMonthDetails: [] } constructor(props) { super(props); let date = new Date(); let year = date.getFullYear(); let month = date.getMonth(); let selectedDay = props.selectedDay; this.state = { year, month, selectedDay, monthDetails: this.getMonthDetails(year, month) }; } setDateToInput = (timestamp) => { const dateString = this.getDateStringFromTimestamp(timestamp); if (inputRef.current) { inputRef.current.value = dateString; } } componentDidMount() { window.addEventListener('mousedown', this.addBackDrop); this.setDateToInput(this.state.selectedDay); } componentWillUnmount() { window.removeEventListener('mousedown', this.addBackDrop); } addBackDrop =e=> { if(this.state.showDatePicker && !ReactDOM.findDOMNode(this).contains(e.target)) { this.setState({ showDatePicker: false }); } } showDatePicker =(showDatePicker=true)=> { this.setState({ showDatePicker }) } daysMap = ['Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi', 'Pazar']; monthMap = ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık']; getDayDetails =args=> { let date = args.index - args.firstDay; let day = (args.index + 6) % 7;; let prevMonth = args.month-1; let prevYear = args.year; if(prevMonth < 0) { prevMonth = 11; prevYear--; } let prevMonthNumberOfDays = this.getNumberOfDays(prevYear, prevMonth); let _date = (date < 0 ? prevMonthNumberOfDays+date : date % args.numberOfDays) + 1; let month = date < 0 ? -1 : date >= args.numberOfDays ? 1 : 0; let timestamp = new Date(args.year, args.month, _date).getTime(); return { date: _date, day, month, timestamp, dayString: this.daysMap[day] } } getNumberOfDays =(year, month)=> { return 40 - new Date(year, month, 40).getDate(); } getMonthDetails =(year, month)=> { let firstDay = (new Date(year, month)).getDay(); firstDay = firstDay === 0 ? 7 : firstDay; let numberOfDays = this.getNumberOfDays(year, month); let monthArray = []; let rows = 6; let currentDay = null; let index = 0; let cols = 7; for(let row=0; row<rows; row++) { for(let col=0; col<cols; col++) { currentDay = this.getDayDetails({ index, numberOfDays, firstDay: firstDay - 1, year, month }); monthArray.push(currentDay); index++; } } return monthArray; } isCurrentDay =day=> { return day.timestamp === todayTimestamp; } isSelectedDay =day=> { return day.timestamp === this.state.selectedDay; } getDateFromDateString =dateValue=> { let dateData = dateValue.split('-').map(d=>parseInt(d, 10)); if(dateData.length < 3) return null; let year = dateData[0]; let month = dateData[1]; let date = dateData[2]; return {year, month, date}; } getMonthStr =month=> this.monthMap[Math.max(Math.min(11, month), 0)] || 'Month'; getDateStringFromTimestamp =timestamp=> { let dateObject = new Date(timestamp); let month = dateObject.getMonth()+1; let date = dateObject.getDate(); return dateObject.getFullYear() + '-' + (month < 10 ? '0'+month : month) + '-' + (date < 10 ? '0'+date : date); } setDate =dateData=> { let selectedDay = new Date(dateData.year, dateData.month-1, dateData.date).getTime(); this.setState({ selectedDay }) if(this.props.onChange) { this.props.onChange(selectedDay); } } updateDateFromInput = () => { const dateValue = inputRef.current.value; const dateData = this.getDateFromDateString(dateValue); if (dateData !== null) { this.setDate(dateData); this.setState({ year: dateData.year, month: dateData.month - 1, monthDetails: this.getMonthDetails(dateData.year, dateData.month - 1) }); } } setDateToInput =(timestamp)=> { let dateString = this.getDateStringFromTimestamp(timestamp); inputRef.current.value = dateString; } onDateClick =day=> { this.setState({selectedDay: day.timestamp}, ()=>this.setDateToInput(day.timestamp)); if(this.props.onChange) { this.props.onChange(day.timestamp); } } setYear =offset=> { let year = this.state.year + offset; let month = this.state.month; this.setState({ year, monthDetails: this.getMonthDetails(year, month) }) } setMonth =offset=> { let year = this.state.year; let month = this.state.month + offset; if(month === -1) { month = 11; year--; } else if(month === 12) { month = 0; year++; } this.setState({ year, month, monthDetails: this.getMonthDetails(year, month) }) } /** * Renderers */ renderCalendar() { let days = this.state.monthDetails.map((day, index)=> { return ( <div className={'c-day-container ' + (day.month !== 0 ? ' disabled' : '') + (this.isCurrentDay(day) ? ' highlight' : '') + (this.isSelectedDay(day) ? ' highlight-green' : '')} key={index}> <div className='cdc-day'> <span onClick={()=>this.onDateClick(day)}> {day.date} </span> </div> </div> ) }) return ( <div className='c-container'> <div className='cc-head'> {['PZT', 'SAL', 'ÇAR', 'PER', 'CUM', 'CMT', 'PZR'].map((d,i)=><div key={i} className='cch-name'>{d}</div>)} </div> <div className='cc-body'> {days} </div> </div> ) } formatDateToInputValue = (date) => { if (!date) return ''; const d = new Date(date); let day = '' + d.getDate(), month = '' + (d.getMonth() + 1), year = d.getFullYear(); if (day.length < 2) day = '0' + day; if (month.length < 2) month = '0' + month; return [year, month, day].join('-'); } render() { const formattedDate = this.props.selectedDay ? this.formatDateToInputValue(this.props.selectedDay) : ''; return ( <div className='MyDatePicker'> <div className='mdp-input' onClick={() => this.showDatePicker(true)}> <input type='date' value={formattedDate} onChange={this.updateDateFromInput} ref={inputRef} /> </div> {this.state.showDatePicker ? ( <div className='mdp-container'> <div className='mdpc-head'> <div className='mdpch-button'> <div className='mdpchb-inner' onClick={()=> this.setYear(-1)}> <span className='mdpchbi-left-arrows'></span> </div> </div> <div className='mdpch-button'> <div className='mdpchb-inner' onClick={()=> this.setMonth(-1)}> <span className='mdpchbi-left-arrow'></span> </div> </div> <div className='mdpch-container'> <div className='mdpchc-year'>{this.state.year}</div> <div className='mdpchc-month'>{this.getMonthStr(this.state.month)}</div> </div> <div className='mdpch-button'> <div className='mdpchb-inner' onClick={()=> this.setMonth(1)}> <span className='mdpchbi-right-arrow'></span> </div> </div> <div className='mdpch-button' onClick={()=> this.setYear(1)}> <div className='mdpchb-inner'> <span className='mdpchbi-right-arrows'></span> </div> </div> </div> <div className='mdpc-body'> {this.renderCalendar()} </div> </div> ) : ''} </div> ) } }
Leave a Comment