106 lines
2.7 KiB
JavaScript

import {Component, View, Attribute, onChange} from 'angular2/angular2';
import {isPresent, isBlank} from 'angular2/src/facade/lang';
import {Math} from 'angular2/src/facade/math';
@Component({
selector: 'md-progress-linear',
lifecycle: [onChange],
properties: {
'value': 'value',
'bufferValue': 'buffer-value'
},
hostProperties: {
'role': 'attr.role',
'ariaValuemin': 'attr.aria-valuemin',
'ariaValuemax': 'attr.aria-valuemax',
'ariaValuenow': 'attr.aria-valuenow'
}
})
@View({
templateUrl: 'angular2_material/src/components/progress-linear/progress_linear.html',
directives: []
})
export class MdProgressLinear {
/** Value for the primary bar. */
value_: number;
/** Value for the secondary bar. */
bufferValue: number;
/** The render mode for the progress bar. */
mode: string;
/** Attribute setter for aria-valuenow. */
ariaValueNowSetter: Function;
/** CSS `transform` property applied to the primary bar. */
primaryBarTransform: string;
/** CSS `transform` property applied to the secondary bar. */
secondaryBarTransform: string;
role:any;
ariaValuemin:any;
ariaValuemax:any;
ariaValuenow:any;
constructor(@Attribute('md-mode') mode: string) {
this.ariaValueNowSetter = ariaValueNowSetter;
this.primaryBarTransform = '';
this.secondaryBarTransform = '';
this.role = 'progressbar';
this.ariaValuemin = '0';
this.ariaValuemax = '100';
this.mode = isPresent(mode) ? mode : Mode.DETERMINATE;
}
get value() {
return this.value_;
}
set value(v) {
if (isPresent(v)) {
this.value_ = MdProgressLinear.clamp(v);
this.ariaValueNowSetter(this.value_);
}
}
onChange(_) {
// If the mode does not use a value, or if there is no value, do nothing.
if (this.mode == Mode['QUERY'] || this.mode == Mode['INDETERMINATE'] || isBlank(this.value)) {
return;
}
this.primaryBarTransform = this.transformForValue(this.value);
// The bufferValue is only used in buffer mode.
if (this.mode == Mode['BUFFER']) {
this.secondaryBarTransform = this.transformForValue(this.bufferValue);
}
}
/** Gets the CSS `transform` property for a progress bar based on the given value (0 - 100). */
transformForValue(value) {
// TODO(jelbourn): test perf gain of caching these, since there are only 101 values.
var scale = value / 100;
var translateX = (value - 100) / 2;
return `translateX(${translateX}%) scale(${scale}, 1)`;
}
/** Clamps a value to be between 0 and 100. */
static clamp(v) {
return Math.max(0, Math.min(100, v));
}
}
/** @enum {string} Progress-linear modes. */
var Mode = {
'DETERMINATE': 'determinate',
'INDETERMINATE': 'indeterminate',
'BUFFER': 'buffer',
'QUERY': 'query'
};