X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/756b563b822bdcfa1d1b7d3eebcf313cb01c5560..e7456824103846b3cc9857d3f05f2db09bb0abab:/src/smartxml/smartxml.js?ds=sidebyside diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index ab4d6fb..7d3f332 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -476,6 +476,12 @@ $.extend(Document.prototype, Backbone.Events, { transform: function(Transformation, args) { var toret, transformation; + if(!this._currentTransaction) { + return this.transaction(function() { + return this.transform(Transformation, args); + }, this); + } + if(typeof Transformation === 'function') { transformation = new Transformation(this, this, args); } else { @@ -491,13 +497,7 @@ $.extend(Document.prototype, Backbone.Events, { }, function() { if(this._transformationLevel === 1 && !this._undoInProgress) { - if(this._currentTransaction) { - this._currentTransaction.pushTransformation(transformation); - } else { - this.undoStack.push(new Transaction([transformation])); - } - } - if(!this._undoInProgress && this._transformationLevel === 1) { + this._currentTransaction.pushTransformation(transformation); this.redoStack = []; } } @@ -556,11 +556,12 @@ $.extend(Document.prototype, Backbone.Events, { } }, - startTransaction: function() { + startTransaction: function(metadata) { if(this._currentTransaction) { throw new Error('Nested transactions not supported!'); } - this._currentTransaction = new Transaction([]); + this._rollbackBackup = this.root.clone(); + this._currentTransaction = new Transaction([], metadata); }, endTransaction: function() { @@ -573,11 +574,33 @@ $.extend(Document.prototype, Backbone.Events, { this._currentTransaction = null; }, - transaction: function(callback, context) { + rollbackTransaction: function() { + if(!this._currentTransaction) { + throw new Error('Transaction rollback requested, but there is no transaction in progress!'); + } + this.replaceRoot(this._rollbackBackup); + this._rollbackBackup = null; + this._currentTransaction = null; + this._transformationLevel = 0; + }, + + transaction: function(callback, params) { var toret; - this.startTransaction(); - toret = callback.call(context); + params = params || {}; + this.startTransaction(params.metadata); + try { + toret = callback.call(params.context || this); + } catch(e) { + if(params.error) { + params.error(e); + } + this.rollbackTransaction(); + return; + } this.endTransaction(); + if(params.success) { + params.success(toret); + } return toret; }, @@ -606,8 +629,9 @@ $.extend(Document.prototype, Backbone.Events, { } }); -var Transaction = function(transformations) { +var Transaction = function(transformations, metadata) { this.transformations = transformations || []; + this.metadata = metadata; }; $.extend(Transaction.prototype, { pushTransformation: function(transformation) {