// potem spr na dotychczasowych undo/redo tests;
+ var patchObject = function(obj, depth) {
+ depth = _.isNumber(depth) ? depth : 1;
+ if(depth > 3) {
+ return;
+ }
+ _.keys(obj).forEach(function(key) {
+ var value = obj[key],
+ path;
+ if(value) {
+ if(value.nodeType) {
+ path = value.getPath();
+ Object.defineProperty(obj, key, {
+ get: function() {
+ if(transformation.hasRun && path) {
+ return transformation.document.getNodeByPath(path);
+ } else {
+ return value;
+ }
+ }
+ });
+ } else if(_.isObject(value)) {
+ patchObject(value, depth+1);
+ }
+ }
+ });
+ };
this.args.forEach(function(arg, idx, args) {
var path;
}
});
} else if(_.isObject(arg)) {
- _.keys(arg).forEach(function(key) {
- var value = arg[key],
- path;
- if(value && value.nodeType) {
- path = value.getPath();
- Object.defineProperty(arg, key, {
- get: function() {
- if(transformation.hasRun && path) {
- return transformation.document.getNodeByPath(path);
- } else {
- return value;
- }
- }
- });
- }
- });
+ patchObject(arg);
}
}
});
run: function(options) {
var changeRoot;
if(!desc.undo && options.beUndoable) {
- changeRoot = desc.getChangeRoot ? desc.getChangeRoot.call(this) : this.document.root;
- this.snapshot = changeRoot.clone();
+ changeRoot = this.getChangeRoot();
+ if(!changeRoot) {
+ throw new Error(
+ 'Transformation {name} returned invalid change root value'
+ .replace('{name}', name)
+ );
+ }
this.changeRootPath = changeRoot.getPath();
+ this.snapshot = changeRoot.clone();
}
var argsToPass = desc.undo ? [this].concat(this.args) : this.args;
var toret = desc.impl.apply(this.context, argsToPass);
this.document.getNodeByPath(this.changeRootPath).replaceWith(this.snapshot);
}
},
+ getChangeRoot: desc.getChangeRoot || function() {
+ return this.document.root;
+ }
});
return GenericTransformation;