From ead22d9e3c2b71a6e6baf3ca6070b88dfc949d0e Mon Sep 17 00:00:00 2001 From: Silviu Popa Date: Thu, 9 May 2019 19:48:23 +0300 Subject: [PATCH] [ADF-4473] TaskCloud - add priority numeric validation (#4684) * [ADF-4473] TaskCloud - add priority numeric validation * [ADF-4473] - change validation conditiion * [ADF-4473] - add return type * [ADF-4473] - fix unit test --- ...dit-process-filter-cloud.component.spec.ts | 2 +- .../people-cloud.component.spec.ts | 30 ---------------- .../edit-task-filter-cloud.component.spec.ts | 2 +- .../task-header-cloud.component.spec.ts | 23 ++++++++++++ .../components/task-header-cloud.component.ts | 4 ++- .../lib/validators/numeric-field.validator.ts | 35 +++++++++++++++++++ 6 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 lib/process-services-cloud/src/lib/validators/numeric-field.validator.ts diff --git a/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.spec.ts index 65af081f40..696dd114cb 100644 --- a/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/process/process-filters/components/edit-process-filter-cloud.component.spec.ts @@ -507,7 +507,7 @@ describe('EditProcessFilterCloudComponent', () => { fixture.detectChanges(); const lastModifiedToControl: AbstractControl = component.editProcessFilterForm.get('lastModifiedTo'); - lastModifiedToControl.setValue('Tue Apr 09 2019 00:00:00 GMT+0300 (Eastern European Summer Time)'); + lastModifiedToControl.setValue(new Date().toISOString()); const lastModifiedToFilter = moment(lastModifiedToControl.value); lastModifiedToFilter.set({ hour: 23, diff --git a/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.spec.ts index f2636fe43d..800dc92ddd 100644 --- a/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/task/start-task/components/people-cloud/people-cloud.component.spec.ts @@ -76,11 +76,6 @@ describe('PeopleCloudComponent', () => { element = fixture.nativeElement; })); - afterEach(() => { - fixture.destroy(); - TestBed.resetTestingModule(); - }); - it('should list the users if the typed result match', async(() => { const inputHTMLElement: HTMLInputElement = element.querySelector('input'); inputHTMLElement.focus(); @@ -173,11 +168,6 @@ describe('PeopleCloudComponent', () => { element = fixture.nativeElement; })); - afterEach(() => { - fixture.destroy(); - TestBed.resetTestingModule(); - }); - it('should list users who have access to the app when appName is specified', async(() => { const inputHTMLElement: HTMLInputElement = element.querySelector('input'); inputHTMLElement.focus(); @@ -314,11 +304,6 @@ describe('PeopleCloudComponent', () => { element = fixture.nativeElement; })); - afterEach(() => { - fixture.destroy(); - TestBed.resetTestingModule(); - }); - it('should filter users if users has any specified role', async(() => { fixture.detectChanges(); const inputHTMLElement: HTMLInputElement = element.querySelector('input'); @@ -378,11 +363,6 @@ describe('PeopleCloudComponent', () => { element = fixture.nativeElement; })); - afterEach(() => { - fixture.destroy(); - TestBed.resetTestingModule(); - }); - it('should not show chip list when mode=single', async(() => { fixture.detectChanges(); fixture.whenStable().then(() => { @@ -413,11 +393,6 @@ describe('PeopleCloudComponent', () => { element = fixture.nativeElement; })); - afterEach(() => { - fixture.destroy(); - TestBed.resetTestingModule(); - }); - it('should not show chip list when mode=single', async(() => { fixture.detectChanges(); fixture.whenStable().then(() => { @@ -450,11 +425,6 @@ describe('PeopleCloudComponent', () => { alfrescoApiService = TestBed.get(AlfrescoApiService); })); - afterEach(() => { - fixture.destroy(); - TestBed.resetTestingModule(); - }); - it('should show chip list when mode=multiple', async(() => { fixture.detectChanges(); fixture.whenStable().then(() => { diff --git a/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.spec.ts index ecdfe1860b..94a8909d50 100644 --- a/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/task/task-filters/components/edit-task-filter-cloud.component.spec.ts @@ -403,7 +403,7 @@ describe('EditTaskFilterCloudComponent', () => { fixture.detectChanges(); const lastModifiedToControl: AbstractControl = component.editTaskFilterForm.get('lastModifiedTo'); - lastModifiedToControl.setValue('Tue Apr 09 2019 00:00:00 GMT+0300 (Eastern European Summer Time)'); + lastModifiedToControl.setValue(new Date().toISOString()); const lastModifiedToFilter = moment(lastModifiedToControl.value); lastModifiedToFilter.set({ hour: 23, diff --git a/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.spec.ts index 7c592355e2..d393fabf7f 100644 --- a/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.spec.ts @@ -89,6 +89,29 @@ describe('TaskHeaderCloudComponent', () => { }); })); + it('should display error if priority is not a number', async(() => { + component.ngOnInit(); + fixture.detectChanges(); + + fixture.whenStable().then(() => { + const edit = fixture.debugElement.query(By.css('[data-automation-id="card-textitem-edit-icon-priority"]')); + edit.nativeElement.click(); + fixture.detectChanges(); + + const formPriorityEl = fixture.debugElement.query(By.css('[data-automation-id="card-textitem-editinput-priority"]')); + formPriorityEl.nativeElement.value = 'stringValue'; + formPriorityEl.nativeElement.dispatchEvent(new Event('input')); + fixture.detectChanges(); + + const submitEl = fixture.debugElement.query(By.css('[data-automation-id="card-textitem-update-priority"]')); + submitEl.nativeElement.click(); + fixture.detectChanges(); + + const errorMessageEl = fixture.debugElement.query(By.css('[data-automation-id="card-textitem-error-priority"]')); + expect(errorMessageEl).not.toBeNull(); + }); + })); + it('should display due date', async(() => { component.ngOnInit(); fixture.detectChanges(); diff --git a/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts b/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts index 6224e9bc4f..0e255dff67 100644 --- a/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/task/task-header/components/task-header-cloud.component.ts @@ -30,6 +30,7 @@ import { TaskDetailsCloudModel, TaskStatusEnum } from '../../start-task/models/t import { Router } from '@angular/router'; import { TaskCloudService } from '../../services/task-cloud.service'; import { Subscription } from 'rxjs'; +import { NumericFieldValidator } from '../../../validators/numeric-field.validator'; @Component({ selector: 'adf-cloud-task-header', @@ -112,7 +113,8 @@ export class TaskHeaderCloudComponent implements OnInit, OnDestroy { label: 'ADF_CLOUD_TASK_HEADER.PROPERTIES.PRIORITY', value: this.taskDetails.priority, key: 'priority', - editable: true + editable: true, + validators: [new NumericFieldValidator()] } ), new CardViewDateItemModel( diff --git a/lib/process-services-cloud/src/lib/validators/numeric-field.validator.ts b/lib/process-services-cloud/src/lib/validators/numeric-field.validator.ts new file mode 100644 index 0000000000..36f4e17645 --- /dev/null +++ b/lib/process-services-cloud/src/lib/validators/numeric-field.validator.ts @@ -0,0 +1,35 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { CardViewItemValidator } from '@alfresco/adf-core'; + +export class NumericFieldValidator implements CardViewItemValidator { + + message: string = 'ADF_CLOUD_TASK_HEADER.FORM_VALIDATION.INVALID_FIELD'; + + isValid(value: any): boolean { + if (!value) { + return false; + } + return !isNaN(+value) && !this.whitespaces(value); + } + + whitespaces(value: any): boolean { + const isWhitespace = (value || '').trim().length === 0; + return !(value.length === 0 || !isWhitespace); + } +}