From 66a1a837aaa84334e88fbee012c990eddbeb33b1 Mon Sep 17 00:00:00 2001 From: Max Goodman Date: Thu, 2 May 2013 16:50:03 -0700 Subject: [PATCH] Move multi right bar items into own view; add subscribe bubbles. --- r2/r2/public/static/js/multi.js | 101 ++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/r2/r2/public/static/js/multi.js b/r2/r2/public/static/js/multi.js index 7c7559289..c91dc1253 100644 --- a/r2/r2/public/static/js/multi.js +++ b/r2/r2/public/static/js/multi.js @@ -7,11 +7,11 @@ r.multi = { var multi = new r.multi.MultiReddit({ path: detailsEl.data('path') }) - multi.fetch() new r.multi.MultiDetails({ model: multi, el: detailsEl }) + multi.fetch() } var subscribeBubbleGroup = {} @@ -89,32 +89,91 @@ r.multi.MyMultiCollection = Backbone.Collection.extend({ } }) +r.multi.MultiSubredditItem = Backbone.View.extend({ + tagName: 'li', + + template: _.template('/r/<%= srName %>'), + + events: { + 'click .remove-sr': 'removeSubreddit' + }, + + render: function() { + this.$el.addClass('sr-' + this.model.get('name')) + this.$el.append(this.template({ + srName: this.model.get('name') + })) + this.bubble = new r.multi.MultiSubscribeBubble({ + parent: this.$el, + group: this.options.bubbleGroup, + srName: this.model.get('name') + }) + return this + }, + + remove: function() { + this.bubble.remove() + Backbone.View.prototype.remove.apply(this) + }, + + removeSubreddit: function(ev) { + this.options.multi.removeSubreddit(this.model.get('name')) + } +}) + r.multi.MultiDetails = Backbone.View.extend({ - itemTemplate: _.template('
  • /r/<%= name %>
  • '), events: { 'submit .add-sr': 'addSubreddit', - 'click .remove-sr': 'removeSubreddit', 'change [name="visibility"]': 'setVisibility', 'confirm .delete': 'deleteMulti' }, initialize: function() { - this.showWorkingDeferred = _.partial(r.ui.showWorkingDeferred, this.$el) - this.model.subreddits.on('add remove', this.render, this) - this.model.on('request', function(model, xhr) { - this.showWorkingDeferred(xhr) - }, this) + this.listenTo(this.model.subreddits, 'add', this.addOne) + this.listenTo(this.model.subreddits, 'remove', this.removeOne) + this.listenTo(this.model.subreddits, 'reset', this.addAll) new r.ui.ConfirmButton({el: this.$('button.delete')}) + + this.listenTo(this.model.subreddits, 'add remove', function() { + r.ui.showWorkingDeferred(this.$el, r.ui.refreshListing()) + }) + + this.model.on('request', function(model, xhr) { + r.ui.showWorkingDeferred(this.$el, xhr) + }, this) + + this.bubbleGroup = {} }, - render: function() { - var srList = this.$('.subreddits') - srList.empty() - this.model.subreddits.each(function(sr) { - srList.append(this.itemTemplate({ - name: sr.get('name') - })) - }, this) + addOne: function(sr) { + var view = new r.multi.MultiSubredditItem({ + model: sr, + multi: this.model, + bubbleGroup: this.bubbleGroup + }) + this.itemViews[sr.id] = view + + var $el = view.render().$el, + index = this.model.subreddits.indexOf(sr), + $list = this.$('.subreddits'), + $cur = $list.children().eq(index) + + if ($cur.length) { + $cur.before($el) + } else { + $list.append($el) + } + }, + + removeOne: function(sr) { + this.itemViews[sr.id].remove() + delete this.itemViews[sr.id] + }, + + addAll: function() { + this.itemViews = {} + this.$('.subreddits').empty() + this.model.subreddits.each(this.addOne, this) }, addSubreddit: function(ev) { @@ -132,7 +191,6 @@ r.multi.MultiDetails = Backbone.View.extend({ this.model.addSubreddit(srName, { wait: true, success: _.bind(function() { - this.showWorkingDeferred(r.ui.refreshListing()) this.$('.add-error').hide() }, this), error: _.bind(function(model, xhr) { @@ -145,13 +203,6 @@ r.multi.MultiDetails = Backbone.View.extend({ }) }, - removeSubreddit: function(ev) { - var srName = $(ev.target).parent().data('name') - this.model.removeSubreddit(srName, { - success: _.compose(this.showWorkingDeferred, r.ui.refreshListing) - }) - }, - setVisibility: function() { this.model.save({ visibility: this.$('[name="visibility"]:checked').val() @@ -187,7 +238,7 @@ r.multi.MultiSubscribeBubble = r.ui.Bubble.extend({ }, initialize: function() { - this.on('show', this.load, this) + this.listenTo(this, 'show', this.load) this.listenTo(r.multi.mine, 'reset add', this.render) r.ui.Bubble.prototype.initialize.apply(this) },