diff --git a/lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts b/lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts index ab64bcbb2a..fb96797d60 100644 --- a/lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts +++ b/lib/process-services-cloud/src/lib/process/process-filters/models/process-filter-cloud.model.ts @@ -47,6 +47,7 @@ export class ProcessFilterCloudModel { completedDateType: DateCloudFilterType | null; startedDateType: DateCloudFilterType | null; suspendedDateType: DateCloudFilterType | null; + includeSubprocesses: boolean | null; completedDate: Date | null; environmentId: string | null; showCounter: boolean; @@ -112,6 +113,7 @@ export class ProcessFilterCloudModel { this.completedDate = obj.completedDate || null; this._suspendedFrom = obj._suspendedFrom || null; this._suspendedTo = obj._suspendedTo || null; + this.includeSubprocesses = obj.includeSubprocesses || null; this.initArrayProperties(obj); } diff --git a/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.spec.ts b/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.spec.ts index c55b4e8157..cc11faa462 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.spec.ts +++ b/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.spec.ts @@ -677,6 +677,33 @@ describe('ProcessListCloudComponent', () => { expect(component.processListRequestNode.appVersion.length).toEqual(0); }); + it('should set includeSubprocesses to true in request node when input is true', () => { + spyOn(processListCloudService, 'fetchProcessList').and.returnValue(of(fakeProcessCloudList)); + component.includeSubprocesses = true; + component.ngAfterContentInit(); + component.reload(); + + expect(component.processListRequestNode.includeSubprocesses).toBeTrue(); + }); + + it('should set includeSubprocesses to false in request node when input is false', () => { + spyOn(processListCloudService, 'fetchProcessList').and.returnValue(of(fakeProcessCloudList)); + component.includeSubprocesses = false; + component.ngAfterContentInit(); + component.reload(); + + expect(component.processListRequestNode.includeSubprocesses).toBeFalse(); + }); + + it('should omit includeSubprocesses in request node when input is null', () => { + spyOn(processListCloudService, 'fetchProcessList').and.returnValue(of(fakeProcessCloudList)); + component.includeSubprocesses = null; + component.ngAfterContentInit(); + component.reload(); + + expect(component.processListRequestNode.includeSubprocesses).toBeNull(); + }); + it('should return the results if an application name is given', (done) => { spyOn(processListCloudService, 'fetchProcessList').and.returnValue(of(fakeProcessCloudList)); const appName = new SimpleChange(null, 'FAKE-APP-NAME', true); diff --git a/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts b/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts index f941eafa49..3bf8b805e3 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/process/process-list/components/process-list-cloud.component.ts @@ -290,6 +290,10 @@ export class ProcessListCloudComponent @Input() processVariables: ProcessVariableFilterModel[]; + /** Include subprocesses in the process list. */ + @Input() + includeSubprocesses: boolean | null = null; + /** Emitted when a row in the process list is clicked. */ @Output() rowClick: EventEmitter = new EventEmitter(); @@ -606,6 +610,7 @@ export class ProcessListCloudComponent completedTo: this.completedTo, suspendedFrom: this.suspendedFrom, suspendedTo: this.suspendedTo, + includeSubprocesses: this.includeSubprocesses, processVariableKeys: this.getVariableDefinitionsRequestModel(), processVariableFilters: this.processVariables }; diff --git a/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts b/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts index 8f506dc050..9672ba14fe 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts +++ b/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-query-request.model.ts @@ -102,6 +102,7 @@ export class ProcessListRequestModel { completedTo?: string; suspendedFrom?: string; suspendedTo?: string; + includeSubprocesses?: boolean; processVariableFilters?: ProcessVariableFilterModel[]; processVariableKeys?: string[]; @@ -130,6 +131,8 @@ export class ProcessListRequestModel { this.completedTo = obj.completedTo; this.suspendedFrom = obj.suspendedFrom; this.suspendedTo = obj.suspendedTo; + this.includeSubprocesses = obj.includeSubprocesses; + this.processVariableKeys = obj.processVariableKeys; this.processVariableFilters = obj.processVariableFilters; } diff --git a/lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.spec.ts b/lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.spec.ts index 599ad3a4ae..5c32c28841 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.spec.ts +++ b/lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.spec.ts @@ -174,6 +174,46 @@ describe('ProcessListCloudService', () => { expect(error).toBe('Appname not configured'); }); + + it('should include includeSubprocesses=true in body', async () => { + const processRequest = { + appName: 'fakeName', + pagination: { skipCount: 0, maxItems: 20 }, + includeSubprocesses: true + } as ProcessListRequestModel; + requestSpy.and.callFake(returnCallBody); + + const requestBodyParams = await firstValueFrom(service.fetchProcessList(processRequest)); + + expect(requestBodyParams).toEqual({ includeSubprocesses: true }); + }); + + it('should include includeSubprocesses=false in body', async () => { + const processRequest = { + appName: 'fakeName', + pagination: { skipCount: 0, maxItems: 20 }, + includeSubprocesses: false + } as ProcessListRequestModel; + requestSpy.and.callFake(returnCallBody); + + const requestBodyParams = await firstValueFrom(service.fetchProcessList(processRequest)); + + expect(requestBodyParams).toEqual({ includeSubprocesses: false }); + }); + + it('should omit includeSubprocesses when null', async () => { + const processRequest = { + appName: 'fakeName', + pagination: { skipCount: 0, maxItems: 20 }, + includeSubprocesses: null + } as unknown as ProcessListRequestModel; + requestSpy.and.callFake(returnCallBody); + + const requestBodyParams = await firstValueFrom(service.fetchProcessList(processRequest)); + + expect(requestBodyParams).toEqual({}); + expect(requestBodyParams.includeSubprocesses).toBeUndefined(); + }); }); describe('getAdminProcessRequest', () => { diff --git a/lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts b/lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts index 318ca76cd5..0f21244f0e 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts +++ b/lib/process-services-cloud/src/lib/process/process-list/services/process-list-cloud.service.ts @@ -118,7 +118,8 @@ export class ProcessListCloudService extends BaseCloudService { suspendedFrom: requestNode.suspendedFrom, suspendedTo: requestNode.suspendedTo, processVariableKeys: requestNode.processVariableKeys, - processVariableFilters: requestNode.processVariableFilters + processVariableFilters: requestNode.processVariableFilters, + includeSubprocesses: requestNode.includeSubprocesses }; if (requestNode.sorting) { @@ -147,7 +148,7 @@ export class ProcessListCloudService extends BaseCloudService { */ Object.keys(queryData).forEach((key) => { const value = queryData[key]; - const isValueEmpty = !value; + const isValueEmpty = value === undefined || value === null || value === ''; const isValueArrayWithEmptyValue = Array.isArray(value) && (value.length === 0 || value[0] === null); if (isValueEmpty || isValueArrayWithEmptyValue) { delete queryData[key];