UNPKG

ngx-progressbar

Version:

<p align="center"> <img height="200px" width="200px" style="text-align: center;" src="https://gitcdn.xyz/repo/MurhafSousli/ngx-progressbar/master/projects/ngx-progressbar-demo/src/assets/logo.svg"> <h1 align="center">Angular Progressbar</h1> </p>

123 lines 16.6 kB
import { Subject, BehaviorSubject, timer, of, combineLatest, Subscription, EMPTY } from 'rxjs'; import { tap, delay, debounce, switchMap, takeUntil, finalize, filter } from 'rxjs/operators'; export class NgProgressRef { constructor(customConfig, _onDestroyCallback) { this._onDestroyCallback = _onDestroyCallback; // Progress start source event (used to cancel finalizing delays) this._started = new Subject(); // Progress start event: stream that emits only when it hasn't already started this.started = this._started.pipe(filter(() => !this.isStarted)); // Progress ended source event this._completed = new Subject(); // Progress start event: stream that emits only when it has already started this.completed = this._completed.pipe(filter(() => this.isStarted)); // Stream that increments and updates the progress state this._trickling = new Subject(); // Stream that combines "_trickling" and "config" streams this._worker = Subscription.EMPTY; this._state = new BehaviorSubject({ active: false, value: 0 }); this._config = new BehaviorSubject(customConfig); this.state = this._state.asObservable(); this.config = this._config.asObservable(); this._worker = combineLatest([this._trickling, this._config]).pipe(debounce(([start, config]) => timer(start ? config.debounceTime : 0)), switchMap(([start, config]) => start ? this.onTrickling(config) : this.onComplete(config))).subscribe(); } // Get current progress state get snapshot() { return this._state.value; } // Check if progress has started get isStarted() { return this.snapshot.active; } /** * Start the progress */ start() { this._started.next(); this._trickling.next(true); } /** * Complete the progress */ complete() { this._trickling.next(false); } /** * Increment the progress */ inc(amount) { const n = this.snapshot.value; if (!this.isStarted) { this.start(); } else { if (typeof amount !== 'number') { amount = this._config.value.trickleFunc(n); } this.set(n + amount); } } /** * Set the progress */ set(n) { this.setState({ value: this.clamp(n), active: true }); } /** * Set config */ setConfig(config) { this._config.next({ ...this._config.value, ...config }); } /** * Destroy progress reference */ destroy() { this._worker.unsubscribe(); this._trickling.complete(); this._state.complete(); this._config.complete(); this._started.complete(); this._completed.complete(); this._onDestroyCallback(); } /** * Set progress state */ setState(state) { this._state.next({ ...this.snapshot, ...state }); } /** * Clamps a value to be between min and max */ clamp(n) { return Math.max(this._config.value.min, Math.min(this._config.value.max, n)); } /** * Keeps incrementing the progress */ onTrickling(config) { if (!this.isStarted) { this.set(this._config.value.min); } return timer(0, config.trickleSpeed).pipe(tap(() => this.inc())); } /** * Completes then resets the progress */ onComplete(config) { this._completed.next(); return !this.isStarted ? EMPTY : of({}).pipe( // Complete the progress tap(() => this.setState({ value: 100 })), // Deactivate the progress after a tiny delay delay(config.speed * 1.7), tap(() => this.setState({ active: false })), // Use a tiny delay before resetting delay(config.speed), // Force the progress to reset even it got cancelled finalize(() => this.setState({ value: 0 })), // Cancel any of the finalizing delays if the progress has started again takeUntil(this._started)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcHJvZ3Jlc3MtcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXByb2dyZXNzYmFyL3NyYy9saWIvbmctcHJvZ3Jlc3MtcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0csT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzlGLE1BQU0sT0FBTyxhQUFhO0lBb0N4QixZQUFZLFlBQTRCLEVBQVUsa0JBQThCO1FBQTlCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBWTtRQTFCaEYsaUVBQWlFO1FBQ2hELGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2hELDhFQUE4RTtRQUNyRSxZQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFckUsOEJBQThCO1FBQ2IsZUFBVSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDbEQsMkVBQTJFO1FBQ2xFLGNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFeEUsd0RBQXdEO1FBQ3ZDLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBRXJELHlEQUF5RDtRQUN4QyxZQUFPLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztRQWE1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElB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LENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJO1FBQzFDLHdCQUF3QjtRQUN4QixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBRXhDLDZDQUE2QztRQUM3QyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsRUFDekIsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUUzQyxvQ0FBb0M7UUFDcEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbkIsb0RBQW9EO1FBQ3BELFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0Msd0VBQXdFO1FBQ3hFLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQ3pCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QsIHRpbWVyLCBvZiwgY29tYmluZUxhdGVzdCwgU3Vic2NyaXB0aW9uLCBFTVBUWSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIGRlbGF5LCBkZWJvdW5jZSwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIGZpbmFsaXplLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE5nUHJvZ3Jlc3NTdGF0ZSwgTmdQcm9ncmVzc0NvbmZpZywgUHJvZ3Jlc3NDb25maWcsIFByb2dyZXNzU3RhdGUgfSBmcm9tICcuL25nLXByb2dyZXNzLmludGVyZmFjZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgTmdQcm9ncmVzc1JlZiB7XHJcblxyXG4gIC8vIFN0cmVhbSB0aGF0IGVtaXRzIHdoZW4gcHJvZ3Jlc3Mgc3RhdGUgaXMgY2hhbmdlZFxyXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlOiBCZWhhdmlvclN1YmplY3Q8UHJvZ3Jlc3NTdGF0ZT47XHJcbiAgc3RhdGU6IE9ic2VydmFibGU8UHJvZ3Jlc3NTdGF0ZT47XHJcblxyXG4gIC8vIFN0cmVhbSB0aGF0IGVtaXRzIHdoZW4gY29uZmlnIGlzIGNoYW5nZWRcclxuICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IEJlaGF2aW9yU3ViamVjdDxQcm9ncmVzc0NvbmZpZz47XHJcbiAgY29uZmlnOiBPYnNlcnZhYmxlPFByb2dyZXNzQ29uZmlnPjtcclxuXHJcbiAgLy8gUHJvZ3Jlc3Mgc3RhcnQgc291cmNlIGV2ZW50ICh1c2VkIHRvIGNhbmNlbCBmaW5hbGl6aW5nIGRlbGF5cylcclxuICBwcml2YXRlIHJlYWRvbmx5IF9zdGFydGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAvLyBQcm9ncmVzcyBzdGFydCBldmVudDogc3RyZWFtIHRoYXQgZW1pdHMgb25seSB3aGVuIGl0IGhhc24ndCBhbHJlYWR5IHN0YXJ0ZWRcclxuICByZWFkb25seSBzdGFydGVkID0gdGhpcy5fc3RhcnRlZC5waXBlKGZpbHRlcigoKSA9PiAhdGhpcy5pc1N0YXJ0ZWQpKTtcclxuXHJcbiAgLy8gUHJvZ3Jlc3MgZW5kZWQgc291cmNlIGV2ZW50XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfY29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAvLyBQcm9ncmVzcyBzdGFydCBldmVudDogc3RyZWFtIHRoYXQgZW1pdHMgb25seSB3aGVuIGl0IGhhcyBhbHJlYWR5IHN0YXJ0ZWRcclxuICByZWFkb25seSBjb21wbGV0ZWQgPSB0aGlzLl9jb21wbGV0ZWQucGlwZShmaWx0ZXIoKCkgPT4gdGhpcy5pc1N0YXJ0ZWQpKTtcclxuXHJcbiAgLy8gU3RyZWFtIHRoYXQgaW5jcmVtZW50cyBhbmQgdXBkYXRlcyB0aGUgcHJvZ3Jlc3Mgc3RhdGVcclxuICBwcml2YXRlIHJlYWRvbmx5IF90cmlja2xpbmcgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICAvLyBTdHJlYW0gdGhhdCBjb21iaW5lcyBcIl90cmlja2xpbmdcIiBhbmQgXCJjb25maWdcIiBzdHJlYW1zXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfd29ya2VyID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xyXG5cclxuICAvLyBHZXQgY3VycmVudCBwcm9ncmVzcyBzdGF0ZVxyXG4gIHByaXZhdGUgZ2V0IHNuYXBzaG90KCk6IFByb2dyZXNzU3RhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgcHJvZ3Jlc3MgaGFzIHN0YXJ0ZWRcclxuICBnZXQgaXNTdGFydGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc25hcHNob3QuYWN0aXZlO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoY3VzdG9tQ29uZmlnOiBQcm9ncmVzc0NvbmZpZywgcHJpdmF0ZSBfb25EZXN0cm95Q2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcclxuICAgIHRoaXMuX3N0YXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9ncmVzc1N0YXRlPih7IGFjdGl2ZTogZmFsc2UsIHZhbHVlOiAwIH0pO1xyXG4gICAgdGhpcy5fY29uZmlnID0gbmV3IEJlaGF2aW9yU3ViamVjdDxQcm9ncmVzc0NvbmZpZz4oY3VzdG9tQ29uZmlnKTtcclxuICAgIHRoaXMuc3RhdGUgPSB0aGlzLl9zdGF0ZS5hc09ic2VydmFibGUoKTtcclxuICAgIHRoaXMuY29uZmlnID0gdGhpcy5fY29uZmlnLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHRoaXMuX3dvcmtlciA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuX3RyaWNrbGluZywgdGhpcy5fY29uZmlnXSkucGlwZShcclxuICAgICAgZGVib3VuY2UoKFtzdGFydCwgY29uZmlnXTogW2Jvb2xlYW4sIFByb2dyZXNzQ29uZmlnXSkgPT4gdGltZXIoc3RhcnQgPyBjb25maWcuZGVib3VuY2VUaW1lIDogMCkpLFxyXG4gICAgICBzd2l0Y2hNYXAoKFtzdGFydCwgY29uZmlnXTogW2Jvb2xlYW4sIFByb2dyZXNzQ29uZmlnXSkgPT4gc3RhcnQgPyB0aGlzLm9uVHJpY2tsaW5nKGNvbmZpZykgOiB0aGlzLm9uQ29tcGxldGUoY29uZmlnKSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFydCB0aGUgcHJvZ3Jlc3NcclxuICAgKi9cclxuICBzdGFydCgpIHtcclxuICAgIHRoaXMuX3N0YXJ0ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5fdHJpY2tsaW5nLm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wbGV0ZSB0aGUgcHJvZ3Jlc3NcclxuICAgKi9cclxuICBjb21wbGV0ZSgpIHtcclxuICAgIHRoaXMuX3RyaWNrbGluZy5uZXh0KGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluY3JlbWVudCB0aGUgcHJvZ3Jlc3NcclxuICAgKi9cclxuICBpbmMoYW1vdW50PzogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5zbmFwc2hvdC52YWx1ZTtcclxuICAgIGlmICghdGhpcy5pc1N0YXJ0ZWQpIHtcclxuICAgICAgdGhpcy5zdGFydCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHR5cGVvZiBhbW91bnQgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgYW1vdW50ID0gdGhpcy5fY29uZmlnLnZhbHVlLnRyaWNrbGVGdW5jKG4pO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2V0KG4gKyBhbW91bnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBwcm9ncmVzc1xyXG4gICAqL1xyXG4gIHNldChuOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdGhpcy5jbGFtcChuKSwgYWN0aXZlOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGNvbmZpZ1xyXG4gICAqL1xyXG4gIHNldENvbmZpZyhjb25maWc6IE5nUHJvZ3Jlc3NDb25maWcpIHtcclxuICAgIHRoaXMuX2NvbmZpZy5uZXh0KHsgLi4udGhpcy5fY29uZmlnLnZhbHVlLCAuLi5jb25maWcgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXN0cm95IHByb2dyZXNzIHJlZmVyZW5jZVxyXG4gICAqL1xyXG4gIGRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLl93b3JrZXIudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuX3RyaWNrbGluZy5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5fc3RhdGUuY29tcGxldGUoKTtcclxuICAgIHRoaXMuX2NvbmZpZy5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5fc3RhcnRlZC5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5fY29tcGxldGVkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLl9vbkRlc3Ryb3lDYWxsYmFjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHByb2dyZXNzIHN0YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRTdGF0ZShzdGF0ZTogTmdQcm9ncmVzc1N0YXRlKSB7XHJcbiAgICB0aGlzLl9zdGF0ZS5uZXh0KHsgLi4udGhpcy5zbmFwc2hvdCwgLi4uc3RhdGUgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGFtcHMgYSB2YWx1ZSB0byBiZSBiZXR3ZWVuIG1pbiBhbmQgbWF4XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGFtcChuOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuX2NvbmZpZy52YWx1ZS5taW4sIE1hdGgubWluKHRoaXMuX2NvbmZpZy52YWx1ZS5tYXgsIG4pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtlZXBzIGluY3JlbWVudGluZyB0aGUgcHJvZ3Jlc3NcclxuICAgKi9cclxuICBwcml2YXRlIG9uVHJpY2tsaW5nKGNvbmZpZzogUHJvZ3Jlc3NDb25maWcpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgaWYgKCF0aGlzLmlzU3RhcnRlZCkge1xyXG4gICAgICB0aGlzLnNldCh0aGlzLl9jb25maWcudmFsdWUubWluKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aW1lcigwLCBjb25maWcudHJpY2tsZVNwZWVkKS5waXBlKHRhcCgoKSA9PiB0aGlzLmluYygpKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wbGV0ZXMgdGhlbiByZXNldHMgdGhlIHByb2dyZXNzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbkNvbXBsZXRlKGNvbmZpZzogUHJvZ3Jlc3NDb25maWcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5fY29tcGxldGVkLm5leHQoKTtcclxuICAgIHJldHVybiAhdGhpcy5pc1N0YXJ0ZWQgPyBFTVBUWSA6IG9mKHt9KS5waXBlKFxyXG4gICAgICAvLyBDb21wbGV0ZSB0aGUgcHJvZ3Jlc3NcclxuICAgICAgdGFwKCgpID0+IHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogMTAwIH0pKSxcclxuXHJcbiAgICAgIC8vIERlYWN0aXZhdGUgdGhlIHByb2dyZXNzIGFmdGVyIGEgdGlueSBkZWxheVxyXG4gICAgICBkZWxheShjb25maWcuc3BlZWQgKiAxLjcpLFxyXG4gICAgICB0YXAoKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGFjdGl2ZTogZmFsc2UgfSkpLFxyXG5cclxuICAgICAgLy8gVXNlIGEgdGlueSBkZWxheSBiZWZvcmUgcmVzZXR0aW5nXHJcbiAgICAgIGRlbGF5KGNvbmZpZy5zcGVlZCksXHJcbiAgICAgIC8vIEZvcmNlIHRoZSBwcm9ncmVzcyB0byByZXNldCBldmVuIGl0IGdvdCBjYW5jZWxsZWRcclxuICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHZhbHVlOiAwIH0pKSxcclxuICAgICAgLy8gQ2FuY2VsIGFueSBvZiB0aGUgZmluYWxpemluZyBkZWxheXMgaWYgdGhlIHByb2dyZXNzIGhhcyBzdGFydGVkIGFnYWluXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLl9zdGFydGVkKVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19