[ACA-3687] Implement Process definition name filter dropdown in Process List (#5870)

* [ACA-3687] Implement Process definition name filtr

* Updated docs

* Updated mock
This commit is contained in:
Mercy Chrysolite
2020-07-30 14:00:39 +05:30
committed by GitHub
parent f6bf60eb49
commit 46f3f0f1d1
22 changed files with 100 additions and 14 deletions

View File

@@ -15,6 +15,7 @@
[appName]="editedFilter.appName"
[initiator]="editedFilter.initiator"
[processDefinitionId]="editedFilter.processDefinitionId"
[processDefinitionName]="editedFilter.processDefinitionName"
[processDefinitionKey]="editedFilter.processDefinitionKey"
[id]="editedFilter.processInstanceId"
[status]="editedFilter.status"

View File

@@ -63,6 +63,7 @@ when the process list is empty:
| presetColumn | `string` | | Custom preset column schema in JSON format. |
| processDefinitionId | `string` | "" | Filter the processes to display only the ones with this process definition ID. |
| processDefinitionKey | `string` | "" | Filter the processes to display only the ones with this process definition key. |
| processDefinitionName | `string` | "" | Filter the processes to display only the ones with this process definition name. |
| selectionMode | `string` | "single" | Row selection mode. Can be "none", "single" or "multiple". For multiple mode, you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. |
| showActions | `boolean` | false | Toggles the data actions column. |
| showContextMenu | `boolean` | false | Toggles custom context menu for the component. |

View File

@@ -51,7 +51,7 @@ Starts a process.
| cancel | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when the starting process is cancelled |
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when an error occurs. |
| formContentClicked | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ContentLinkModel`](../../../lib/core/form/components/widgets/core/content-link.model.ts)`>` | Emitted when form content is clicked. |
| processDefinitionSelection | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-definition-cloud.model.ts)`>` | Emitted when process definition selection changes. |
| processDefinitionSelection | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/models/process-definition-cloud.model.ts)`>` | Emitted when process definition selection changes. |
| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>` | Emitted when the process is successfully started. |
## Details

View File

@@ -18,7 +18,7 @@ processNameCloudPipe.transform('Example - %{processDefinition} - %{datetime}', n
| Name | Type | Default value | Description |
| ---- | ---- | ------------- | ----------- |
| processNameFormat | string | undefined | The process name format including the preferred identifiers to be used |
| selectedProcessDefinition | [`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-definition-cloud.model.ts) | undefined | (optional) The selected process definition |
| selectedProcessDefinition | [`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/models/process-definition-cloud.model.ts) | undefined | (optional) The selected process definition |
## Details

View File

@@ -23,6 +23,10 @@ Manages cloud process instances.
- _appName:_ `string` -
- **Returns** `string` -
- **getProcessDefinitions**(appName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/models/process-definition-cloud.model.ts)`[]>`<br/>
Gets the process definitions associated with an app.
- _appName:_ `string` - Name of the target app
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/models/process-definition-cloud.model.ts)`[]>` - Array of process definitions
- **getProcessInstanceById**(appName: `string`, processInstanceId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>`<br/>
Gets details of a process instance.
- _appName:_ `string` - Name of the app

View File

@@ -28,10 +28,10 @@ Gets process definitions and starts processes.
- _appName:_ `string` -
- **Returns** `string` -
- **getProcessDefinitions**(appName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-definition-cloud.model.ts)`[]>`<br/>
- **getProcessDefinitions**(appName: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/models/process-definition-cloud.model.ts)`[]>`<br/>
Gets the process definitions associated with an app.
- _appName:_ `string` - Name of the target app
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-definition-cloud.model.ts)`[]>` - Array of process definitions
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessDefinitionCloud`](../../../lib/process-services-cloud/src/lib/models/process-definition-cloud.model.ts)`[]>` - Array of process definitions
- **startCreatedProcess**(appName: `string`, createdProcessInstanceId: `string`, payload: [`ProcessPayloadCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-payload-cloud.model.ts)): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`ProcessInstanceCloud`](../../../lib/process-services-cloud/src/lib/process/start-process/models/process-instance-cloud.model.ts)`>`<br/>
Starts an already created process using the process instance id.
- _appName:_ `string` -

View File

@@ -17,6 +17,7 @@
"DESCRIPTION": "Description",
"LAST_MODIFIED": "Last Modified",
"PROCESS_NAME": "Process Name",
"PROCESS_DEFINITION_NAME": "Process Definition Name",
"PARENT_TASK_ID": "Parent Task Id",
"PROCESS_DEF_ID": "Process Definition Id",
"PROCESS_DEF_KEY": "Process Definition Key",
@@ -158,6 +159,7 @@
"SORT": "Sort",
"DIRECTION": "Direction",
"PROCESS_DEF_ID": "ProcessDefinitionId",
"PROCESS_DEF_NAME": "ProcessDefinitionName",
"PROCESS_DEF_KEY": "ProcessDefinitionKey",
"LAST_MODIFIED": "LastModified",
"LAST_MODIFIED_DATE_FORM": "LastModifiedFrom",

View File

@@ -35,6 +35,7 @@ import { AbstractControl } from '@angular/forms';
import { PROCESS_FILTERS_SERVICE_TOKEN } from '../../../services/cloud-token.service';
import { LocalPreferenceCloudService } from '../../../services/local-preference-cloud.service';
import { TranslateModule } from '@ngx-translate/core';
import { ProcessCloudService } from '../../services/process-cloud.service';
describe('EditProcessFilterCloudComponent', () => {
let component: EditProcessFilterCloudComponent;
@@ -42,6 +43,7 @@ describe('EditProcessFilterCloudComponent', () => {
let fixture: ComponentFixture<EditProcessFilterCloudComponent>;
let dialog: MatDialog;
let appsService: AppsProcessCloudService;
let processService: ProcessCloudService;
let getRunningApplicationsSpy: jasmine.Spy;
let getProcessFilterByIdSpy: jasmine.Spy;
@@ -74,6 +76,7 @@ describe('EditProcessFilterCloudComponent', () => {
component = fixture.componentInstance;
service = TestBed.inject(ProcessFilterCloudService);
appsService = TestBed.inject(AppsProcessCloudService);
processService = TestBed.inject(ProcessCloudService);
dialog = TestBed.inject(MatDialog);
spyOn(dialog, 'open').and.returnValue({
afterClosed() {
@@ -414,6 +417,22 @@ describe('EditProcessFilterCloudComponent', () => {
});
}));
it('should fetch process definitions when processDefinitionName filter property is set', async(() => {
const processSpy = spyOn(processService, 'getProcessDefinitions').and.returnValue(of([{ id: 'fake-id', name: 'fake-name' }]));
fixture.detectChanges();
component.filterProperties = ['processDefinitionName'];
fixture.detectChanges();
const processFilterIdChange = new SimpleChange(null, 'mock-process-filter-id', true);
component.ngOnChanges({ 'id': processFilterIdChange });
fixture.detectChanges();
const controller = component.editProcessFilterForm.get('processDefinitionName');
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(processSpy).toHaveBeenCalled();
expect(controller).toBeDefined();
});
}));
it('should display default sort properties', async(() => {
const processFilterIdChange = new SimpleChange(null, 'mock-process-filter-id', true);
component.ngOnChanges({ 'id': processFilterIdChange });

View File

@@ -30,6 +30,8 @@ import { TranslationService, UserPreferencesService, UserPreferenceValues } from
import { ProcessFilterCloudService } from '../services/process-filter-cloud.service';
import { ProcessFilterDialogCloudComponent } from './process-filter-dialog-cloud.component';
import { ApplicationInstanceModel } from '../../../app/models/application-instance.model';
import { ProcessCloudService } from '../../services/process-cloud.service';
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
@Component({
selector: 'adf-cloud-edit-process-filter',
@@ -42,6 +44,7 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes
public static ACTION_SAVE_AS = 'saveAs';
public static ACTION_DELETE = 'delete';
public static APPLICATION_NAME: string = 'appName';
public static PROCESS_DEFINITION_NAME: string = 'processDefinitionName';
public static APP_RUNNING_STATUS: string = 'RUNNING';
public static LAST_MODIFIED: string = 'lastModified';
public static SORT: string = 'sort';
@@ -108,6 +111,7 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes
EditProcessFilterCloudComponent.ACTION_DELETE
];
applicationNames: any[] = [];
processDefinitionNames: any[] = [];
formHasBeenChanged = false;
editProcessFilterForm: FormGroup;
processFilterProperties: ProcessFilterProperties[] = [];
@@ -124,7 +128,8 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes
private userPreferencesService: UserPreferencesService,
private translateService: TranslationService,
private processFilterCloudService: ProcessFilterCloudService,
private appsProcessCloudService: AppsProcessCloudService) {
private appsProcessCloudService: AppsProcessCloudService,
private processCloudService: ProcessCloudService) {
}
ngOnInit() {
@@ -198,10 +203,14 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes
createAndFilterProperties(): ProcessFilterProperties[] {
this.checkMandatoryFilterProperties();
if (this.checkForApplicationNameProperty()) {
if (this.checkForProperty(EditProcessFilterCloudComponent.APPLICATION_NAME)) {
this.applicationNames = [];
this.getRunningApplications();
}
if (this.checkForProperty(EditProcessFilterCloudComponent.PROCESS_DEFINITION_NAME)) {
this.processDefinitionNames = [];
this.getProcessDefinitions();
}
const defaultProperties = this.createProcessFilterProperties(this.processFilter);
let filteredProperties = defaultProperties.filter((filterProperty: ProcessFilterProperties) => this.isValidProperty(this.filterProperties, filterProperty));
if (!this.hasSortProperty()) {
@@ -219,8 +228,8 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes
}
}
checkForApplicationNameProperty(): boolean {
return this.filterProperties ? this.filterProperties.indexOf(EditProcessFilterCloudComponent.APPLICATION_NAME) >= 0 : false;
checkForProperty(property: string): boolean {
return this.filterProperties ? this.filterProperties.indexOf(property) >= 0 : false;
}
private isValidProperty(filterProperties: string[], filterProperty: ProcessFilterProperties): boolean {
@@ -316,6 +325,18 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes
});
}
getProcessDefinitions() {
this.processCloudService.getProcessDefinitions(this.appName)
.pipe(takeUntil(this.onDestroy$))
.subscribe((processDefinitions: ProcessDefinitionCloud[]) => {
if (processDefinitions && processDefinitions.length > 0) {
processDefinitions.map((processDefinition) => {
this.processDefinitionNames.push({ label: processDefinition.name, value: processDefinition.name });
});
}
});
}
executeFilterActions(action: ProcessFilterAction): void {
if (action.actionType === EditProcessFilterCloudComponent.ACTION_SAVE) {
this.save(action);
@@ -538,6 +559,13 @@ export class EditProcessFilterCloudComponent implements OnInit, OnChanges, OnDes
key: 'processName',
value: currentProcessFilter.processName || ''
}),
new ProcessFilterProperties({
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.PROCESS_DEF_NAME',
type: 'select',
key: 'processDefinitionName',
value: currentProcessFilter.processDefinitionName || '',
options: this.processDefinitionNames
}),
new ProcessFilterProperties({
label: 'ADF_CLOUD_EDIT_PROCESS_FILTER.LABEL.INITIATOR',
type: 'text',

View File

@@ -30,6 +30,7 @@ export class ProcessFilterCloudModel {
sort: string;
order: string;
processDefinitionId: string;
processDefinitionName: string;
processDefinitionKey: string;
lastModified: Date;
lastModifiedTo: Date;
@@ -51,6 +52,7 @@ export class ProcessFilterCloudModel {
this.sort = obj.sort || null;
this.order = obj.order || null;
this.processDefinitionId = obj.processDefinitionId || null;
this.processDefinitionName = obj.processDefinitionName || null;
this.processDefinitionKey = obj.processDefinitionKey || null;
this.lastModified = obj.lastModified || null;
this.lastModifiedTo = obj.lastModifiedTo || null;

View File

@@ -51,6 +51,7 @@ describe('ProcessFilterCloudService', () => {
order: 'DESC',
index: 2,
processName: 'process-name',
processDefinitionName: 'process-def-name',
processInstanceId: 'processinstanceid',
initiator: 'mockuser',
processDefinitionId: 'processDefid',

View File

@@ -67,6 +67,10 @@ export class ProcessListCloudComponent extends DataTableSchema implements OnChan
@Input()
processDefinitionId: string = '';
/** Filter the processes to display only the ones with this process definition name. */
@Input()
processDefinitionName: string = '';
/** Filter the processes to display only the ones with this process definition key. */
@Input()
processDefinitionKey: string = '';
@@ -291,6 +295,7 @@ export class ProcessListCloudComponent extends DataTableSchema implements OnChan
id: this.id,
name: this.name,
processDefinitionId: this.processDefinitionId,
processDefinitionName: this.processDefinitionName,
processDefinitionKey: this.processDefinitionKey,
status: this.status,
businessKey: this.businessKey,

View File

@@ -24,6 +24,7 @@ export class ProcessQueryCloudRequestModel {
id?: string;
name?: string;
processDefinitionId?: string;
processDefinitionName?: string;
processDefinitionKey?: string;
status?: string;
startDate?: string;
@@ -42,6 +43,7 @@ export class ProcessQueryCloudRequestModel {
this.id = obj.id;
this.name = obj.name;
this.processDefinitionId = obj.processDefinitionId;
this.processDefinitionName = obj.processDefinitionName;
this.processDefinitionKey = obj.processDefinitionKey;
this.status = obj.status;
this.startDate = obj.startDate;

View File

@@ -21,6 +21,7 @@ import { Observable, Subject, throwError } from 'rxjs';
import { map } from 'rxjs/operators';
import { ProcessInstanceCloud } from '../start-process/models/process-instance-cloud.model';
import { BaseCloudService } from '../../services/base-cloud.service';
import { ProcessDefinitionCloud } from '../../models/process-definition-cloud.model';
@Injectable({
providedIn: 'root'
@@ -57,6 +58,26 @@ export class ProcessCloudService extends BaseCloudService {
}
}
/**
* Gets the process definitions associated with an app.
* @param appName Name of the target app
* @returns Array of process definitions
*/
getProcessDefinitions(appName: string): Observable<ProcessDefinitionCloud[]> {
if (appName || appName === '') {
const url = `${this.getBasePath(appName)}/rb/v1/process-definitions`;
return this.get(url).pipe(
map((res: any) => {
return res.list.entries.map((processDefs) => new ProcessDefinitionCloud(processDefs.entry));
})
);
} else {
this.logService.error('AppName is mandatory for querying task');
return throwError('AppName not configured');
}
}
/**
* Cancels a process.
* @param appName Name of the app

View File

@@ -27,7 +27,7 @@ import { FormModel, ContentLinkModel } from '@alfresco/adf-core';
import { MatAutocompleteTrigger } from '@angular/material/autocomplete';
import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
import { debounceTime, takeUntil, switchMap, filter, distinctUntilChanged, tap } from 'rxjs/operators';
import { ProcessDefinitionCloud } from '../models/process-definition-cloud.model';
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
import { Subject, Observable } from 'rxjs';
import { TaskVariableCloud } from '../../../form/models/task-variable-cloud.model';
import { ProcessNameCloudPipe } from '../../../pipes/process-name-cloud.pipe';

View File

@@ -17,7 +17,7 @@
import { ProcessInstanceCloud } from '../models/process-instance-cloud.model';
import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
import { ProcessDefinitionCloud } from '../models/process-definition-cloud.model';
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
export const fakeProcessInstance: ProcessInstanceCloud = {
appName: 'simple-app',

View File

@@ -17,7 +17,6 @@
export * from './components/start-process-cloud.component';
export * from './models/process-definition-cloud.model';
export * from './models/process-instance-cloud.model';
export * from './models/process-payload-cloud.model';

View File

@@ -20,8 +20,8 @@ import { of, throwError } from 'rxjs';
import { setupTestBed, AlfrescoApiService } from '@alfresco/adf-core';
import { StartProcessCloudService } from './start-process-cloud.service';
import { fakeProcessPayload } from '../mock/start-process.component.mock';
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
import { HttpErrorResponse, HttpClientModule } from '@angular/common/http';
import { ProcessDefinitionCloud } from '../models/process-definition-cloud.model';
describe('StartProcessCloudService', () => {

View File

@@ -21,7 +21,7 @@ import { Observable, throwError } from 'rxjs';
import { map } from 'rxjs/operators';
import { ProcessInstanceCloud } from '../models/process-instance-cloud.model';
import { ProcessPayloadCloud } from '../models/process-payload-cloud.model';
import { ProcessDefinitionCloud } from '../models/process-definition-cloud.model';
import { ProcessDefinitionCloud } from '../../../models/process-definition-cloud.model';
import { BaseCloudService } from '../../../services/base-cloud.service';
@Injectable({

View File

@@ -26,3 +26,4 @@ export * from './lib/services/public-api';
export * from './lib/types';
export * from './lib/pipes/process-name-cloud.pipe';
export * from './lib/pipes/process-services-cloud-pipe.module';
export * from './lib/models/process-definition-cloud.model';

View File

@@ -8,7 +8,7 @@ var jsyaml = require("js-yaml");
var remark = require("remark");
var frontMatter = require("remark-frontmatter");
var mdCompact = require("mdast-util-compact");
var minimatch = require("Minimatch");
var minimatch = require("minimatch");
var si = require("./sourceInfoClasses");