update
This commit is contained in:
@@ -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) { };
|
||||
@@ -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);
|
||||
};
|
||||
Reference in New Issue
Block a user