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

Commit fc8b262

Browse files
author
Dmitry Yadrikhinsky
committed
Duration by date in TaskDrawer
1 parent 6a30bf7 commit fc8b262

File tree

6 files changed

+55
-25
lines changed

6 files changed

+55
-25
lines changed

src/helpers/DateTime.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { ITimeRangeModel } from '../models/TaskModel';
2+
13
function timePad(time: number): string {
24
return String(time).padStart(2, '0');
35
}
@@ -28,3 +30,12 @@ export function msToTime(s: number, showSeconds: boolean = true) {
2830
}
2931
return `${timePad(hrs)}:${timePad(mins)}`;
3032
}
33+
34+
export function calcDuration(taskTime: ITimeRangeModel[]) {
35+
return taskTime.reduce((prev, timeRange) => {
36+
if (timeRange.end) {
37+
return prev + timeRange.end.getTime() - timeRange.start.getTime();
38+
}
39+
return prev + new Date().getTime() - timeRange.start.getTime();
40+
}, 0);
41+
}

src/hooks/TaskHooks.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { msToTime } from '../helpers/DateTime';
2-
import TaskModel from '../models/TaskModel';
31
import { useEffect, useRef, useState } from 'react';
2+
3+
import { calcDuration, msToTime } from '../helpers/DateTime';
4+
import TaskModel from '../models/TaskModel';
45
import TaskTimeModel from '../models/TaskTimeModel';
56

67
export function useTaskDuration(model: TaskModel | undefined) {
@@ -32,25 +33,16 @@ export function useTaskDuration(model: TaskModel | undefined) {
3233
return duration;
3334
}
3435

35-
function calcDuration(taskTime: TaskTimeModel[]) {
36-
return taskTime.reduce((prev, curr) => {
37-
if (curr.time.end) {
38-
return prev + curr.time.end.getTime() - curr.time.start.getTime();
39-
}
40-
return prev + new Date().getTime() - curr.time.start.getTime();
41-
}, 0);
42-
}
43-
4436
export function useTimeItemsDuration(taskTime: TaskTimeModel[]) {
4537
const [duration, setDuration] = useState<string>('');
4638
const intervalRef = useRef<NodeJS.Timeout>();
4739

4840
useEffect(() => {
4941
const haveActiveTime = taskTime.some((t) => !t.time.end);
50-
setDuration(msToTime(calcDuration(taskTime), false));
42+
setDuration(msToTime(calcDuration(taskTime.map((t) => t.time)), false));
5143
if (haveActiveTime) {
5244
intervalRef.current = setInterval(() => {
53-
setDuration(msToTime(calcDuration(taskTime), false));
45+
setDuration(msToTime(calcDuration(taskTime.map((t) => t.time)), false));
5446
}, 1000);
5547
}
5648
return () => {

src/screens/projects/components/HoursByTask/HoursByTask.less

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,12 @@
1515
margin-left: 8px;
1616
}
1717

18+
1819
.hours-item .ant-card-body {
1920
padding: 8px;
2021
}
2122

22-
.description {
23-
font-size: 11px;
24-
}
25-
26-
.bottom {
23+
.header-date {
2724
display: flex;
2825
flex-direction: row;
2926
justify-content: space-between;
@@ -35,11 +32,8 @@
3532
font-weight: bold;
3633
}
3734

38-
.hours-range {
39-
font-size: 10px;
40-
}
41-
42-
.duration {
35+
.duration-date {
36+
margin-right: 8px;
4337
font-size: 11px;
4438
font-weight: bold;
4539
}

src/screens/projects/components/HoursByTask/HoursByTask.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,21 @@ import format from 'date-fns/format';
66

77
import './HoursByTask.less';
88

9-
import TaskModel from '../../../../models/TaskModel';
9+
import TaskModel, { ITimeRangeModel } from '../../../../models/TaskModel';
1010
import { mapLastCurrent } from '../../../../helpers/IterateLastCurrent';
1111
import HoursItem from './HoursItem';
1212
import IconTile from '../../../../components/IconTile/IconTile';
13+
import { calcDuration, msToTime } from '../../../../helpers/DateTime';
1314

1415
function dateFormat(date: Date) {
1516
return format(date, 'dd.MM.yyyy');
1617
}
1718

19+
function getDurationPerDay(timeItems: ITimeRangeModel[], date: Date) {
20+
const filteredTimeItems = timeItems.filter((t) => isSameDay(t.start, date));
21+
return msToTime(calcDuration(filteredTimeItems), false);
22+
}
23+
1824
interface HoursByTaskProps {
1925
task: TaskModel | undefined;
2026
}
@@ -29,9 +35,13 @@ export default function HoursByTask({ task }: HoursByTaskProps) {
2935
{task?.time.length === 0 && <div>No billed hours</div>}
3036
{mapLastCurrent(task?.time || [], (last, range, index) => {
3137
if (!last || !isSameDay(last.start, range.start)) {
38+
const duration = getDurationPerDay(task?.time || [], range.start);
3239
return (
3340
<div key={index}>
34-
<div className="date">{dateFormat(range.start)}</div>
41+
<div className="header-date">
42+
<div className="date">{dateFormat(range.start)}</div>
43+
<div className="duration-date">{duration}</div>
44+
</div>
3545
<HoursItem range={range} />
3646
</div>
3747
);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
.hours-item {
2+
.description {
3+
font-size: 11px;
4+
}
5+
6+
.bottom {
7+
display: flex;
8+
flex-direction: row;
9+
justify-content: space-between;
10+
}
11+
12+
.hours-range {
13+
font-size: 10px;
14+
}
15+
16+
.duration {
17+
font-size: 11px;
18+
font-weight: bold;
19+
}
20+
}

src/screens/projects/components/HoursByTask/HoursItem.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import React from 'react';
22
import { Card } from 'antd';
33
import format from 'date-fns/format';
4+
5+
import './HoursItem.less';
6+
47
import { msToTime } from '../../../../helpers/DateTime';
58
import { ITimeRangeModel } from '../../../../models/TaskModel';
69

0 commit comments

Comments
 (0)