Skip to content
This repository was archived by the owner on Dec 26, 2022. It is now read-only.

Commit 77a29fe

Browse files
author
Dmitry Yadrikhinsky
committed
TimeRangeModal
1 parent bc76274 commit 77a29fe

File tree

7 files changed

+125
-17
lines changed

7 files changed

+125
-17
lines changed

src/components/TimeRangeModal/TimeRangeModal.less

Whitespace-only changes.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import React, { useEffect, useState } from 'react';
2+
import { DatePicker, Modal } from 'antd';
3+
import { Moment } from 'moment/moment';
4+
import moment from 'moment';
5+
import { RangeValue } from 'rc-picker/lib/interface';
6+
7+
import './TimeRangeModal.less';
8+
9+
import rootStore from '../../services/RootStore';
10+
import TaskTimeModel from '../../models/TaskTimeModel';
11+
import { ITimeRangeModel } from '../../models/TaskModel';
12+
import { Undefined } from '../../types/CommonTypes';
13+
14+
const { RangePicker } = DatePicker;
15+
16+
interface TimeRangeModalProps {
17+
taskTime?: TaskTimeModel;
18+
visible: boolean;
19+
onClose: () => void;
20+
}
21+
22+
export default function TimeRangeModal({
23+
taskTime,
24+
visible,
25+
onClose,
26+
}: TimeRangeModalProps) {
27+
const [taskTimeItem, setTaskTimeItem] = useState(taskTime);
28+
const [timeRange, setTimeRange] = useState<Undefined<ITimeRangeModel>>();
29+
30+
useEffect(() => {
31+
if (taskTime) {
32+
setTaskTimeItem(taskTime);
33+
setTimeRange({ ...taskTime.time });
34+
}
35+
}, [taskTime]);
36+
37+
function handleOk() {
38+
if (taskTime?.task && timeRange) {
39+
const { task, index } = taskTime;
40+
task.time[index] = timeRange;
41+
}
42+
onClose();
43+
}
44+
45+
function handleCancel() {
46+
onClose();
47+
}
48+
49+
function onChange(dates: RangeValue<Moment>) {
50+
setTimeRange({
51+
start: dates?.[0]?.toDate() || new Date(),
52+
end: dates?.[1]?.toDate(),
53+
description: '',
54+
});
55+
}
56+
57+
return (
58+
<Modal
59+
title="Edit time range"
60+
visible={visible}
61+
onOk={handleOk}
62+
onCancel={handleCancel}
63+
okText="Save"
64+
>
65+
<div>Task: {taskTime?.task.title}</div>
66+
67+
<RangePicker
68+
showTime={{ format: 'HH:mm' }}
69+
format="DD-MM-YYYY HH:mm"
70+
value={[
71+
moment(timeRange?.start),
72+
timeRange?.end ? moment(timeRange?.end) : undefined,
73+
]}
74+
onOk={onChange}
75+
onChange={onChange}
76+
/>
77+
</Modal>
78+
);
79+
}

src/models/TaskTimeModel.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import TaskModel, { ITimeRangeModel } from './TaskModel';
22

33
export default class TaskTimeModel {
4-
task: TaskModel;
5-
time: ITimeRangeModel;
6-
7-
constructor(task: TaskModel, time: ITimeRangeModel) {
8-
this.task = task;
9-
this.time = time;
10-
}
4+
constructor(
5+
public task: TaskModel,
6+
public time: ITimeRangeModel,
7+
public index: number
8+
) {}
119
}

src/screens/hours/HoursView.tsx

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,18 @@ import rootStore from '../../services/RootStore';
88
import HoursCard from './components/HoursCard/HoursCard';
99
import getTimeItems from '../../services/TaskTimeItem';
1010
import SelectDate from './components/SelectDate/SelectDate';
11+
import TimeRangeModal from '../../components/TimeRangeModal/TimeRangeModal';
12+
import TaskTimeModel from '../../models/TaskTimeModel';
13+
import { Undefined } from '../../types/CommonTypes';
1114

1215
const { tasksStore } = rootStore;
1316

1417
export default observer(function HoursView() {
1518
const [date, setDate] = useState<Date>(new Date());
19+
const [showModal, setShowModal] = useState<boolean>(false);
20+
const [currentTaskTime, setCurrentTaskTime] = useState<
21+
Undefined<TaskTimeModel>
22+
>();
1623

1724
const tasks = tasksStore.getTasksByDate(date);
1825
const timeItems = getTimeItems(tasks, date);
@@ -22,9 +29,21 @@ export default observer(function HoursView() {
2229
<Space direction="vertical">
2330
<SelectDate date={date} onChange={setDate} />
2431
{timeItems.map((taskTime, index) => (
25-
<HoursCard key={index} taskTime={taskTime} />
32+
<HoursCard
33+
key={index}
34+
taskTime={taskTime}
35+
onClick={(taskTime) => {
36+
setCurrentTaskTime(taskTime);
37+
setShowModal(true);
38+
}}
39+
/>
2640
))}
2741
</Space>
42+
<TimeRangeModal
43+
visible={showModal}
44+
onClose={() => setShowModal(false)}
45+
taskTime={currentTaskTime}
46+
/>
2847
</Layout>
2948
);
3049
});

src/screens/hours/components/HoursCard/HoursCard.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@ function timeFormat(date: Date | undefined) {
1818

1919
interface HoursCardProps {
2020
taskTime: TaskTimeModel;
21+
onClick: (taskTime: TaskTimeModel) => void;
2122
}
2223

23-
export default observer(function HoursCard({ taskTime }: HoursCardProps) {
24+
export default observer(function HoursCard({
25+
taskTime,
26+
onClick,
27+
}: HoursCardProps) {
2428
const { task, time } = taskTime;
2529

2630
return (
27-
<Card className="hours-card">
31+
<Card className="hours-card" onClick={() => onClick(taskTime)}>
2832
<div className="hours-card__info">
2933
<div>{task.title}</div>
3034
<div>{`${timeFormat(time.start)} - ${timeFormat(time.end)}`}</div>

src/services/TaskTimeItem.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@ export default function getTimeItems(
1010
): TaskTimeModel[] {
1111
let taskTime: TaskTimeModel[] = [];
1212
tasks.forEach((task) => {
13-
const timeItems = task.time.filter(
14-
(range) =>
13+
const taskTimeItems: TaskTimeModel[] = [];
14+
for (let i = 0; i < task.time.length; i++) {
15+
const range = task.time[i];
16+
if (
1517
isSameDay(range.start, date) ||
1618
(range.end && isSameDay(range.end, date))
17-
);
18-
taskTime = taskTime.concat(
19-
timeItems.map((time) => new TaskTimeModel(task, time))
20-
);
19+
) {
20+
taskTimeItems.push(new TaskTimeModel(task, range, i));
21+
}
22+
}
23+
taskTime = taskTime.concat(taskTimeItems);
2124
});
2225
taskTime = taskTime.sort((a, b) => compareAsc(a.time.start, b.time.start));
2326
return taskTime;

src/services/tasks/TaskStore.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { makeAutoObservable } from 'mobx';
22

33
import TaskService from './TaskService';
4-
import TaskModel from '../../models/TaskModel';
4+
import TaskModel, { ITimeRangeModel } from '../../models/TaskModel';
55
import TasksByProject from '../../models/TasksByProject';
66
import TreeModelStoreHelper from '../../base/TreeModelStoreHelper';
77

@@ -19,6 +19,11 @@ export default class TaskStore {
1919
this.tasksService.save(this.tasks);
2020
}
2121

22+
setTime(task: TaskModel, timeIndex: number, timeRange: ITimeRangeModel) {
23+
task.time[timeIndex] = timeRange;
24+
this.tasksService.save(this.tasks);
25+
}
26+
2227
getTasks(projectId: string): TaskModel[] {
2328
return this.tasks[projectId] || [];
2429
}

0 commit comments

Comments
 (0)