</a>
<ul class='dropdown-menu'>
<li><a href='/docdown'>DocDown</a></li>
+ <li><a href='/grades'>Grades</a></li>
</ul>
</li>
</ul>
<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>
--- /dev/null
+/*
+ * 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();
+ }])
+})();
{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);
+ },
}
}])
*/
(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');
--- /dev/null
+<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>