From 2d21cd7e1269a2116c0bcddf90a4ea70cd9ed559 Mon Sep 17 00:00:00 2001 From: Israel Leon Date: Wed, 24 Feb 2021 16:16:30 -0500 Subject: [PATCH 01/12] fix: TT-165 Warning message in the console (#641) --- .../components/details-fields/details-fields.component.html | 4 ++-- .../components/details-fields/details-fields.component.scss | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.html b/src/app/modules/shared/components/details-fields/details-fields.component.html index 5a04f4b87..a876cb26a 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.html +++ b/src/app/modules/shared/components/details-fields/details-fields.component.html @@ -99,8 +99,8 @@ [format]="24" formControlName="start_hour" id="start_hour" - [disabled]="!(project_name.value && project_id.value)" class="timepicker-input" + [class.timepicker-input--disabled]="!(project_id.value && project_name.value)" > @@ -126,8 +126,8 @@ [format]="24" formControlName="end_hour" id="end_hour" - [disabled]="!(project_name.value && project_id.value)" class="timepicker-input" + [class.timepicker-input--disabled]="!(project_id.value && project_name.value)" > diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.scss b/src/app/modules/shared/components/details-fields/details-fields.component.scss index 88b00d6e7..25dd0337a 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.scss +++ b/src/app/modules/shared/components/details-fields/details-fields.component.scss @@ -103,3 +103,8 @@ input[type="date"]::-webkit-clear-button { border-radius: 0.25rem; } +.timepicker-input--disabled ::ng-deep div{ + pointer-events: none; + background-color: #e9ecef; + opacity: 1; +} From 7d593c85e57615b1aeb11e7da9c9c32285d12a85 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 24 Feb 2021 21:17:59 +0000 Subject: [PATCH 02/12] chore(release): 1.31.17 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 31f593150..970319399 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.31.16", + "version": "1.31.17", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c286b54b7..47b6417c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.31.16", + "version": "1.31.17", "scripts": { "preinstall": "npx npm-force-resolutions", "ng": "ng", From 414c4a6e3aab8b370b7ef446ec00b283057fc9dc Mon Sep 17 00:00:00 2001 From: wobravo <77082898+wobravo@users.noreply.github.com> Date: Wed, 24 Feb 2021 17:07:07 -0500 Subject: [PATCH 03/12] fix: TT 149 when edit date in update the date out (#640) * fix: TT-149 When-edit-Date-In-update-the-Date-Out * fix: TT-149 When edit Date In update the Date Out * fix: TT-149 When edit Date In update the Date Out * fix: TT-149 When edit Date In update the Date Out * fix: TT-149 rename tests Co-authored-by: Sandro Castillo --- .../details-fields.component.html | 1 + .../details-fields.component.spec.ts | 25 +++++++++++++++++++ .../details-fields.component.ts | 4 +++ 3 files changed, 30 insertions(+) diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.html b/src/app/modules/shared/components/details-fields/details-fields.component.html index a876cb26a..c1114e007 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.html +++ b/src/app/modules/shared/components/details-fields/details-fields.component.html @@ -90,6 +90,7 @@ aria-describedby="inputGroup-sizing-sm" [class.is-invalid]="start_date.invalid && start_date.touched" required + (ngModelChange)="onStartDateChange($event)" /> diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts b/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts index 60139632f..a29ed6e06 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts +++ b/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts @@ -443,6 +443,31 @@ describe('DetailsFieldsComponent', () => { expect(component.projectSelected.emit).toHaveBeenCalledWith(data); }); + it('on selected start_date should change end_date', () => { + const expectedStartDate = '2020-02-05'; + + component.onStartDateChange(expectedStartDate); + fixture.detectChanges(); + const endDateInput: HTMLInputElement = fixture.debugElement.nativeElement.querySelector('#end_date'); + + expect(endDateInput.value).toEqual(expectedStartDate); + }); + + it('on selected end_date should not change start_date', () => { + const expectedStartDate = '2020-02-05'; + const expectedEndDate = '2020-02-06'; + + component.ngOnInit(); + fixture.detectChanges(); + const startDateInput: HTMLInputElement = fixture.debugElement.nativeElement.querySelector('#start_date'); + const endDateInput: HTMLInputElement = fixture.debugElement.nativeElement.querySelector('#end_date'); + startDateInput.value = expectedStartDate; + endDateInput.value = expectedEndDate; + endDateInput.dispatchEvent(new Event('#end_date')); + + expect(endDateInput.value).not.toEqual(startDateInput.value); + expect(startDateInput.value).toEqual(expectedStartDate); + }); /* TODO As part of https://github.com/ioet/time-tracker-ui/issues/424 a new parameter was added to the details-field-component, and now these couple of tests are failing. A solution to this error might be generate a Test Wrapper Component. More details here: diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.ts b/src/app/modules/shared/components/details-fields/details-fields.component.ts index 5a0434d8a..be8c13d9a 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.ts +++ b/src/app/modules/shared/components/details-fields/details-fields.component.ts @@ -124,6 +124,10 @@ export class DetailsFieldsComponent implements OnChanges, OnInit { }); } + onStartDateChange($event: string) { + this.end_date.setValue($event); + } + ngOnChanges(): void { this.goingToWorkOnThis = this.entryToEdit ? this.entryToEdit.running : false; this.shouldRestartEntry = false; From c138f40d4b5a638103869c7cf80792a5673243d8 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 24 Feb 2021 22:09:21 +0000 Subject: [PATCH 04/12] chore(release): 1.31.18 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 970319399..22702e8cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.31.17", + "version": "1.31.18", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 47b6417c6..0f5a41369 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.31.17", + "version": "1.31.18", "scripts": { "preinstall": "npx npm-force-resolutions", "ng": "ng", From 3dc840d3ce74f18777d64235aa6d92d61af775da Mon Sep 17 00:00:00 2001 From: VanessaIniguez <56464942+VanessaIniguez@users.noreply.github.com> Date: Mon, 1 Mar 2021 10:56:10 -0500 Subject: [PATCH 05/12] fix: TT-141 Have the data persistent in the modal (#639) * fix: TT-141 Have the data persistent in the modal * feat: TT-141 Create test to validate the isEdit flag of the DetailsFields component * 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 * fix: TT-141 Delete test lines and add in the test the method of edited an entry --- .../details-fields.component.ts | 2 +- .../pages/time-entries.component.spec.ts | 17 +++++++++++- .../pages/time-entries.component.ts | 27 +++++-------------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.ts b/src/app/modules/shared/components/details-fields/details-fields.component.ts index be8c13d9a..669475254 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.ts +++ b/src/app/modules/shared/components/details-fields/details-fields.component.ts @@ -147,7 +147,7 @@ export class DetailsFieldsComponent implements OnChanges, OnInit { technology: '', }); } else { - this.cleanForm(); + this.cleanForm(); } } diff --git a/src/app/modules/time-entries/pages/time-entries.component.spec.ts b/src/app/modules/time-entries/pages/time-entries.component.spec.ts index e64fc92f1..095d14156 100644 --- a/src/app/modules/time-entries/pages/time-entries.component.spec.ts +++ b/src/app/modules/time-entries/pages/time-entries.component.spec.ts @@ -148,7 +148,6 @@ describe('TimeEntriesComponent', () => { it('when creating a new entry, then entryId should be null', () => { component.newEntry(); - expect(component.entry).toBe(null); expect(component.entryId).toBe(null); }); @@ -427,4 +426,20 @@ describe('TimeEntriesComponent', () => { expect(entryData.customer_name).toContain('ioet Inc.'); }); })); + + it('Should the entry be null if the flag is true', () => { + component.wasEditingExistingTimeEntry = true; + const idEntry = '1'; + component.editEntry(idEntry); + component.newEntry(); + expect(component.entry).toBe(null); + }); + + it('Should the input persist the data if the flag is false', () => { + const newEntry = { start_date: new Date(), id: '1234', technologies: [], project_name: 'time-tracker' }; + component.entry = newEntry; + component.wasEditingExistingTimeEntry = false; + component.newEntry(); + expect(component.entry).toEqual(newEntry); + }); }); diff --git a/src/app/modules/time-entries/pages/time-entries.component.ts b/src/app/modules/time-entries/pages/time-entries.component.ts index d21f64303..21a89ccb8 100644 --- a/src/app/modules/time-entries/pages/time-entries.component.ts +++ b/src/app/modules/time-entries/pages/time-entries.component.ts @@ -25,24 +25,21 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { message: string; idToDelete: string; entriesSubscription: Subscription; + wasEditingExistingTimeEntry = false; canMarkEntryAsWIP = true; timeEntriesDataSource$: Observable>; selectedYearAsText: string; selectedMonth: number; selectedYear: number; selectedMonthAsText: string; - constructor(private store: Store, private toastrService: ToastrService, private actionsSubject$: ActionsSubject) { this.timeEntriesDataSource$ = this.store.pipe(delay(0), select(getTimeEntriesDataSource)); } - ngOnDestroy(): void { this.entriesSubscription.unsubscribe(); } - ngOnInit(): void { this.loadActiveEntry(); - this.entriesSubscription = this.actionsSubject$.pipe( filter((action: any) => ( action.type === EntryActionTypes.CREATE_ENTRY_SUCCESS || @@ -55,24 +52,22 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { this.store.dispatch(new entryActions.LoadEntries(this.selectedMonth, this.selectedYear)); }); } - newEntry() { - this.entry = null; + if (this.wasEditingExistingTimeEntry) { + this.entry = null; + } this.entryId = null; this.store.pipe(select(getTimeEntriesDataSource)).subscribe(ds => { this.canMarkEntryAsWIP = !this.isThereAnEntryRunning(ds.data); }); } - private getEntryRunning(entries: Entry[]) { const runningEntry: Entry = entries.find(entry => entry.running === true); return runningEntry; } - private isThereAnEntryRunning(entries: Entry[]) { return !!this.getEntryRunning(entries); } - editEntry(entryId: string) { this.entryId = entryId; this.store.pipe(select(getTimeEntriesDataSource)).subscribe(ds => { @@ -80,8 +75,8 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { this.canMarkEntryAsWIP = this.isEntryRunningEqualsToEntryToEdit(this.getEntryRunning(ds.data), this.entry) || this.isTheEntryToEditTheLastOne(ds.data); }); + this.wasEditingExistingTimeEntry = true; } - private isEntryRunningEqualsToEntryToEdit(entryRunning: Entry, entryToEdit: Entry) { if (entryRunning && entryToEdit) { return entryRunning.id === entryToEdit.id; @@ -89,7 +84,6 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { return false; } } - private isTheEntryToEditTheLastOne(entries: Entry[]) { if (entries && entries.length > 0) { const lastEntry = entries[0]; @@ -98,11 +92,9 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { return false; } } - private isNewEntry() { return this.entryId === null; } - saveEntry(event: SaveEntryEvent): void { if (this.activeTimeEntry) { const startDateAsLocalDate = new Date(event.entry.start_date); @@ -121,8 +113,8 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { this.doSave(event); } } - projectSelected(event: ProjectSelectedEvent): void { + this.wasEditingExistingTimeEntry = false; this.store.pipe(select(getTimeEntriesDataSource)).subscribe(ds => { const dataToUse = ds.data.find(item => item.project_id === event.projectId); if (dataToUse && this.isNewEntry()) { @@ -140,7 +132,6 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { } }); } - doSave(event: SaveEntryEvent) { if (this.entryId) { event.entry.id = this.entryId; @@ -152,19 +143,16 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { this.store.dispatch(new entryActions.CreateEntry(event.entry)); } } - loadActiveEntry() { this.store.dispatch(new entryActions.LoadActiveEntry()); this.store.pipe(select(getActiveTimeEntry)).subscribe((activeTimeEntry) => { this.activeTimeEntry = activeTimeEntry; }); } - removeEntry() { this.store.dispatch(new entryActions.DeleteEntry(this.idToDelete)); this.showModal = false; } - dateSelected(event: { monthIndex: number; year: number }) { this.selectedYear = event.year; this.selectedYearAsText = event.year.toString(); @@ -172,10 +160,9 @@ export class TimeEntriesComponent implements OnInit, OnDestroy { this.selectedMonthAsText = moment().month(event.monthIndex).format('MMMM'); this.store.dispatch(new entryActions.LoadEntries(this.selectedMonth, this.selectedYear)); } - openModal(item: any) { this.idToDelete = item.id; this.message = `Are you sure you want to delete ${item.activity_name}?`; this.showModal = true; } -} +} \ No newline at end of file From e78badbdf4f7efc0afbea986408c5fd40a925936 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 1 Mar 2021 15:58:02 +0000 Subject: [PATCH 06/12] chore(release): 1.31.19 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 22702e8cf..3769fae6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.31.18", + "version": "1.31.19", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0f5a41369..0c39bb33d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.31.18", + "version": "1.31.19", "scripts": { "preinstall": "npx npm-force-resolutions", "ng": "ng", From f74adda3099e044a7e73881408dc1cfcf4dff05c Mon Sep 17 00:00:00 2001 From: wobravo <77082898+wobravo@users.noreply.github.com> Date: Mon, 8 Mar 2021 16:48:06 -0500 Subject: [PATCH 07/12] fix: TT-167 Date picker disable future dates (#642) * fix: TT-167 Date picker disable future dates * fix: TT-167 Date picker disable future dates * fix: TT-167 Date picker disable future dates * fix: TT-167 Date picker disable future dates * fix: TT-167 Date picker disable future dates --- .../details-fields.component.html | 4 +++ .../details-fields.component.spec.ts | 25 +++++++++++++++++++ .../details-fields.component.ts | 4 +++ 3 files changed, 33 insertions(+) diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.html b/src/app/modules/shared/components/details-fields/details-fields.component.html index c1114e007..48388e267 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.html +++ b/src/app/modules/shared/components/details-fields/details-fields.component.html @@ -91,6 +91,8 @@ [class.is-invalid]="start_date.invalid && start_date.touched" required (ngModelChange)="onStartDateChange($event)" + [max]="getCurrentDate()" + onkeydown="return false" /> @@ -118,6 +120,8 @@ aria-describedby="inputGroup-sizing-sm" [class.is-invalid]="end_date.invalid && end_date.touched" required + [max]="getCurrentDate()" + onkeydown="return false" /> diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts b/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts index a29ed6e06..39cb76bdc 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts +++ b/src/app/modules/shared/components/details-fields/details-fields.component.spec.ts @@ -468,6 +468,31 @@ describe('DetailsFieldsComponent', () => { expect(endDateInput.value).not.toEqual(startDateInput.value); expect(startDateInput.value).toEqual(expectedStartDate); }); + + it('on get current date should return expected date', () => { + const expectedDate = new Date().toISOString().split('T')[0]; + + expect(component.getCurrentDate()).toEqual(expectedDate); + }); + + it('on the input with id #start_date we could get the id and max value', () => { + fixture.detectChanges(); + const expectedDate = new Date().toISOString().split('T')[0]; + const startDateInput: HTMLInputElement = fixture.debugElement. + nativeElement.querySelector(`input[id="start_date"],input[max="${component.getCurrentDate()}"]`); + + expect(startDateInput.id).toEqual('start_date'); + expect(startDateInput.max).toEqual(expectedDate); + }); + + it('on the input with id #end_date we could get the current Date ', () => { + fixture.detectChanges(); + const expectedDate = new Date().toISOString().split('T')[0]; + const endDateInput = fixture.debugElement.nativeElement.querySelector('[id=end_date]'); + + expect(endDateInput.id).toEqual('end_date'); + expect(endDateInput.max).toEqual(expectedDate); + }); /* TODO As part of https://github.com/ioet/time-tracker-ui/issues/424 a new parameter was added to the details-field-component, and now these couple of tests are failing. A solution to this error might be generate a Test Wrapper Component. More details here: diff --git a/src/app/modules/shared/components/details-fields/details-fields.component.ts b/src/app/modules/shared/components/details-fields/details-fields.component.ts index 669475254..8ca3bad92 100644 --- a/src/app/modules/shared/components/details-fields/details-fields.component.ts +++ b/src/app/modules/shared/components/details-fields/details-fields.component.ts @@ -171,6 +171,10 @@ export class DetailsFieldsComponent implements OnChanges, OnInit { this.selectedTechnologies = $event; } + getCurrentDate(): string { + return new Date().toISOString().split('T')[0]; + } + get project_id() { return this.entryForm.get('project_id'); } From 597c66e27417b30ed69a4d1823f3c4696637dfcc Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Mon, 8 Mar 2021 21:49:28 +0000 Subject: [PATCH 08/12] chore(release): 1.31.20 [skip ci]nn --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3769fae6d..920dec5ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.31.19", + "version": "1.31.20", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0c39bb33d..5bf34e977 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "time-tracker", - "version": "1.31.19", + "version": "1.31.20", "scripts": { "preinstall": "npx npm-force-resolutions", "ng": "ng", From 9db07be0a819e43837af8d765b30d9f739c746a2 Mon Sep 17 00:00:00 2001 From: jr-98 Date: Mon, 1 Mar 2021 15:43:21 -0500 Subject: [PATCH 09/12] fix: TT-29 Warn-of-unsaved-changes-on-customer-page --- .../customer-list.component.html | 37 ++++--------------- .../customer-list/customer-list.component.ts | 12 +++++- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/app/modules/customer-management/components/customer-info/components/customer-list/customer-list.component.html b/src/app/modules/customer-management/components/customer-info/components/customer-list/customer-list.component.html index 09b7a0b76..dbc70fe54 100644 --- a/src/app/modules/customer-management/components/customer-info/components/customer-list/customer-list.component.html +++ b/src/app/modules/customer-management/components/customer-info/components/customer-list/customer-list.component.html @@ -1,11 +1,6 @@
- +
@@ -19,20 +14,11 @@ @@ -41,15 +27,6 @@
Customer ID{{ customer.id }} {{ customer.name }} - -
-