/*! * Angular Material Design * https://github.com/angular/material * @license MIT * v0.9.8 */ (function( window, angular, undefined ){ "use strict"; /** * @ngdoc module * @name material.components.progressLinear * @description Linear Progress module! */ angular.module('material.components.progressLinear', [ 'material.core' ]) .directive('mdProgressLinear', MdProgressLinearDirective); /** * @ngdoc directive * @name mdProgressLinear * @module material.components.progressLinear * @restrict E * * @description * The linear progress directive is used to make loading content in your app as delightful and painless as possible by minimizing the amount of visual change a user sees before they can view and interact with content. Each operation should only be represented by one activity indicator—for example, one refresh operation should not display both a refresh bar and an activity circle. * * For operations where the percentage of the operation completed can be determined, use a determinate indicator. They give users a quick sense of how long an operation will take. * * For operations where the user is asked to wait a moment while something finishes up, and it’s not necessary to expose what's happening behind the scenes and how long it will take, use an indeterminate indicator. * * @param {string} md-mode Select from one of four modes: determinate, indeterminate, buffer or query. * @param {number=} value In determinate and buffer modes, this number represents the percentage of the primary progress bar. Default: 0 * @param {number=} md-buffer-value In the buffer mode, this number represents the precentage of the secondary progress bar. Default: 0 * * @usage * * * * * * * * * * * */ function MdProgressLinearDirective($$rAF, $mdConstant, $mdTheming) { return { restrict: 'E', template: '
' + '
' + '
' + '
' + '
', compile: compile }; function compile(tElement, tAttrs, transclude) { tElement.attr('aria-valuemin', 0); tElement.attr('aria-valuemax', 100); tElement.attr('role', 'progressbar'); return postLink; } function postLink(scope, element, attr) { $mdTheming(element); var bar1Style = element[0].querySelector('.md-bar1').style, bar2Style = element[0].querySelector('.md-bar2').style, container = angular.element(element[0].querySelector('.md-container')); attr.$observe('value', function(value) { if (attr.mdMode == 'query') { return; } var clamped = clamp(value); element.attr('aria-valuenow', clamped); bar2Style[$mdConstant.CSS.TRANSFORM] = transforms[clamped]; }); attr.$observe('mdBufferValue', function(value) { bar1Style[$mdConstant.CSS.TRANSFORM] = transforms[clamp(value)]; }); $$rAF(function() { container.addClass('md-ready'); }); } function clamp(value) { if (value > 100) { return 100; } if (value < 0) { return 0; } return Math.ceil(value || 0); } } MdProgressLinearDirective.$inject = ["$$rAF", "$mdConstant", "$mdTheming"]; // ********************************************************** // Private Methods // ********************************************************** var transforms = (function() { var values = new Array(101); for(var i = 0; i < 101; i++){ values[i] = makeTransform(i); } return values; function makeTransform(value){ var scale = value/100; var translateX = (value-100)/2; return 'translateX(' + translateX.toString() + '%) scale(' + scale.toString() + ', 1)'; } })(); })(window, window.angular);