UNPKG

7.2 kBJavaScriptView Raw
1import inherits from 'inherits';
2
3import Ids from 'ids';
4
5import Viewer from './Viewer';
6
7import NavigatedViewer from './NavigatedViewer';
8
9import KeyboardMoveModule from 'diagram-js/lib/navigation/keyboard-move';
10import MoveCanvasModule from 'diagram-js/lib/navigation/movecanvas';
11import TouchModule from 'diagram-js/lib/navigation/touch';
12import ZoomScrollModule from 'diagram-js/lib/navigation/zoomscroll';
13
14import AlignElementsModule from 'diagram-js/lib/features/align-elements';
15import AutoPlaceModule from './features/auto-place';
16import AutoResizeModule from './features/auto-resize';
17import AutoScrollModule from 'diagram-js/lib/features/auto-scroll';
18import BendpointsModule from 'diagram-js/lib/features/bendpoints';
19import ContextPadModule from './features/context-pad';
20import CopyPasteModule from './features/copy-paste';
21import DistributeElementsModule from './features/distribute-elements';
22import EditorActionsModule from './features/editor-actions';
23import KeyboardModule from './features/keyboard';
24import KeyboardMoveSelectionModule from 'diagram-js/lib/features/keyboard-move-selection';
25import LabelEditingModule from './features/label-editing';
26import ModelingModule from './features/modeling';
27import MoveModule from 'diagram-js/lib/features/move';
28import PaletteModule from './features/palette';
29import ReplacePreviewModule from './features/replace-preview';
30import ResizeModule from 'diagram-js/lib/features/resize';
31import SnappingModule from './features/snapping';
32import SearchModule from './features/search';
33
34
35var initialDiagram =
36 '<?xml version="1.0" encoding="UTF-8"?>' +
37 '<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
38 'xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" ' +
39 'xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" ' +
40 'xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" ' +
41 'targetNamespace="http://bpmn.io/schema/bpmn" ' +
42 'id="Definitions_1">' +
43 '<bpmn:process id="Process_1" isExecutable="false">' +
44 '<bpmn:startEvent id="StartEvent_1"/>' +
45 '</bpmn:process>' +
46 '<bpmndi:BPMNDiagram id="BPMNDiagram_1">' +
47 '<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">' +
48 '<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">' +
49 '<dc:Bounds height="36.0" width="36.0" x="173.0" y="102.0"/>' +
50 '</bpmndi:BPMNShape>' +
51 '</bpmndi:BPMNPlane>' +
52 '</bpmndi:BPMNDiagram>' +
53 '</bpmn:definitions>';
54
55
56/**
57 * A modeler for BPMN 2.0 diagrams.
58 *
59 *
60 * ## Extending the Modeler
61 *
62 * In order to extend the viewer pass extension modules to bootstrap via the
63 * `additionalModules` option. An extension module is an object that exposes
64 * named services.
65 *
66 * The following example depicts the integration of a simple
67 * logging component that integrates with interaction events:
68 *
69 *
70 * ```javascript
71 *
72 * // logging component
73 * function InteractionLogger(eventBus) {
74 * eventBus.on('element.hover', function(event) {
75 * console.log()
76 * })
77 * }
78 *
79 * InteractionLogger.$inject = [ 'eventBus' ]; // minification save
80 *
81 * // extension module
82 * var extensionModule = {
83 * __init__: [ 'interactionLogger' ],
84 * interactionLogger: [ 'type', InteractionLogger ]
85 * };
86 *
87 * // extend the viewer
88 * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] });
89 * bpmnModeler.importXML(...);
90 * ```
91 *
92 *
93 * ## Customizing / Replacing Components
94 *
95 * You can replace individual diagram components by redefining them in override modules.
96 * This works for all components, including those defined in the core.
97 *
98 * Pass in override modules via the `options.additionalModules` flag like this:
99 *
100 * ```javascript
101 * function CustomContextPadProvider(contextPad) {
102 *
103 * contextPad.registerProvider(this);
104 *
105 * this.getContextPadEntries = function(element) {
106 * // no entries, effectively disable the context pad
107 * return {};
108 * };
109 * }
110 *
111 * CustomContextPadProvider.$inject = [ 'contextPad' ];
112 *
113 * var overrideModule = {
114 * contextPadProvider: [ 'type', CustomContextPadProvider ]
115 * };
116 *
117 * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]});
118 * ```
119 *
120 * @param {Object} [options] configuration options to pass to the viewer
121 * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body.
122 * @param {String|Number} [options.width] the width of the viewer
123 * @param {String|Number} [options.height] the height of the viewer
124 * @param {Object} [options.moddleExtensions] extension packages to provide
125 * @param {Array<didi.Module>} [options.modules] a list of modules to override the default modules
126 * @param {Array<didi.Module>} [options.additionalModules] a list of modules to use with the default modules
127 */
128export default function Modeler(options) {
129 Viewer.call(this, options);
130
131 // hook ID collection into the modeler
132 this.on('import.parse.complete', function(event) {
133 if (!event.error) {
134 this._collectIds(event.definitions, event.context);
135 }
136 }, this);
137
138 this.on('diagram.destroy', function() {
139 this.get('moddle').ids.clear();
140 }, this);
141}
142
143inherits(Modeler, Viewer);
144
145Modeler.Viewer = Viewer;
146Modeler.NavigatedViewer = NavigatedViewer;
147
148/**
149 * Create a new diagram to start modeling.
150 *
151 * @param {Function} [done]
152 */
153Modeler.prototype.createDiagram = function(done) {
154 return this.importXML(initialDiagram, done);
155};
156
157/**
158 * Create a moddle instance, attaching ids to it.
159 *
160 * @param {Object} options
161 */
162Modeler.prototype._createModdle = function(options) {
163 var moddle = Viewer.prototype._createModdle.call(this, options);
164
165 // attach ids to moddle to be able to track
166 // and validated ids in the BPMN 2.0 XML document
167 // tree
168 moddle.ids = new Ids([ 32, 36, 1 ]);
169
170 return moddle;
171};
172
173/**
174 * Collect ids processed during parsing of the
175 * definitions object.
176 *
177 * @param {ModdleElement} definitions
178 * @param {Context} context
179 */
180Modeler.prototype._collectIds = function(definitions, context) {
181
182 var moddle = definitions.$model,
183 ids = moddle.ids,
184 id;
185
186 // remove references from previous import
187 ids.clear();
188
189 for (id in context.elementsById) {
190 ids.claim(id, context.elementsById[id]);
191 }
192};
193
194Modeler.prototype._interactionModules = [
195 // non-modeling components
196 KeyboardMoveModule,
197 MoveCanvasModule,
198 TouchModule,
199 ZoomScrollModule
200];
201
202Modeler.prototype._modelingModules = [
203 // modeling components
204 AlignElementsModule,
205 AutoPlaceModule,
206 AutoScrollModule,
207 AutoResizeModule,
208 BendpointsModule,
209 ContextPadModule,
210 CopyPasteModule,
211 DistributeElementsModule,
212 EditorActionsModule,
213 KeyboardModule,
214 KeyboardMoveSelectionModule,
215 LabelEditingModule,
216 ModelingModule,
217 MoveModule,
218 PaletteModule,
219 ReplacePreviewModule,
220 ResizeModule,
221 SnappingModule,
222 SearchModule
223];
224
225
226// modules the modeler is composed of
227//
228// - viewer modules
229// - interaction modules
230// - modeling modules
231
232Modeler.prototype._modules = [].concat(
233 Modeler.prototype._modules,
234 Modeler.prototype._interactionModules,
235 Modeler.prototype._modelingModules);