| angular.module('ui.bootstrap.rating', []) |
| |
| .constant('uibRatingConfig', { |
| max: 5, |
| stateOn: null, |
| stateOff: null, |
| titles : ['one', 'two', 'three', 'four', 'five'] |
| }) |
| |
| .controller('UibRatingController', ['$scope', '$attrs', 'uibRatingConfig', function($scope, $attrs, ratingConfig) { |
| var ngModelCtrl = { $setViewValue: angular.noop }; |
| |
| this.init = function(ngModelCtrl_) { |
| ngModelCtrl = ngModelCtrl_; |
| ngModelCtrl.$render = this.render; |
| |
| ngModelCtrl.$formatters.push(function(value) { |
| if (angular.isNumber(value) && value << 0 !== value) { |
| value = Math.round(value); |
| } |
| return value; |
| }); |
| |
| this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; |
| this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; |
| var tmpTitles = angular.isDefined($attrs.titles) ? $scope.$parent.$eval($attrs.titles) : ratingConfig.titles ; |
| this.titles = angular.isArray(tmpTitles) && tmpTitles.length > 0 ? |
| tmpTitles : ratingConfig.titles; |
| |
| var ratingStates = angular.isDefined($attrs.ratingStates) ? |
| $scope.$parent.$eval($attrs.ratingStates) : |
| new Array(angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max); |
| $scope.range = this.buildTemplateObjects(ratingStates); |
| }; |
| |
| this.buildTemplateObjects = function(states) { |
| for (var i = 0, n = states.length; i < n; i++) { |
| states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff, title: this.getTitle(i) }, states[i]); |
| } |
| return states; |
| }; |
| |
| this.getTitle = function(index) { |
| if (index >= this.titles.length) { |
| return index + 1; |
| } else { |
| return this.titles[index]; |
| } |
| }; |
| |
| $scope.rate = function(value) { |
| if (!$scope.readonly && value >= 0 && value <= $scope.range.length) { |
| ngModelCtrl.$setViewValue(ngModelCtrl.$viewValue === value ? 0 : value); |
| ngModelCtrl.$render(); |
| } |
| }; |
| |
| $scope.enter = function(value) { |
| if (!$scope.readonly) { |
| $scope.value = value; |
| } |
| $scope.onHover({value: value}); |
| }; |
| |
| $scope.reset = function() { |
| $scope.value = ngModelCtrl.$viewValue; |
| $scope.onLeave(); |
| }; |
| |
| $scope.onKeydown = function(evt) { |
| if (/(37|38|39|40)/.test(evt.which)) { |
| evt.preventDefault(); |
| evt.stopPropagation(); |
| $scope.rate($scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1)); |
| } |
| }; |
| |
| this.render = function() { |
| $scope.value = ngModelCtrl.$viewValue; |
| }; |
| }]) |
| |
| .directive('uibRating', function() { |
| return { |
| require: ['uibRating', 'ngModel'], |
| scope: { |
| readonly: '=?', |
| onHover: '&', |
| onLeave: '&' |
| }, |
| controller: 'UibRatingController', |
| templateUrl: 'template/rating/rating.html', |
| replace: true, |
| link: function(scope, element, attrs, ctrls) { |
| var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1]; |
| ratingCtrl.init(ngModelCtrl); |
| } |
| }; |
| }); |
| |
| /* Deprecated rating below */ |
| |
| angular.module('ui.bootstrap.rating') |
| |
| .value('$ratingSuppressWarning', false) |
| |
| .controller('RatingController', ['$scope', '$attrs', '$controller', '$log', '$ratingSuppressWarning', function($scope, $attrs, $controller, $log, $ratingSuppressWarning) { |
| if (!$ratingSuppressWarning) { |
| $log.warn('RatingController is now deprecated. Use UibRatingController instead.'); |
| } |
| |
| angular.extend(this, $controller('UibRatingController', { |
| $scope: $scope, |
| $attrs: $attrs |
| })); |
| }]) |
| |
| .directive('rating', ['$log', '$ratingSuppressWarning', function($log, $ratingSuppressWarning) { |
| return { |
| require: ['rating', 'ngModel'], |
| scope: { |
| readonly: '=?', |
| onHover: '&', |
| onLeave: '&' |
| }, |
| controller: 'RatingController', |
| templateUrl: 'template/rating/rating.html', |
| replace: true, |
| link: function(scope, element, attrs, ctrls) { |
| if (!$ratingSuppressWarning) { |
| $log.warn('rating is now deprecated. Use uib-rating instead.'); |
| } |
| var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1]; |
| ratingCtrl.init(ngModelCtrl); |
| } |
| }; |
| }]); |