implement logic to get a working html5 input date. #32

This commit is contained in:
Danny 2018-05-16 13:54:52 +02:00
parent a0bb890210
commit f082231b12
2 changed files with 53 additions and 25 deletions

View File

@ -32,13 +32,11 @@ class DatePicker extends Component {
after: 0, after: 0,
} }
this.setTimeRange(this.state.period) this.updateDatesFromPeriod(this.state.period)
} }
@bind @bind
setTimeRange(period) { updateDatesFromPeriod(period) {
const timezoneOffset = (new Date()).getTimezoneOffset() * 60;
let startDate = new Date(); let startDate = new Date();
startDate.setHours(0); startDate.setHours(0);
startDate.setMinutes(0); startDate.setMinutes(0);
@ -66,17 +64,25 @@ class DatePicker extends Component {
break; break;
} }
let before, after; this.setDateRange(startDate, endDate, period);
}
@bind
setDateRange(startDate, endDate, period) {
const timezoneOffset = (new Date()).getTimezoneOffset() * 60;
let before, after;
before = Math.round(((+endDate) / 1000) - timezoneOffset); before = Math.round(((+endDate) / 1000) - timezoneOffset);
after = Math.round(((+startDate) / 1000) - timezoneOffset); after = Math.round(((+startDate) / 1000) - timezoneOffset);
this.setState({ this.setState({
period: period, period: period || '',
startDate: startDate, startDate: startDate,
endDate: endDate, endDate: endDate,
before: before, before: before,
after: after, after: after,
picking: '',
}); });
this.props.onChange(this.state); this.props.onChange(this.state);
} }
@ -89,37 +95,38 @@ class DatePicker extends Component {
return; return;
} }
this.setTimeRange(newPeriod); this.updateDatesFromPeriod(newPeriod);
} }
dateValue(date) { dateValue(date) {
return date.getFullYear() + '-' + date.getMonth() + '-' + date.getDate(); const addZero = function(n){return n<10? '0'+n:''+n;}
return date.getFullYear() + '-' + addZero(date.getMonth() + 1) + '-' + addZero(date.getDate());
} }
@bind @bind
pickStart(e) { startPicking(e) {
this.setState({ picking: 'start' }) this.setState({ picking: e.target.dataset.value })
} }
@bind @bind
pickEnd(e) { stopPicking(e) {
this.setState({ picking: 'end' }) this.setState({ picking: '' })
} }
@bind @bind
setStartDate(e) { setStartDate(e) {
// TODO: Parse input value let newStartDate = e.target.valueAsDate;
this.setState({ if(newStartDate) {
picking: '', this.setDateRange(newStartDate, this.state.endDate, '')
}) }
} }
@bind @bind
setEndDate(e) { setEndDate(e) {
// TODO: Parse input value let newEndDate = e.target.valueAsDate;
this.setState({ if(newEndDate) {
picking: '', this.setDateRange(this.state.startDate, newEndDate, '')
}) }
} }
render(props, state) { render(props, state) {
@ -133,12 +140,20 @@ class DatePicker extends Component {
{links} {links}
<li> <li>
<span style="padding: 0 8px 0 0;">&mdash;</span> <span style="padding: 0 8px 0 0;">&mdash;</span>
<span> <span class="datepicker-wrap">
{state.picking === 'start' ? <input type="date" value={this.dateValue(state.startDate)} onchange={this.setStartDate} /> : <strong onclick={this.pickStart}>{state.startDate.toLocaleDateString()}</strong> } <strong onclick={this.startPicking} data-value="start">{state.startDate.toLocaleDateString()}</strong>
<span class="datepicker" style={state.picking === 'start' ? '' : 'display: none'}>
<label>Choose start date</label>
<input type="date" value={this.dateValue(state.startDate)} onblur={this.stopPicking} onchange={this.setStartDate} />
</span>
</span> </span>
<span> to </span> <span> to </span>
<span> <span class="datepicker-wrap">
{state.picking === 'end' ? <input type="date" value={this.dateValue(state.endDate)} onchange={this.setEndDate} /> : <strong onclick={this.pickEnd}>{state.endDate.toLocaleDateString()}</strong> } <strong onclick={this.startPicking} data-value="end">{state.endDate.toLocaleDateString()}</strong>
<span class="datepicker" style={state.picking === 'end' ? '' : 'display: none'}>
<label>Choose end date</label>
<input type="date" value={this.dateValue(state.endDate)} onblur={this.stopPicking} onchange={this.setStartDate} />
</span>
</span> </span>
</li> </li>
</ul> </ul>

View File

@ -122,10 +122,23 @@ body {
.w10:after{width:10%}.w09:after{width:9%}.w08:after{width:8%}.w07:after{width:7%}.w06:after{width:6%} .w10:after{width:10%}.w09:after{width:9%}.w08:after{width:8%}.w07:after{width:7%}.w06:after{width:6%}
.w05:after{width:5%}.w04:after{width:4%}.w03:after{width:3%}.w02:after{width:2%}.w01:after{width:1%}.w00:after{width:0} .w05:after{width:5%}.w04:after{width:4%}.w03:after{width:3%}.w02:after{width:2%}.w01:after{width:1%}.w00:after{width:0}
a { color: #46494d; text-decoration: none; transition: all .4s ease; } a { color: #46494d; text-decoration: none; transition: all .4s ease; }
.cell a:hover { color: #533feb; } .cell a:hover { color: #533feb; }
.datepicker-wrap{ position: relative; }
.datepicker{
position: absolute;
left: 0;
top: 20px;
padding: 6px;
display: block;
z-index: 10;
background: #f5f7fa;
box-shadow: 0 2px 8px 0 rgba(70, 73, 77, 0.16);
border-radius: 4px;
}
@media ( min-width: 1220px ) { @media ( min-width: 1220px ) {
nav.main-nav ul { margin-top: 24px; } nav.main-nav ul { margin-top: 24px; }