Skip to content

Commit f29e020

Browse files
committed
[NAE-1684] Frontend component for data field caseRef
- little refactor
1 parent 4be5f89 commit f29e020

File tree

9 files changed

+253
-147
lines changed

9 files changed

+253
-147
lines changed
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
import {AfterViewInit, Component, Input} from '@angular/core';
2+
import {
3+
PetriflowArc,
4+
PetriflowCanvasConfigurationService,
5+
PetriflowCanvasFactoryService,
6+
PetriflowCanvasService,
7+
PetriflowInhibitorArc,
8+
PetriflowPlace,
9+
PetriflowPlaceTransitionArc, PetriflowReadArc,
10+
PetriflowResetArc,
11+
PetriflowTransition, PetriflowTransitionPlaceArc
12+
} from '@netgrif/petriflow.svg';
13+
import {
14+
Arc,
15+
InhibitorArc,
16+
ReadArc,
17+
RegularPlaceTransitionArc,
18+
RegularTransitionPlaceArc,
19+
ResetArc
20+
} from '@netgrif/petri.svg';
21+
import {CaseRefField} from './models/case-ref-field';
22+
import {PetriNetResourceService} from '../../resources/engine-endpoint/petri-net-resource.service';
23+
import {CaseResourceService} from '../../resources/engine-endpoint/case-resource.service';
24+
import {TransitionImport} from '../../resources/interface/transition-import';
25+
import {PlaceImport} from '../../resources/interface/place-import';
26+
import {ArcImport} from '../../resources/interface/arc-import';
27+
import {ArcType} from '../../resources/interface/arc-type';
28+
29+
@Component({
30+
selector: 'ncc-abstract-case-ref-field',
31+
template: ''
32+
})
33+
export abstract class AbstractCaseRefFieldComponent implements AfterViewInit {
34+
35+
@Input() public dataField: CaseRefField;
36+
37+
constructor(protected _petriflowCanvasService: PetriflowCanvasService, protected _petriflowFactoryService: PetriflowCanvasFactoryService,
38+
protected _petriflowConfigService: PetriflowCanvasConfigurationService, protected _caseResourceService: CaseResourceService,
39+
protected _petriNetResourceService: PetriNetResourceService){
40+
}
41+
42+
ngAfterViewInit(): void {
43+
this._petriNetResourceService.getNetByCaseId(this.dataField.value).subscribe(net => {
44+
if (net) {
45+
const trans: Array<PetriflowTransition> = [];
46+
const places: Array<PetriflowPlace> = [];
47+
let minX: number = Number.MAX_SAFE_INTEGER;
48+
let minY: number = Number.MAX_SAFE_INTEGER;
49+
net.transitions.forEach((value) => {
50+
trans.push(this.createTransitions(value));
51+
minX = Math.min(minX, value.position.x);
52+
minY = Math.min(minY, value.position.y);
53+
})
54+
net.places.forEach((value) => {
55+
places.push(this.createPlace(value));
56+
minX = Math.min(minX, value.position.x);
57+
minY = Math.min(minY, value.position.y);
58+
})
59+
net.arcs.forEach((arc) => {
60+
this.createArcs(trans, places, arc);
61+
arc.breakpoints?.forEach(value => {
62+
minX = Math.min(minX, value.x);
63+
minY = Math.min(minY, value.y);
64+
});
65+
});
66+
this._petriflowCanvasService.panzoom?.moveTo(-minX+20, -minY+20);
67+
setTimeout(() => {
68+
this._petriflowCanvasService.panzoom?.pause();
69+
})
70+
}
71+
});
72+
}
73+
74+
protected createTransitions(value: TransitionImport): PetriflowTransition {
75+
const transition = this._petriflowFactoryService.createTransition(new DOMPoint(value.position.x, value.position.y));
76+
transition.changeId(value.stringId);
77+
this._petriflowConfigService.addTransitionEvents(transition);
78+
return transition;
79+
}
80+
81+
protected createPlace(value: PlaceImport): PetriflowPlace {
82+
const place = this._petriflowFactoryService.createPlace(value.tokens, new DOMPoint(value.position.x, value.position.y));
83+
place.changeId(value.stringId);
84+
this._petriflowConfigService.addPlaceEvents(place);
85+
return place;
86+
}
87+
88+
protected createArcs(trans: Array<PetriflowTransition>, places: Array<PetriflowPlace>, arc: ArcImport) {
89+
let source: PetriflowPlace | PetriflowTransition = trans.find(value => value.canvasElement.label.textContent === arc.sourceId);
90+
let destination: PetriflowPlace | PetriflowTransition;
91+
if (source === undefined) {
92+
source = places.find(value => value.canvasElement.label.textContent === arc.sourceId);
93+
destination = trans.find(value => value.canvasElement.label.textContent === arc.destinationId);
94+
} else {
95+
destination = places.find(value => value.canvasElement.label.textContent === arc.destinationId);
96+
}
97+
if (source === undefined || destination === undefined) {
98+
console.error("Can't find source or destination for arc [" + arc.importId + "]");
99+
} else {
100+
const newArc: Arc = this.createArc(arc, source, destination);
101+
const petriflowArc: PetriflowArc<Arc> = this.createPetriflowArc(arc, newArc, source);
102+
this._petriflowCanvasService.canvas.container.appendChild(newArc.container);
103+
this._petriflowCanvasService.petriflowElementsCollection.arcs.push(petriflowArc);
104+
}
105+
}
106+
107+
protected createArc(arc: ArcImport, source: PetriflowTransition | PetriflowPlace, destination: PetriflowPlace | PetriflowTransition) {
108+
if (source instanceof PetriflowPlace) {
109+
switch (arc.type) {
110+
case ArcType.ARC: {
111+
return this._petriflowFactoryService.createArc(RegularPlaceTransitionArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity);
112+
}
113+
case ArcType.RESET: {
114+
return this._petriflowFactoryService.createArc(ResetArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity);
115+
}
116+
case ArcType.INHIBITOR: {
117+
return this._petriflowFactoryService.createArc(InhibitorArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity);
118+
}
119+
case ArcType.READ: {
120+
return this._petriflowFactoryService.createArc(ReadArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity);
121+
}
122+
default: {
123+
return undefined;
124+
}
125+
}
126+
} else if (arc.type === ArcType.ARC) {
127+
return this._petriflowFactoryService.createArc(RegularTransitionPlaceArc, source.canvasElement, destination.canvasElement, arc.breakpoints, arc.multiplicity);
128+
} else {
129+
return undefined;
130+
}
131+
}
132+
133+
protected createPetriflowArc(arc: ArcImport, newArc: Arc, source: PetriflowTransition | PetriflowPlace) {
134+
if (source instanceof PetriflowPlace) {
135+
switch (arc.type) {
136+
case ArcType.ARC: {
137+
return this._petriflowFactoryService.createArc(PetriflowPlaceTransitionArc, newArc);
138+
}
139+
case ArcType.RESET: {
140+
return this._petriflowFactoryService.createArc(PetriflowResetArc, newArc);
141+
}
142+
case ArcType.INHIBITOR: {
143+
return this._petriflowFactoryService.createArc(PetriflowInhibitorArc, newArc);
144+
}
145+
case ArcType.READ: {
146+
return this._petriflowFactoryService.createArc(PetriflowReadArc, newArc);
147+
}
148+
default: {
149+
return undefined;
150+
}
151+
}
152+
} else if (arc.type === ArcType.ARC) {
153+
return this._petriflowFactoryService.createArc(PetriflowTransitionPlaceArc, newArc);
154+
} else {
155+
return undefined;
156+
}
157+
}
158+
}

projects/netgrif-components-core/src/lib/data-fields/data-fields.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {NgxMatDatetimePickerModule} from '@angular-material-components/datetime-
1111
import {NgxMatMomentModule} from '@angular-material-components/moment-adapter';
1212
import {TranslateLibModule} from '../translate/translate-lib.module';
1313
import {DateAdapter} from '@angular/material/core';
14+
import {PetriflowCanvasModule} from '@netgrif/petriflow.svg';
1415

1516
@NgModule({
1617
imports: [
@@ -23,7 +24,8 @@ import {DateAdapter} from '@angular/material/core';
2324
ReactiveFormsModule,
2425
NgxMatDatetimePickerModule,
2526
NgxMatMomentModule,
26-
TranslateLibModule
27+
TranslateLibModule,
28+
PetriflowCanvasModule
2729
],
2830
providers: [
2931
{provide: DateAdapter, useClass: CustomDateAdapter}

projects/netgrif-components-core/src/lib/data-fields/public-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export * from './i18n-field/abstract-i18n-field.component';
3737
export * from './i18n-field/i18n-text-field/abstract-i18n-text-field.component';
3838
export * from './i18n-field/i18n-divider-field/abstract-i18n-divider-field.component';
3939
export * from './i18n-field/abstract-i18n-errors.component';
40+
export * from './case-ref-field/abstract-case-ref-field.component';
4041

4142
/* Class */
4243
export * from './models/abstract-data-field';

projects/netgrif-components-core/src/lib/resources/engine-endpoint/petri-net-resource.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,11 @@ export class PetriNetResourceService extends AbstractResourceService {
173173
}
174174

175175
/**
176-
* get One Net by ID
176+
* get One Net by case ID
177177
*
178178
* **Request Type:** GET
179179
*
180-
* **Request URL:** {{baseUrl}}/api/petrinet/{id}
180+
* **Request URL:** {{baseUrl}}/api/petrinet/case/{id}
181181
*/
182182
public getNetByCaseId(caseId: string, params?: Params): Observable<PetriNetImport> {
183183
return this._resourceProvider.get$('petrinet/case/' + caseId, this.SERVER_URL, params)
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {Position} from './position';
2+
import {ArcType} from './arc-type';
23

34
export interface ArcImport {
45
destinationId: string;
@@ -7,5 +8,5 @@ export interface ArcImport {
78
multiplicity: number;
89
stringId: string;
910
breakpoints: Array<Position>;
10-
type: string;
11+
type: ArcType;
1112
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export enum ArcType {
2+
ARC = 'arc',
3+
RESET = 'reset',
4+
INHIBITOR = 'inhibitor',
5+
READ = 'read'
6+
}

projects/netgrif-components-core/src/lib/resources/public-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export * from './interface/place-import';
4949
export * from './interface/transition-import';
5050
export * from './interface/position';
5151
export * from './interface/petri-net-import';
52+
export * from './interface/arc-type';
5253
export * from './types/nae-date-type';
5354

5455
/* ABSTRACTIONS */
Lines changed: 72 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,78 @@
1-
import { ComponentFixture, TestBed } from '@angular/core/testing';
2-
3-
import { CaseRefFieldComponent } from './case-ref-field.component';
1+
import {ComponentFixture, TestBed} from '@angular/core/testing';
2+
import {
3+
MaterialModule,
4+
TranslateLibModule,
5+
AuthenticationMethodService,
6+
MockAuthenticationMethodService,
7+
AuthenticationService,
8+
MockAuthenticationService,
9+
ConfigurationService,
10+
TestConfigurationService,
11+
CaseRefField,
12+
PetriNetResourceService
13+
} from '@netgrif/components-core';
14+
import {CaseRefFieldComponent} from './case-ref-field.component';
15+
import {AngularResizeEventModule} from 'angular-resize-event';
16+
import {HttpClientTestingModule} from '@angular/common/http/testing';
17+
import {NoopAnimationsModule} from '@angular/platform-browser/animations';
18+
import {PetriflowCanvasModule} from '@netgrif/petriflow.svg';
19+
import {Component} from '@angular/core';
20+
import {of} from 'rxjs';
421

522
describe('CaseRefFieldComponent', () => {
6-
let component: CaseRefFieldComponent;
7-
let fixture: ComponentFixture<CaseRefFieldComponent>;
23+
let component: CaseRefFieldComponent;
24+
let fixture: ComponentFixture<TestWrapperComponent>;
25+
26+
beforeEach(async () => {
27+
await TestBed.configureTestingModule({
28+
imports: [
29+
MaterialModule,
30+
AngularResizeEventModule,
31+
TranslateLibModule,
32+
HttpClientTestingModule,
33+
NoopAnimationsModule,
34+
PetriflowCanvasModule,
835

9-
beforeEach(async () => {
10-
await TestBed.configureTestingModule({
11-
declarations: [ CaseRefFieldComponent ]
12-
})
13-
.compileComponents();
14-
});
36+
],
37+
providers: [
38+
{provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService},
39+
{provide: AuthenticationService, useClass: MockAuthenticationService},
40+
{provide: ConfigurationService, useClass: TestConfigurationService},
41+
{provide: PetriNetResourceService, useClass: MyPetriNetResource},
42+
],
43+
declarations: [CaseRefFieldComponent]
44+
})
45+
.compileComponents();
46+
fixture = TestBed.createComponent(TestWrapperComponent);
47+
component = fixture.debugElement.children[0].componentInstance;
48+
fixture.detectChanges();
49+
});
1550

16-
beforeEach(() => {
17-
fixture = TestBed.createComponent(CaseRefFieldComponent);
18-
component = fixture.componentInstance;
19-
fixture.detectChanges();
20-
});
51+
it('should create', () => {
52+
expect(component).toBeTruthy();
53+
});
2154

22-
it('should create', () => {
23-
expect(component).toBeTruthy();
24-
});
55+
afterEach(() => {
56+
TestBed.resetTestingModule();
57+
});
2558
});
59+
60+
@Component({
61+
selector: 'nc-test-wrapper',
62+
template: '<nc-case-ref-field [dataField]="field"></nc-case-ref-field>'
63+
})
64+
class TestWrapperComponent {
65+
field = new CaseRefField('', '', '', {
66+
required: true,
67+
});
68+
}
69+
70+
class MyPetriNetResource {
71+
public getNetByCaseId(caseId: string) {
72+
return of({
73+
transitions: [],
74+
places: [],
75+
arcs: []
76+
});
77+
}
78+
}

0 commit comments

Comments
 (0)