smartxml: allow for adding metadata to transaction
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 18 Feb 2014 11:26:15 +0000 (12:26 +0100)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 18 Feb 2014 11:26:15 +0000 (12:26 +0100)
src/smartxml/smartxml.js
src/smartxml/smartxml.test.js

index 5cadcd7..505ab85 100644 (file)
@@ -558,11 +558,11 @@ $.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._currentTransaction = new Transaction([], metadata);
     },
 
     endTransaction: function() {
@@ -575,9 +575,9 @@ $.extend(Document.prototype, Backbone.Events, {
         this._currentTransaction = null;
     },
 
-    transaction: function(callback, context) {
+    transaction: function(callback, context, metadata) {
         var toret;
-        this.startTransaction();
+        this.startTransaction(metadata);
         toret = callback.call(context);
         this.endTransaction();
         return toret;
@@ -608,8 +608,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) {
index 491c586..cc2b3cf 100644 (file)
@@ -1632,6 +1632,24 @@ describe('smartxml', function() {
                 expect(doc.root.getAttr('smart')).to.equal('1');
                 expect(doc.root.getAttr('unaware')).to.equal('1');
             });
+
+            it('can have associated metadata', function() {
+                var doc = getDocumentFromXML('<div></div>'),
+                    metadata = Object.create({});
+
+                doc.registerExtension({document: {transformations: {
+                    test: function() {
+                        this.trigger('change');
+                    }
+                }}});
+
+                doc.startTransaction(metadata);
+                doc.test();
+                doc.endTransaction();
+
+                var transaction = doc.undoStack[0];
+                expect(transaction.metadata).to.equal(metadata);
+            });
         });
 
         describe('Regression tests', function() {