From 2b5a2b5fcef721efae5eb514e4a6560d7038177c Mon Sep 17 00:00:00 2001
From: Neil Lalonde <neillalonde@gmail.com>
Date: Tue, 16 Apr 2013 12:09:37 -0400
Subject: [PATCH] Add a refresh button to problems on dashboard, so you can
 check for problems again

---
 .../controllers/admin_dashboard_controller.js | 31 ++++++++++++++++++-
 .../admin/routes/admin_dashboard_route.js     | 15 ++-------
 .../admin/templates/dashboard.js.handlebars   | 21 +++++++++++--
 app/assets/stylesheets/admin/admin_base.scss  |  3 ++
 config/locales/client.en.yml                  |  3 ++
 5 files changed, 57 insertions(+), 16 deletions(-)

diff --git a/app/assets/javascripts/admin/controllers/admin_dashboard_controller.js b/app/assets/javascripts/admin/controllers/admin_dashboard_controller.js
index a62912807..2f85858e8 100644
--- a/app/assets/javascripts/admin/controllers/admin_dashboard_controller.js
+++ b/app/assets/javascripts/admin/controllers/admin_dashboard_controller.js
@@ -9,8 +9,37 @@
 Discourse.AdminDashboardController = Ember.Controller.extend({
   loading: true,
   versionCheck: null,
+  problemsCheckInterval: '1 minute ago',
 
   foundProblems: function() {
     return(this.get('problems') && this.get('problems').length > 0);
-  }.property('problems')
+  }.property('problems'),
+
+  thereWereProblems: function() {
+    if( this.get('foundProblems') ) {
+      this.set('hadProblems', true);
+      return true;
+    } else {
+      return this.get('hadProblems') || false;
+    }
+  }.property('foundProblems'),
+
+  loadProblems: function() {
+    this.set('loadingProblems', true);
+    this.set('problemsFetchedAt', new Date());
+    var c = this;
+    Discourse.AdminDashboard.fetchProblems().then(function(d) {
+      c.set('problems', d.problems);
+      c.set('loadingProblems', false);
+      if( d.problems && d.problems.length > 0 ) {
+        c.problemsCheckInterval = '1 minute ago';
+      } else {
+        c.problemsCheckInterval = '10 minutes ago';
+      }
+    });
+  },
+
+  problemsTimestamp: function() {
+    return this.get('problemsFetchedAt').long();
+  }.property('problemsFetchedAt')
 });
diff --git a/app/assets/javascripts/admin/routes/admin_dashboard_route.js b/app/assets/javascripts/admin/routes/admin_dashboard_route.js
index 41e78f8eb..72d097c25 100644
--- a/app/assets/javascripts/admin/routes/admin_dashboard_route.js
+++ b/app/assets/javascripts/admin/routes/admin_dashboard_route.js
@@ -8,8 +8,6 @@
 **/
 Discourse.AdminDashboardRoute = Discourse.Route.extend({
 
-  problemsCheckInterval: '1 minute ago',
-
   setupController: function(c) {
     this.fetchDashboardData(c);
     this.fetchGithubCommits(c);
@@ -35,18 +33,9 @@ Discourse.AdminDashboardRoute = Discourse.Route.extend({
         c.set('problems', d.problems);
         c.set('loading', false);
       });
-    } else if( !c.get('problemsFetchedAt') || Date.create(this.problemsCheckInterval, 'en') > c.get('problemsFetchedAt') ) {
+    } else if( !c.get('problemsFetchedAt') || Date.create(c.problemsCheckInterval, 'en') > c.get('problemsFetchedAt') ) {
       c.set('problemsFetchedAt', new Date());
-      var _this = this;
-      Discourse.AdminDashboard.fetchProblems().then(function(d) {
-        c.set('problems', d.problems);
-        c.set('loading', false);
-        if( d.problems && d.problems.length > 0 ) {
-          _this.problemsCheckInterval = '1 minute ago';
-        } else {
-          _this.problemsCheckInterval = '10 minutes ago';
-        }
-      });
+      c.loadProblems();
     }
   },
 
diff --git a/app/assets/javascripts/admin/templates/dashboard.js.handlebars b/app/assets/javascripts/admin/templates/dashboard.js.handlebars
index 5ddaddd4a..f011c4e68 100644
--- a/app/assets/javascripts/admin/templates/dashboard.js.handlebars
+++ b/app/assets/javascripts/admin/templates/dashboard.js.handlebars
@@ -3,17 +3,34 @@
     <div class="dashboard-stats detected-problems">
       <div class="look-here"><i class="icon icon-warning-sign"></i></div>
       <div class="problem-messages">
-        <p>
+        <p {{bindAttr class="loadingProblems:invisible"}}>
           {{i18n admin.dashboard.problems_found}}
-          <ul>
+          <ul {{bindAttr class="loadingProblems:invisible"}}>
             {{#each problem in problems}}
               <li>{{{problem}}}</li>
             {{/each}}
           </ul>
         </p>
+        <p class="actions">
+          <small>{{i18n admin.dashboard.last_checked}}: {{problemsTimestamp}}</small>
+          <button {{action loadProblems}} class="btn btn-small"><i class="icon icon-refresh"></i>{{i18n admin.dashboard.refresh_problems}}</button>
+        </p>
       </div>
       <div class="clearfix"></div>
     </div>
+  {{else}}
+    {{#if thereWereProblems}}
+      <div class="dashboard-stats detected-problems">
+        <div class="look-here">&nbsp;</div>
+        <div class="problem-messages">
+          <p>
+            {{i18n admin.dashboard.no_problems}}
+            <button {{action loadProblems}} class="btn btn-small"><i class="icon icon-refresh"></i>{{i18n admin.dashboard.refresh_problems}}</button>
+          </p>
+        </div>
+        <div class="clearfix"></div>
+      </div>
+    {{/if}}
   {{/if}}
 
   {{#if Discourse.SiteSettings.version_checks}}
diff --git a/app/assets/stylesheets/admin/admin_base.scss b/app/assets/stylesheets/admin/admin_base.scss
index 2595582e4..337fec6a3 100644
--- a/app/assets/stylesheets/admin/admin_base.scss
+++ b/app/assets/stylesheets/admin/admin_base.scss
@@ -407,6 +407,9 @@ table {
       a {
         text-decoration: underline;
       }
+      .actions {
+        text-align: right;
+      }
     }
   }
 
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index c88b60554..83c9e622c 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -818,6 +818,9 @@ en:
         latest_version: "Latest"
         update_often: 'Please update often!'
         problems_found: "Some problems have been found with your installation of Discourse:"
+        last_checked: "Last checked"
+        refresh_problems: "Refresh"
+        no_problems: "No problems were found."
         moderators: 'Moderators:'
         admins: 'Admins:'