blob: 366aadba95f0b26663325c7818ce1721699547a7 [file] [log] [blame]
angular.module('ui.bootstrap.progressbar', [])
.constant('uibProgressConfig', {
animate: true,
max: 100
})
.controller('UibProgressController', ['$scope', '$attrs', 'uibProgressConfig', function($scope, $attrs, progressConfig) {
var self = this,
animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;
this.bars = [];
$scope.max = angular.isDefined($scope.max) ? $scope.max : progressConfig.max;
this.addBar = function(bar, element, attrs) {
if (!animate) {
element.css({'transition': 'none'});
}
this.bars.push(bar);
bar.max = $scope.max;
bar.title = attrs && angular.isDefined(attrs.title) ? attrs.title : 'progressbar';
bar.$watch('value', function(value) {
bar.recalculatePercentage();
});
bar.recalculatePercentage = function() {
var totalPercentage = self.bars.reduce(function(total, bar) {
bar.percent = +(100 * bar.value / bar.max).toFixed(2);
return total + bar.percent;
}, 0);
if (totalPercentage > 100) {
bar.percent -= totalPercentage - 100;
}
};
bar.$on('$destroy', function() {
element = null;
self.removeBar(bar);
});
};
this.removeBar = function(bar) {
this.bars.splice(this.bars.indexOf(bar), 1);
this.bars.forEach(function (bar) {
bar.recalculatePercentage();
});
};
$scope.$watch('max', function(max) {
self.bars.forEach(function(bar) {
bar.max = $scope.max;
bar.recalculatePercentage();
});
});
}])
.directive('uibProgress', function() {
return {
replace: true,
transclude: true,
controller: 'UibProgressController',
require: 'uibProgress',
scope: {
max: '=?'
},
templateUrl: 'template/progressbar/progress.html'
};
})
.directive('uibBar', function() {
return {
replace: true,
transclude: true,
require: '^uibProgress',
scope: {
value: '=',
type: '@'
},
templateUrl: 'template/progressbar/bar.html',
link: function(scope, element, attrs, progressCtrl) {
progressCtrl.addBar(scope, element, attrs);
}
};
})
.directive('uibProgressbar', function() {
return {
replace: true,
transclude: true,
controller: 'UibProgressController',
scope: {
value: '=',
max: '=?',
type: '@'
},
templateUrl: 'template/progressbar/progressbar.html',
link: function(scope, element, attrs, progressCtrl) {
progressCtrl.addBar(scope, angular.element(element.children()[0]), {title: attrs.title});
}
};
});
/* Deprecated progressbar below */
angular.module('ui.bootstrap.progressbar')
.value('$progressSuppressWarning', false)
.controller('ProgressController', ['$scope', '$attrs', 'uibProgressConfig', '$log', '$progressSuppressWarning', function($scope, $attrs, progressConfig, $log, $progressSuppressWarning) {
if (!$progressSuppressWarning) {
$log.warn('ProgressController is now deprecated. Use UibProgressController instead.');
}
var self = this,
animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;
this.bars = [];
$scope.max = angular.isDefined($scope.max) ? $scope.max : progressConfig.max;
this.addBar = function(bar, element, attrs) {
if (!animate) {
element.css({'transition': 'none'});
}
this.bars.push(bar);
bar.max = $scope.max;
bar.title = attrs && angular.isDefined(attrs.title) ? attrs.title : 'progressbar';
bar.$watch('value', function(value) {
bar.recalculatePercentage();
});
bar.recalculatePercentage = function() {
bar.percent = +(100 * bar.value / bar.max).toFixed(2);
var totalPercentage = self.bars.reduce(function(total, bar) {
return total + bar.percent;
}, 0);
if (totalPercentage > 100) {
bar.percent -= totalPercentage - 100;
}
};
bar.$on('$destroy', function() {
element = null;
self.removeBar(bar);
});
};
this.removeBar = function(bar) {
this.bars.splice(this.bars.indexOf(bar), 1);
};
$scope.$watch('max', function(max) {
self.bars.forEach(function(bar) {
bar.max = $scope.max;
bar.recalculatePercentage();
});
});
}])
.directive('progress', ['$log', '$progressSuppressWarning', function($log, $progressSuppressWarning) {
return {
replace: true,
transclude: true,
controller: 'ProgressController',
require: 'progress',
scope: {
max: '=?',
title: '@?'
},
templateUrl: 'template/progressbar/progress.html',
link: function() {
if (!$progressSuppressWarning) {
$log.warn('progress is now deprecated. Use uib-progress instead.');
}
}
};
}])
.directive('bar', ['$log', '$progressSuppressWarning', function($log, $progressSuppressWarning) {
return {
replace: true,
transclude: true,
require: '^progress',
scope: {
value: '=',
type: '@'
},
templateUrl: 'template/progressbar/bar.html',
link: function(scope, element, attrs, progressCtrl) {
if (!$progressSuppressWarning) {
$log.warn('bar is now deprecated. Use uib-bar instead.');
}
progressCtrl.addBar(scope, element);
}
};
}])
.directive('progressbar', ['$log', '$progressSuppressWarning', function($log, $progressSuppressWarning) {
return {
replace: true,
transclude: true,
controller: 'ProgressController',
scope: {
value: '=',
max: '=?',
type: '@'
},
templateUrl: 'template/progressbar/progressbar.html',
link: function(scope, element, attrs, progressCtrl) {
if (!$progressSuppressWarning) {
$log.warn('progressbar is now deprecated. Use uib-progressbar instead.');
}
progressCtrl.addBar(scope, angular.element(element.children()[0]), {title: attrs.title});
}
};
}]);