forked from Yadro/time-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTimeRangeModal.tsx
More file actions
122 lines (110 loc) · 3.14 KB
/
TimeRangeModal.tsx
File metadata and controls
122 lines (110 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import React, { useEffect, useState } from 'react';
import { Button, Col, Form, Input, Modal, Row, TimePicker } from 'antd';
import { Moment } from 'moment/moment';
import moment from 'moment';
import { DeleteFilled } from '@ant-design/icons';
import { observer } from 'mobx-react';
import './TimeRangeModal.less';
import rootStore from '../../services/RootStore';
import TaskTimeModel from '../../models/TaskTimeModel';
import { ITimeRangeModel } from '../../models/TaskModel';
import { Undefined } from '../../types/CommonTypes';
const { tasksStore } = rootStore;
enum RangeField {
start = 'start',
end = 'end',
}
interface TimeRangeModalProps {
taskTime?: TaskTimeModel;
visible: boolean;
onClose: () => void;
}
export default observer(function TimeRangeModal({
taskTime,
visible,
onClose,
}: TimeRangeModalProps) {
const [description, setDescription] = useState<string>('');
const [timeRange, setTimeRange] = useState<Undefined<ITimeRangeModel>>();
const timeInProgress = !taskTime?.time.end;
useEffect(() => {
if (taskTime) {
setTimeRange({ ...taskTime.time });
setDescription(taskTime.time.description || '');
}
}, [taskTime]);
function handleOk() {
if (taskTime?.task && timeRange) {
const { task, index } = taskTime;
if (description) {
timeRange.description = description;
}
tasksStore.setTime(task, index, timeRange);
}
onClose();
}
function handleDelete() {
if (taskTime) {
tasksStore.deleteTime(taskTime.task, taskTime.index);
}
onClose();
}
function handleCancel() {
onClose();
}
function onChange(field: RangeField) {
return (value: Moment | null) => {
const newTimeRange = {
...timeRange,
[field]: value?.toDate() || undefined,
};
setTimeRange(newTimeRange as ITimeRangeModel);
};
}
return (
<Modal
title="Edit time range"
visible={visible}
onOk={handleOk}
onCancel={handleCancel}
okText="Save"
>
<Form colon>
<Form.Item label="Task">
<div>{taskTime?.task.title}</div>
</Form.Item>
<Form.Item label="Description">
<Input
placeholder="Type description..."
value={description}
onChange={(e) => setDescription(e.target.value)}
/>
</Form.Item>
<Row>
<Col span={12}>
<Form.Item label="Start" labelCol={{ span: 24 }}>
<TimePicker
format="HH:mm"
value={moment(timeRange?.start)}
onChange={onChange(RangeField.start)}
/>
</Form.Item>
</Col>
<Col span={12}>
<Form.Item label="End" labelCol={{ span: 24 }}>
<TimePicker
format="HH:mm"
value={timeRange?.end && moment(timeRange?.end)}
onChange={onChange(RangeField.end)}
disabled={timeInProgress}
/>
</Form.Item>
</Col>
</Row>
<Button icon={<DeleteFilled />} onClick={handleDelete}>
Remove
</Button>
</Form>
</Modal>
);
});