Refactoring: cleaning directories structure
[fnpeditor.git] / src / editor / modules / documentHistory / documentHistory.js
diff --git a/src/editor/modules/documentHistory/documentHistory.js b/src/editor/modules/documentHistory/documentHistory.js
new file mode 100644 (file)
index 0000000..f595594
--- /dev/null
@@ -0,0 +1,146 @@
+define([
+'libs/jquery',
+'libs/underscore',
+'./restoreDialog',
+'libs/text!./templates/main.html',
+'libs/text!./templates/item.html'
+], function($, _, restoreDialog, mainTemplateSrc, itemTemplateSrc) {
+
+'use strict';
+    
+return function(sandbox) {
+    
+    var dom = $(_.template(mainTemplateSrc)());
+    var domNodes = {
+        itemList: dom.find('.rng-module-documentHistory-itemsList'),
+    };
+    var itemViews = [];
+    
+    
+    dom.find('.btn.compare').click(function(e) {
+        var selected = historyItems.getSelected();
+        sandbox.publish('compare', selected[0], selected[1]);
+    });
+    
+    dom.find('.btn.restore').click(function(e) {
+        var dialog = restoreDialog.create();
+        dialog.on('restore', function(event) {
+            sandbox.publish('restoreVersion', {version: historyItems.getSelected()[0], description: event.data.description});
+            event.success();
+        });
+        dialog.show();
+    });
+    
+    dom.find('.btn.display').click(function(e) {
+        sandbox.publish('displayVersion', {version: historyItems.getSelected()[0]});
+    });
+        
+    var addHistoryItem = function(item, options) {
+        historyItems.add(item);
+        var view = new ItemView(item);
+        itemViews.push(view);
+        domNodes.itemList.prepend(view.dom);
+        if(options.animate) {
+            view.dom.hide().slideDown();
+        }
+    };
+    
+    var toggleItemViews = function(toggle) {
+        itemViews.forEach(function(view) {
+            if(!historyItems.isSelected(view.item))
+                view.toggle(toggle);
+        });
+    };
+    
+    var toggleButton = function(btn, toggle) {
+        dom.find('button.'+btn).toggleClass('disabled', !toggle);
+    };
+    
+    var historyItems = {
+        _itemsById: {},
+        _selected: [],
+        select: function(item) {
+            if(this._selected.length < 2) {
+                this._selected.push(item.version);
+                this._updateUI();
+                return true;
+            }
+            return false;
+        },
+        unselect: function(item) {
+            this._selected = _.without(this._selected, item.version);
+            this._updateUI();
+        },
+        add: function(item) {
+            this._itemsById[item.version] = item;
+        },
+        isSelected: function(item) {
+            return _.contains(this._selected, item.version);
+        },
+        getSelected: function() {
+            return this._selected;
+        },
+        _updateUI: function() {
+            var len = this._selected.length;
+            if(len === 0) {
+                toggleButton('compare', false);
+                toggleButton('display', false);
+                toggleButton('restore', false);
+            }
+            if(len === 1) {
+                toggleButton('compare', false);
+                toggleButton('display', true);
+                toggleButton('restore', true);
+            }
+            if(len === 2) {
+                toggleItemViews(false);
+                toggleButton('compare', true);
+                toggleButton('display', false);
+                toggleButton('restore', false);
+            } else {
+                toggleItemViews(true);
+            }
+        }
+    };
+    historyItems._updateUI();
+    
+    var ItemView = function(item) {
+        this.item = item;
+        this.dom = $(this.template(item));
+        this.dom.on('click', _.bind(this.onItemClicked, this));
+    };
+    ItemView.prototype.template = _.template(itemTemplateSrc);
+    ItemView.prototype.onItemClicked = function() {
+        if(historyItems.isSelected(this.item)) {
+            historyItems.unselect(this.item);
+            this.dimItem();
+        } else if(historyItems.select(this.item)) {
+            this.highlightItem();
+        }            
+    };
+    ItemView.prototype.highlightItem = function() {
+        this.dom.addClass('highlighted');
+    };
+    ItemView.prototype.dimItem = function() {
+        this.dom.removeClass('highlighted');
+    };
+    ItemView.prototype.toggle = function(toggle) {
+        this.dom.toggleClass('disabled', !toggle);
+    };
+
+    
+    
+    return {
+        start: function() { sandbox.publish('ready'); },
+        addHistory: function(history, options) {
+            history.forEach(function(historyItem) {
+                addHistoryItem(historyItem, options || {});
+            });
+        },
+        getView: function() {
+            return dom;
+        }
+    };
+};
+
+});
\ No newline at end of file