This commit is contained in:
hanjian
2024-08-14 15:17:51 +08:00
parent 20a221c1a2
commit b610f94b2e
3483 changed files with 650965 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
'use strict';
function isTracked(element) {
return element.$instanceOf('bpmn:FlowElement') ||
element.$instanceOf('bpmn:MessageFlow') ||
element.$instanceOf('bpmn:Participant') ||
element.$instanceOf('bpmn:Lane');
}
function ChangeHandler() {
this._layoutChanged = {};
this._changed = {};
this._removed = {};
this._added = {};
}
module.exports = ChangeHandler;
ChangeHandler.prototype.removed = function(model, property, element, idx) {
if (isTracked(element)) {
this._removed[element.id] = element;
}
};
ChangeHandler.prototype.changed = function(model, property, newValue, oldValue) {
if (model.$instanceOf('bpmndi:BPMNEdge') || model.$instanceOf('bpmndi:BPMNShape')) {
this._layoutChanged[model.bpmnElement.id] = model.bpmnElement;
}
if (isTracked(model)) {
var changed = this._changed[model.id];
if (!changed) {
changed = this._changed[model.id] = { model: model, attrs: { } };
}
if (oldValue !== undefined || newValue !== undefined) {
changed.attrs[property] = { oldValue: oldValue, newValue: newValue };
}
}
};
ChangeHandler.prototype.added = function(model, property, element, idx) {
if (isTracked(element)) {
this._added[element.id] = element;
}
};
ChangeHandler.prototype.moved = function(model, property, oldIndex, newIndex) { };

View File

@@ -0,0 +1,82 @@
'use strict';
var _ = require('lodash');
var jsondiffpatch = require('jsondiffpatch');
var ChangeHandler = require('./change-handler');
function Differ() { }
module.exports = Differ;
Differ.prototype.createDiff = function(a, b) {
// create a configured instance, match objects by name
var diffpatcher = jsondiffpatch.create({
objectHash: function(obj) {
return obj.id || JSON.stringify(obj);
}
});
return diffpatcher.diff(a, b);
};
Differ.prototype.diff = function(a, b, handler) {
handler = handler || new ChangeHandler();
function walk(diff, model) {
_.forEach(diff, function(d, key) {
// is array
if (d._t === 'a') {
_.forEach(d, function(val, idx) {
if (idx === '_t') {
return;
}
var removed = /^_/.test(idx),
added = !removed && _.isArray(val),
moved = removed && val[0] === '';
idx = parseInt(removed ? idx.slice(1) : idx, 10);
if (added || (removed && !moved)) {
handler[removed ? 'removed' : 'added'](model, key, val[0], idx);
} else
if (moved) {
handler.moved(model, key, val[1], val[2]);
} else {
walk(val, model[key][idx]);
}
});
} else {
if (_.isArray(d)) {
handler.changed(model, key, d[0], d[1]);
} else {
handler.changed(model, key);
walk(d, model[key]);
}
}
});
}
var diff = this.createDiff(a, b);
walk(diff, b, handler);
return handler;
};
module.exports.diff = function(a, b, handler) {
return new Differ().diff(a, b, handler);
};