bar.component.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import { Component, Host, HostBinding, Input, ElementRef, Renderer2 } from '@angular/core';
  6. import { ProgressbarComponent } from './progressbar.component';
  7. import { isBs3 } from 'ngx-bootstrap/utils';
  8. // todo: number pipe
  9. // todo: use query from progress?
  10. export class BarComponent {
  11. /**
  12. * @param {?} el
  13. * @param {?} progress
  14. * @param {?} renderer
  15. */
  16. constructor(el, progress, renderer) {
  17. this.el = el;
  18. this.renderer = renderer;
  19. this.addClass = true;
  20. this.percent = 0;
  21. this.progress = progress;
  22. }
  23. /**
  24. * provide one of the four supported contextual classes: `success`, `info`, `warning`, `danger`
  25. * @return {?}
  26. */
  27. get type() {
  28. return this._type;
  29. }
  30. /**
  31. * @param {?} v
  32. * @return {?}
  33. */
  34. set type(v) {
  35. this._type = v;
  36. this.applyTypeClasses();
  37. }
  38. /**
  39. * current value of progress bar
  40. * @return {?}
  41. */
  42. get value() {
  43. return this._value;
  44. }
  45. /**
  46. * @param {?} v
  47. * @return {?}
  48. */
  49. set value(v) {
  50. if (!v && v !== 0) {
  51. return;
  52. }
  53. this._value = v;
  54. this.recalculatePercentage();
  55. }
  56. /**
  57. * @return {?}
  58. */
  59. get setBarWidth() {
  60. this.recalculatePercentage();
  61. return this.percent;
  62. }
  63. /**
  64. * @return {?}
  65. */
  66. get isBs3() {
  67. return isBs3();
  68. }
  69. /**
  70. * @return {?}
  71. */
  72. ngOnInit() {
  73. this.progress.addBar(this);
  74. }
  75. /**
  76. * @return {?}
  77. */
  78. ngOnDestroy() {
  79. this.progress.removeBar(this);
  80. }
  81. /**
  82. * @return {?}
  83. */
  84. recalculatePercentage() {
  85. this.percent = +(this.value / this.progress.max * 100).toFixed(2);
  86. /** @type {?} */
  87. const totalPercentage = this.progress.bars
  88. .reduce((/**
  89. * @param {?} total
  90. * @param {?} bar
  91. * @return {?}
  92. */
  93. function (total, bar) {
  94. return total + bar.percent;
  95. }), 0);
  96. if (totalPercentage > 100) {
  97. this.percent -= totalPercentage - 100;
  98. }
  99. }
  100. /**
  101. * @private
  102. * @return {?}
  103. */
  104. applyTypeClasses() {
  105. if (this._prevType) {
  106. /** @type {?} */
  107. const barTypeClass = `progress-bar-${this._prevType}`;
  108. /** @type {?} */
  109. const bgClass = `bg-${this._prevType}`;
  110. this.renderer.removeClass(this.el.nativeElement, barTypeClass);
  111. this.renderer.removeClass(this.el.nativeElement, bgClass);
  112. this._prevType = null;
  113. }
  114. if (this._type) {
  115. /** @type {?} */
  116. const barTypeClass = `progress-bar-${this._type}`;
  117. /** @type {?} */
  118. const bgClass = `bg-${this._type}`;
  119. this.renderer.addClass(this.el.nativeElement, barTypeClass);
  120. this.renderer.addClass(this.el.nativeElement, bgClass);
  121. this._prevType = this._type;
  122. }
  123. }
  124. }
  125. BarComponent.decorators = [
  126. { type: Component, args: [{
  127. selector: 'bar',
  128. template: "<ng-content></ng-content>\n",
  129. host: {
  130. role: 'progressbar',
  131. 'aria-valuemin': '0',
  132. '[class.progress-bar-animated]': '!isBs3 && animate',
  133. '[class.progress-bar-striped]': 'striped',
  134. '[class.active]': 'isBs3 && animate',
  135. '[attr.aria-valuenow]': 'value',
  136. '[attr.aria-valuetext]': 'percent ? percent.toFixed(0) + "%" : ""',
  137. '[attr.aria-valuemax]': 'max',
  138. '[style.height.%]': '"100"'
  139. }
  140. }] }
  141. ];
  142. /** @nocollapse */
  143. BarComponent.ctorParameters = () => [
  144. { type: ElementRef },
  145. { type: ProgressbarComponent, decorators: [{ type: Host }] },
  146. { type: Renderer2 }
  147. ];
  148. BarComponent.propDecorators = {
  149. type: [{ type: Input }],
  150. value: [{ type: Input }],
  151. setBarWidth: [{ type: HostBinding, args: ['style.width.%',] }],
  152. addClass: [{ type: HostBinding, args: ['class.progress-bar',] }]
  153. };
  154. if (false) {
  155. /** @type {?} */
  156. BarComponent.prototype.max;
  157. /** @type {?} */
  158. BarComponent.prototype.addClass;
  159. /** @type {?} */
  160. BarComponent.prototype.striped;
  161. /** @type {?} */
  162. BarComponent.prototype.animate;
  163. /** @type {?} */
  164. BarComponent.prototype.percent;
  165. /** @type {?} */
  166. BarComponent.prototype.progress;
  167. /**
  168. * @type {?}
  169. * @protected
  170. */
  171. BarComponent.prototype._value;
  172. /**
  173. * @type {?}
  174. * @protected
  175. */
  176. BarComponent.prototype._type;
  177. /**
  178. * @type {?}
  179. * @private
  180. */
  181. BarComponent.prototype._prevType;
  182. /**
  183. * @type {?}
  184. * @private
  185. */
  186. BarComponent.prototype.el;
  187. /**
  188. * @type {?}
  189. * @private
  190. */
  191. BarComponent.prototype.renderer;
  192. }
  193. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1ib290c3RyYXAvcHJvZ3Jlc3NiYXIvIiwic291cmNlcyI6WyJiYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULElBQUksRUFDSixXQUFXLEVBQ1gsS0FBSyxFQUdMLFVBQVUsRUFDVixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7QUFtQjVDLE1BQU0sT0FBTyxZQUFZOzs7Ozs7SUFrRHZCLFlBQ1UsRUFBYyxFQUNkLFFBQThCLEVBQzlCLFFBQW1CO1FBRm5CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFFZCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBbEJNLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFRbkQsWUFBTyxHQUFHLENBQUMsQ0FBQztRQVlWLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0lBQzNCLENBQUM7Ozs7O0lBcERELElBQ0ksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDOzs7OztJQUVELElBQUksSUFBSSxDQUFDLENBQVM7UUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUdELElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOzs7OztJQUVELElBQUksS0FBSyxDQUFDLENBQVM7UUFDakIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hC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VyxTQUFDLG9CQUFvQjs7OztJQWxDakMsMkJBQVk7O0lBa0NaLGdDQUFtRDs7SUFNbkQsK0JBQWlCOztJQUNqQiwrQkFBaUI7O0lBQ2pCLCtCQUFZOztJQUNaLGdDQUErQjs7Ozs7SUFFL0IsOEJBQXlCOzs7OztJQUN6Qiw2QkFBd0I7Ozs7O0lBQ3hCLGlDQUEwQjs7Ozs7SUFHeEIsMEJBQXNCOzs7OztJQUV0QixnQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEhvc3QsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUHJvZ3Jlc3NiYXJDb21wb25lbnQgfSBmcm9tICcuL3Byb2dyZXNzYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBpc0JzMyB9IGZyb20gJ25neC1ib290c3RyYXAvdXRpbHMnO1xuXG4vLyB0b2RvOiBudW1iZXIgcGlwZVxuLy8gdG9kbzogdXNlIHF1ZXJ5IGZyb20gcHJvZ3Jlc3M/XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdiYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgIHJvbGU6ICdwcm9ncmVzc2JhcicsXG4gICAgJ2FyaWEtdmFsdWVtaW4nOiAnMCcsXG4gICAgJ1tjbGFzcy5wcm9ncmVzcy1iYXItYW5pbWF0ZWRdJzogJyFpc0JzMyAmJiBhbmltYXRlJyxcbiAgICAnW2NsYXNzLnByb2dyZXNzLWJhci1zdHJpcGVkXSc6ICdzdHJpcGVkJyxcbiAgICAnW2NsYXNzLmFjdGl2ZV0nOiAnaXNCczMgJiYgYW5pbWF0ZScsXG4gICAgJ1thdHRyLmFyaWEtdmFsdWVub3ddJzogJ3ZhbHVlJyxcbiAgICAnW2F0dHIuYXJpYS12YWx1ZXRleHRdJzogJ3BlcmNlbnQgPyBwZXJjZW50LnRvRml4ZWQoMCkgKyBcIiVcIiA6IFwiXCInLFxuICAgICdbYXR0ci5hcmlhLXZhbHVlbWF4XSc6ICdtYXgnLFxuICAgICdbc3R5bGUuaGVpZ2h0LiVdJzogJ1wiMTAwXCInXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBtYXg6IG51bWJlcjtcblxuICAvKiogcHJvdmlkZSBvbmUgb2YgdGhlIGZvdXIgc3VwcG9ydGVkIGNvbnRleHR1YWwgY2xhc3NlczogYHN1Y2Nlc3NgLCBgaW5mb2AsIGB3YXJuaW5nYCwgYGRhbmdlcmAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHR5cGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIHNldCB0eXBlKHY6IHN0cmluZykge1xuICAgIHRoaXMuX3R5cGUgPSB2O1xuICAgIHRoaXMuYXBwbHlUeXBlQ2xhc3NlcygpO1xuICB9XG5cbiAgLyoqIGN1cnJlbnQgdmFsdWUgb2YgcHJvZ3Jlc3MgYmFyICovXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2OiBudW1iZXIpIHtcbiAgICBpZiAoIXYgJiYgdiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgdGhpcy5yZWNhbGN1bGF0ZVBlcmNlbnRhZ2UoKTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnc3R5bGUud2lkdGguJScpXG4gIGdldCBzZXRCYXJXaWR0aCgpIHtcbiAgICB0aGlzLnJlY2FsY3VsYXRlUGVyY2VudGFnZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMucGVyY2VudDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MucHJvZ3Jlc3MtYmFyJykgYWRkQ2xhc3MgPSB0cnVlO1xuXG4gIGdldCBpc0JzMygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNCczMoKTtcbiAgfVxuXG4gIHN0cmlwZWQ6IGJvb2xlYW47XG4gIGFuaW1hdGU6IGJvb2xlYW47XG4gIHBlcmNlbnQgPSAwO1xuICBwcm9ncmVzczogUHJvZ3Jlc3NiYXJDb21wb25lbnQ7XG5cbiAgcHJvdGVjdGVkIF92YWx1ZTogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX3R5cGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcHJldlR5cGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsOiBFbGVtZW50UmVmLFxuICAgIEBIb3N0KCkgcHJvZ3Jlc3M6IFByb2dyZXNzYmFyQ29tcG9uZW50LFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHtcbiAgICB0aGlzLnByb2dyZXNzID0gcHJvZ3Jlc3M7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnByb2dyZXNzLmFkZEJhcih0aGlzKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucHJvZ3Jlc3MucmVtb3ZlQmFyKHRoaXMpO1xuICB9XG5cbiAgcmVjYWxjdWxhdGVQZXJjZW50YWdlKCk6IHZvaWQge1xuICAgIHRoaXMucGVyY2VudCA9ICsodGhpcy52YWx1ZSAvIHRoaXMucHJvZ3Jlc3MubWF4ICogMTAwKS50b0ZpeGVkKDIpO1xuXG4gICAgY29uc3QgdG90YWxQZXJjZW50YWdlID0gdGhpcy5wcm9ncmVzcy5iYXJzXG4gICAgICAucmVkdWNlKGZ1bmN0aW9uICh0b3RhbDogbnVtYmVyLCBiYXI6IEJhckNvbXBvbmVudCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0b3RhbCArIGJhci5wZXJjZW50O1xuICAgICAgfSwgMCk7XG5cbiAgICBpZiAodG90YWxQZXJjZW50YWdlID4gMTAwKSB7XG4gICAgICB0aGlzLnBlcmNlbnQgLT0gdG90YWxQZXJjZW50YWdlIC0gMTAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUeXBlQ2xhc3NlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcHJldlR5cGUpIHtcbiAgICAgIGNvbnN0IGJhclR5cGVDbGFzcyA9IGBwcm9ncmVzcy1iYXItJHt0aGlzLl9wcmV2VHlwZX1gO1xuICAgICAgY29uc3QgYmdDbGFzcyA9IGBiZy0ke3RoaXMuX3ByZXZUeXBlfWA7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgYmFyVHlwZUNsYXNzKTtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBiZ0NsYXNzKTtcbiAgICAgIHRoaXMuX3ByZXZUeXBlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdHlwZSkge1xuICAgICAgY29uc3QgYmFyVHlwZUNsYXNzID0gYHByb2dyZXNzLWJhci0ke3RoaXMuX3R5cGV9YDtcbiAgICAgIGNvbnN0IGJnQ2xhc3MgPSBgYmctJHt0aGlzLl90eXBlfWA7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgYmFyVHlwZUNsYXNzKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbC5uYXRpdmVFbGVtZW50LCBiZ0NsYXNzKTtcbiAgICAgIHRoaXMuX3ByZXZUeXBlID0gdGhpcy5fdHlwZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==