'use strict'; var inherits = require('inherits'); var IdSupport = require('bpmn-moddle/lib/id-support'), Ids = require('ids'); var Viewer = require('./Viewer'); var initialTemplate = '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + ''; /** * A modeler for BPMN 2.0 diagrams. * * * ## Extending the Modeler * * In order to extend the viewer pass extension modules to bootstrap via the * `additionalModules` option. An extension module is an object that exposes * named services. * * The following example depicts the integration of a simple * logging component that integrates with interaction events: * * * ```javascript * * // logging component * function InteractionLogger(eventBus) { * eventBus.on('element.hover', function(event) { * console.log() * }) * } * * InteractionLogger.$inject = [ 'eventBus' ]; // minification save * * // extension module * var extensionModule = { * __init__: [ 'interactionLogger' ], * interactionLogger: [ 'type', InteractionLogger ] * }; * * // extend the viewer * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] }); * bpmnModeler.importXML(...); * ``` * * * ## Customizing / Replacing Components * * You can replace individual diagram components by redefining them in override modules. * This works for all components, including those defined in the core. * * Pass in override modules via the `options.additionalModules` flag like this: * * ```javascript * function CustomContextPadProvider(contextPad) { * * contextPad.registerProvider(this); * * this.getContextPadEntries = function(element) { * // no entries, effectively disable the context pad * return {}; * }; * } * * CustomContextPadProvider.$inject = [ 'contextPad' ]; * * var overrideModule = { * contextPadProvider: [ 'type', CustomContextPadProvider ] * }; * * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]}); * ``` * * @param {Object} [options] configuration options to pass to the viewer * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body. * @param {String|Number} [options.width] the width of the viewer * @param {String|Number} [options.height] the height of the viewer * @param {Object} [options.moddleExtensions] extension packages to provide * @param {Array} [options.modules] a list of modules to override the default modules * @param {Array} [options.additionalModules] a list of modules to use with the default modules */ function Modeler(options) { Viewer.call(this, options); } inherits(Modeler, Viewer); Modeler.prototype.createTemplate = function(done) { return this.importXML(initialTemplate, done); }; Modeler.prototype.createModdle = function() { var moddle = Viewer.prototype.createModdle.call(this); IdSupport.extend(moddle, new Ids([ 32, 36, 1 ])); return moddle; }; Modeler.prototype._interactionModules = [ // non-modeling components require('./features/label-editing'), require('./features/auto-resize'), require('diagram-js/lib/navigation/zoomscroll'), require('diagram-js/lib/navigation/movecanvas'), require('diagram-js/lib/navigation/touch') ]; Modeler.prototype._modelingModules = [ // modeling components require('diagram-js/lib/features/move'), require('diagram-js/lib/features/bendpoints'), require('diagram-js/lib/features/resize'), require('diagram-js/lib/features/space-tool'), require('diagram-js/lib/features/lasso-tool'), require('./features/keyboard'), require('./features/snapping'), require('./features/modeling'), require('./features/context-pad'), require('./features/palette'), require('./features/replace-preview') ]; // modules the modeler is composed of // // - viewer modules // - interaction modules // - modeling modules Modeler.prototype._modules = [].concat( Modeler.prototype._modules, Modeler.prototype._interactionModules, Modeler.prototype._modelingModules); module.exports = Modeler;