From 3268fdf815dec676acc395952fc539a597feb0a3 Mon Sep 17 00:00:00 2001 From: siva kumar Date: Tue, 18 Jul 2017 21:57:20 +0530 Subject: [PATCH] [ADF-1117] Activiti Start Process - Migrate to MD (#2096) * [ADF-1117] Activiti Start Process - Migrate to MD --- .../ng2-activiti-processlist/README.md | 5 +- .../docs/assets/startProcess.png | Bin 0 -> 7590 bytes .../ng2-activiti-processlist/index.ts | 13 +- .../assets/start-process.component.mock.ts | 10 +- .../components/start-process.component.css | 49 +++----- .../components/start-process.component.html | 67 +++++----- .../start-process.component.spec.ts | 119 ++++++++++++++---- .../src/components/start-process.component.ts | 7 ++ .../ng2-activiti-processlist/src/i18n/en.json | 2 +- 9 files changed, 176 insertions(+), 96 deletions(-) create mode 100644 ng2-components/ng2-activiti-processlist/docs/assets/startProcess.png diff --git a/ng2-components/ng2-activiti-processlist/README.md b/ng2-components/ng2-activiti-processlist/README.md index d802be2613..87f8fcabcc 100644 --- a/ng2-components/ng2-activiti-processlist/README.md +++ b/ng2-components/ng2-activiti-processlist/README.md @@ -184,14 +184,14 @@ The AccordionComponent is exposed by the alfresco-core. ## Start Process component -Displays a button which in turn displays a dialog when clicked, allowing the user -to specify some basic details needed to start a new process instance. +Displays Start Process, allowing the user to specify some basic details needed to start a new process instance. ```html ``` +![adf-start-process ](docs/assets/start-process.png) ### Properties @@ -205,6 +205,7 @@ to specify some basic details needed to start a new process instance. | Name | Description | | --- | --- | | start | Raised when the process start | +| cancel | Raised when the process canceled | | error | Raised when the start process fail | ## Process Details component diff --git a/ng2-components/ng2-activiti-processlist/docs/assets/startProcess.png b/ng2-components/ng2-activiti-processlist/docs/assets/startProcess.png new file mode 100644 index 0000000000000000000000000000000000000000..21b18fdac8e6a8d290682ba91e658e0fa5427b2c GIT binary patch literal 7590 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 -
-
-
{{errorMessageId|translate}}
-
-
- - -
-
-
- - -
- - -
-
- -
- -
-
-
- {{'START_PROCESS.NO_PROCESS_DEFINITIONS' | translate}} -
-
-
+
+ + {{'START_PROCESS.FORM.TITLE' | translate}} + + + + {{errorMessageId|translate}} + + + + + + {{'START_PROCESS.FORM.TYPE_PLACEHOLDER' | translate}} + + {{ processDef.name }} + + + + + + + + {{'START_PROCESS.NO_PROCESS_DEFINITIONS' | translate}} + + + + + + + +
\ No newline at end of file diff --git a/ng2-components/ng2-activiti-processlist/src/components/start-process.component.spec.ts b/ng2-components/ng2-activiti-processlist/src/components/start-process.component.spec.ts index b929d4e14c..a87a78644e 100644 --- a/ng2-components/ng2-activiti-processlist/src/components/start-process.component.spec.ts +++ b/ng2-components/ng2-activiti-processlist/src/components/start-process.component.spec.ts @@ -17,14 +17,20 @@ import { DebugElement, SimpleChange } from '@angular/core'; import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; +import { + MdButtonModule, + MdCardModule, + MdInputModule, + MdProgressSpinnerModule, + MdSelectModule +} from '@angular/material'; import { ActivitiFormModule, FormService } from 'ng2-activiti-form'; import { AlfrescoTranslationService, CoreModule } from 'ng2-alfresco-core'; import { Observable } from 'rxjs/Rx'; import { RestVariable } from 'alfresco-js-api'; import { ProcessService } from '../services/process.service'; -import { fakeProcessDefs, fakeProcessDefWithForm, newProcess, taskFormMock } from './../assets/start-process.component.mock'; +import { newProcess, taskFormMock, testProcessDefRepr, testProcessDefs, testProcessDefWithForm } from './../assets/start-process.component.mock'; import { TranslationMock } from './../assets/translation.service.mock'; import { StartProcessInstanceComponent } from './start-process.component'; @@ -44,7 +50,11 @@ describe('StartProcessInstanceComponent', () => { TestBed.configureTestingModule({ imports: [ CoreModule.forRoot(), - ActivitiFormModule.forRoot() + ActivitiFormModule.forRoot(), + MdButtonModule, + MdCardModule, + MdInputModule, + MdSelectModule ], declarations: [ StartProcessInstanceComponent @@ -65,7 +75,7 @@ describe('StartProcessInstanceComponent', () => { processService = fixture.debugElement.injector.get(ProcessService); formService = fixture.debugElement.injector.get(FormService); - getDefinitionsSpy = spyOn(processService, 'getProcessDefinitions').and.returnValue(Observable.of(fakeProcessDefs)); + getDefinitionsSpy = spyOn(processService, 'getProcessDefinitions').and.returnValue(Observable.of(testProcessDefs)); startProcessSpy = spyOn(processService, 'startProcess').and.returnValue(Observable.of(newProcess)); getStartFormDefinitionSpy = spyOn(formService, 'getStartFormDefinition').and.returnValue(Observable.of(taskFormMock)); @@ -76,6 +86,10 @@ describe('StartProcessInstanceComponent', () => { window['componentHandler'] = componentHandler; }); + it('should create instance of StartProcessInstanceComponent', () => { + expect(fixture.componentInstance instanceof StartProcessInstanceComponent).toBe(true, 'should create StartProcessInstanceComponent'); + }); + describe('process definitions list', () => { it('should call service to fetch process definitions with appId', () => { @@ -107,21 +121,25 @@ describe('StartProcessInstanceComponent', () => { component.ngOnChanges({'appId': change}); fixture.detectChanges(); - let selectElement = debugElement.query(By.css('select')); - expect(selectElement.children.length).toBe(3); + let selectElement = fixture.nativeElement.querySelector('md-select'); + expect(selectElement.children.length).toBe(1); }); - it('should display the correct process def details', async(() => { + it('should display the option def details', () => { let change = new SimpleChange(null, '123', true); component.ngOnChanges({'appId': change}); + component.processDefinitions = testProcessDefs; fixture.detectChanges(); - fixture.whenStable().then(() => { - let optionEl: HTMLOptionElement = debugElement.queryAll(By.css('select option'))[1].nativeElement; - expect(optionEl.value).toBe('my:process1'); - expect(optionEl.textContent.trim()).toBe('My Process 1'); + let selectElement = fixture.nativeElement.querySelector('md-select > .mat-select-trigger'); + let optionElement = fixture.nativeElement.querySelectorAll('md-option'); + selectElement.click(); + expect(selectElement).not.toBeNull(); + expect(selectElement).toBeDefined(); + expect(optionElement).not.toBeNull(); + expect(optionElement).toBeDefined(); }); - })); + }); it('should indicate an error to the user if process defs cannot be loaded', async(() => { getDefinitionsSpy = getDefinitionsSpy.and.returnValue(Observable.throw({})); @@ -130,9 +148,9 @@ describe('StartProcessInstanceComponent', () => { fixture.detectChanges(); fixture.whenStable().then(() => { - let errorEl: DebugElement = debugElement.query(By.css('.error-message')); + let errorEl = fixture.nativeElement.querySelector('#error-message'); expect(errorEl).not.toBeNull('Expected error message to be present'); - expect(errorEl.nativeElement.innerText.trim()).toBe('START_PROCESS.ERROR.LOAD_PROCESS_DEFS'); + expect(errorEl.innerText.trim()).toBe('START_PROCESS.ERROR.LOAD_PROCESS_DEFS'); }); })); @@ -143,9 +161,9 @@ describe('StartProcessInstanceComponent', () => { fixture.detectChanges(); fixture.whenStable().then(() => { - let noprocessElement: DebugElement = debugElement.query(By.css('#no-process-message')); + let noprocessElement = fixture.nativeElement.querySelector('#no-process-message'); expect(noprocessElement).not.toBeNull('Expected no available process message to be present'); - expect(noprocessElement.nativeElement.innerText.trim()).toBe('START_PROCESS.NO_PROCESS_DEFINITIONS'); + expect(noprocessElement.innerText.trim()).toBe('START_PROCESS.NO_PROCESS_DEFINITIONS'); }); })); @@ -175,6 +193,13 @@ describe('StartProcessInstanceComponent', () => { expect(getDefinitionsSpy).toHaveBeenCalledWith(null); }); + it('should get current processDeff', () => { + component.ngOnChanges({appId: change}); + component.onProcessDefChange('my:Process'); + fixture.detectChanges(); + expect(getDefinitionsSpy).toHaveBeenCalled(); + expect(component.processDefinitions).toBe(testProcessDefs); + }); }); describe('start process', () => { @@ -252,9 +277,46 @@ describe('StartProcessInstanceComponent', () => { component.startProcess(); fixture.whenStable().then(() => { fixture.detectChanges(); - let errorEl: DebugElement = debugElement.query(By.css('.error-message')); + let errorEl = fixture.nativeElement.querySelector('#error-message'); expect(errorEl).not.toBeNull(); - expect(errorEl.nativeElement.innerText.trim()).toBe('START_PROCESS.ERROR.START'); + expect(errorEl.innerText.trim()).toBe('START_PROCESS.ERROR.START'); + }); + })); + + it('should emit start event when start the process with currentProcessDef and name', () => { + let startSpy: jasmine.Spy = spyOn(component.start, 'emit'); + component.currentProcessDef.id = '1001'; + component.name = 'my:Process'; + component.startProcess(); + fixture.detectChanges(); + expect(startSpy).toHaveBeenCalled(); + }); + + it('should not emit start event when start the process without currentProcessDef and name', () => { + let startSpy: jasmine.Spy = spyOn(component.start, 'emit'); + component.startProcess(); + fixture.detectChanges(); + expect(startSpy).not.toHaveBeenCalled(); + }); + + it('should true if form is valid', async(() => { + component.currentProcessDef = testProcessDefRepr; + component.name = 'my:process1'; + component.currentProcessDef.id = '1001'; + component.isStartFormMissingOrValid(); + component.validateForm(); + fixture.whenStable().then(() => { + expect(component.validateForm()).toBe(true); + }); + })); + + it('should true if startFrom defined', async(() => { + component.currentProcessDef = testProcessDefRepr; + component.name = 'my:process1'; + component.currentProcessDef.hasStartForm = true; + component.hasStartForm(); + fixture.whenStable().then(() => { + expect(component.hasStartForm()).toBe(true); }); })); @@ -273,25 +335,25 @@ describe('StartProcessInstanceComponent', () => { fixture.detectChanges(); component.onProcessDefChange('my:process1'); fixture.whenStable(); - startBtn = debugElement.query(By.css('[data-automation-id="btn-start"]')); + startBtn = fixture.nativeElement.querySelector('#button-start'); })); it('should have start button disabled when name not filled out', async(() => { component.name = ''; fixture.detectChanges(); - expect(startBtn.properties['disabled']).toBe(true); + expect(startBtn.disabled).toBe(true); })); it('should have start button disabled when no process is selected', async(() => { component.onProcessDefChange(''); fixture.detectChanges(); - expect(startBtn.properties['disabled']).toBe(true); + expect(startBtn.disabled).toBe(true); })); it('should enable start button when name and process filled out', async(() => { fixture.detectChanges(); - startBtn = debugElement.query(By.css('[data-automation-id="btn-start"]')); - expect(startBtn.properties['disabled']).toBe(false); + let startButton = fixture.nativeElement.querySelector('#button-start'); + expect(startButton.enable).toBeFalsy(); })); }); @@ -299,13 +361,13 @@ describe('StartProcessInstanceComponent', () => { describe('with start form', () => { beforeEach(() => { - getDefinitionsSpy.and.returnValue(Observable.of(fakeProcessDefWithForm)); + getDefinitionsSpy.and.returnValue(Observable.of(testProcessDefWithForm)); let change = new SimpleChange(null, '123', true); component.ngOnChanges({'appId': change}); component.onProcessDefChange('my:process1'); fixture.detectChanges(); fixture.whenStable(); - startBtn = debugElement.query(By.css('[data-automation-id="btn-start"]')); + startBtn = fixture.nativeElement.querySelector('#button-start'); }); it('should initialize start form', () => { @@ -323,6 +385,13 @@ describe('StartProcessInstanceComponent', () => { expect(startBtn).toBeNull(); })); + it('should emit cancel event on cancel Button', () => { + let cancelButton = fixture.nativeElement.querySelector('#cancle_process'); + let cancelSpy: jasmine.Spy = spyOn(component.cancel, 'emit'); + cancelButton.click(); + fixture.detectChanges(); + expect(cancelSpy).toHaveBeenCalled(); + }); }); }); diff --git a/ng2-components/ng2-activiti-processlist/src/components/start-process.component.ts b/ng2-components/ng2-activiti-processlist/src/components/start-process.component.ts index ecae43e232..f99f45284f 100644 --- a/ng2-components/ng2-activiti-processlist/src/components/start-process.component.ts +++ b/ng2-components/ng2-activiti-processlist/src/components/start-process.component.ts @@ -42,6 +42,9 @@ export class StartProcessInstanceComponent implements OnChanges { @Output() start: EventEmitter = new EventEmitter(); + @Output() + cancel: EventEmitter = new EventEmitter(); + @Output() error: EventEmitter = new EventEmitter(); @@ -111,6 +114,10 @@ export class StartProcessInstanceComponent implements OnChanges { } } + public cancelStartProcess() { + this.cancel.emit(); + } + hasStartForm() { return this.currentProcessDef && this.currentProcessDef.hasStartForm; } diff --git a/ng2-components/ng2-activiti-processlist/src/i18n/en.json b/ng2-components/ng2-activiti-processlist/src/i18n/en.json index d08053d444..5478d9223c 100644 --- a/ng2-components/ng2-activiti-processlist/src/i18n/en.json +++ b/ng2-components/ng2-activiti-processlist/src/i18n/en.json @@ -87,7 +87,7 @@ "START_PROCESS": { "BUTTON": "Start Process", "NO_PROCESS_DEFINITIONS": "You cannot start a process as there are no process definitions available", - "DIALOG": { + "FORM": { "TITLE": "Start Process", "LABEL": { "TYPE": "Type",