From 19eaa0e7c789ef2862cb621a38ecbf841c21d08c Mon Sep 17 00:00:00 2001 From: Samuel Clay Date: Wed, 23 May 2012 20:10:28 -0700 Subject: [PATCH] Move folder now backboneified. --- media/js/newsblur/common/assetmodel.js | 2 +- media/js/newsblur/models/feeds.js | 4 +- media/js/newsblur/models/folders.js | 67 ++++++++++++++++++++++- media/js/newsblur/reader/reader.js | 48 +++++++--------- media/js/newsblur/views/feed_list_view.js | 1 - media/js/newsblur/views/folder_view.js | 7 ++- 6 files changed, 92 insertions(+), 37 deletions(-) diff --git a/media/js/newsblur/common/assetmodel.js b/media/js/newsblur/common/assetmodel.js index cf81ceec7..8b2c9bdb7 100644 --- a/media/js/newsblur/common/assetmodel.js +++ b/media/js/newsblur/common/assetmodel.js @@ -275,7 +275,7 @@ NEWSBLUR.AssetModel = Backbone.Router.extend({ var pre_callback = function(feeds, subscriptions) { self.flags['favicons_fetching'] = self.feeds.any(function(feed) { return feed.get('favicons_fetching'); }); - self.folders.reset(subscriptions.folders); + self.folders.reset(_.compact(subscriptions.folders)); self.starred_count = subscriptions.starred_count; self.social_feeds.reset(subscriptions.social_feeds); self.user_profile.set(subscriptions.social_profile); diff --git a/media/js/newsblur/models/feeds.js b/media/js/newsblur/models/feeds.js index bb84d58ec..33bccadb7 100644 --- a/media/js/newsblur/models/feeds.js +++ b/media/js/newsblur/models/feeds.js @@ -13,9 +13,9 @@ NEWSBLUR.Models.Feed = Backbone.Model.extend({ delete_feed: function(options) { options = options || {}; var view = options.view || this.get_view(); - console.log(["Delete Feed", this, view, view.options.folder_title]); + console.log(["Delete Feed", this, view, view.collection.options.title]); - NEWSBLUR.assets.delete_feed(this.id, view.options.folder_title); + NEWSBLUR.assets.delete_feed(this.id, view.collection.options.title); view.delete_feed(); }, diff --git a/media/js/newsblur/models/folders.js b/media/js/newsblur/models/folders.js index 79c6c4270..d97b795ac 100644 --- a/media/js/newsblur/models/folders.js +++ b/media/js/newsblur/models/folders.js @@ -9,8 +9,9 @@ NEWSBLUR.Models.FeedOrFolder = Backbone.Model.extend({ var children = model[title]; this.set('is_folder', true); this.set('folder_title', title); + this.folder_views = []; this.folders = new NEWSBLUR.Collections.Folders([], {title: title}); - this.folders.reset(children); + this.folders.reset(_.compact(children)); } }, @@ -20,6 +21,39 @@ NEWSBLUR.Models.FeedOrFolder = Backbone.Model.extend({ is_folder: function() { return this.get('is_folder', false); + }, + + get_view: function($folder) { + var view = _.detect(this.folder_views, function(view) { + if ($folder) { + return view.el == $folder.get(0); + } + }); + if (!view && this.folders.length) { + view = this.folders.get_view($folder); + } + return view; + }, + + move_to_folder: function(to_folder, options) { + options = options || {}; + var view = options.view || this.get_view(); + var in_folder = this.collection.options.title; + var folder_title = this.get('folder_title'); + if (in_folder == to_folder) return false; + + NEWSBLUR.assets.move_folder_to_folder(folder_title, in_folder, to_folder, function() { + _.delay(function() { + NEWSBLUR.reader.$s.$feed_list.css('opacity', 1).animate({'opacity': 0}, { + 'duration': 100, + 'complete': function() { + NEWSBLUR.app.feed_list.make_feeds(); + } + }); + }, 250); + }); + + return true; } }); @@ -30,11 +64,38 @@ NEWSBLUR.Collections.Folders = Backbone.Collection.extend({ title: '' }, - initialize: function() { + initialize: function(models, options) { + this.options = options || {}; this.comparator = NEWSBLUR.Collections.Folders.comparator; }, - model: NEWSBLUR.Models.FeedOrFolder + model: NEWSBLUR.Models.FeedOrFolder, + + get_view: function($folder) { + var view; + this.any(function(item) { + if (item.is_folder()) { + view = item.get_view($folder); + return view; + } + }); + if (view) { + return view; + } + }, + + child_folder_names: function() { + var names = []; + this.each(function(item) { + if (item.is_folder()) { + names.push(item.get('folder_title')); + _.each(item.folders.child_folder_names(), function(name) { + names.push(name); + }); + } + }); + return names; + } }, { diff --git a/media/js/newsblur/reader/reader.js b/media/js/newsblur/reader/reader.js index f7eaa9b56..d08f25067 100644 --- a/media/js/newsblur/reader/reader.js +++ b/media/js/newsblur/reader/reader.js @@ -5262,9 +5262,14 @@ var $confirm = $('.NB-menu-manage-feed-move-confirm,.NB-menu-manage-folder-move-confirm'); var $position = $('.NB-menu-manage-confirm-position', $confirm); var $select = $('select', $confirm); - var feed = this.model.get_feed(feed_id); - var feed_view = feed.get_view($feed); - var in_folder = feed_view.options.folder_title; + if (_.isNumber(feed_id)) { + var feed = this.model.get_feed(feed_id); + var feed_view = feed.get_view($feed); + var in_folder = feed_view.options.folder_title; + } else { + folder_view = NEWSBLUR.assets.folders.get_view($feed); + var in_folder = folder_view.collection.options.title; + } $move.addClass('NB-menu-manage-feed-move-cancel'); $('.NB-menu-manage-title', $move).text('Cancel move'); @@ -5320,18 +5325,12 @@ }, manage_menu_move_folder: function(folder, $folder) { - var self = this; - var in_folder = ''; - var $parent = $folder.parents('li.folder').eq(0); - var to_folder = $('.NB-menu-manage-folder-move-confirm select').val(); - var folder_name = $folder.find('.folder_title_text').eq(0).text(); - var child_folders = $folder.find('.folder_title_text').map(function() { - return $(this).text(); - }).get(); - - if ($parent.length) { - in_folder = $parent.find('.folder_title_text').eq(0).text(); - } + var self = this; + var to_folder = $('.NB-menu-manage-folder-move-confirm select').val(); + var folder_view = NEWSBLUR.assets.folders.get_view($folder); + var in_folder = folder_view.collection.options.title; + var folder_name = folder_view.options.title; + var child_folders = folder_view.collection.child_folder_names(); if (to_folder == in_folder || to_folder == folder_name || @@ -5339,20 +5338,13 @@ return this.hide_confirm_move_menu_item(); } - this.model.move_folder_to_folder(folder, in_folder, to_folder, _.bind(function() { + var moved = folder_view.model.move_to_folder(to_folder, {view: folder_view}); + this.hide_confirm_move_menu_item(moved); + if (moved) { _.delay(_.bind(function() { - this.$s.$feed_list.css('opacity', 1).animate({'opacity': 0}, { - 'duration': 100, - 'complete': _.bind(function() { - NEWSBLUR.app.feed_list.make_feeds(); - }, this) - }); - }, this), 250); - - this.hide_manage_menu('folder', $parent, true); - }, this)); - - this.hide_confirm_move_menu_item(true); + this.hide_manage_menu('folder', $folder, true); + }, this), 500); + } }, // ======================== diff --git a/media/js/newsblur/views/feed_list_view.js b/media/js/newsblur/views/feed_list_view.js index 6d23ad693..204c1f9c2 100644 --- a/media/js/newsblur/views/feed_list_view.js +++ b/media/js/newsblur/views/feed_list_view.js @@ -142,7 +142,6 @@ NEWSBLUR.Views.FeedList = Backbone.View.extend({ if (!model) { model = NEWSBLUR.assets.feeds.selected() || NEWSBLUR.assets.social_feeds.selected(); - console.log(["selected models", model]); } if (!model || !model.get('selected')) return; diff --git a/media/js/newsblur/views/folder_view.js b/media/js/newsblur/views/folder_view.js index 12301e523..6f8dd83e9 100644 --- a/media/js/newsblur/views/folder_view.js +++ b/media/js/newsblur/views/folder_view.js @@ -34,11 +34,14 @@ NEWSBLUR.Views.Folder = Backbone.View.extend({ item.feed.views.push(feed_view); return feed_view.el; } else { - return new NEWSBLUR.Views.Folder({ + var folder_view = new NEWSBLUR.Views.Folder({ + model: item, collection: item.folders, depth: depth + 1, title: item.get('folder_title') - }).render().el; + }).render(); + item.folder_views.push(folder_view); + return folder_view.el; } }, this)); $feeds.push(this.make('div', { 'class': 'feed NB-empty' }));