From cf6cbb955ba9fce704365b83a3a379f2a2055031 Mon Sep 17 00:00:00 2001
From: Robin Ward <robin.ward@gmail.com>
Date: Thu, 24 Apr 2014 17:39:34 -0400
Subject: [PATCH] REFACTOR: Introduce `Discourse.computed.setting` to create a
 computed property that links to a `Discourse.SiteSetting`

---
 .../admin/controllers/admin_user_controller.js     |  9 ++-------
 .../discourse/components/home_logo_component.js    | 13 +++----------
 .../controllers/create_account_controller.js       |  4 +---
 .../controllers/edit_category_controller.js        |  4 +---
 .../controllers/poster_expansion_controller.js     |  4 +---
 .../controllers/preferences_controller.js          | 12 +++---------
 .../discourse/controllers/site_map_controller.js   |  4 +---
 .../controllers/user_invited_controller.js         |  4 +---
 app/assets/javascripts/discourse/lib/computed.js   | 14 ++++++++++++++
 test/javascripts/lib/computed_test.js              | 11 +++++++++++
 10 files changed, 38 insertions(+), 41 deletions(-)

diff --git a/app/assets/javascripts/admin/controllers/admin_user_controller.js b/app/assets/javascripts/admin/controllers/admin_user_controller.js
index ec146502764..50dff9a2fe6 100644
--- a/app/assets/javascripts/admin/controllers/admin_user_controller.js
+++ b/app/assets/javascripts/admin/controllers/admin_user_controller.js
@@ -20,13 +20,8 @@ Discourse.AdminUserController = Discourse.ObjectController.extend({});
 Discourse.AdminUserIndexController = Discourse.ObjectController.extend({
   editingTitle: false,
 
-  showApproval: function() {
-    return Discourse.SiteSettings.must_approve_users;
-  }.property(),
-
-  showBadges: function() {
-    return Discourse.SiteSettings.enable_badges;
-  }.property(),
+  showApproval: Discourse.computed.setting('must_approve_users'),
+  showBadges: Discourse.computed.setting('enable_badges'),
 
   primaryGroupDirty: Discourse.computed.propertyNotEqual('originalPrimaryGroupId', 'primary_group_id'),
 
diff --git a/app/assets/javascripts/discourse/components/home_logo_component.js b/app/assets/javascripts/discourse/components/home_logo_component.js
index 8ab855cda41..e605a42407f 100644
--- a/app/assets/javascripts/discourse/components/home_logo_component.js
+++ b/app/assets/javascripts/discourse/components/home_logo_component.js
@@ -9,15 +9,8 @@ Discourse.HomeLogoComponent = Ember.Component.extend({
     return !Discourse.Mobile.mobileView && this.get("minimized");
   }.property("minimized"),
 
-  smallLogoUrl: function() {
-    return Discourse.SiteSettings.logo_small_url;
-  }.property(),
+  smallLogoUrl: Discourse.computed.setting('logo_small_url'),
+  bigLogoUrl: Discourse.computed.setting('logo_url'),
+  title: Discourse.computed.setting('title'),
 
-  bigLogoUrl: function() {
-    return Discourse.SiteSettings.logo_url;
-  }.property(),
-
-  title: function() {
-    return Discourse.SiteSettings.title;
-  }.property()
 });
diff --git a/app/assets/javascripts/discourse/controllers/create_account_controller.js b/app/assets/javascripts/discourse/controllers/create_account_controller.js
index 28790a564b3..a04dc3c6c4f 100644
--- a/app/assets/javascripts/discourse/controllers/create_account_controller.js
+++ b/app/assets/javascripts/discourse/controllers/create_account_controller.js
@@ -324,9 +324,7 @@ Discourse.CreateAccountController = Discourse.Controller.extend(Discourse.ModalF
     });
   },
 
-  tosAcceptRequired: function() {
-    return Discourse.SiteSettings.tos_accept_required;
-  }.property(),
+  tosAcceptRequired: Discourse.computed.setting('tos_accept_required'),
 
   actions: {
     createAccount: function() {
diff --git a/app/assets/javascripts/discourse/controllers/edit_category_controller.js b/app/assets/javascripts/discourse/controllers/edit_category_controller.js
index cff1f1ffb5f..91790b7c903 100644
--- a/app/assets/javascripts/discourse/controllers/edit_category_controller.js
+++ b/app/assets/javascripts/discourse/controllers/edit_category_controller.js
@@ -58,9 +58,7 @@ Discourse.EditCategoryController = Discourse.ObjectController.extend(Discourse.M
     return false;
   }.property('saving', 'name', 'color', 'deleting'),
 
-  emailInEnabled: function() {
-    return Discourse.SiteSettings.email_in;
-  },
+  emailInEnabled: Discourse.computed.setting('email_in'),
 
   deleteDisabled: function() {
     return (this.get('deleting') || this.get('saving') || false);
diff --git a/app/assets/javascripts/discourse/controllers/poster_expansion_controller.js b/app/assets/javascripts/discourse/controllers/poster_expansion_controller.js
index 99cca8f5572..d78edc4fbab 100644
--- a/app/assets/javascripts/discourse/controllers/poster_expansion_controller.js
+++ b/app/assets/javascripts/discourse/controllers/poster_expansion_controller.js
@@ -20,9 +20,7 @@ Discourse.PosterExpansionController = Discourse.ObjectController.extend({
 
   hasUserFilters: Em.computed.gt('postStream.userFilters.length', 0),
 
-  showBadges: function() {
-    return Discourse.SiteSettings.enable_badges;
-  }.property(),
+  showBadges: Discourse.computed.setting('enable_badges'),
 
   moreBadgesCount: function() {
     return this.get('user.badge_count') - this.get('user.featured_user_badges.length');
diff --git a/app/assets/javascripts/discourse/controllers/preferences_controller.js b/app/assets/javascripts/discourse/controllers/preferences_controller.js
index 1467b87ba97..851dce9acbb 100644
--- a/app/assets/javascripts/discourse/controllers/preferences_controller.js
+++ b/app/assets/javascripts/discourse/controllers/preferences_controller.js
@@ -7,13 +7,9 @@
   @module Discourse
 **/
 Discourse.PreferencesController = Discourse.ObjectController.extend({
-  allowAvatarUpload: function() {
-    return Discourse.SiteSettings.allow_uploaded_avatars;
-  }.property(),
 
-  allowUserLocale: function() {
-    return Discourse.SiteSettings.allow_user_locale;
-  }.property(),
+  allowAvatarUpload: Discourse.computed.setting('allow_uploaded_avatars'),
+  allowUserLocale: Discourse.computed.setting('allow_user_locale'),
 
   selectedCategories: function(){
     return [].concat(this.get("watchedCategories"), this.get("trackedCategories"), this.get("mutedCategories"));
@@ -34,9 +30,7 @@ Discourse.PreferencesController = Discourse.ObjectController.extend({
   cannotDeleteAccount: Em.computed.not('can_delete_account'),
   deleteDisabled: Em.computed.or('saving', 'deleting', 'cannotDeleteAccount'),
 
-  canEditName: function() {
-    return Discourse.SiteSettings.enable_names;
-  }.property(),
+  canEditName: Discourse.computed.setting('enable_names'),
 
   canSelectTitle: function() {
     if (!Discourse.SiteSettings.enable_badges || this.get('model.badge_count') === 0) {
diff --git a/app/assets/javascripts/discourse/controllers/site_map_controller.js b/app/assets/javascripts/discourse/controllers/site_map_controller.js
index 01032113862..18f105068e3 100644
--- a/app/assets/javascripts/discourse/controllers/site_map_controller.js
+++ b/app/assets/javascripts/discourse/controllers/site_map_controller.js
@@ -13,9 +13,7 @@ Discourse.SiteMapController = Ember.ArrayController.extend(Discourse.HasCurrentU
     return Discourse.SiteSettings.faq_url ? Discourse.SiteSettings.faq_url : Discourse.getURL('/faq');
   }.property(),
 
-  showMobileToggle: function() {
-    return Discourse.SiteSettings.enable_mobile_theme;
-  }.property(),
+  showMobileToggle: Discourse.computed.setting('enable_mobile_theme'),
 
   mobileViewLinkTextKey: function() {
     return Discourse.Mobile.mobileView ? "desktop_view" : "mobile_view";
diff --git a/app/assets/javascripts/discourse/controllers/user_invited_controller.js b/app/assets/javascripts/discourse/controllers/user_invited_controller.js
index 673e3a0ae28..dc0e82fa1de 100644
--- a/app/assets/javascripts/discourse/controllers/user_invited_controller.js
+++ b/app/assets/javascripts/discourse/controllers/user_invited_controller.js
@@ -31,9 +31,7 @@ Discourse.UserInvitedController = Ember.ObjectController.extend({
 
     @property maxInvites
   **/
-  maxInvites: function() {
-    return Discourse.SiteSettings.invites_shown;
-  }.property(),
+  maxInvites: Discourse.computed.setting('invites_shown'),
 
   /**
     Can the currently logged in user invite users to the site
diff --git a/app/assets/javascripts/discourse/lib/computed.js b/app/assets/javascripts/discourse/lib/computed.js
index 3cf503bd0cb..9a69bbf3c04 100644
--- a/app/assets/javascripts/discourse/lib/computed.js
+++ b/app/assets/javascripts/discourse/lib/computed.js
@@ -128,5 +128,19 @@ Discourse.computed = {
       if (typeof result !== "undefined" && result.toString() === defaultValue) { return; }
       return result;
     }).property(path);
+  },
+
+  /**
+    Creates a property from a SiteSetting. In the future the plan is for them to
+    be able to update when changed.
+
+    @method setting
+    @param {String} name of site setting
+  **/
+  setting: function(name) {
+    return Ember.computed(function() {
+      return Discourse.SiteSettings[name];
+    }).property();
   }
+
 };
diff --git a/test/javascripts/lib/computed_test.js b/test/javascripts/lib/computed_test.js
index 6a97ac80b44..db7c77d2393 100644
--- a/test/javascripts/lib/computed_test.js
+++ b/test/javascripts/lib/computed_test.js
@@ -10,6 +10,17 @@ module("Discourse.Computed", {
   }
 });
 
+test("setting", function() {
+  var t = Em.Object.extend({
+    vehicle: Discourse.computed.setting('vehicle'),
+    missingProp: Discourse.computed.setting('madeUpThing')
+  }).create();
+
+  Discourse.SiteSettings.vehicle = "airplane";
+  equal(t.get('vehicle'), "airplane", "it has the value of the site setting");
+  ok(!t.get('missingProp'), "it is falsy when the site setting is not defined");
+});
+
 test("propertyEqual", function() {
   var t = Em.Object.extend({
     same: Discourse.computed.propertyEqual('cookies', 'biscuits')