From e8dcd8ab7139a375ce5b27da856bd0916d948ee3 Mon Sep 17 00:00:00 2001
From: Sam <sam.saffron@gmail.com>
Date: Wed, 8 Jan 2014 17:10:16 +1100
Subject: [PATCH] BUGFIX: show uncategorized in tracking etc BUGFIX: allow
 emptying of lists of watched / tracked BUGFIX: page scrolls when clicking on
 [x]

---
 .../components/category_group_component.js    |  4 ++--
 .../javascripts/discourse/lib/autocomplete.js |  1 +
 .../javascripts/discourse/models/category.js  |  6 ++++++
 .../javascripts/discourse/models/user.js      | 19 +++++++++----------
 app/models/category_user.rb                   |  3 ++-
 5 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/app/assets/javascripts/discourse/components/category_group_component.js b/app/assets/javascripts/discourse/components/category_group_component.js
index 28cc4ea4b..e8a97ff91 100644
--- a/app/assets/javascripts/discourse/components/category_group_component.js
+++ b/app/assets/javascripts/discourse/components/category_group_component.js
@@ -19,7 +19,7 @@ Discourse.CategoryGroupComponent = Ember.Component.extend({
       },
       template: Discourse.CategoryGroupComponent.templateFunction(),
       transformComplete: function(category){
-        return Discourse.HTML.categoryLink(category);
+        return Discourse.HTML.categoryLink(category, {allowUncategorized: true});
       }
     });
   }
@@ -32,7 +32,7 @@ Discourse.CategoryGroupComponent.reopenClass({
                                     "<ul>" +
                                     "{{#each options}}" +
                                       "<li>" +
-                                          "{{categoryLinkRaw this}}" +
+                                          "{{categoryLinkRaw this allowUncategorized=true}}" +
                                       "</li>" +
                                       "{{/each}}" +
                                     "</ul>" +
diff --git a/app/assets/javascripts/discourse/lib/autocomplete.js b/app/assets/javascripts/discourse/lib/autocomplete.js
index 33d3715a1..6c181deee 100644
--- a/app/assets/javascripts/discourse/lib/autocomplete.js
+++ b/app/assets/javascripts/discourse/lib/autocomplete.js
@@ -114,6 +114,7 @@ $.fn.autocomplete = function(options) {
       if (options.onChangeItems) {
         options.onChangeItems(inputSelectedItems);
       }
+      return false;
     });
   };
 
diff --git a/app/assets/javascripts/discourse/models/category.js b/app/assets/javascripts/discourse/models/category.js
index dc1a125a2..d4e963a68 100644
--- a/app/assets/javascripts/discourse/models/category.js
+++ b/app/assets/javascripts/discourse/models/category.js
@@ -209,6 +209,12 @@ Discourse.Category.reopenClass({
     return Discourse.Category.list().findBy('id', id);
   },
 
+  findByIds: function(ids){
+    return ids.map(function(id){
+      return Discourse.Category.findById(id);
+    });
+  },
+
   findBySlug: function(slug, parentSlug) {
 
     var categories = Discourse.Category.list(),
diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js
index 6baecbced..c200722b2 100644
--- a/app/assets/javascripts/discourse/models/user.js
+++ b/app/assets/javascripts/discourse/models/user.js
@@ -181,8 +181,12 @@ Discourse.User = Discourse.Model.extend({
                                'external_links_in_new_tab',
                                'watch_new_topics',
                                'enable_quoting');
+
     _.each(['muted','watched','tracked'], function(s){
-      data[s + '_category_ids'] = user.get(s + 'Categories').map(function(c){ return c.get('id')});
+      var cats = user.get(s + 'Categories').map(function(c){ return c.get('id')});
+      // HACK: denote lack of categories
+      if(cats.length === 0) { cats = [-1]; }
+      data[s + '_category_ids'] = cats;
     });
 
     return Discourse.ajax("/users/" + this.get('username_lower'), {
@@ -358,22 +362,17 @@ Discourse.User = Discourse.Model.extend({
   }.property("trust_level", "hasBeenSeenInTheLastMonth"),
 
   updateMutedCategories: function() {
-    this.set("mutedCategories", _.map(this.muted_category_ids, function(id){
-      return Discourse.Category.findById(id);
-    }));
+    this.set("mutedCategories", Discourse.Category.findByIds(this.muted_category_ids));
   }.observes("muted_category_ids"),
 
   updateTrackedCategories: function() {
-    this.set("trackedCategories", _.map(this.tracked_category_ids, function(id){
-      return Discourse.Category.findById(id);
-    }));
+    this.set("trackedCategories", Discourse.Category.findByIds(this.tracked_category_ids));
   }.observes("tracked_category_ids"),
 
   updateWatchedCategories: function() {
-    this.set("watchedCategories", _.map(this.watched_category_ids, function(id){
-      return Discourse.Category.findById(id);
-    }));
+    this.set("watchedCategories", Discourse.Category.findByIds(this.watched_category_ids));
   }.observes("watched_category_ids")
+
 });
 
 Discourse.User.reopenClass(Discourse.Singleton, {
diff --git a/app/models/category_user.rb b/app/models/category_user.rb
index ea59fa3c0..5c06ad831 100644
--- a/app/models/category_user.rb
+++ b/app/models/category_user.rb
@@ -21,9 +21,10 @@ class CategoryUser < ActiveRecord::Base
 
   def self.batch_set(user, level, category_ids)
     records = CategoryUser.where(user: user, notification_level: notification_levels[level])
-
     old_ids = records.pluck(:category_id)
 
+    category_ids = Category.where('id in (?)', category_ids).pluck(:id)
+
     remove = (old_ids - category_ids)
     if remove.present?
       records.where('category_id in (?)', remove).destroy_all