mida
Version:
Muiltiple Instance and Data Animator for BPMN models.
255 lines (189 loc) • 8.44 kB
JavaScript
'use strict';
var domify = require('min-dom/dist').domify,
domClasses = require('min-dom/dist').classes,
domEvent = require('min-dom/dist').event,
domQuery = require('min-dom/dist').query;
var elementHelper = require('../../util/ElementHelper'),
getBusinessObject = elementHelper.getBusinessObject,
is = elementHelper.is,
isTypedEvent = elementHelper.isTypedEvent;
var events = require('../../util/EventHelper'),
GENERATE_TOKEN_EVENT = events.GENERATE_TOKEN_EVENT,
CONSUME_TOKEN_EVENT = events.CONSUME_TOKEN_EVENT,
TOGGLE_MODE_EVENT = events.TOGGLE_MODE_EVENT,
RESET_SIMULATION_EVENT = events.RESET_SIMULATION_EVENT,
PROCESS_INSTANCE_CREATED_EVENT = events.PROCESS_INSTANCE_CREATED_EVENT,
PROCESS_INSTANCE_FINISHED_EVENT = events.PROCESS_INSTANCE_FINISHED_EVENT;
function getElementName(element) {
return (element && element.businessObject.name);
}
function Log(eventBus, notifications, tokenSimulationPalette, canvas) {
var self = this;
this._notifications = notifications;
this._tokenSimulationPalette = tokenSimulationPalette;
this._canvas = canvas;
this._init();
eventBus.on(GENERATE_TOKEN_EVENT, function(context) {
var element = context.element,
elementName = getElementName(element);
if (is(element, 'bpmn:StartEvent')) {
self.log(elementName || 'Start Event', 'info', 'bpmn-icon-start-event-none');
} else if (is(element, 'bpmn:StartMessageEvent')) {
self.log(elementName || 'Start Message Event', 'info', 'bpmn-icon-start-event-none');
} else if (is(element, 'bpmn:Task')) {
self.log(elementName || 'Task', 'info', 'bpmn-icon-task');
} else if (is(element, 'bpmn:BusinessRuleTask')) {
self.log(elementName || 'Business Rule Task', 'info', 'bpmn-icon-business-rule');
} else if (is(element, 'bpmn:ManualTask')) {
self.log(elementName || 'Manual Task', 'info', 'bpmn-icon-manual');
} else if (is(element, 'bpmn:ScriptTask')) {
self.log(elementName || 'Script Task', 'info', 'bpmn-icon-script');
} else if (is(element, 'bpmn:ServiceTask')) {
self.log(elementName || 'Service Task', 'info', 'bpmn-icon-service');
} else if (is(element, 'bpmn:UserTask')) {
self.log(elementName || 'User Task', 'info', 'bpmn-icon-user');
} else if (is(element, 'bpmn:SendTask')) {
self.log(elementName || 'Send Task', 'info', 'bpmn-icon-send');
} else if (is(element, 'bpmn:ReceiveTask')) {
self.log(elementName || 'Receive Task', 'info', 'bpmn-icon-receive');
} else if (is(element, 'bpmn:DataObjectReference')) {
self.log(elementName || 'Data Object', 'info', 'bpmn-icon-data-object');
} else if (is(element, 'bpmn:ExclusiveGateway')) {
if (element.outgoing.length < 2) {
return;
}
var sequenceFlowName = getElementName(element.sequenceFlow);
var text = elementName || 'Gateway';
if (sequenceFlowName) {
text = text.concat(' <i class="fa fa-angle-right" aria-hidden="true"></i> ' + sequenceFlowName);
}
self.log(text, 'info', 'bpmn-icon-gateway-xor');
} else if (is(element, 'bpmn:InclusiveGateway')) {
if (element.outgoing.length < 2) {
return;
}
var sequenceFlowName = getElementName(element.sequenceFlow);
var text = elementName || 'Gateway';
if (sequenceFlowName) {
text = text.concat(' <i class="fa fa-angle-right" aria-hidden="true"></i> ' + sequenceFlowName);
}
self.log(text, 'info', 'bpmn-icon-gateway-or');
}else if (is(element, 'bpmn:ParallelGateway')) {
if (element.outgoing.length < 2) {
return;
}
var sequenceFlowName = getElementName(element.sequenceFlow);
var text = elementName || 'Gateway';
if (sequenceFlowName) {
text = text.concat(' <i class="fa fa-angle-right" aria-hidden="true"></i> ' + sequenceFlowName);
}
self.log(text, 'info', 'bpmn-icon-gateway-parallel');
}else if (is(element, ['bpmn:IntermediateCatchEvent', 'bpmn:IntermediateThrowEvent'])) {
self.log(elementName || 'Intermediate Event', 'info', 'bpmn-icon-intermediate-event-none');
}
});
eventBus.on(CONSUME_TOKEN_EVENT, function(context) {
var element = context.element,
elementName = getElementName(element);
if (is(element, 'bpmn:EndEvent')) {
if (isTypedEvent(getBusinessObject(element), 'bpmn:TerminateEventDefinition')) {
self.log(elementName || 'Terminate End Event', 'info', 'bpmn-icon-end-event-terminate');
} else {
self.log(elementName || 'End Event', 'info', 'bpmn-icon-end-event-none');
}
}
});
eventBus.on(PROCESS_INSTANCE_CREATED_EVENT, function(context) {
var processInstanceId = context.processInstanceId,
parent = context.parent;
if (is(parent, 'bpmn:Process')||is(parent, 'bpmn:Participant')) {
self.log('Process ' + processInstanceId + ' started', 'success', 'fa-check');
} else {
self.log('Subprocess ' + processInstanceId + ' started', 'info', 'fa-check');
}
});
eventBus.on(TOGGLE_MODE_EVENT, function(context) {
var simulationModeActive = context.simulationModeActive;
if (!simulationModeActive) {
self.emptyLog();
domClasses(self.container).add('hidden');
}
});
eventBus.on(RESET_SIMULATION_EVENT, function(context) {
self.emptyLog();
domClasses(self.container).add('hidden');
});
}
Log.prototype._init = function() {
var self = this;
this.container = domify(
'<div class="token-simulation-log hidden">' +
'<div class="header">' +
'<i class="fa fa-align-left"></i>' +
'<button class="close">' +
'<i class="fa fa-times" aria-hidden="true"></i>' +
'</button>' +
'</div>' +
'<div class="content">' +
'<p class="entry placeholder">No Entries</p>' +
'</div>' +
'</div>'
);
this.placeholder = domQuery('.placeholder', this.container);
this.content = domQuery('.content', this.container);
domEvent.bind(this.content, 'wheel', function(e) {
e.stopPropagation();
});
domEvent.bind(this.content, 'mousedown', function(e) {
e.stopPropagation();
});
this.close = domQuery('.close', this.container);
domEvent.bind(this.close, 'click', function() {
domClasses(self.container).add('hidden');
});
this.icon = domQuery('.fa-align-left', this.container);
domEvent.bind(this.icon, 'click', function() {
domClasses(self.container).add('hidden');
});
this._canvas.getContainer().appendChild(this.container);
this.paletteEntry = domify('<div title="Show Animation Log"><i class="fa fa-align-left"></i> Events</div>');
domEvent.bind(this.paletteEntry, 'click', function() {
domClasses(self.container).remove('hidden');
});
this._tokenSimulationPalette.addEntry(this.paletteEntry, 3);
};
Log.prototype.toggle = function() {
var container = this.container;
if (domClasses(container).has('hidden')) {
domClasses(container).remove('hidden');
} else {
domClasses(container).add('hidden');
}
};
Log.prototype.log = function(text, type, icon) {
domClasses(this.placeholder).add('hidden');
var date = new Date();
var dateString = date.toLocaleTimeString() + ':' + date.getUTCMilliseconds();
this._notifications.showNotification(text, type, icon);
var iconMarkup;
if (!icon) {
icon = 'fa-info';
}
if (icon.includes('bpmn')) {
iconMarkup = '<span class="icon ' + icon + '">';
} else {
iconMarkup = '<i class="icon fa ' + icon + '"></i>';
}
var logEntry = domify('<p class="entry ' + type + '"><span class="date">' + dateString + '</span>' + iconMarkup + '</span>' + text + '</p>');
this.content.appendChild(logEntry);
this.content.scrollTop = this.content.scrollHeight;
};
Log.prototype.emptyLog = function() {
while (this.content.firstChild) {
this.content.removeChild(this.content.firstChild);
}
this.placeholder = domify('<p class="entry placeholder">No Entries</p>');
this.content.appendChild(this.placeholder);
};
Log.$inject = [ 'eventBus', 'notifications', 'tokenSimulationPalette', 'canvas' ];
module.exports = Log;