Skip to content

Commit d2fc8aa

Browse files
feat: TT-141 Create flag in the TimeEntries component to control whether it is a new entry or an existing one and persist the data in the form, create their respective tests
1 parent 46be8e9 commit d2fc8aa

File tree

5 files changed

+30
-52
lines changed

5 files changed

+30
-52
lines changed

src/app/modules/shared/components/details-fields/details-fields.component.spec.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,6 @@ describe('DetailsFieldsComponent', () => {
171171

172172
it('should emit ngOnChange without data', () => {
173173
component.entryToEdit = null;
174-
component.isEdit = true;
175174
component.ngOnChanges();
176175
expect(component.shouldRestartEntry).toBeFalse();
177176
expect(component.entryForm.value).toEqual(initialData);
@@ -193,7 +192,6 @@ describe('DetailsFieldsComponent', () => {
193192
technology: '',
194193
};
195194
component.entryToEdit = null;
196-
component.isEdit = true;
197195
component.ngOnChanges();
198196
expect(component.entryForm.value).toEqual(formValue);
199197
});
@@ -445,20 +443,6 @@ describe('DetailsFieldsComponent', () => {
445443
expect(component.projectSelected.emit).toHaveBeenCalledWith(data);
446444
});
447445

448-
it('should clear the form fields', () => {
449-
spyOn(component, 'cleanForm');
450-
component.isEdit = true;
451-
component.ngOnChanges();
452-
expect(component.cleanForm).toHaveBeenCalled();
453-
});
454-
455-
it('should persist entry form value', () => {
456-
spyOn(component, 'cleanForm');
457-
component.isEdit = false;
458-
component.ngOnChanges();
459-
expect(component.cleanForm).toHaveBeenCalledTimes(0);
460-
});
461-
462446
/*
463447
TODO As part of https://github.com/ioet/time-tracker-ui/issues/424 a new parameter was added to the details-field-component,
464448
and now these couple of tests are failing. A solution to this error might be generate a Test Wrapper Component. More details here:

src/app/modules/shared/components/details-fields/details-fields.component.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export class DetailsFieldsComponent implements OnChanges, OnInit {
3030
keyword = 'search_field';
3131
@Input() entryToEdit: Entry;
3232
@Input() canMarkEntryAsWIP: boolean;
33-
@Input() isEdit: boolean;
3433
@Output() saveEntry = new EventEmitter<SaveEntryEvent>();
3534
@Output() projectSelected = new EventEmitter<ProjectSelectedEvent>();
3635
@ViewChild('closeModal') closeModal: ElementRef;
@@ -144,9 +143,7 @@ export class DetailsFieldsComponent implements OnChanges, OnInit {
144143
technology: '',
145144
});
146145
} else {
147-
if (this.isEdit) {
148-
this.cleanForm();
149-
}
146+
this.cleanForm();
150147
}
151148
}
152149

src/app/modules/time-entries/pages/time-entries.component.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ <h5 class="modal-title">{{ entryId ? 'Edit Entry' : 'New Entry' }}</h5>
6868
<div class="modal-body">
6969
<app-details-fields
7070
[entryToEdit]="entry"
71-
[isEdit]="isEdit"
7271
(saveEntry)="saveEntry($event)"
7372
(projectSelected)="projectSelected($event)"
7473
[canMarkEntryAsWIP]='canMarkEntryAsWIP'

src/app/modules/time-entries/pages/time-entries.component.spec.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ describe('TimeEntriesComponent', () => {
148148

149149
it('when creating a new entry, then entryId should be null', () => {
150150
component.newEntry();
151-
expect(component.entry).toBe(null);
152151
expect(component.entryId).toBe(null);
153152
});
154153

@@ -427,4 +426,18 @@ describe('TimeEntriesComponent', () => {
427426
expect(entryData.customer_name).toContain('ioet Inc.');
428427
});
429428
}));
429+
430+
it('Should the entry be null if the flag is true', () => {
431+
component.wasEditingExistingTimeEntry = true;
432+
component.newEntry();
433+
expect(component.entry).toBe(null);
434+
});
435+
436+
it('Should the input persist the data if the flag is false', () => {
437+
const newEntry = { start_date: new Date(), id: '1234', technologies: [], project_name: 'time-tracker' };
438+
component.entry = newEntry;
439+
component.wasEditingExistingTimeEntry = false;
440+
component.newEntry();
441+
expect(component.entry).toEqual(newEntry);
442+
});
430443
});

src/app/modules/time-entries/pages/time-entries.component.ts

Lines changed: 15 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,21 @@ export class TimeEntriesComponent implements OnInit, OnDestroy {
2525
message: string;
2626
idToDelete: string;
2727
entriesSubscription: Subscription;
28+
wasEditingExistingTimeEntry = false;
2829
canMarkEntryAsWIP = true;
2930
timeEntriesDataSource$: Observable<DataSource<Entry>>;
3031
selectedYearAsText: string;
3132
selectedMonth: number;
3233
selectedYear: number;
3334
selectedMonthAsText: string;
34-
isEdit: boolean;
35-
3635
constructor(private store: Store<EntryState>, private toastrService: ToastrService, private actionsSubject$: ActionsSubject) {
3736
this.timeEntriesDataSource$ = this.store.pipe(delay(0), select(getTimeEntriesDataSource));
3837
}
39-
4038
ngOnDestroy(): void {
4139
this.entriesSubscription.unsubscribe();
4240
}
43-
4441
ngOnInit(): void {
4542
this.loadActiveEntry();
46-
4743
this.entriesSubscription = this.actionsSubject$.pipe(
4844
filter((action: any) => (
4945
action.type === EntryActionTypes.CREATE_ENTRY_SUCCESS ||
@@ -56,42 +52,39 @@ export class TimeEntriesComponent implements OnInit, OnDestroy {
5652
this.store.dispatch(new entryActions.LoadEntries(this.selectedMonth, this.selectedYear));
5753
});
5854
}
59-
6055
newEntry() {
61-
this.entry = null;
56+
if (this.wasEditingExistingTimeEntry) {
57+
this.entry = null;
58+
}
59+
console.log('Esta es', this.entry);
6260
this.entryId = null;
6361
this.store.pipe(select(getTimeEntriesDataSource)).subscribe(ds => {
6462
this.canMarkEntryAsWIP = !this.isThereAnEntryRunning(ds.data);
6563
});
6664
}
67-
6865
private getEntryRunning(entries: Entry[]) {
6966
const runningEntry: Entry = entries.find(entry => entry.running === true);
7067
return runningEntry;
7168
}
72-
7369
private isThereAnEntryRunning(entries: Entry[]) {
7470
return !!this.getEntryRunning(entries);
7571
}
76-
7772
editEntry(entryId: string) {
7873
this.entryId = entryId;
79-
this.isEdit = true;
8074
this.store.pipe(select(getTimeEntriesDataSource)).subscribe(ds => {
8175
this.entry = ds.data.find((entry) => entry.id === entryId);
8276
this.canMarkEntryAsWIP = this.isEntryRunningEqualsToEntryToEdit(this.getEntryRunning(ds.data), this.entry)
8377
|| this.isTheEntryToEditTheLastOne(ds.data);
8478
});
79+
this.wasEditingExistingTimeEntry = true;
8580
}
86-
8781
private isEntryRunningEqualsToEntryToEdit(entryRunning: Entry, entryToEdit: Entry) {
8882
if (entryRunning && entryToEdit) {
8983
return entryRunning.id === entryToEdit.id;
9084
} else {
9185
return false;
9286
}
9387
}
94-
9588
private isTheEntryToEditTheLastOne(entries: Entry[]) {
9689
if (entries && entries.length > 0) {
9790
const lastEntry = entries[0];
@@ -100,11 +93,9 @@ export class TimeEntriesComponent implements OnInit, OnDestroy {
10093
return false;
10194
}
10295
}
103-
10496
private isNewEntry() {
10597
return this.entryId === null;
10698
}
107-
10899
saveEntry(event: SaveEntryEvent): void {
109100
if (this.activeTimeEntry) {
110101
const startDateAsLocalDate = new Date(event.entry.start_date);
@@ -123,27 +114,25 @@ export class TimeEntriesComponent implements OnInit, OnDestroy {
123114
this.doSave(event);
124115
}
125116
}
126-
127117
projectSelected(event: ProjectSelectedEvent): void {
128-
this.isEdit = false;
118+
this.wasEditingExistingTimeEntry = false;
129119
this.store.pipe(select(getTimeEntriesDataSource)).subscribe(ds => {
130120
const dataToUse = ds.data.find(item => item.project_id === event.projectId);
131121
if (dataToUse && this.isNewEntry()) {
132122
const startDate = new Date(new Date().setHours(0, 0, 0, 0));
133123
const entry = {
134-
description : dataToUse.description ? dataToUse.description : '',
135-
technologies : dataToUse.technologies ? dataToUse.technologies : [],
136-
uri : dataToUse.uri ? dataToUse.uri : '',
137-
activity_id : dataToUse.activity_id,
138-
project_id : dataToUse.project_id,
139-
start_date : startDate,
140-
end_date : startDate
124+
description: dataToUse.description ? dataToUse.description : '',
125+
technologies: dataToUse.technologies ? dataToUse.technologies : [],
126+
uri: dataToUse.uri ? dataToUse.uri : '',
127+
activity_id: dataToUse.activity_id,
128+
project_id: dataToUse.project_id,
129+
start_date: startDate,
130+
end_date: startDate
141131
};
142132
this.entry = entry;
143133
}
144134
});
145135
}
146-
147136
doSave(event: SaveEntryEvent) {
148137
if (this.entryId) {
149138
event.entry.id = this.entryId;
@@ -155,30 +144,26 @@ export class TimeEntriesComponent implements OnInit, OnDestroy {
155144
this.store.dispatch(new entryActions.CreateEntry(event.entry));
156145
}
157146
}
158-
159147
loadActiveEntry() {
160148
this.store.dispatch(new entryActions.LoadActiveEntry());
161149
this.store.pipe(select(getActiveTimeEntry)).subscribe((activeTimeEntry) => {
162150
this.activeTimeEntry = activeTimeEntry;
163151
});
164152
}
165-
166153
removeEntry() {
167154
this.store.dispatch(new entryActions.DeleteEntry(this.idToDelete));
168155
this.showModal = false;
169156
}
170-
171157
dateSelected(event: { monthIndex: number; year: number }) {
172158
this.selectedYear = event.year;
173159
this.selectedYearAsText = event.year.toString();
174160
this.selectedMonth = event.monthIndex + 1;
175161
this.selectedMonthAsText = moment().month(event.monthIndex).format('MMMM');
176162
this.store.dispatch(new entryActions.LoadEntries(this.selectedMonth, this.selectedYear));
177163
}
178-
179164
openModal(item: any) {
180165
this.idToDelete = item.id;
181166
this.message = `Are you sure you want to delete ${item.activity_name}?`;
182167
this.showModal = true;
183168
}
184-
}
169+
}

0 commit comments

Comments
 (0)