1 | 'use strict';
|
2 |
|
3 | var domQuery = require('min-dom').query,
|
4 | domClear = require('min-dom').clear,
|
5 | is = require('bpmn-js/lib/util/ModelUtil').is,
|
6 | forEach = require('lodash/forEach'),
|
7 | domify = require('min-dom').domify,
|
8 | Ids = require('ids').default;
|
9 |
|
10 | var SPACE_REGEX = /\s/;
|
11 |
|
12 |
|
13 | var QNAME_REGEX = /^([a-z][\w-.]*:)?[a-z_][\w-.]*$/i;
|
14 |
|
15 |
|
16 | var ID_REGEX = /^[a-z_][\w-.]*$/i;
|
17 |
|
18 | var PLACEHOLDER_REGEX = /\$\{([^}]*)\}/g;
|
19 |
|
20 | var HTML_ESCAPE_MAP = {
|
21 | '&': '&',
|
22 | '<': '<',
|
23 | '>': '>',
|
24 | '"': '"',
|
25 | '\'': '''
|
26 | };
|
27 |
|
28 | function selectedOption(selectBox) {
|
29 | if (selectBox.selectedIndex >= 0) {
|
30 | return selectBox.options[selectBox.selectedIndex].value;
|
31 | }
|
32 | }
|
33 |
|
34 | module.exports.selectedOption = selectedOption;
|
35 |
|
36 |
|
37 | function selectedType(elementSyntax, inputNode) {
|
38 | var typeSelect = domQuery(elementSyntax, inputNode);
|
39 | return selectedOption(typeSelect);
|
40 | }
|
41 |
|
42 | module.exports.selectedType = selectedType;
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 | function getRoot(businessObject) {
|
52 | var parent = businessObject;
|
53 | while (parent.$parent) {
|
54 | parent = parent.$parent;
|
55 | }
|
56 | return parent;
|
57 | }
|
58 |
|
59 | module.exports.getRoot = getRoot;
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 | function filterElementsByType(objectList, type) {
|
67 | var list = objectList || [];
|
68 | var result = [];
|
69 | forEach(list, function(obj) {
|
70 | if (is(obj, type)) {
|
71 | result.push(obj);
|
72 | }
|
73 | });
|
74 | return result;
|
75 | }
|
76 |
|
77 | module.exports.filterElementsByType = filterElementsByType;
|
78 |
|
79 |
|
80 | function findRootElementsByType(businessObject, referencedType) {
|
81 | var root = getRoot(businessObject);
|
82 |
|
83 | return filterElementsByType(root.rootElements, referencedType);
|
84 | }
|
85 |
|
86 | module.exports.findRootElementsByType = findRootElementsByType;
|
87 |
|
88 |
|
89 | function removeAllChildren(domElement) {
|
90 | while (domElement.firstChild) {
|
91 | domElement.removeChild(domElement.firstChild);
|
92 | }
|
93 | }
|
94 |
|
95 | module.exports.removeAllChildren = removeAllChildren;
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | function addEmptyParameter(list) {
|
102 | return list.push({ 'label': '', 'value': '', 'name': '' });
|
103 | }
|
104 |
|
105 | module.exports.addEmptyParameter = addEmptyParameter;
|
106 |
|
107 |
|
108 |
|
109 |
|
110 |
|
111 | function refreshOptionsModel(businessObject, referencedType) {
|
112 | var model = [];
|
113 | var referableObjects = findRootElementsByType(businessObject, referencedType);
|
114 | forEach(referableObjects, function(obj) {
|
115 | model.push({
|
116 | label: (obj.name || '') + ' (id='+obj.id+')',
|
117 | value: obj.id,
|
118 | name: obj.name
|
119 | });
|
120 | });
|
121 | return model;
|
122 | }
|
123 |
|
124 | module.exports.refreshOptionsModel = refreshOptionsModel;
|
125 |
|
126 |
|
127 |
|
128 |
|
129 |
|
130 | function updateOptionsDropDown(domSelector, businessObject, referencedType, entryNode) {
|
131 | var options = refreshOptionsModel(businessObject, referencedType);
|
132 | addEmptyParameter(options);
|
133 | var selectBox = domQuery(domSelector, entryNode);
|
134 | domClear(selectBox);
|
135 |
|
136 | forEach(options, function(option) {
|
137 | var optionEntry = domify('<option value="' + escapeHTML(option.value) + '">' + escapeHTML(option.label) + '</option>');
|
138 | selectBox.appendChild(optionEntry);
|
139 | });
|
140 | return options;
|
141 | }
|
142 |
|
143 | module.exports.updateOptionsDropDown = updateOptionsDropDown;
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 |
|
154 |
|
155 | function isIdValid(bo, idValue, translate) {
|
156 | var assigned = bo.$model.ids.assigned(idValue);
|
157 |
|
158 | var idExists = assigned && assigned !== bo;
|
159 |
|
160 | if (!idValue || idExists) {
|
161 | return translate('Element must have an unique id.');
|
162 | }
|
163 |
|
164 | return validateId(idValue, translate);
|
165 | }
|
166 |
|
167 | module.exports.isIdValid = isIdValid;
|
168 |
|
169 |
|
170 | function validateId(idValue, translate) {
|
171 |
|
172 | idValue = stripPlaceholders(idValue);
|
173 |
|
174 | if (containsSpace(idValue)) {
|
175 | return translate('Id must not contain spaces.');
|
176 | }
|
177 |
|
178 | if (!ID_REGEX.test(idValue)) {
|
179 |
|
180 | if (QNAME_REGEX.test(idValue)) {
|
181 | return translate('Id must not contain prefix.');
|
182 | }
|
183 |
|
184 | return translate('Id must be a valid QName.');
|
185 | }
|
186 | }
|
187 |
|
188 | module.exports.validateId = validateId;
|
189 |
|
190 |
|
191 | function containsSpace(value) {
|
192 | return SPACE_REGEX.test(value);
|
193 | }
|
194 |
|
195 | module.exports.containsSpace = containsSpace;
|
196 |
|
197 |
|
198 | function stripPlaceholders(idValue) {
|
199 |
|
200 |
|
201 |
|
202 |
|
203 | return idValue.replace(PLACEHOLDER_REGEX, '$1');
|
204 | }
|
205 |
|
206 |
|
207 |
|
208 |
|
209 | function nextId(prefix) {
|
210 | var ids = new Ids([32,32,1]);
|
211 |
|
212 | return ids.nextPrefixed(prefix);
|
213 | }
|
214 |
|
215 | module.exports.nextId = nextId;
|
216 |
|
217 |
|
218 | function triggerClickEvent(element) {
|
219 | var evt;
|
220 | var eventType = 'click';
|
221 |
|
222 | if (document.createEvent) {
|
223 | try {
|
224 |
|
225 | evt = new MouseEvent((eventType), { view: window, bubbles: true, cancelable: true });
|
226 | } catch (e) {
|
227 |
|
228 | evt = document.createEvent('MouseEvent');
|
229 |
|
230 | evt.initEvent((eventType), true, true);
|
231 | }
|
232 | return element.dispatchEvent(evt);
|
233 | } else {
|
234 |
|
235 | evt = document.createEventObject();
|
236 |
|
237 | return element.fireEvent('on' + eventType, evt);
|
238 | }
|
239 | }
|
240 |
|
241 | module.exports.triggerClickEvent = triggerClickEvent;
|
242 |
|
243 |
|
244 | function escapeHTML(str) {
|
245 | str = '' + str;
|
246 |
|
247 | return str && str.replace(/[&<>"']/g, function(match) {
|
248 | return HTML_ESCAPE_MAP[match];
|
249 | });
|
250 | }
|
251 |
|
252 | module.exports.escapeHTML = escapeHTML; |
\ | No newline at end of file |