@@ -4,11 +4,23 @@ import isSameDay from 'date-fns/isSameDay';
44import AbstractModel from '../base/AbstractModel' ;
55import { ITreeItem } from '../types/ITreeItem' ;
66
7+ export interface IJsonTimeRangeModel {
8+ start : string ;
9+ end ?: string ;
10+ description ?: string ;
11+ }
12+
13+ export interface ITimeRangeModel {
14+ start : Date ;
15+ end ?: Date ;
16+ description ?: string ;
17+ }
18+
719interface IJsonTaskModel extends ITreeItem < IJsonTaskModel > {
820 projectId : string ;
921 checked : boolean ;
1022 active : boolean ;
11- time : string [ ] [ ] ;
23+ time : string [ ] [ ] | IJsonTimeRangeModel [ ] ;
1224 datesInProgress : string [ ] ;
1325 children : IJsonTaskModel [ ] ;
1426 details : string [ ] ;
@@ -21,7 +33,7 @@ export default class TaskModel extends AbstractModel {
2133 projectId : string = '' ;
2234 checked : boolean = false ;
2335 active : boolean = false ;
24- time : Date [ ] [ ] = [ ] ;
36+ time : ITimeRangeModel [ ] = [ ] ;
2537 datesInProgress : Date [ ] = [ ] ;
2638 details : string = '' ;
2739 deleted : boolean = false ;
@@ -30,7 +42,24 @@ export default class TaskModel extends AbstractModel {
3042 super ( ) ;
3143 this . load ( props ) ;
3244 this . children = props . children ?. map ( ( json ) => new TaskModel ( json ) ) || [ ] ;
33- this . time = props . time ?. map ( ( range ) => range . map ( ( t ) => new Date ( t ) ) ) || [ ] ;
45+ this . time =
46+ props . time ?. map < ITimeRangeModel > (
47+ ( range : string [ ] | IJsonTimeRangeModel ) => {
48+ if ( Array . isArray ( range ) ) {
49+ return {
50+ start : new Date ( range [ 0 ] ) ,
51+ end : range [ 1 ] ? new Date ( range [ 1 ] ) : undefined ,
52+ description : undefined ,
53+ } ;
54+ } else {
55+ return {
56+ start : new Date ( range . start ) ,
57+ end : range . end ? new Date ( range . end ) : undefined ,
58+ description : undefined ,
59+ } ;
60+ }
61+ }
62+ ) || [ ] ;
3463 this . datesInProgress =
3564 props . datesInProgress ?. map ( ( date ) => new Date ( date ) ) || [ ] ;
3665
@@ -53,14 +82,10 @@ export default class TaskModel extends AbstractModel {
5382 }
5483
5584 get duration ( ) {
56- return this . time . reduce ( ( prev : number , range : Date [ ] ) => {
57- if ( range . length > 0 ) {
58- const duration =
59- ( range . length === 2 ? range [ 1 ] . getTime ( ) : Date . now ( ) ) -
60- range [ 0 ] . getTime ( ) ;
61- return prev + duration ;
62- }
63- return prev ;
85+ return this . time . reduce ( ( prev : number , range : ITimeRangeModel ) => {
86+ const { start, end } = range ;
87+ const duration = ( end ? end . getTime ( ) : Date . now ( ) ) - start . getTime ( ) ;
88+ return prev + duration ;
6489 } , 0 ) ;
6590 }
6691
@@ -83,19 +108,18 @@ export default class TaskModel extends AbstractModel {
83108 start ( ) {
84109 this . active = true ;
85110 this . addDateWhenWasInProgress ( new Date ( ) ) ;
86- this . time . forEach ( ( range ) => {
87- if ( range . length === 1 ) {
88- range . push ( new Date ( ) ) ;
89- }
111+ this . time . push ( {
112+ start : new Date ( ) ,
113+ end : undefined ,
114+ description : undefined ,
90115 } ) ;
91- this . time . push ( [ new Date ( ) ] ) ;
92116 }
93117
94118 end ( ) {
95119 if ( this . active ) {
96120 this . active = false ;
97121 const range = this . time [ this . time . length - 1 ] ;
98- range . push ( new Date ( ) ) ;
122+ range . end = new Date ( ) ;
99123 }
100124 }
101125
0 commit comments