UNPKG

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