forked from bpmn-io/bpmn-js-example-angular
-
Notifications
You must be signed in to change notification settings - Fork 0
/
diagram.component.ts
114 lines (101 loc) · 2.6 KB
/
diagram.component.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import {
AfterContentInit,
Component,
ElementRef,
Input,
OnChanges,
OnDestroy,
OnInit,
Output,
ViewChild,
SimpleChanges,
EventEmitter
} from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { map, switchMap } from 'rxjs/operators';
/**
* You may include a different variant of BpmnJS:
*
* bpmn-viewer - displays BPMN diagrams without the ability
* to navigate them
* bpmn-modeler - bootstraps a full-fledged BPMN editor
*/
import * as BpmnJS from 'bpmn-js/dist/bpmn-modeler.production.min.js';
import { from, Observable, Subscription } from 'rxjs';
@Component({
selector: 'app-diagram',
template: `
<div #ref class="diagram-container"></div>
`,
styles: [
`
.diagram-container {
height: 100%;
width: 100%;
}
`
]
})
export class DiagramComponent implements AfterContentInit, OnChanges, OnDestroy, OnInit {
@ViewChild('ref', { static: true }) private el: ElementRef;
@Input() private url?: string;
@Output() private importDone: EventEmitter<any> = new EventEmitter();
private bpmnJS: BpmnJS = new BpmnJS();
constructor(private http: HttpClient) {
this.bpmnJS.on('import.done', ({ error }) => {
if (!error) {
this.bpmnJS.get('canvas').zoom('fit-viewport');
}
});
}
ngAfterContentInit(): void {
this.bpmnJS.attachTo(this.el.nativeElement);
}
ngOnInit(): void {
if (this.url) {
this.loadUrl(this.url);
}
}
ngOnChanges(changes: SimpleChanges) {
// re-import whenever the url changes
if (changes.url) {
this.loadUrl(changes.url.currentValue);
}
}
ngOnDestroy(): void {
this.bpmnJS.destroy();
}
/**
* Load diagram from URL and emit completion event
*/
loadUrl(url: string): Subscription {
return (
this.http.get(url, { responseType: 'text' }).pipe(
switchMap((xml: string) => this.importDiagram(xml)),
map(result => result.warnings),
).subscribe(
(warnings) => {
this.importDone.emit({
type: 'success',
warnings
});
},
(err) => {
this.importDone.emit({
type: 'error',
error: err
});
}
)
);
}
/**
* Creates a Promise to import the given XML into the current
* BpmnJS instance, then returns it as an Observable.
*
* @see https://github.com/bpmn-io/bpmn-js-callbacks-to-promises#importxml
*/
private importDiagram(xml: string): Observable<{warnings: Array<any>}> {
return from(this.bpmnJS.importXML(xml) as Promise<{warnings: Array<any>}>);
}
}