import { Component, Host, HostBinding, Input, OnDestroy, OnInit } from '@angular/core'; import { ProgressbarComponent } from './progressbar.component'; import { isBs3 } from '../utils/theme-provider'; // todo: number pipe // todo: use query from progress? @Component({ selector: 'bar', templateUrl: './bar.component.html', host: { role: 'progressbar', 'aria-valuemin': '0', '[class]': '"progress-bar " + (type ? "progress-bar-" + type + " bg-" + type : "")', '[class.progress-bar-animated]': '!isBs3 && animate', '[class.progress-bar-striped]': 'striped', '[class.active]': 'isBs3 && animate', '[attr.aria-valuenow]': 'value', '[attr.aria-valuetext]': 'percent ? percent.toFixed(0) + "%" : ""', '[attr.aria-valuemax]': 'max', '[style.height.%]': '"100"' } }) export class BarComponent implements OnInit, OnDestroy { max: number; /** provide one of the four supported contextual classes: `success`, `info`, `warning`, `danger` */ @Input() type: string; /** current value of progress bar */ @Input() get value(): number { return this._value; } set value(v: number) { if (!v && v !== 0) { return; } this._value = v; this.recalculatePercentage(); } @HostBinding('style.width.%') get setBarWidth() { this.recalculatePercentage(); return this.percent; } get isBs3(): boolean { return isBs3(); } striped: boolean; animate: boolean; percent = 0; progress: ProgressbarComponent; protected _value: number; constructor(@Host() progress: ProgressbarComponent) { this.progress = progress; } ngOnInit(): void { this.progress.addBar(this); } ngOnDestroy(): void { this.progress.removeBar(this); } recalculatePercentage(): void { this.percent = +(this.value / this.progress.max * 100).toFixed(2); const totalPercentage = this.progress.bars .reduce(function (total: number, bar: BarComponent): number { return total + bar.percent; }, 0); if (totalPercentage > 100) { this.percent -= totalPercentage - 100; } } }