@@ -12,6 +12,10 @@ import { ActivityState, LoadActivities } from '../../../activities-management/st
1212
1313import * as entryActions from '../../store/entry.actions' ;
1414
15+ import * as moment from 'moment' ;
16+ import { ToastrService } from 'ngx-toastr' ;
17+ import { formatDate } from '@angular/common' ;
18+
1519type Merged = TechnologyState & ProjectState & ActivityState ;
1620
1721@Component ( {
@@ -26,56 +30,75 @@ export class EntryFieldsComponent implements OnInit {
2630 activeEntry ;
2731 newData ;
2832
29- constructor ( private formBuilder : FormBuilder , private store : Store < Merged > , private actionsSubject$ : ActionsSubject ) {
33+ constructor (
34+ private formBuilder : FormBuilder ,
35+ private store : Store < Merged > ,
36+ private actionsSubject$ : ActionsSubject ,
37+ private toastrService : ToastrService
38+ ) {
3039 this . entryForm = this . formBuilder . group ( {
3140 description : '' ,
3241 uri : '' ,
3342 activity_id : '' ,
43+ start_hour : '' ,
44+ start_date : '' ,
3445 } ) ;
3546 }
3647
3748 ngOnInit ( ) : void {
3849 this . store . dispatch ( new LoadActivities ( ) ) ;
3950
40- this . actionsSubject$ . pipe (
41- filter ( ( action : any ) => ( action . type === ActivityManagementActionTypes . LOAD_ACTIVITIES_SUCCESS ) )
42- ) . subscribe ( ( action ) => {
43- this . activities = action . payload ;
44- this . store . dispatch ( new LoadActiveEntry ( ) ) ;
45- } ) ;
46-
47- this . actionsSubject$ . pipe (
48- filter ( ( action : any ) => ( action . type === EntryActionTypes . CREATE_ENTRY_SUCCESS ) )
49- ) . subscribe ( ( action ) => {
50- if ( ! action . payload . end_date ) {
51+ this . actionsSubject$
52+ . pipe ( filter ( ( action : any ) => action . type === ActivityManagementActionTypes . LOAD_ACTIVITIES_SUCCESS ) )
53+ . subscribe ( ( action ) => {
54+ this . activities = action . payload ;
5155 this . store . dispatch ( new LoadActiveEntry ( ) ) ;
52- }
53- } ) ;
56+ } ) ;
5457
55- this . actionsSubject$ . pipe (
56- filter ( ( action : any ) => ( action . type === EntryActionTypes . LOAD_ACTIVE_ENTRY_SUCCESS ) )
57- ) . subscribe ( ( action ) => {
58- this . activeEntry = action . payload ;
59- this . setDataToUpdate ( this . activeEntry ) ;
60- this . newData = {
61- id : this . activeEntry . id ,
62- project_id : this . activeEntry . project_id ,
63- uri : this . activeEntry . uri ,
64- activity_id : this . activeEntry . activity_id ,
65- } ;
66- } ) ;
58+ this . actionsSubject$
59+ . pipe (
60+ filter ( ( action : any ) => (
61+ action . type === EntryActionTypes . CREATE_ENTRY_SUCCESS ||
62+ action . type === EntryActionTypes . UPDATE_ENTRY_SUCCESS
63+ ) )
64+ ) . subscribe ( ( action ) => {
65+ if ( ! action . payload . end_date ) {
66+ this . store . dispatch ( new LoadActiveEntry ( ) ) ;
67+ this . store . dispatch ( new entryActions . LoadEntriesSummary ( ) ) ;
68+ }
69+ } ) ;
70+
71+ this . actionsSubject$
72+ . pipe ( filter ( ( action : any ) => action . type === EntryActionTypes . LOAD_ACTIVE_ENTRY_SUCCESS ) )
73+ . subscribe ( ( action ) => {
74+ this . activeEntry = action . payload ;
75+ this . setDataToUpdate ( this . activeEntry ) ;
76+ this . newData = {
77+ id : this . activeEntry . id ,
78+ project_id : this . activeEntry . project_id ,
79+ uri : this . activeEntry . uri ,
80+ activity_id : this . activeEntry . activity_id ,
81+ start_date : this . activeEntry . start_date ,
82+ start_hour : formatDate ( this . activeEntry . start_date , 'HH:mm:ss' , 'en' ) ,
83+ } ;
84+ } ) ;
6785 }
6886
6987 get activity_id ( ) {
7088 return this . entryForm . get ( 'activity_id' ) ;
7189 }
7290
91+ get start_hour ( ) {
92+ return this . entryForm . get ( 'start_hour' ) ;
93+ }
94+
7395 setDataToUpdate ( entryData : NewEntry ) {
7496 if ( entryData ) {
7597 this . entryForm . patchValue ( {
7698 description : entryData . description ,
7799 uri : entryData . uri ,
78100 activity_id : entryData . activity_id ,
101+ start_hour : formatDate ( entryData . start_date , 'HH:mm:ss' , 'en' ) ,
79102 } ) ;
80103 if ( entryData . technologies ) {
81104 this . selectedTechnologies = entryData . technologies ;
@@ -93,6 +116,19 @@ export class EntryFieldsComponent implements OnInit {
93116 this . store . dispatch ( new entryActions . UpdateEntryRunning ( { ...this . newData , ...this . entryForm . value } ) ) ;
94117 }
95118
119+ onUpdateStartHour ( ) {
120+ const startDate = formatDate ( this . activeEntry . start_date , 'yyyy-MM-dd' , 'en' ) ;
121+ const newHourEntered = new Date ( `${ startDate } T${ this . entryForm . value . start_hour . trim ( ) } ` ) . toISOString ( ) ;
122+ const isEntryDateInTheFuture = moment ( newHourEntered ) . isAfter ( moment ( ) ) ;
123+ if ( isEntryDateInTheFuture ) {
124+ this . toastrService . error ( 'You cannot start a time-entry in the future' ) ;
125+ this . entryForm . patchValue ( { start_hour : this . newData . start_hour } ) ;
126+ return ;
127+ }
128+ this . entryForm . patchValue ( { start_date : newHourEntered } ) ;
129+ this . store . dispatch ( new entryActions . UpdateEntryRunning ( { ...this . newData , ...this . entryForm . value } ) ) ;
130+ }
131+
96132 onTechnologyAdded ( $event : string [ ] ) {
97133 this . store . dispatch ( new entryActions . UpdateEntryRunning ( { ...this . newData , technologies : $event } ) ) ;
98134 }
0 commit comments