nitweb: show grade overview in specific page
authorAlexandre Terrasa <alexandre@moz-code.org>
Mon, 28 Nov 2016 21:49:28 +0000 (16:49 -0500)
committerAlexandre Terrasa <alexandre@moz-code.org>
Mon, 5 Dec 2016 15:56:06 +0000 (10:56 -0500)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

share/nitweb/index.html
share/nitweb/javascripts/grades.js [new file with mode: 0644]
share/nitweb/javascripts/model.js
share/nitweb/javascripts/nitweb.js
share/nitweb/views/grades.html [new file with mode: 0644]

index c7657bc..930931d 100644 (file)
@@ -35,6 +35,7 @@
                                                        </a>
                                                        <ul class='dropdown-menu'>
                                                                <li><a href='/docdown'>DocDown</a></li>
+                                                               <li><a href='/grades'>Grades</a></li>
                                                        </ul>
                                                </li>
                                        </ul>
@@ -88,5 +89,6 @@
                <script src='/javascripts/docdown.js'></script>
                <script src='/javascripts/metrics.js'></script>
                <script src='/javascripts/users.js'></script>
+               <script src='/javascripts/grades.js'></script>
        </body>
 </html>
diff --git a/share/nitweb/javascripts/grades.js b/share/nitweb/javascripts/grades.js
new file mode 100644 (file)
index 0000000..41d6647
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2016 Alexandre Terrasa <alexandre@moz-code.org>.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+(function() {
+       angular
+               .module('grades', ['ngSanitize', 'model'])
+
+               .controller('GradesCtrl', ['Feedback', '$scope', function(Feedback, $scope) {
+
+                       this.loadMostRated = function() {
+                               Feedback.loadMostRated(
+                                       function(data) {
+                                               $scope.most = data;
+                                       }, function(err) {
+                                               $scope.error = err;
+                                       });
+                       };
+
+                       this.loadBestRated = function() {
+                               Feedback.loadBestRated(
+                                       function(data) {
+                                               $scope.best = data;
+                                       }, function(err) {
+                                               $scope.error = err;
+                                       });
+                       };
+                       this.loadWorstRated = function() {
+                               Feedback.loadWorstRated(
+                                       function(data) {
+                                               $scope.worst = data;
+                                       }, function(err) {
+                                               $scope.error = err;
+                                       });
+                       };
+                       this.loadUsersRatings = function() {
+                               Feedback.loadUsersRatings(
+                                       function(data) {
+                                               $scope.ratings = data;
+                                       }, function(err) {
+                                               $scope.error = err;
+                                       });
+                       };
+
+                       this.loadMostRated();
+                       this.loadBestRated();
+                       this.loadWorstRated();
+                       this.loadUsersRatings();
+               }])
+})();
index e609047..fb2c008 100644 (file)
                                                {rating: rating})
                                                .success(cb)
                                                .error(cbErr);
-                               }
+                               },
+                               loadMostRated: function(cb, cbErr) {
+                                       $http.get(apiUrl + '/feedback/grades/most')
+                                               .success(cb)
+                                               .error(cbErr);
+                               },
+                               loadBestRated: function(cb, cbErr) {
+                                       $http.get(apiUrl + '/feedback/grades/best')
+                                               .success(cb)
+                                               .error(cbErr);
+                               },
+                               loadWorstRated: function(cb, cbErr) {
+                                       $http.get(apiUrl + '/feedback/grades/worst')
+                                               .success(cb)
+                                               .error(cbErr);
+                               },
+                               loadUsersRatings: function(cb, cbErr) {
+                                       $http.get(apiUrl + '/feedback/grades/users')
+                                               .success(cb)
+                                               .error(cbErr);
+                               },
                        }
                }])
 
index 6cac103..73c7c2a 100644 (file)
@@ -15,7 +15,7 @@
  */
 
 (function() {
-       angular.module('nitweb', ['ngRoute', 'ngSanitize', 'angular-loading-bar', 'entities', 'docdown', 'index', 'metrics', 'users'])
+       angular.module('nitweb', ['ngRoute', 'ngSanitize', 'angular-loading-bar', 'entities', 'docdown', 'index', 'metrics', 'users', 'grades'])
        .config(['cfpLoadingBarProvider', function(cfpLoadingBarProvider) {
                cfpLoadingBarProvider.includeSpinner = false;
        }])
                                controller: 'DocdownCtrl',
                                controllerAs: 'docdownCtrl'
                        })
+                       .when('/grades', {
+                               templateUrl: 'views/grades.html',
+                               controller: 'GradesCtrl',
+                               controllerAs: 'gradesCtrl'
+                       })
                        .when('/login', {
                                controller : function(){
                                        window.location.replace('/login');
diff --git a/share/nitweb/views/grades.html b/share/nitweb/views/grades.html
new file mode 100644 (file)
index 0000000..3a928f5
--- /dev/null
@@ -0,0 +1,93 @@
+<div class='container-fluid'>
+       <div class='page-header'>
+               <h2>Grades</h2>
+
+               <div class='container-fluid'>
+                       <div class='col-xs-6'>
+                               <div class='card'>
+                                       <div class='card-body'>
+                                               <h4 class='card-title'>Most rated entities</h4>
+                                               <p ng-if='!most || most.length == 0' class='text-muted'>
+                                                       <i>No grades yet</i>
+                                               </p>
+                                               <table class='table' ng-if='most.length > 0'>
+                                                       <tr>
+                                                               <th width='60%'>Entity</th>
+                                                               <th>Total grades</th>
+                                                       </tr>
+                                                       <tr ng-repeat='rating in most'>
+                                                               <th><a href='/doc/{{rating._id}}'>{{rating._id}}</a></th>
+                                                               <td>{{rating.count}}</td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                               </div>
+                       </div>
+                       <div class='col-xs-6'>
+                               <div class='card'>
+                                       <div class='card-body'>
+                                               <h4 class='card-title'>Best rated entities</h4>
+                                               <p ng-if='!best || best.length == 0' class='text-muted'>
+                                                       <i>No grades yet</i>
+                                               </p>
+                                               <table class='table' ng-if='best.length > 0'>
+                                                       <tr>
+                                                               <th width='60%'>Entity</th>
+                                                               <th>Avg. grade</th>
+                                                       </tr>
+                                                       <tr ng-repeat='rating in best'>
+                                                               <th><a href='/doc/{{rating._id}}'>{{rating._id}}</a></th>
+                                                               <td>{{rating.avg}}</td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                               </div>
+                       </div>
+                       <div class='col-xs-6'>
+                               <div class='card'>
+                                       <div class='card-body'>
+                                               <h4 class='card-title'>Most active users</h4>
+                                               <p ng-if='!ratings || ratings.length == 0' class='text-muted'>
+                                                       <i>No grades yet</i>
+                                               </p>
+                                               <table class='table' ng-if='ratings.length > 0'>
+                                                       <tr>
+                                                               <th width='60%'>User</th>
+                                                               <th>Total grades</th>
+                                                       </tr>
+                                                       <tr ng-repeat='rating in ratings'>
+                                                               <th ng-if='rating._id'>
+                                                                       <b>{{rating._id}}</b>
+                                                               </th>
+                                                               <th ng-if='!rating._id'>
+                                                                       <em>anon.</em>
+                                                               </th>
+                                                               <td>{{rating.count}}</td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                               </div>
+                       </div>
+                       <div class='col-xs-6'>
+                               <div class='card'>
+                                       <div class='card-body'>
+                                               <h4 class='card-title'>Worst rated entities</h4>
+                                               <p ng-if='!worst || worst.length == 0' class='text-muted'>
+                                                       <i>No grades yet</i>
+                                               </p>
+                                               <table class='table' ng-if='worst.length > 0'>
+                                                       <tr>
+                                                               <th width='60%'>Entity</th>
+                                                               <th>Total grades</th>
+                                                       </tr>
+                                                       <tr ng-repeat='rating in worst'>
+                                                               <th><a href='/doc/{{rating._id}}'>{{rating._id}}</a></th>
+                                                               <td>{{rating.avg}}</td>
+                                                       </tr>
+                                               </table>
+                                       </div>
+                               </div>
+                       </div>
+               </div>
+       </div>
+</div>