Skip to content

Commit 4341b11

Browse files
committed
[NAE-1684] Frontend component for data field caseRef
- add highlighting - add error handling - add new translations
1 parent f29e020 commit 4341b11

File tree

11 files changed

+129
-21
lines changed

11 files changed

+129
-21
lines changed

projects/netgrif-components-core/src/assets/i18n/de.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,8 @@
245245
"maxFilesExceeded": "Die maximale Anzahl hochladbarer Dateien ist überschritten: ",
246246
"maxFilesSizeExceeded": "Die maximale Größe der hochgeladenen Dateien wird überschritten: ",
247247
"notSelectedUser": "Es wurde kein Benutzer ausgewählt",
248-
"userAssigned": "Benutzer {{userName}} wurde zugewiesen"
248+
"userAssigned": "Benutzer {{userName}} wurde zugewiesen",
249+
"caseNetGetFailed": "Das Abrufen des Fallnetzes ist fehlgeschlagen"
249250
},
250251
"values": {
251252
"boolean": {

projects/netgrif-components-core/src/assets/i18n/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,8 @@
245245
"maxFilesExceeded": "Maximum number of uploadable files exceeded: ",
246246
"maxFilesSizeExceeded": "The maximum size of uploaded files is exceeded: ",
247247
"notSelectedUser": "No user has been selected",
248-
"userAssigned": "User {{userName}} was assigned"
248+
"userAssigned": "User {{userName}} was assigned",
249+
"caseNetGetFailed": "Getting case Net failed"
249250
},
250251
"values": {
251252
"boolean": {

projects/netgrif-components-core/src/assets/i18n/sk.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,8 @@
245245
"maxFilesExceeded": "Je presiahnutý maximálny počet nahratých súborov: ",
246246
"maxFilesSizeExceeded": "Je presiahnutá maximálna veľkosť nahrávaných súborov: ",
247247
"notSelectedUser": "Nebol vybraný žiadny používateľ",
248-
"userAssigned": "Používateľ {{userName}} bol pridelený"
248+
"userAssigned": "Používateľ {{userName}} bol pridelený",
249+
"caseNetGetFailed": "Načítanie siete podľa prípadu zlyhalo"
249250
},
250251
"values": {
251252
"boolean": {

projects/netgrif-components-core/src/lib/data-fields/case-ref-field/abstract-case-ref-field.component.ts

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
} from '@netgrif/petriflow.svg';
1313
import {
1414
Arc,
15-
InhibitorArc,
15+
InhibitorArc, Place,
1616
ReadArc,
1717
RegularPlaceTransitionArc,
1818
RegularTransitionPlaceArc,
@@ -25,6 +25,10 @@ import {TransitionImport} from '../../resources/interface/transition-import';
2525
import {PlaceImport} from '../../resources/interface/place-import';
2626
import {ArcImport} from '../../resources/interface/arc-import';
2727
import {ArcType} from '../../resources/interface/arc-type';
28+
import {PetriNetImport} from '../../resources/interface/petri-net-import';
29+
import {LoggerService} from '../../logger/services/logger.service';
30+
import {SnackBarService} from '../../snack-bar/services/snack-bar.service';
31+
import {TranslateService} from '@ngx-translate/core';
2832

2933
@Component({
3034
selector: 'ncc-abstract-case-ref-field',
@@ -36,14 +40,16 @@ export abstract class AbstractCaseRefFieldComponent implements AfterViewInit {
3640

3741
constructor(protected _petriflowCanvasService: PetriflowCanvasService, protected _petriflowFactoryService: PetriflowCanvasFactoryService,
3842
protected _petriflowConfigService: PetriflowCanvasConfigurationService, protected _caseResourceService: CaseResourceService,
39-
protected _petriNetResourceService: PetriNetResourceService){
43+
protected _petriNetResourceService: PetriNetResourceService, protected _log: LoggerService, protected _snackBar: SnackBarService,
44+
protected _translate: TranslateService) {
4045
}
4146

4247
ngAfterViewInit(): void {
4348
this._petriNetResourceService.getNetByCaseId(this.dataField.value).subscribe(net => {
4449
if (net) {
4550
const trans: Array<PetriflowTransition> = [];
4651
const places: Array<PetriflowPlace> = [];
52+
const arcs: Array<PetriflowArc<any>> = [];
4753
let minX: number = Number.MAX_SAFE_INTEGER;
4854
let minY: number = Number.MAX_SAFE_INTEGER;
4955
net.transitions.forEach((value) => {
@@ -57,17 +63,30 @@ export abstract class AbstractCaseRefFieldComponent implements AfterViewInit {
5763
minY = Math.min(minY, value.position.y);
5864
})
5965
net.arcs.forEach((arc) => {
60-
this.createArcs(trans, places, arc);
66+
arcs.push(this.createArcs(trans, places, arc, net));
6167
arc.breakpoints?.forEach(value => {
6268
minX = Math.min(minX, value.x);
6369
minY = Math.min(minY, value.y);
6470
});
6571
});
66-
this._petriflowCanvasService.panzoom?.moveTo(-minX+20, -minY+20);
67-
setTimeout(() => {
68-
this._petriflowCanvasService.panzoom?.pause();
69-
})
72+
trans.forEach(value => {
73+
if (net.assignedTasks.includes(value.canvasElement.label.textContent)) {
74+
value.activate();
75+
}
76+
if (this.isEnabled(value, places, arcs)) {
77+
value.canvasElement.element.classList.add('svg-transition-enabled');
78+
}
79+
});
80+
this._petriflowCanvasService.panzoom?.moveTo(-minX + 20, -minY + 20);
81+
if (this.dataField.component?.properties?.lock === 'true') {
82+
setTimeout(() => {
83+
this._petriflowCanvasService.panzoom?.pause();
84+
})
85+
}
7086
}
87+
}, error => {
88+
this._log.error('Getting net by Case ID failed', error);
89+
this._snackBar.openErrorSnackBar(this._translate.instant('dataField.snackBar.caseNetGetFailed'));
7190
});
7291
}
7392

@@ -85,23 +104,38 @@ export abstract class AbstractCaseRefFieldComponent implements AfterViewInit {
85104
return place;
86105
}
87106

88-
protected createArcs(trans: Array<PetriflowTransition>, places: Array<PetriflowPlace>, arc: ArcImport) {
107+
protected createArcs(trans: Array<PetriflowTransition>, places: Array<PetriflowPlace>, arc: ArcImport, net: PetriNetImport) {
89108
let source: PetriflowPlace | PetriflowTransition = trans.find(value => value.canvasElement.label.textContent === arc.sourceId);
90109
let destination: PetriflowPlace | PetriflowTransition;
110+
let activable: boolean = false;
91111
if (source === undefined) {
92112
source = places.find(value => value.canvasElement.label.textContent === arc.sourceId);
93113
destination = trans.find(value => value.canvasElement.label.textContent === arc.destinationId);
114+
if (net.assignedTasks.includes(destination.canvasElement.label.textContent)) {
115+
source.activate();
116+
destination.activate();
117+
activable = true;
118+
}
94119
} else {
95120
destination = places.find(value => value.canvasElement.label.textContent === arc.destinationId);
121+
if (net.finishedTasks.includes(source.canvasElement.label.textContent)) {
122+
source.activate();
123+
activable = true;
124+
}
96125
}
97126
if (source === undefined || destination === undefined) {
98-
console.error("Can't find source or destination for arc [" + arc.importId + "]");
127+
this._log.error("Can't find source or destination for arc [" + arc.importId + "]");
99128
} else {
100129
const newArc: Arc = this.createArc(arc, source, destination);
130+
if (activable) {
131+
newArc.activate();
132+
}
101133
const petriflowArc: PetriflowArc<Arc> = this.createPetriflowArc(arc, newArc, source);
102134
this._petriflowCanvasService.canvas.container.appendChild(newArc.container);
103135
this._petriflowCanvasService.petriflowElementsCollection.arcs.push(petriflowArc);
136+
return petriflowArc;
104137
}
138+
return undefined
105139
}
106140

107141
protected createArc(arc: ArcImport, source: PetriflowTransition | PetriflowPlace, destination: PetriflowPlace | PetriflowTransition) {
@@ -155,4 +189,40 @@ export abstract class AbstractCaseRefFieldComponent implements AfterViewInit {
155189
return undefined;
156190
}
157191
}
192+
193+
protected isEnabled(t: PetriflowTransition, places: Array<PetriflowPlace>, arcs: Array<PetriflowArc<any>>): boolean {
194+
const testMarking: Map<string, number> = new Map();
195+
196+
for (const place of places) {
197+
testMarking.set(place.canvasElement.id, place.canvasElement.tokensCount);
198+
}
199+
for (const arc of arcs) {
200+
if (arc.element.end.id === t.canvasElement.id && (arc instanceof PetriflowInhibitorArc) && testMarking.get((arc.element.start as Place).id) >= parseInt(arc.element.multiplicity.data, 10)) {
201+
return false;
202+
}
203+
}
204+
for (const arc of arcs) {
205+
if (arc.element.end.id === t.canvasElement.id && (arc instanceof PetriflowReadArc) && testMarking.get((arc.element.start as Place).id) < parseInt(arc.element.multiplicity.data, 10)) {
206+
return false;
207+
}
208+
}
209+
for (const arc of arcs) {
210+
if (arc.element.end.id === t.canvasElement.id && arc instanceof PetriflowPlaceTransitionArc) {
211+
const place = testMarking.get((arc.element.start as Place).id)
212+
testMarking.set((arc.element.start as Place).id, place - parseInt(arc.element.multiplicity.data, 10));
213+
}
214+
}
215+
for (const place of testMarking.values()) {
216+
if (place < 0) {
217+
return false;
218+
}
219+
}
220+
221+
return true;
222+
}
223+
224+
public getHeight() {
225+
return (this.dataField.layout && this.dataField.layout.rows && this.dataField.layout.rows) > 1 ?
226+
this.dataField.layout.rows * CaseRefField.FIELD_HEIGHT : CaseRefField.FIELD_HEIGHT;
227+
}
158228
}

projects/netgrif-components-core/src/lib/data-fields/case-ref-field/models/case-ref-field.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {TextFieldView} from '../../text-field/models/text-field';
77

88
export class CaseRefField extends DataField<string> {
99

10+
public static FIELD_HEIGHT: number = 75;
11+
1012
constructor(stringId: string, title: string, value: string, behavior: Behavior, placeholder?: string,
1113
description?: string, layout?: Layout, validations?: Array<Validation>, _component?: Component, parentTaskId?: string) {
1214
super(stringId, title, value, behavior, placeholder, description, layout, validations, _component, parentTaskId);

projects/netgrif-components-core/src/lib/resources/interface/petri-net-import.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ export interface PetriNetImport {
66
transitions: Array<TransitionImport>;
77
places: Array<PlaceImport>;
88
arcs: Array<ArcImport>;
9+
assignedTasks: Array<string>;
10+
finishedTasks: Array<string>;
911
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<div class="outer">
2-
<petriflow-svg-canvas class="canvas"></petriflow-svg-canvas>
2+
<petriflow-svg-canvas class="canvas" [ngStyle]="{'min-height': getHeight()+'px'}"></petriflow-svg-canvas>
33
</div>

projects/netgrif-components/src/lib/data-fields/case-ref-field/case-ref-field.component.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
.outer {
22
display: flex;
3-
min-height: 300px;
43
width: 100%;
54
max-height: 100%;
65
}

projects/netgrif-components/src/lib/data-fields/case-ref-field/case-ref-field.component.spec.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import {
99
ConfigurationService,
1010
TestConfigurationService,
1111
CaseRefField,
12-
PetriNetResourceService
12+
PetriNetResourceService,
13+
SnackBarModule,
14+
ErrorSnackBarComponent
1315
} from '@netgrif/components-core';
1416
import {CaseRefFieldComponent} from './case-ref-field.component';
1517
import {AngularResizeEventModule} from 'angular-resize-event';
@@ -18,6 +20,7 @@ import {NoopAnimationsModule} from '@angular/platform-browser/animations';
1820
import {PetriflowCanvasModule} from '@netgrif/petriflow.svg';
1921
import {Component} from '@angular/core';
2022
import {of} from 'rxjs';
23+
import {BrowserDynamicTestingModule} from '@angular/platform-browser-dynamic/testing';
2124

2225
describe('CaseRefFieldComponent', () => {
2326
let component: CaseRefFieldComponent;
@@ -32,7 +35,7 @@ describe('CaseRefFieldComponent', () => {
3235
HttpClientTestingModule,
3336
NoopAnimationsModule,
3437
PetriflowCanvasModule,
35-
38+
SnackBarModule
3639
],
3740
providers: [
3841
{provide: AuthenticationMethodService, useClass: MockAuthenticationMethodService},
@@ -41,8 +44,7 @@ describe('CaseRefFieldComponent', () => {
4144
{provide: PetriNetResourceService, useClass: MyPetriNetResource},
4245
],
4346
declarations: [CaseRefFieldComponent]
44-
})
45-
.compileComponents();
47+
}).compileComponents();
4648
fixture = TestBed.createComponent(TestWrapperComponent);
4749
component = fixture.debugElement.children[0].componentInstance;
4850
fixture.detectChanges();
Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
import {Component} from '@angular/core';
2-
import {AbstractCaseRefFieldComponent, CaseResourceService, PetriNetResourceService} from '@netgrif/components-core';
2+
import {
3+
AbstractCaseRefFieldComponent,
4+
CaseResourceService,
5+
PetriNetResourceService,
6+
LoggerService,
7+
SnackBarService
8+
} from '@netgrif/components-core';
39
import {
410
PetriflowCanvasConfigurationService,
511
PetriflowCanvasFactoryService,
612
PetriflowCanvasService
713
} from '@netgrif/petriflow.svg';
14+
import {TranslateService} from '@ngx-translate/core';
815

916
@Component({
1017
selector: 'nc-case-ref-field',
@@ -15,8 +22,10 @@ export class CaseRefFieldComponent extends AbstractCaseRefFieldComponent {
1522

1623
constructor(protected _petriflowCanvasService: PetriflowCanvasService, protected _petriflowFactoryService: PetriflowCanvasFactoryService,
1724
protected _petriflowConfigService: PetriflowCanvasConfigurationService, protected _caseResourceService: CaseResourceService,
18-
protected _petriNetResourceService: PetriNetResourceService){
19-
super(_petriflowCanvasService, _petriflowFactoryService, _petriflowConfigService, _caseResourceService, _petriNetResourceService);
25+
protected _petriNetResourceService: PetriNetResourceService, protected _log: LoggerService, protected _snackBar: SnackBarService,
26+
protected _translate: TranslateService){
27+
super(_petriflowCanvasService, _petriflowFactoryService, _petriflowConfigService, _caseResourceService, _petriNetResourceService,
28+
_log, _snackBar, _translate);
2029
}
2130

2231
}

0 commit comments

Comments
 (0)