X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/0479fc5313b1730d4de86b2b71a7bc721ab2b44a..b2ed6c0477904d9bcbf8494043f231a5197f6b78:/modules/documentHistory/documentHistory.js diff --git a/modules/documentHistory/documentHistory.js b/modules/documentHistory/documentHistory.js index d5f20d4..c3a2f69 100644 --- a/modules/documentHistory/documentHistory.js +++ b/modules/documentHistory/documentHistory.js @@ -1,99 +1,146 @@ -define([ -'libs/jquery-1.9.1.min', -'libs/underscore-min', -'libs/text!./templates/main.html', -'libs/text!./templates/item.html' -], function($, _, mainTemplateSrc, itemTemplateSrc) { - -'use strict'; - -return function(sandbox) { - - var dom = $(_.template(mainTemplateSrc)()); - var domNodes = { - itemList: dom.find('.rng-module-documentHistory-itemsList'), - } - var itemViews = []; - - 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.selected(view.item)) - view.toggle(toggle); - }); - } - - var historyItems = { - _itemsById: {}, - _selected: [], - select: function(item) { - if(this._selected.length < 2) { - this._selected.push(item.version); - if(this._selected.length === 2) - toggleItemViews(false); - return true; - } - return false; - }, - unselect: function(item) { - this._selected = _.without(this._selected, item.version); - if(this._selected.length < 2) - toggleItemViews(true); - }, - add: function(item) { - this._itemsById[item.version] = item; - }, - selected: function(item) { - return _.contains(this._selected, item.version); - } - }; - - 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.selected(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 { +define([ +'libs/jquery-1.9.1.min', +'libs/underscore-min', +'./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; - } - } -} - + addHistory: function(history, options) { + history.forEach(function(historyItem) { + addHistoryItem(historyItem, options || {}); + }); + }, + getView: function() { + return dom; + } + }; +}; + }); \ No newline at end of file