123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- 'use strict';
- var domQuery = require('min-dom').query,
- domClear = require('min-dom').clear,
- is = require('bpmn-js/lib/util/ModelUtil').is,
- forEach = require('lodash/forEach'),
- domify = require('min-dom').domify,
- Ids = require('ids').default;
- var SPACE_REGEX = /\s/;
- // for QName validation as per http://www.w3.org/TR/REC-xml/#NT-NameChar
- var QNAME_REGEX = /^([a-z][\w-.]*:)?[a-z_][\w-.]*$/i;
- // for ID validation as per BPMN Schema (QName - Namespace)
- var ID_REGEX = /^[a-z_][\w-.]*$/i;
- var PLACEHOLDER_REGEX = /\$\{([^}]*)\}/g;
- var HTML_ESCAPE_MAP = {
- '&': '&',
- '<': '<',
- '>': '>',
- '"': '"',
- '\'': '''
- };
- function selectedOption(selectBox) {
- if (selectBox.selectedIndex >= 0) {
- return selectBox.options[selectBox.selectedIndex].value;
- }
- }
- module.exports.selectedOption = selectedOption;
- function selectedType(elementSyntax, inputNode) {
- var typeSelect = domQuery(elementSyntax, inputNode);
- return selectedOption(typeSelect);
- }
- module.exports.selectedType = selectedType;
- /**
- * Retrieve the root element the document this
- * business object is contained in.
- *
- * @return {ModdleElement}
- */
- function getRoot(businessObject) {
- var parent = businessObject;
- while (parent.$parent) {
- parent = parent.$parent;
- }
- return parent;
- }
- module.exports.getRoot = getRoot;
- /**
- * filters all elements in the list which have a given type.
- * removes a new list
- */
- function filterElementsByType(objectList, type) {
- var list = objectList || [];
- var result = [];
- forEach(list, function(obj) {
- if (is(obj, type)) {
- result.push(obj);
- }
- });
- return result;
- }
- module.exports.filterElementsByType = filterElementsByType;
- function findRootElementsByType(businessObject, referencedType) {
- var root = getRoot(businessObject);
- return filterElementsByType(root.rootElements, referencedType);
- }
- module.exports.findRootElementsByType = findRootElementsByType;
- function removeAllChildren(domElement) {
- while (domElement.firstChild) {
- domElement.removeChild(domElement.firstChild);
- }
- }
- module.exports.removeAllChildren = removeAllChildren;
- /**
- * adds an empty option to the list
- */
- function addEmptyParameter(list) {
- return list.push({ 'label': '', 'value': '', 'name': '' });
- }
- module.exports.addEmptyParameter = addEmptyParameter;
- /**
- * returns a list with all root elements for the given parameter 'referencedType'
- */
- function refreshOptionsModel(businessObject, referencedType) {
- var model = [];
- var referableObjects = findRootElementsByType(businessObject, referencedType);
- forEach(referableObjects, function(obj) {
- model.push({
- label: (obj.name || '') + ' (id='+obj.id+')',
- value: obj.id,
- name: obj.name
- });
- });
- return model;
- }
- module.exports.refreshOptionsModel = refreshOptionsModel;
- /**
- * fills the drop down with options
- */
- function updateOptionsDropDown(domSelector, businessObject, referencedType, entryNode) {
- var options = refreshOptionsModel(businessObject, referencedType);
- addEmptyParameter(options);
- var selectBox = domQuery(domSelector, entryNode);
- domClear(selectBox);
- forEach(options, function(option) {
- var optionEntry = domify('<option value="' + escapeHTML(option.value) + '">' + escapeHTML(option.label) + '</option>');
- selectBox.appendChild(optionEntry);
- });
- return options;
- }
- module.exports.updateOptionsDropDown = updateOptionsDropDown;
- /**
- * checks whether the id value is valid
- *
- * @param {ModdleElement} bo
- * @param {String} idValue
- * @param {Function} translate
- *
- * @return {String} error message
- */
- function isIdValid(bo, idValue, translate) {
- var assigned = bo.$model.ids.assigned(idValue);
- var idExists = assigned && assigned !== bo;
- if (!idValue || idExists) {
- return translate('Element must have an unique id.');
- }
- return validateId(idValue, translate);
- }
- module.exports.isIdValid = isIdValid;
- function validateId(idValue, translate) {
- idValue = stripPlaceholders(idValue);
- if (containsSpace(idValue)) {
- return translate('Id must not contain spaces.');
- }
- if (!ID_REGEX.test(idValue)) {
- if (QNAME_REGEX.test(idValue)) {
- return translate('Id must not contain prefix.');
- }
- return translate('Id must be a valid QName.');
- }
- }
- module.exports.validateId = validateId;
- function containsSpace(value) {
- return SPACE_REGEX.test(value);
- }
- module.exports.containsSpace = containsSpace;
- function stripPlaceholders(idValue) {
- // replace expression e.g. ${VERSION_TAG}
- // use only the content between ${}
- // for the REGEX check
- return idValue.replace(PLACEHOLDER_REGEX, '$1');
- }
- /**
- * generate a semantic id with given prefix
- */
- function nextId(prefix) {
- var ids = new Ids([32,32,1]);
- return ids.nextPrefixed(prefix);
- }
- module.exports.nextId = nextId;
- function triggerClickEvent(element) {
- var evt;
- var eventType = 'click';
- if (document.createEvent) {
- try {
- // Chrome, Safari, Firefox
- evt = new MouseEvent((eventType), { view: window, bubbles: true, cancelable: true });
- } catch (e) {
- // IE 11, PhantomJS (wat!)
- evt = document.createEvent('MouseEvent');
- evt.initEvent((eventType), true, true);
- }
- return element.dispatchEvent(evt);
- } else {
- // Welcome IE
- evt = document.createEventObject();
- return element.fireEvent('on' + eventType, evt);
- }
- }
- module.exports.triggerClickEvent = triggerClickEvent;
- function escapeHTML(str) {
- str = '' + str;
- return str && str.replace(/[&<>"']/g, function(match) {
- return HTML_ESCAPE_MAP[match];
- });
- }
- module.exports.escapeHTML = escapeHTML;
|