X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/3800336fe528a2f0cd5b4f3c90ed17fdca0bc0c8..b7c15f28d309a6281ab7a50765822b4a83baa5a5:/src/smartxml/smartxml.js diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 5cadcd7..c23e06d 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -498,8 +498,6 @@ $.extend(Document.prototype, Backbone.Events, { function() { if(this._transformationLevel === 1 && !this._undoInProgress) { this._currentTransaction.pushTransformation(transformation); - } - if(!this._undoInProgress && this._transformationLevel === 1) { this.redoStack = []; } } @@ -558,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() { @@ -575,11 +574,32 @@ $.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; + }, + + 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; }, @@ -608,8 +628,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) {