Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import {
HeaderColumnType,
PetriNetReference,
WorkflowMetaField,
Author,
AllowedNetsServiceFactory,
SimpleFilter,
CaseViewService,
AllowedNetsService,
SearchService,
NAE_BASE_FILTER,
DeploymentState,
WorkflowViewService
} from '@netgrif/components-core';
import {BehaviorSubject} from 'rxjs';
Expand Down Expand Up @@ -84,7 +84,8 @@ export class PanelsComponent implements OnInit {
email: 'test@netgrif.com',
fullName: 'Test Testovič'
},
immediateData: []
immediateData: [],
deploymentState: DeploymentState.DEPLOYED
};
this.featuredFields$ = new BehaviorSubject<Array<HeaderColumn>>([
new HeaderColumn(HeaderColumnType.META, 'visualId', 'Visual ID', 'text'),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
Net,
SideMenuService,
SideMenuSize,
DeploymentState,
} from '@netgrif/components-core';
import {of} from 'rxjs';
import {NewCaseComponent, UserAssignComponent, FilterSelectorComponent} from '@netgrif/components';
Expand Down Expand Up @@ -40,7 +41,8 @@ export class SidemenuExampleComponent implements OnInit {
immediateData: [],
initials: 'EX',
title: 'Example Dummy Process',
version: '1.0.0'
version: '1.0.0',
deploymentState: DeploymentState.DEPLOYED
}),
new Net({
stringId: '999',
Expand All @@ -52,7 +54,8 @@ export class SidemenuExampleComponent implements OnInit {
immediateData: [],
initials: 'EXX',
title: 'Other Example Dummy Process',
version: '1.0.0'
version: '1.0.0',
deploymentState: DeploymentState.DEPLOYED
})])
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {User} from '../../user/models/user';
import {AssignPolicy, DataFocusPolicy, FinishPolicy} from '../../task-content/model/policy';
import {PermissionType} from '../../process/permissions';
import {Net} from '../../process/net';
import {DeploymentState} from "../../resources/interface/petri-net-reference";

describe('PermissionService', () => {
let permissionService: PermissionService;
Expand Down Expand Up @@ -271,7 +272,8 @@ describe('PermissionService', () => {
defaultCaseName: '',
initials: '',
version: '',
title: ''
title: '',
deploymentState: DeploymentState.DEPLOYED
});
net.permissions = {};
expect(permissionService.hasNetPermission(PermissionType.CREATE, net)).toBeFalse();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@ import {MockUserResourceService} from '../../utility/tests/mocks/mock-user-resou
import {AuthenticationMethodService} from '../../authentication/services/authentication-method.service';
import {ViewService} from '../../routing/view-service/view.service';
import {TestViewService} from '../../utility/tests/test-view-service';
import {ErrorSnackBarComponent} from '../../snack-bar/components/error-snack-bar/error-snack-bar.component';
import {SuccessSnackBarComponent} from '../../snack-bar/components/success-snack-bar/success-snack-bar.component';
import {BrowserDynamicTestingModule} from '@angular/platform-browser-dynamic/testing';
import {CaseMetaField} from './case-menta-enum';
import {MatSnackBarModule} from '@angular/material/snack-bar';
import {MatIconModule} from '@angular/material/icon';
Expand All @@ -34,6 +31,7 @@ import {SnackBarModule} from '../../snack-bar/snack-bar.module';
import {NAE_BASE_FILTER} from '../../search/models/base-filter-injection-token';
import {AllowedNetsService} from '../../allowed-nets/services/allowed-nets.service';
import {AllowedNetsServiceFactory} from '../../allowed-nets/services/factory/allowed-nets-service-factory';
import {DeploymentState} from '../../resources/interface/petri-net-reference';

describe('CaseHeaderService', () => {
let service: CaseHeaderService;
Expand Down Expand Up @@ -87,7 +85,8 @@ describe('CaseHeaderService', () => {
defaultCaseName: 'string',
createdDate: [2020, 1, 1, 10, 0],
author: {email: 'email', fullName: 'fullName'},
immediateData: [{stringId: 'string', title: 'string', type: 'string'}]
immediateData: [{stringId: 'string', title: 'string', type: 'string'}],
deploymentState: DeploymentState.DEPLOYED
}]);
expect(service.fieldsGroup.length).toEqual(2);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {TranslateService} from '@ngx-translate/core';
import {LoggerService} from '../../logger/services/logger.service';
import {HeaderColumn, HeaderColumnType} from '../../header/models/header-column';
import {WorkflowMetaField} from '../../header/workflow-header/workflow-meta-enum';
import {PetriNetReference} from '../../resources/interface/petri-net-reference';
import {DeploymentState, PetriNetReference} from '../../resources/interface/petri-net-reference';
import {RouterTestingModule} from '@angular/router/testing';
import {WorkflowViewService} from '../../view/workflow-view/workflow-view.service';
import {take} from 'rxjs/operators';
Expand Down Expand Up @@ -136,6 +136,7 @@ class TestWrapperComponent {
stringId: '',
title: '',
version: '',
uriNodeId: ''
uriNodeId: '',
deploymentState: DeploymentState.DEPLOYED
};
}
8 changes: 6 additions & 2 deletions projects/netgrif-components-core/src/lib/process/net.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {Net} from './net';
import {TestBed} from '@angular/core/testing';
import {DeploymentState} from "../resources/interface/petri-net-reference";

describe('Net', () => {
it('should create an instance', () => {
Expand All @@ -13,7 +14,8 @@ describe('Net', () => {
createdDate: [2020, 1, 1, 1, 1],
author: {email: 'mail', fullName: 'name'},
immediateData: [],
uriNodeId: 'string'
uriNodeId: 'string',
deploymentState: DeploymentState.DEPLOYED
})).toBeTruthy();
});

Expand All @@ -28,7 +30,8 @@ describe('Net', () => {
createdDate: [2020, 1, 1, 1, 1],
author: {email: 'mail', fullName: 'name'},
immediateData: [],
uriNodeId: 'string'
uriNodeId: 'string',
deploymentState: DeploymentState.DEPLOYED
});
expect(net.stringId).toEqual('true');
expect(net.title).toEqual('string');
Expand All @@ -42,6 +45,7 @@ describe('Net', () => {
expect(net.transitions).toEqual([]);
expect(net.transactions).toEqual([]);
expect(net.roles).toEqual([]);
expect(net.deploymentState).toEqual(DeploymentState.DEPLOYED);
});

afterEach(() => {
Expand Down
15 changes: 14 additions & 1 deletion projects/netgrif-components-core/src/lib/process/net.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {PetriNetReference} from '../resources/interface/petri-net-reference';
import {DeploymentState, PetriNetReference} from '../resources/interface/petri-net-reference';
import {Author} from '../resources/interface/author';
import {ImmediateData} from '../resources/interface/immediate-data';
import Transition from './transition';
Expand Down Expand Up @@ -67,6 +67,10 @@ export class Net implements PetriNetReferenceWithPermissions {
* @ignore
*/
private _permissions: Permissions;
/**
* @ignore
*/
private _deploymentState: DeploymentState;
/**
* @ignore
*/
Expand All @@ -84,6 +88,7 @@ export class Net implements PetriNetReferenceWithPermissions {
this._transactions = [];
this._roles = [];
this._uriNodeId = net.uriNodeId;
this._deploymentState = net.deploymentState;
}

get stringId(): string {
Expand Down Expand Up @@ -197,4 +202,12 @@ export class Net implements PetriNetReferenceWithPermissions {
set uriNodeId(uriNodeId: string) {
this._uriNodeId = uriNodeId;
}

get deploymentState(): DeploymentState {
return this._deploymentState;
}

set deploymentState(deploymentState: DeploymentState) {
this._deploymentState = deploymentState;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,5 +48,17 @@ export interface PetriNetReference {
* [ImmediateData]{@link ImmediateData}
*/
immediateData: Array<ImmediateData>;

/**
* Deployment state of the net
*/
deploymentState: DeploymentState;
}

export enum DeploymentState {
DRAFT = 'DRAFT',
DEPLOYED = 'DEPLOYED',
ARCHIVED = 'ARCHIVED',
TRASH = 'TRASH'
}

Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import {Net} from '../../../process/net';
import NetRole from '../../../process/netRole';
import {ImmediateData} from '../../../resources/interface/immediate-data';
import {Permissions} from '../../../process/permissions';
import {DeploymentState} from '../../../resources/interface/petri-net-reference';

/**
* A mock transition representation used by the {@link createMockNet} function to populate the mock net with mock transition objects
Expand Down Expand Up @@ -37,7 +38,8 @@ export function createMockNet(stringId = 'stringId',
email: '',
fullName: ''
},
immediateData
immediateData,
deploymentState: DeploymentState.DEPLOYED
});
net.roles = roles;
net.transitions = transitions.map(t => ({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import {Inject, Injectable, OnDestroy, Optional} from '@angular/core';
import {CaseResourceService} from '../../../resources/engine-endpoint/case-resource.service';
import {BehaviorSubject, Observable, of, Subject} from 'rxjs';
import {BehaviorSubject, Observable, of, Subject, Subscription} from 'rxjs';
import {HttpParams} from '@angular/common/http';
import {Case} from '../../../resources/interface/case';
import {LoggerService} from '../../../logger/services/logger.service';
import {SnackBarService} from '../../../snack-bar/services/snack-bar.service';
import {SearchService} from '../../../search/search-service/search.service';
import {TranslateService} from '@ngx-translate/core';
import {catchError, concatMap, filter, map, mergeMap, scan, switchMap, tap} from 'rxjs/operators';
import {catchError, concatMap, filter, map, mergeMap, scan, switchMap, take, tap} from 'rxjs/operators';
import {Pagination} from '../../../resources/interface/pagination';
import {CaseMetaField} from '../../../header/case-header/case-menta-enum';
import {PageLoadRequestContext} from '../../abstract/page-load-request-context';
Expand Down Expand Up @@ -37,6 +37,7 @@ import {PaginationParams} from '../../../utility/pagination/pagination-params';
import {createSortParam, PaginationSort} from '../../../utility/pagination/pagination-sort';
import {MatDialog} from '@angular/material/dialog';
import {NAE_NEW_CASE_DIALOG_COMPONENT} from '../../../dialog/injection-tokens';
import {DeploymentState} from "../../../resources/interface/petri-net-reference";

@Injectable()
export class CaseViewService extends AbstractSortableViewComponent implements OnDestroy {
Expand All @@ -54,6 +55,8 @@ export class CaseViewService extends AbstractSortableViewComponent implements On
protected _newCaseConfiguration: NewCaseConfiguration;
protected _paginationView: boolean = false;

protected _activeFilterSub: Subscription;

constructor(protected _allowedNetsService: AllowedNetsService,
protected _dialog: MatDialog,
protected _caseResourceService: CaseResourceService,
Expand All @@ -74,7 +77,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On
Object.assign(this._newCaseConfiguration, newCaseConfig);
}
this._loading$ = new LoadingWithFilterEmitter();
this._searchService.activeFilter$.subscribe(() => {
this._activeFilterSub = this._searchService.activeFilter$.subscribe(() => {
this.reload();
});
this._endOfData = false;
Expand Down Expand Up @@ -123,6 +126,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On
super.ngOnDestroy();
this._loading$.complete();
this._nextPage$.complete();
this._activeFilterSub?.unsubscribe();
}

public get loading(): boolean {
Expand Down Expand Up @@ -241,7 +245,7 @@ export class CaseViewService extends AbstractSortableViewComponent implements On
newCaseCreationConfiguration
},
});
dialogRef.afterClosed().subscribe($event => {
dialogRef.afterClosed().pipe(take(1)).subscribe($event => {
if ($event?.data) {
this._log.debug($event.message, $event.data);
this.reload();
Expand All @@ -257,47 +261,57 @@ export class CaseViewService extends AbstractSortableViewComponent implements On
isCaseTitleRequired: true
}): Observable<Case> {
const myCase = new Subject<Case>();
this.getNewCaseAllowedNets(newCaseCreationConfiguration.blockNets).subscribe((nets: Array<PetriNetReferenceWithPermissions>) => {
if (!nets || nets.length === 0) {
const errorMessage = this._translate.instant('side-menu.new-case.noNets');
this.getNewCaseAllowedNets(newCaseCreationConfiguration.blockNets).pipe(take(1)).subscribe({
next: (nets: Array<PetriNetReferenceWithPermissions>) => {
if (!nets || nets.length === 0) {
const errorMessage = this._translate.instant('side-menu.new-case.noNets');
this._snackBarService.openErrorSnackBar(errorMessage);
this._log.error('No nets available for case creation. Ensure the allowed nets configuration is correct.');
myCase.complete();
return;
}
this._caseResourceService.createCase({
title: null,
color: 'panel-primary-icon',
netId: nets[0].stringId
}).pipe(take(1)).subscribe({
next: (response: EventOutcomeMessageResource) => {
this._snackBarService.openSuccessSnackBar(this._translate.instant('side-menu.new-case.createCase')
+ ' ' + this._translate.instant('side-menu.new-case.defaultCaseName'));
this.reload();
myCase.next((response.outcome as CreateCaseEventOutcome).aCase);
myCase.complete();
},
error: error => {
const errorMessage = error.message ? error.message : this._translate.instant('side-menu.new-case.createCaseError');
this._snackBarService.openErrorSnackBar(errorMessage);
this._log.error('Error occurred during case creation: ' + errorMessage);
myCase.complete();
}
});
},
error: error => {
const errorMessage = error.message || this._translate.instant('side-menu.new-case.errorCreate');
this._log.error('Failed to fetch allowed nets. Error: ' + errorMessage);
this._snackBarService.openErrorSnackBar(errorMessage);
this._log.error('No nets available for case creation. Ensure the allowed nets configuration is correct.');
return;
}
this._caseResourceService.createCase({
title: null,
color: 'panel-primary-icon',
netId: nets[0].stringId
}).subscribe((response: EventOutcomeMessageResource) => {
this._snackBarService.openSuccessSnackBar(this._translate.instant('side-menu.new-case.createCase')
+ ' ' + this._translate.instant('side-menu.new-case.defaultCaseName'));
this.reload();
myCase.next((response.outcome as CreateCaseEventOutcome).aCase);
myCase.complete();
}, error => {
const errorMessage = error.message ? error.message : this._translate.instant('side-menu.new-case.createCaseError');
this._snackBarService.openErrorSnackBar(errorMessage);
this._log.error('Error occurred during case creation: ' + errorMessage);
});
}, error => {
const errorMessage = error.message || this._translate.instant('side-menu.new-case.errorCreate');
this._log.error('Failed to fetch allowed nets. Error: ' + errorMessage);
this._snackBarService.openErrorSnackBar(errorMessage);
});
return myCase;
}});
return myCase.asObservable();
}

public getNewCaseAllowedNets(blockNets: string[] = []): Observable<Array<PetriNetReferenceWithPermissions>> {
if (this._newCaseConfiguration.useCachedProcesses) {
return this._allowedNetsService.allowedNets$.pipe(
map(net => net.filter(n => blockNets.indexOf(n.identifier) === -1)),
map(net => net.filter(n => n.deploymentState === DeploymentState.DEPLOYED)),
map(net => net.filter(n => this._permissionService.hasNetPermission(PermissionType.CREATE, n)))
);
} else {
return this._allowedNetsService.allowedNets$.pipe(
switchMap(allowedNets => {
return this._processService.getNetReferences(allowedNets.map(net => net.identifier)).pipe(
map(net => net.filter(n => blockNets.indexOf(n.identifier) === -1)),
map(net => net.filter(n => n.deploymentState === DeploymentState.DEPLOYED)),
map(net => net.filter(n => this._permissionService.hasNetPermission(PermissionType.CREATE, n)))
);
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import {SetDataEventOutcome} from '../../../event/model/event-outcomes/data-outc
import {AssignTaskEventOutcome} from '../../../event/model/event-outcomes/task-outcomes/assign-task-event-outcome';
import {CreateCaseEventOutcome} from '../../../event/model/event-outcomes/case-outcomes/create-case-event-outcome';
import {createMockNet} from '../../../utility/tests/utility/create-mock-net';
import {DeploymentState} from "../../../resources/interface/petri-net-reference";


class MockTreeNode {
Expand Down Expand Up @@ -647,7 +648,8 @@ class TreeTestProcessService {
fullName: ''
},
immediateData: [],
uriNodeId: ''
uriNodeId: '',
deploymentState: DeploymentState.DEPLOYED
}));
}
}
Loading
Loading