-
Notifications
You must be signed in to change notification settings - Fork 14
/
app.js
142 lines (104 loc) · 3.61 KB
/
app.js
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import BpmnModeler from 'bpmn-js/lib/Modeler';
import { getBusinessObject } from 'bpmn-js/lib/util/ModelUtil';
import diagramXML from '../resources/diagram.bpmn';
import qaExtension from '../resources/qa';
const HIGH_PRIORITY = 1500;
const containerEl = document.getElementById('container'),
qualityAssuranceEl = document.getElementById('quality-assurance'),
suitabilityScoreEl = document.getElementById('suitability-score'),
lastCheckedEl = document.getElementById('last-checked'),
okayEl = document.getElementById('okay'),
formEl = document.getElementById('form'),
warningEl = document.getElementById('warning');
// hide quality assurance if user clicks outside
window.addEventListener('click', (event) => {
const { target } = event;
if (target === qualityAssuranceEl || qualityAssuranceEl.contains(target)) {
return;
}
qualityAssuranceEl.classList.add('hidden');
});
// create modeler
const bpmnModeler = new BpmnModeler({
container: containerEl,
moddleExtensions: {
qa: qaExtension
}
});
// import XML
bpmnModeler.importXML(diagramXML, (err) => {
if (err) {
console.error(err);
}
const moddle = bpmnModeler.get('moddle'),
modeling = bpmnModeler.get('modeling');
let analysisDetails,
businessObject,
element,
suitabilityScore;
// validate suitability score
function validate() {
const { value } = suitabilityScoreEl;
if (isNaN(value)) {
warningEl.classList.remove('hidden');
okayEl.disabled = true;
} else {
warningEl.classList.add('hidden');
okayEl.disabled = false;
}
}
// open quality assurance if user right clicks on element
bpmnModeler.on('element.contextmenu', HIGH_PRIORITY, (event) => {
event.originalEvent.preventDefault();
event.originalEvent.stopPropagation();
qualityAssuranceEl.classList.remove('hidden');
({ element } = event);
// ignore root element
if (!element.parent) {
return;
}
businessObject = getBusinessObject(element);
let { suitable } = businessObject;
suitabilityScoreEl.value = suitable ? suitable : '';
suitabilityScoreEl.focus();
analysisDetails = getExtensionElement(businessObject, 'qa:AnalysisDetails');
lastCheckedEl.textContent = analysisDetails ? analysisDetails.lastChecked : '-';
validate();
});
// set suitability core and last checked if user submits
formEl.addEventListener('submit', (event) => {
event.preventDefault();
event.stopPropagation();
suitabilityScore = Number(suitabilityScoreEl.value);
if (isNaN(suitabilityScore)) {
return;
}
const extensionElements = businessObject.extensionElements || moddle.create('bpmn:ExtensionElements');
if (!analysisDetails) {
analysisDetails = moddle.create('qa:AnalysisDetails');
extensionElements.get('values').push(analysisDetails);
}
analysisDetails.lastChecked = new Date().toISOString();
modeling.updateProperties(element, {
extensionElements,
suitable: suitabilityScore
});
qualityAssuranceEl.classList.add('hidden');
});
// close quality assurance if user presses escape
formEl.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
qualityAssuranceEl.classList.add('hidden');
}
});
// validate suitability score if user inputs value
suitabilityScoreEl.addEventListener('input', validate);
});
function getExtensionElement(element, type) {
if (!element.extensionElements) {
return;
}
return element.extensionElements.values.filter((extensionElement) => {
return extensionElement.$instanceOf(type);
})[0];
}