2020-06-13 00:21:58 +02:00
|
|
|
import React, { useState, useEffect } from 'react';
|
|
|
|
import moment from 'moment';
|
|
|
|
import styled from 'styled-components';
|
2020-04-13 00:45:51 +02:00
|
|
|
import DatePicker from 'react-datepicker';
|
|
|
|
import { Cross } from 'shared/icons';
|
2020-06-13 00:21:58 +02:00
|
|
|
import _ from 'lodash';
|
2020-04-13 00:45:51 +02:00
|
|
|
|
|
|
|
import { Wrapper, ActionWrapper, DueDatePickerWrapper, ConfirmAddDueDate, CancelDueDate } from './Styles';
|
|
|
|
|
|
|
|
import 'react-datepicker/dist/react-datepicker.css';
|
2020-06-13 00:21:58 +02:00
|
|
|
import { getYear, getMonth } from 'date-fns';
|
|
|
|
import { useForm } from 'react-hook-form';
|
2020-04-13 00:45:51 +02:00
|
|
|
|
|
|
|
type DueDateManagerProps = {
|
|
|
|
task: Task;
|
|
|
|
onDueDateChange: (task: Task, newDueDate: Date) => void;
|
|
|
|
onCancel: () => void;
|
|
|
|
};
|
2020-06-13 00:21:58 +02:00
|
|
|
|
|
|
|
const HeaderSelectLabel = styled.div`
|
|
|
|
display: inline-block;
|
|
|
|
position: relative;
|
|
|
|
z-index: 9999;
|
|
|
|
border-radius: 3px;
|
|
|
|
cursor: pointer;
|
|
|
|
padding: 6px 10px;
|
|
|
|
text-decoration: underline;
|
|
|
|
margin: 6px 0;
|
|
|
|
font-size: 14px;
|
|
|
|
line-height: 16px;
|
|
|
|
margin-left: 0;
|
|
|
|
margin-right: 0;
|
|
|
|
padding-left: 4px;
|
|
|
|
padding-right: 4px;
|
|
|
|
color: #c2c6dc;
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
background: rgba(115, 103, 240);
|
|
|
|
color: #c2c6dc;
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
|
|
|
const HeaderSelect = styled.select`
|
|
|
|
text-decoration: underline;
|
|
|
|
font-size: 14px;
|
|
|
|
text-align: center;
|
|
|
|
padding: 4px 6px;
|
|
|
|
background: none;
|
|
|
|
outline: none;
|
|
|
|
border: none;
|
|
|
|
border-radius: 3px;
|
|
|
|
appearance: none;
|
|
|
|
|
|
|
|
&:hover {
|
|
|
|
background: #262c49;
|
|
|
|
border: 1px solid rgba(115, 103, 240);
|
|
|
|
outline: none !important;
|
|
|
|
box-shadow: none;
|
|
|
|
color: #c2c6dc;
|
|
|
|
}
|
|
|
|
|
|
|
|
&::-ms-expand {
|
|
|
|
display: none;
|
|
|
|
}
|
|
|
|
|
|
|
|
cursor: pointer;
|
|
|
|
position: absolute;
|
|
|
|
z-index: 9998;
|
|
|
|
margin: 0;
|
|
|
|
left: 0;
|
|
|
|
top: 5px;
|
|
|
|
opacity: 0;
|
|
|
|
`;
|
|
|
|
|
|
|
|
const HeaderButton = styled.button`
|
|
|
|
cursor: pointer;
|
|
|
|
color: #c2c6dc;
|
|
|
|
text-decoration: underline;
|
|
|
|
font-size: 14px;
|
|
|
|
text-align: center;
|
|
|
|
padding: 6px 10px;
|
|
|
|
margin: 6px 0;
|
|
|
|
background: none;
|
|
|
|
outline: none;
|
|
|
|
border: none;
|
|
|
|
border-radius: 3px;
|
|
|
|
&:hover {
|
|
|
|
background: rgba(115, 103, 240);
|
|
|
|
color: #fff;
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
|
|
|
const HeaderActions = styled.div`
|
|
|
|
position: relative;
|
|
|
|
text-align: center;
|
|
|
|
& > button:first-child {
|
|
|
|
float: left;
|
|
|
|
}
|
|
|
|
& > button:last-child {
|
|
|
|
float: right;
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
2020-04-13 00:45:51 +02:00
|
|
|
const DueDateManager: React.FC<DueDateManagerProps> = ({ task, onDueDateChange, onCancel }) => {
|
2020-06-13 00:21:58 +02:00
|
|
|
const now = moment();
|
|
|
|
const [textStartDate, setTextStartDate] = useState(now.format('YYYY-MM-DD'));
|
|
|
|
|
2020-04-13 00:45:51 +02:00
|
|
|
const [startDate, setStartDate] = useState(new Date());
|
2020-06-13 00:21:58 +02:00
|
|
|
useEffect(() => {
|
|
|
|
setTextStartDate(moment(startDate).format('YYYY-MM-DD'));
|
|
|
|
}, [startDate]);
|
2020-04-13 00:45:51 +02:00
|
|
|
|
2020-06-13 00:21:58 +02:00
|
|
|
const years = _.range(2010, getYear(new Date()) + 10, 1);
|
|
|
|
const months = [
|
|
|
|
'January',
|
|
|
|
'February',
|
|
|
|
'March',
|
|
|
|
'April',
|
|
|
|
'May',
|
|
|
|
'June',
|
|
|
|
'July',
|
|
|
|
'August',
|
|
|
|
'September',
|
|
|
|
'October',
|
|
|
|
'November',
|
|
|
|
'December',
|
|
|
|
];
|
|
|
|
const { register, handleSubmit, errors, setError, formState } = useForm<DueDateFormData>();
|
|
|
|
console.log(errors);
|
2020-04-13 00:45:51 +02:00
|
|
|
return (
|
|
|
|
<Wrapper>
|
2020-06-13 00:21:58 +02:00
|
|
|
<form>
|
|
|
|
<input
|
|
|
|
type="text"
|
|
|
|
id="endDate"
|
|
|
|
name="endDate"
|
|
|
|
onChange={e => {
|
|
|
|
setTextStartDate(e.currentTarget.value);
|
|
|
|
}}
|
|
|
|
value={textStartDate}
|
|
|
|
ref={register({
|
|
|
|
required: 'End due date is required.',
|
|
|
|
validate: value => {
|
|
|
|
const isValid = moment(value, 'YYYY-MM-DD').isValid();
|
|
|
|
console.log(`${value} - ${isValid}`);
|
|
|
|
return isValid;
|
|
|
|
},
|
|
|
|
})}
|
|
|
|
/>
|
|
|
|
</form>
|
2020-04-13 00:45:51 +02:00
|
|
|
<DueDatePickerWrapper>
|
2020-06-13 00:21:58 +02:00
|
|
|
<DatePicker
|
|
|
|
useWeekdaysShort
|
|
|
|
renderCustomHeader={({
|
|
|
|
date,
|
|
|
|
changeYear,
|
|
|
|
changeMonth,
|
|
|
|
decreaseMonth,
|
|
|
|
increaseMonth,
|
|
|
|
prevMonthButtonDisabled,
|
|
|
|
nextMonthButtonDisabled,
|
|
|
|
}) => (
|
|
|
|
<HeaderActions>
|
|
|
|
<HeaderButton onClick={decreaseMonth} disabled={prevMonthButtonDisabled}>
|
|
|
|
Prev
|
|
|
|
</HeaderButton>
|
|
|
|
<HeaderSelectLabel>
|
|
|
|
{months[date.getMonth()]}
|
|
|
|
<HeaderSelect value={getYear(date)} onChange={({ target: { value } }) => changeYear(parseInt(value))}>
|
|
|
|
{years.map(option => (
|
|
|
|
<option key={option} value={option}>
|
|
|
|
{option}
|
|
|
|
</option>
|
|
|
|
))}
|
|
|
|
</HeaderSelect>
|
|
|
|
</HeaderSelectLabel>
|
|
|
|
<HeaderSelectLabel>
|
|
|
|
{date.getFullYear()}
|
|
|
|
<HeaderSelect
|
|
|
|
value={months[getMonth(date)]}
|
|
|
|
onChange={({ target: { value } }) => changeMonth(months.indexOf(value))}
|
|
|
|
>
|
|
|
|
{months.map(option => (
|
|
|
|
<option key={option} value={option}>
|
|
|
|
{option}
|
|
|
|
</option>
|
|
|
|
))}
|
|
|
|
</HeaderSelect>
|
|
|
|
</HeaderSelectLabel>
|
|
|
|
|
|
|
|
<HeaderButton onClick={increaseMonth} disabled={nextMonthButtonDisabled}>
|
|
|
|
Next
|
|
|
|
</HeaderButton>
|
|
|
|
</HeaderActions>
|
|
|
|
)}
|
|
|
|
selected={startDate}
|
|
|
|
inline
|
|
|
|
onChange={date => setStartDate(date ?? new Date())}
|
|
|
|
/>
|
2020-04-13 00:45:51 +02:00
|
|
|
</DueDatePickerWrapper>
|
|
|
|
<ActionWrapper>
|
|
|
|
<ConfirmAddDueDate onClick={() => onDueDateChange(task, startDate)}>Save</ConfirmAddDueDate>
|
|
|
|
<CancelDueDate onClick={onCancel}>
|
|
|
|
<Cross size={16} color="#c2c6dc" />
|
|
|
|
</CancelDueDate>
|
|
|
|
</ActionWrapper>
|
|
|
|
</Wrapper>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default DueDateManager;
|