mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-05-12 17:04:57 +00:00
AAE-25190 Retrieve start process cloud customisation (#10133)
* AAE-25190 Restrieve start process cloud customisation * AAE-25190 Fix code duplucation * AAE-25190 Address review comments * AAE-25190 Address review comments
This commit is contained in:
parent
166325d703
commit
b60797e3b1
@ -105,9 +105,10 @@
|
|||||||
(click)="cancelStartProcess()"
|
(click)="cancelStartProcess()"
|
||||||
id="cancel_process"
|
id="cancel_process"
|
||||||
>
|
>
|
||||||
{{ 'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.CANCEL' | translate | uppercase}}
|
{{ cancelButtonLabel }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
|
*ngIf="showStartProcessButton"
|
||||||
color="primary"
|
color="primary"
|
||||||
mat-raised-button
|
mat-raised-button
|
||||||
[disabled]="disableStartButton || !isProcessFormValid"
|
[disabled]="disableStartButton || !isProcessFormValid"
|
||||||
@ -116,7 +117,7 @@
|
|||||||
id="button-start"
|
id="button-start"
|
||||||
class="adf-btn-start"
|
class="adf-btn-start"
|
||||||
>
|
>
|
||||||
{{'ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.START' | translate | uppercase}}
|
{{ startProcessButtonLabel }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -67,6 +67,7 @@ describe('StartProcessCloudComponent', () => {
|
|||||||
let startProcessWithFormSpy: jasmine.Spy;
|
let startProcessWithFormSpy: jasmine.Spy;
|
||||||
let formDefinitionSpy: jasmine.Spy;
|
let formDefinitionSpy: jasmine.Spy;
|
||||||
let getStartEventFormStaticValuesMappingSpy: jasmine.Spy;
|
let getStartEventFormStaticValuesMappingSpy: jasmine.Spy;
|
||||||
|
let getStartEventConstantSpy: jasmine.Spy;
|
||||||
|
|
||||||
const firstChange = new SimpleChange(undefined, 'myApp', true);
|
const firstChange = new SimpleChange(undefined, 'myApp', true);
|
||||||
|
|
||||||
@ -112,6 +113,7 @@ describe('StartProcessCloudComponent', () => {
|
|||||||
startProcessSpy = spyOn(processService, 'startProcess').and.returnValue(of(fakeProcessInstance));
|
startProcessSpy = spyOn(processService, 'startProcess').and.returnValue(of(fakeProcessInstance));
|
||||||
startProcessWithFormSpy = spyOn(processService, 'startProcessWithForm').and.returnValue(of(fakeProcessWithFormInstance));
|
startProcessWithFormSpy = spyOn(processService, 'startProcessWithForm').and.returnValue(of(fakeProcessWithFormInstance));
|
||||||
getStartEventFormStaticValuesMappingSpy = spyOn(processService, 'getStartEventFormStaticValuesMapping').and.returnValue(of([]));
|
getStartEventFormStaticValuesMappingSpy = spyOn(processService, 'getStartEventFormStaticValuesMapping').and.returnValue(of([]));
|
||||||
|
getStartEventConstantSpy = spyOn(processService, 'getStartEventConstants').and.returnValue(of([]));
|
||||||
loader = TestbedHarnessEnvironment.loader(fixture);
|
loader = TestbedHarnessEnvironment.loader(fixture);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -120,6 +122,56 @@ describe('StartProcessCloudComponent', () => {
|
|||||||
TestBed.resetTestingModule();
|
TestBed.resetTestingModule();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup the component with the given start event information.
|
||||||
|
* @param values the values for the form
|
||||||
|
* @param staticValues the static values retrieved from the API for the form
|
||||||
|
* @param constantValues the constant values retrieved from the API for customising the buttons
|
||||||
|
* @returns the start and cancel buttons HTML elements
|
||||||
|
*/
|
||||||
|
function loadWithStartEventInformation(
|
||||||
|
values?: TaskVariableCloud[],
|
||||||
|
staticValues?: TaskVariableCloud[] | Error,
|
||||||
|
constantValues?: TaskVariableCloud[] | Error
|
||||||
|
): {
|
||||||
|
startButton: any;
|
||||||
|
cancelButton: any;
|
||||||
|
} {
|
||||||
|
if (values) {
|
||||||
|
component.values = values;
|
||||||
|
}
|
||||||
|
if (staticValues) {
|
||||||
|
if (staticValues instanceof Error) {
|
||||||
|
getStartEventConstantSpy.and.returnValue(throwError(() => staticValues));
|
||||||
|
} else {
|
||||||
|
getStartEventFormStaticValuesMappingSpy.and.returnValue(of(staticValues));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (constantValues) {
|
||||||
|
if (constantValues instanceof Error) {
|
||||||
|
getStartEventConstantSpy.and.returnValue(throwError(() => constantValues));
|
||||||
|
} else {
|
||||||
|
getStartEventConstantSpy.and.returnValue(of(constantValues));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
component.name = 'My new process';
|
||||||
|
component.processDefinitionName = 'processwithoutform2';
|
||||||
|
getDefinitionsSpy.and.returnValue(of(fakeSingleProcessDefinitionWithoutForm(component.processDefinitionName)));
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
const change = new SimpleChange(null, 'MyApp', true);
|
||||||
|
component.ngOnChanges({ appName: change });
|
||||||
|
fixture.detectChanges();
|
||||||
|
tick(550);
|
||||||
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
const startButton = fixture.nativeElement.querySelector('#button-start');
|
||||||
|
const cancelButton = fixture.nativeElement.querySelector('#cancel_process');
|
||||||
|
|
||||||
|
return { startButton, cancelButton };
|
||||||
|
}
|
||||||
|
|
||||||
describe('start a process without start form', () => {
|
describe('start a process without start form', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
component.name = 'My formless new process';
|
component.name = 'My formless new process';
|
||||||
@ -197,19 +249,47 @@ describe('StartProcessCloudComponent', () => {
|
|||||||
new TaskVariableCloud({ name: 'static2', value: 0 }),
|
new TaskVariableCloud({ name: 'static2', value: 0 }),
|
||||||
new TaskVariableCloud({ name: 'static3', value: true })
|
new TaskVariableCloud({ name: 'static3', value: true })
|
||||||
];
|
];
|
||||||
component.name = 'My new process';
|
|
||||||
component.processDefinitionName = 'processwithoutform2';
|
|
||||||
component.values = values;
|
|
||||||
getDefinitionsSpy.and.returnValue(of(fakeSingleProcessDefinitionWithoutForm(component.processDefinitionName)));
|
|
||||||
getStartEventFormStaticValuesMappingSpy.and.returnValue(of(staticInputs));
|
|
||||||
fixture.detectChanges();
|
|
||||||
|
|
||||||
const change = new SimpleChange(null, 'MyApp', true);
|
loadWithStartEventInformation(values, staticInputs);
|
||||||
component.ngOnChanges({ appName: change });
|
|
||||||
fixture.detectChanges();
|
|
||||||
tick(550);
|
|
||||||
expect(component.resolvedValues).toEqual(staticInputs.concat(values));
|
expect(component.resolvedValues).toEqual(staticInputs.concat(values));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
describe('start event constants', () => {
|
||||||
|
it('should not display the buttons when they are disabled by the constants', fakeAsync(() => {
|
||||||
|
const constants: TaskVariableCloud[] = [
|
||||||
|
new TaskVariableCloud({ name: 'startEnabled', value: 'false' }),
|
||||||
|
new TaskVariableCloud({ name: 'cancelEnabled', value: 'false' })
|
||||||
|
];
|
||||||
|
|
||||||
|
const { startButton, cancelButton } = loadWithStartEventInformation(null, null, constants);
|
||||||
|
|
||||||
|
expect(startButton).toBeNull();
|
||||||
|
expect(cancelButton).toBeNull();
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should display the customised button labels when they are set in the constants', fakeAsync(() => {
|
||||||
|
const constants: TaskVariableCloud[] = [
|
||||||
|
new TaskVariableCloud({ name: 'startEnabled', value: 'true' }),
|
||||||
|
new TaskVariableCloud({ name: 'startLabel', value: 'Start' }),
|
||||||
|
new TaskVariableCloud({ name: 'cancelEnabled', value: 'true' }),
|
||||||
|
new TaskVariableCloud({ name: 'cancelLabel', value: 'Cancel' })
|
||||||
|
];
|
||||||
|
const { startButton, cancelButton } = loadWithStartEventInformation(null, null, constants);
|
||||||
|
|
||||||
|
expect(startButton.textContent?.trim()).toEqual('Start');
|
||||||
|
expect(cancelButton.textContent?.trim()).toEqual('Cancel');
|
||||||
|
}));
|
||||||
|
|
||||||
|
it('should load with default values when retrieving the constants fails', fakeAsync(() => {
|
||||||
|
const { startButton, cancelButton } = loadWithStartEventInformation(null, null, new Error('test'));
|
||||||
|
|
||||||
|
expect(startButton).not.toBeNull();
|
||||||
|
expect(cancelButton).not.toBeNull();
|
||||||
|
expect(startButton.textContent?.trim()).toEqual(component.defaultStartProcessButtonLabel);
|
||||||
|
expect(cancelButton.textContent?.trim()).toEqual(component.defaultCancelProcessButtonLabel);
|
||||||
|
}));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('start a process with start form', () => {
|
describe('start a process with start form', () => {
|
||||||
|
@ -30,18 +30,18 @@ import {
|
|||||||
ViewEncapsulation
|
ViewEncapsulation
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
|
|
||||||
import { ContentLinkModel, FORM_FIELD_VALIDATORS, FormFieldValidator, FormModel } from '@alfresco/adf-core';
|
import { ContentLinkModel, FORM_FIELD_VALIDATORS, FormFieldValidator, FormModel, TranslationService } from '@alfresco/adf-core';
|
||||||
import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';
|
import { AbstractControl, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms';
|
||||||
import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
||||||
import { Subject } from 'rxjs';
|
import { catchError, debounceTime, takeUntil } from 'rxjs/operators';
|
||||||
import { debounceTime, takeUntil } from 'rxjs/operators';
|
|
||||||
import { TaskVariableCloud } from '../../../form/models/task-variable-cloud.model';
|
|
||||||
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
|
|
||||||
import { ProcessNameCloudPipe } from '../../../pipes/process-name-cloud.pipe';
|
|
||||||
import { ProcessInstanceCloud } from '../models/process-instance-cloud.model';
|
import { ProcessInstanceCloud } from '../models/process-instance-cloud.model';
|
||||||
import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
|
import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
|
||||||
import { ProcessWithFormPayloadCloud } from '../models/process-with-form-payload-cloud.model';
|
import { ProcessWithFormPayloadCloud } from '../models/process-with-form-payload-cloud.model';
|
||||||
import { StartProcessCloudService } from '../services/start-process-cloud.service';
|
import { StartProcessCloudService } from '../services/start-process-cloud.service';
|
||||||
|
import { forkJoin, of, Subject } from 'rxjs';
|
||||||
|
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
|
||||||
|
import { TaskVariableCloud } from '../../../form/models/task-variable-cloud.model';
|
||||||
|
import { ProcessNameCloudPipe } from '../../../pipes/process-name-cloud.pipe';
|
||||||
|
|
||||||
const MAX_NAME_LENGTH: number = 255;
|
const MAX_NAME_LENGTH: number = 255;
|
||||||
const PROCESS_DEFINITION_DEBOUNCE: number = 300;
|
const PROCESS_DEFINITION_DEBOUNCE: number = 300;
|
||||||
@ -131,6 +131,10 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy
|
|||||||
isFormCloudLoading = false;
|
isFormCloudLoading = false;
|
||||||
processDefinitionLoaded = false;
|
processDefinitionLoaded = false;
|
||||||
|
|
||||||
|
showStartProcessButton = true;
|
||||||
|
startProcessButtonLabel: string;
|
||||||
|
cancelButtonLabel: string;
|
||||||
|
|
||||||
formCloud?: FormModel;
|
formCloud?: FormModel;
|
||||||
processForm = new FormGroup({
|
processForm = new FormGroup({
|
||||||
processInstanceName: new FormControl('', [
|
processInstanceName: new FormControl('', [
|
||||||
@ -172,6 +176,19 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy
|
|||||||
return !!this.processDefinitionCurrent?.formKey;
|
return !!this.processDefinitionCurrent?.formKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get defaultStartProcessButtonLabel(): string {
|
||||||
|
return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.START').toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
get defaultCancelProcessButtonLabel(): string {
|
||||||
|
return this.translateService.instant('ADF_CLOUD_PROCESS_LIST.ADF_CLOUD_START_PROCESS.FORM.ACTION.CANCEL').toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(private translateService: TranslationService) {
|
||||||
|
this.startProcessButtonLabel = this.defaultStartProcessButtonLabel;
|
||||||
|
this.cancelButtonLabel = this.defaultCancelProcessButtonLabel;
|
||||||
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.initFieldValidators();
|
this.initFieldValidators();
|
||||||
|
|
||||||
@ -230,19 +247,39 @@ export class StartProcessCloudComponent implements OnChanges, OnInit, OnDestroy
|
|||||||
(process: ProcessDefinitionCloud) => process.name === selectedProcessDefinitionName || process.key === selectedProcessDefinitionName
|
(process: ProcessDefinitionCloud) => process.name === selectedProcessDefinitionName || process.key === selectedProcessDefinitionName
|
||||||
);
|
);
|
||||||
|
|
||||||
this.startProcessCloudService.getStartEventFormStaticValuesMapping(this.appName, processDefinitionCurrent.id).subscribe(
|
forkJoin([
|
||||||
(staticMappings) => {
|
this.startProcessCloudService
|
||||||
this.staticMappings = staticMappings;
|
.getStartEventFormStaticValuesMapping(this.appName, processDefinitionCurrent.id)
|
||||||
this.resolvedValues = this.staticMappings.concat(this.values || []);
|
.pipe(catchError(() => of([] as TaskVariableCloud[]))),
|
||||||
this.processDefinitionCurrent = processDefinitionCurrent;
|
this.startProcessCloudService
|
||||||
this.isFormCloudLoading = false;
|
.getStartEventConstants(this.appName, processDefinitionCurrent.id)
|
||||||
},
|
.pipe(catchError(() => of([] as TaskVariableCloud[])))
|
||||||
() => {
|
]).subscribe(([staticMappings, constants]) => {
|
||||||
this.resolvedValues = this.values;
|
this.staticMappings = staticMappings;
|
||||||
this.processDefinitionCurrent = processDefinitionCurrent;
|
this.resolvedValues = this.staticMappings.concat(this.values || []);
|
||||||
this.isFormCloudLoading = false;
|
this.processDefinitionCurrent = processDefinitionCurrent;
|
||||||
|
this.isFormCloudLoading = false;
|
||||||
|
|
||||||
|
const displayStart = constants?.find((constant) => constant.name === 'startEnabled');
|
||||||
|
const startLabel = constants?.find((constant) => constant.name === 'startLabel');
|
||||||
|
|
||||||
|
const displayCancel = constants?.find((constant) => constant.name === 'cancelEnabled');
|
||||||
|
const cancelLabel = constants?.find((constant) => constant.name === 'cancelLabel');
|
||||||
|
|
||||||
|
if (displayStart) {
|
||||||
|
this.showStartProcessButton = displayStart?.value === 'true';
|
||||||
}
|
}
|
||||||
);
|
if (startLabel) {
|
||||||
|
this.startProcessButtonLabel = startLabel?.value?.trim()?.length > 0 ? startLabel.value.trim() : this.defaultStartProcessButtonLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (displayCancel) {
|
||||||
|
this.showCancelButton = displayCancel?.value === 'true' && this.showCancelButton;
|
||||||
|
}
|
||||||
|
if (cancelLabel) {
|
||||||
|
this.cancelButtonLabel = cancelLabel?.value?.trim()?.length > 0 ? cancelLabel.value.trim() : this.defaultCancelProcessButtonLabel;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this.isFormCloudLoaded = false;
|
this.isFormCloudLoaded = false;
|
||||||
this.processPayloadCloud.processDefinitionKey = processDefinitionCurrent.key;
|
this.processPayloadCloud.processDefinitionKey = processDefinitionCurrent.key;
|
||||||
|
@ -125,4 +125,29 @@ describe('StartProcessCloudService', () => {
|
|||||||
expect(requestSpy.calls.mostRecent().args[0]).toContain(`${appName}/rb/v1/process-definitions/${processDefinitionId}/static-values`);
|
expect(requestSpy.calls.mostRecent().args[0]).toContain(`${appName}/rb/v1/process-definitions/${processDefinitionId}/static-values`);
|
||||||
expect(requestSpy.calls.mostRecent().args[1].httpMethod).toBe('GET');
|
expect(requestSpy.calls.mostRecent().args[1].httpMethod).toBe('GET');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should transform the response into task variables when retrieving the constant values for the start event', async () => {
|
||||||
|
const appName = 'test-app';
|
||||||
|
const processDefinitionId = 'processDefinitionId';
|
||||||
|
const requestSpy = spyOn(adfHttpClient, 'request');
|
||||||
|
requestSpy.and.returnValue(Promise.resolve({ constant1: 'value', constant2: '0', constant3: 'true' }));
|
||||||
|
|
||||||
|
const result = await service.getStartEventConstants(appName, processDefinitionId).toPromise();
|
||||||
|
|
||||||
|
expect(result.length).toEqual(3);
|
||||||
|
expect(result[0].name).toEqual('constant1');
|
||||||
|
expect(result[0].id).toEqual('constant1');
|
||||||
|
expect(result[0].value).toEqual('value');
|
||||||
|
expect(result[0].type).toEqual('string');
|
||||||
|
expect(result[1].name).toEqual('constant2');
|
||||||
|
expect(result[1].id).toEqual('constant2');
|
||||||
|
expect(result[1].value).toEqual('0');
|
||||||
|
expect(result[1].type).toEqual('string');
|
||||||
|
expect(result[2].name).toEqual('constant3');
|
||||||
|
expect(result[2].id).toEqual('constant3');
|
||||||
|
expect(result[2].value).toEqual('true');
|
||||||
|
expect(result[2].type).toEqual('string');
|
||||||
|
expect(requestSpy.calls.mostRecent().args[0]).toContain(`${appName}/rb/v1/process-definitions/${processDefinitionId}/constant-values`);
|
||||||
|
expect(requestSpy.calls.mostRecent().args[1].httpMethod).toBe('GET');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -119,4 +119,26 @@ export class StartProcessCloudService extends BaseCloudService {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the constants mapped to the start form of a process definition.
|
||||||
|
*
|
||||||
|
* @param appName Name of the app
|
||||||
|
* @param processDefinitionId ID of the target process definition
|
||||||
|
* @returns Constants values for the start event
|
||||||
|
*/
|
||||||
|
getStartEventConstants(appName: string, processDefinitionId: string): Observable<TaskVariableCloud[]> {
|
||||||
|
const apiUrl = `${this.getBasePath(appName)}/rb/v1/process-definitions/${processDefinitionId}/constant-values`;
|
||||||
|
return this.get(apiUrl).pipe(
|
||||||
|
map((res: { [key: string]: any }) => {
|
||||||
|
const result = [];
|
||||||
|
if (res) {
|
||||||
|
Object.keys(res).forEach((constant) =>
|
||||||
|
result.push(new TaskVariableCloud({ name: constant, value: res[constant], type: 'string' }))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user