UNPKG

ng-cornerstone

Version:

[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.git

108 lines 16.1 kB
import { __decorate } from "tslib"; import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Input, Output, } from '@angular/core'; import { debounceTime, filter, from, merge, startWith, Subject } from 'rxjs'; import { switchMap, takeUntil } from 'rxjs/operators'; import { ButtonComponent } from './button.component'; import { InputBoolean } from '../../core'; import * as i0 from "@angular/core"; export class ButtonGroupComponent { constructor(cd) { this.cd = cd; this.lastEmittedValue = []; this.destroy$ = new Subject(); this.buttonsChange$ = new Subject(); this.disabled = false; /** * Allows to keep multiple button toggles pressed. Off by default. */ this.multiple = false; /** * Emits when `nbButtonToggle` pressed state change. `$event` contains an array of the currently pressed button * toggles. */ this.valueChange = new EventEmitter(); this.role = 'group'; } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } ngAfterContentInit() { this.buttonsChange$.pipe(takeUntil(this.destroy$)).subscribe((buttons) => { this.listenButtonPressedState(buttons); }); this.buttons.changes .pipe( // `buttons.changes` emit during change detection run after projected content already was initialized. // So at this time, it's too late to update projected buttons properties as updating bindings after // initialization doesn't make sense. Changes won't be picked up and should cause an "expression changed" error. // Instead, we wrap the new buttons list into a promise to defer update to the following microtask and also to // trigger change detection one more time. switchMap((buttons) => from(Promise.resolve(buttons.toArray()))), takeUntil(this.destroy$)) .subscribe((value) => this.buttonsChange$.next(value)); this.buttonsChange$.next(this.buttons.toArray()); } listenButtonPressedState(buttons) { const toggleButtons = buttons.filter((button) => { return button.isToggle; }); if (!toggleButtons.length) { return; } const buttonsPressedChange$ = toggleButtons.map((button) => button.pressedChange$); merge(...buttonsPressedChange$) .pipe(filter(({ pressed }) => !this.multiple && pressed), takeUntil(merge(this.buttonsChange$, this.destroy$))) .subscribe(({ source }) => { toggleButtons .filter((button) => button !== source) .forEach((button) => button._updatePressed(false)); }); merge(...buttonsPressedChange$) .pipe( // Use startWith to emit if some buttons are initially pressed. startWith(''), // Use debounce to emit change once when pressed state change in multiple button toggles. debounceTime(0), takeUntil(merge(this.buttonsChange$, this.destroy$))) .subscribe(() => this.emitCurrentValue(toggleButtons)); } emitCurrentValue(toggleButtons) { const pressedToggleValues = toggleButtons .filter((b) => b.pressed && typeof b.value !== 'undefined') .map((b) => b.value); // Prevent multiple emissions of empty value. if (pressedToggleValues.length === 0 && this.lastEmittedValue.length === 0) { return; } this.valueChange.emit(pressedToggleValues); this.lastEmittedValue = pressedToggleValues; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonGroupComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ButtonGroupComponent, selector: "nc-button-group", inputs: { disabled: "disabled", multiple: "multiple" }, outputs: { valueChange: "valueChange" }, host: { properties: { "attr.role": "this.role" } }, queries: [{ propertyName: "buttons", predicate: ButtonComponent }], ngImport: i0, template: ` <ng-content></ng-content> `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } __decorate([ InputBoolean() ], ButtonGroupComponent.prototype, "disabled", void 0); __decorate([ InputBoolean() ], ButtonGroupComponent.prototype, "multiple", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ButtonGroupComponent, decorators: [{ type: Component, args: [{ selector: 'nc-button-group', template: ` <ng-content></ng-content> `, changeDetection: ChangeDetectionStrategy.OnPush, }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { buttons: [{ type: ContentChildren, args: [ButtonComponent] }], disabled: [{ type: Input }], multiple: [{ type: Input }], valueChange: [{ type: Output }], role: [{ type: HostBinding, args: ['attr.role'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvcm5lcnN0b25lL3NyYy9saWIvY29tcG9uZW50cy9idXR0b24vYnV0dG9uLWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUVMLE1BQU0sR0FFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFjLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZUFBZSxFQUFzQixNQUFNLG9CQUFvQixDQUFDO0FBRXpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7O0FBTzFDLE1BQU0sT0FBTyxvQkFBb0I7SUE4Qi9CLFlBQXNCLEVBQXFCO1FBQXJCLE9BQUUsR0FBRixFQUFFLENBQW1CO1FBN0JqQyxxQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFFcEIsYUFBUSxHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQzlDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7UUFPM0QsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUczQjs7V0FFRztRQUdPLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFHcEM7OztXQUdHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBRXhCLFNBQUksR0FBRyxPQUFPLENBQUM7SUFFSyxDQUFDO0lBRS9DLFdBQVc7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFD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SyxLQUFLLFdBQVcsQ0FBQzthQUMzRSxHQUFHLENBQUMsQ0FBQyxDQUFrQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEMsNkNBQTZDO1FBQzdDLElBQUksbUJBQW1CLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNFLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7SUFDOUMsQ0FBQzsrR0F4R1Usb0JBQW9CO21HQUFwQixvQkFBb0Isb09BTWQsZUFBZSw2QkFUdEIsNkJBQTZCOztBQWM3QjtJQURULFlBQVksRUFBRTtzREFDWTtBQVFqQjtJQURULFlBQVksRUFBRTtzREFDcUI7NEZBbkJ6QixvQkFBb0I7a0JBTGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsUUFBUSxFQUFFLDZCQUE2QjtvQkFDdkMsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEO3NGQVFVLE9BQU87c0JBRGYsZUFBZTt1QkFBQyxlQUFlO2dCQUt0QixRQUFRO3NCQUZqQixLQUFLO2dCQVVJLFFBQVE7c0JBRmpCLEtBQUs7Z0JBU0ksV0FBVztzQkFBcEIsTUFBTTtnQkFFbUIsSUFBSTtzQkFBN0IsV0FBVzt1QkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZyb20sIG1lcmdlLCBPYnNlcnZhYmxlLCBzdGFydFdpdGgsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQsIEJ1dHRvblRvZ2dsZUNoYW5nZSB9IGZyb20gJy4vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25jLWJ1dHRvbi1ncm91cCcsXG4gIHRlbXBsYXRlOiBgIDxuZy1jb250ZW50PjwvbmctY29udGVudD4gYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEJ1dHRvbkdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIGxhc3RFbWl0dGVkVmFsdWU6IGFueVtdID0gW107XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJ1dHRvbnNDaGFuZ2UkID0gbmV3IFN1YmplY3Q8QnV0dG9uQ29tcG9uZW50W10+KCk7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25Db21wb25lbnQpXG4gIHJlYWRvbmx5IGJ1dHRvbnMhOiBRdWVyeUxpc3Q8QnV0dG9uQ29tcG9uZW50PjtcblxuICBASW5wdXQoKVxuICBASW5wdXRCb29sZWFuKClcbiAgcHJvdGVjdGVkIGRpc2FibGVkID0gZmFsc2U7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9kaXNhYmxlZDogQm9vbGVhbklucHV0O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgdG8ga2VlcCBtdWx0aXBsZSBidXR0b24gdG9nZ2xlcyBwcmVzc2VkLiBPZmYgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIEBJbnB1dEJvb2xlYW4oKVxuICBwcm90ZWN0ZWQgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX211bHRpcGxlOiBCb29sZWFuSW5wdXQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYG5iQnV0dG9uVG9nZ2xlYCBwcmVzc2VkIHN0YXRlIGNoYW5nZS4gYCRldmVudGAgY29udGFpbnMgYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnRseSBwcmVzc2VkIGJ1dHRvblxuICAgKiB0b2dnbGVzLlxuICAgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpIHJvbGUgPSAnZ3JvdXAnO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYnV0dG9uc0NoYW5nZSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoYnV0dG9uczogQnV0dG9uQ29tcG9uZW50W10pID0+IHtcbiAgICAgIHRoaXMubGlzdGVuQnV0dG9uUHJlc3NlZFN0YXRlKGJ1dHRvbnMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5idXR0b25zLmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBgYnV0dG9ucy5jaGFuZ2VzYCBlbWl0IGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uIHJ1biBhZnRlciBwcm9qZWN0ZWQgY29udGVudCBhbHJlYWR5IHdhcyBpbml0aWFsaXplZC5cbiAgICAgICAgLy8gU28gYXQgdGhpcyB0aW1lLCBpdCdzIHRvbyBsYXRlIHRvIHVwZGF0ZSBwcm9qZWN0ZWQgYnV0dG9ucyBwcm9wZXJ0aWVzIGFzIHVwZGF0aW5nIGJpbmRpbmdzIGFmdGVyXG4gICAgICAgIC8vIGluaXRpYWxpemF0aW9uIGRvZXNuJ3QgbWFrZSBzZW5zZS4gQ2hhbmdlcyB3b24ndCBiZSBwaWNrZWQgdXAgYW5kIHNob3VsZCBjYXVzZSBhbiBcImV4cHJlc3Npb24gY2hhbmdlZFwiIGVycm9yLlxuICAgICAgICAvLyBJbnN0ZWFkLCB3ZSB3cmFwIHRoZSBuZXcgYnV0dG9ucyBsaXN0IGludG8gYSBwcm9taXNlIHRvIGRlZmVyIHVwZGF0ZSB0byB0aGUgZm9sbG93aW5nIG1pY3JvdGFzayBhbmQgYWxzbyB0b1xuICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gb25lIG1vcmUgdGltZS5cbiAgICAgICAgc3dpdGNoTWFwKChidXR0b25zOiBRdWVyeUxpc3Q8QnV0dG9uQ29tcG9uZW50PikgPT4gZnJvbShQcm9taXNlLnJlc29sdmUoYnV0dG9ucy50b0FycmF5KCkpKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB0aGlzLmJ1dHRvbnNDaGFuZ2UkLm5leHQodmFsdWUpKTtcblxuICAgIHRoaXMuYnV0dG9uc0NoYW5nZSQubmV4dCh0aGlzLmJ1dHRvbnMudG9BcnJheSgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBsaXN0ZW5CdXR0b25QcmVzc2VkU3RhdGUoYnV0dG9uczogQnV0dG9uQ29tcG9uZW50W10pOiB2b2lkIHtcbiAgICBjb25zdCB0b2dnbGVCdXR0b25zOiBCdXR0b25Db21wb25lbnRbXSA9IGJ1dHRvbnMuZmlsdGVyKChidXR0b246IEJ1dHRvbkNvbXBvbmVudCkgPT4ge1xuICAgICAgcmV0dXJuIGJ1dHRvbi5pc1RvZ2dsZTtcbiAgICB9KTtcblxuICAgIGlmICghdG9nZ2xlQnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidXR0b25zUHJlc3NlZENoYW5nZSQ6IE9ic2VydmFibGU8QnV0dG9uVG9nZ2xlQ2hhbmdlPltdID0gdG9nZ2xlQnV0dG9ucy5tYXAoXG4gICAgICAoYnV0dG9uOiBCdXR0b25Db21wb25lbnQpID0+IGJ1dHRvbi5wcmVzc2VkQ2hhbmdlJCxcbiAgICApO1xuXG4gICAgbWVyZ2UoLi4uYnV0dG9uc1ByZXNzZWRDaGFuZ2UkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoeyBwcmVzc2VkIH06IEJ1dHRvblRvZ2dsZUNoYW5nZSkgPT4gIXRoaXMubXVsdGlwbGUgJiYgcHJlc3NlZCksXG4gICAgICAgIHRha2VVbnRpbChtZXJnZSh0aGlzLmJ1dHRvbnNDaGFuZ2UkLCB0aGlzLmRlc3Ryb3kkKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCh7IHNvdXJjZSB9OiBCdXR0b25Ub2dnbGVDaGFuZ2UpID0+IHtcbiAgICAgICAgdG9nZ2xlQnV0dG9uc1xuICAgICAgICAgIC5maWx0ZXIoKGJ1dHRvbjogQnV0dG9uQ29tcG9uZW50KSA9PiBidXR0b24gIT09IHNvdXJjZSlcbiAgICAgICAgICAuZm9yRWFjaCgoYnV0dG9uOiBCdXR0b25Db21wb25lbnQpID0+IGJ1dHRvbi5fdXBkYXRlUHJlc3NlZChmYWxzZSkpO1xuICAgICAgfSk7XG5cbiAgICBtZXJnZSguLi5idXR0b25zUHJlc3NlZENoYW5nZSQpXG4gICAgICAucGlwZShcbiAgICAgICAgLy8gVXNlIHN0YXJ0V2l0aCB0byBlbWl0IGlmIHNvbWUgYnV0dG9ucyBhcmUgaW5pdGlhbGx5IHByZXNzZWQuXG4gICAgICAgIHN0YXJ0V2l0aCgnJyksXG4gICAgICAgIC8vIFVzZSBkZWJvdW5jZSB0byBlbWl0IGNoYW5nZSBvbmNlIHdoZW4gcHJlc3NlZCBzdGF0ZSBjaGFuZ2UgaW4gbXVsdGlwbGUgYnV0dG9uIHRvZ2dsZXMuXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFrZVVudGlsKG1lcmdlKHRoaXMuYnV0dG9uc0NoYW5nZSQsIHRoaXMuZGVzdHJveSQpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5lbWl0Q3VycmVudFZhbHVlKHRvZ2dsZUJ1dHRvbnMpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Q3VycmVudFZhbHVlKHRvZ2dsZUJ1dHRvbnM6IEJ1dHRvbkNvbXBvbmVudFtdKTogdm9pZCB7XG4gICAgY29uc3QgcHJlc3NlZFRvZ2dsZVZhbHVlcyA9IHRvZ2dsZUJ1dHRvbnNcbiAgICAgIC5maWx0ZXIoKGI6IEJ1dHRvbkNvbXBvbmVudCkgPT4gYi5wcmVzc2VkICYmIHR5cGVvZiBiLnZhbHVlICE9PSAndW5kZWZpbmVkJylcbiAgICAgIC5tYXAoKGI6IEJ1dHRvbkNvbXBvbmVudCkgPT4gYi52YWx1ZSk7XG5cbiAgICAvLyBQcmV2ZW50IG11bHRpcGxlIGVtaXNzaW9ucyBvZiBlbXB0eSB2YWx1ZS5cbiAgICBpZiAocHJlc3NlZFRvZ2dsZVZhbHVlcy5sZW5ndGggPT09IDAgJiYgdGhpcy5sYXN0RW1pdHRlZFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChwcmVzc2VkVG9nZ2xlVmFsdWVzKTtcbiAgICB0aGlzLmxhc3RFbWl0dGVkVmFsdWUgPSBwcmVzc2VkVG9nZ2xlVmFsdWVzO1xuICB9XG59XG4iXX0=