UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

119 lines 15.7 kB
import { ChangeDetectorRef, ContentChildren, Directive, EventEmitter, forwardRef, inject, Input, Output } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { RadioButtonComponent } from '../radiobutton.component'; import * as i0 from "@angular/core"; export const RADIO_GROUP_CONTROL_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioButtonGroupDirective), multi: true }; export class RadioButtonGroupDirective { constructor() { this._changeDetector = inject(ChangeDetectorRef); /** Emit when the currently selected value changes */ this.valueChange = new EventEmitter(); /** Used to inform Angular forms that the component has been touched */ // eslint-disable-next-line @typescript-eslint/no-empty-function this.onTouched = () => { }; /** Used to inform Angular forms that the component value has changed */ // eslint-disable-next-line @typescript-eslint/no-empty-function this.onChange = () => { }; /** Unsubscribe from all subscriptions on destroy */ this._onDestroy$ = new Subject(); /** Internally store the current value */ this._value = null; } /** Define the current selected value within the group */ set value(value) { this._value = value; this.updateSelectedRadioButton(); } /** Return the currently selected value */ get value() { return this._value; } ngAfterContentInit() { this.updateSelectedRadioButton(); // update the selected items any time new ones are added this._radioButtons.changes.pipe(takeUntil(this._onDestroy$)) .subscribe(() => this.updateSelectedRadioButton()); } ngOnDestroy() { this._onDestroy$.next(); this._onDestroy$.complete(); } /** Allow Angular forms for provide us with a callback for when the input value changes */ registerOnChange(fn) { this.onChange = fn; } /** Allow Angular forms for provide us with a callback for when the touched state changes */ registerOnTouched(fn) { this.onTouched = fn; } /** Allow Angular forms to give us the current value */ writeValue(value) { this.value = value; this._changeDetector.markForCheck(); } /** Allow Angular forms to disable the component */ setDisabledState(isDisabled) { if (this._radioButtons) { this._radioButtons.forEach(radio => radio.setDisabledState(isDisabled)); this._changeDetector.markForCheck(); } } /** Emit the currently selected value */ emitChange(value) { this.valueChange.next(value); this.onChange(value); this.onTouched(); } /** Determine and set the correct internal tabindex */ determineAndSetInternalTabIndex() { const firstEnabled = this._radioButtons.find(radio => { return radio.disabled === false; }); this._radioButtons.forEach(radio => { if (this._value !== undefined) { radio.setInternalTabindex(radio.option === this._value ? 0 : -1); } else { radio.setInternalTabindex(firstEnabled === radio ? 0 : -1); } }); } /** Inform all child radio buttons of the latest value */ updateSelectedRadioButton() { // update the selected value in all radio buttons if (this._radioButtons) { this.determineAndSetInternalTabIndex(); this._radioButtons.forEach(radio => radio.writeValue(this._value)); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RadioButtonGroupDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: RadioButtonGroupDirective, selector: "ux-radio-button-group, [uxRadioButtonGroup]", inputs: { value: "value" }, outputs: { valueChange: "valueChange" }, host: { attributes: { "role": "radiogroup" } }, providers: [ RADIO_GROUP_CONTROL_VALUE_ACCESSOR ], queries: [{ propertyName: "_radioButtons", predicate: i0.forwardRef(() => RadioButtonComponent), descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RadioButtonGroupDirective, decorators: [{ type: Directive, args: [{ selector: 'ux-radio-button-group, [uxRadioButtonGroup]', providers: [ RADIO_GROUP_CONTROL_VALUE_ACCESSOR ], host: { 'role': 'radiogroup' } }] }], propDecorators: { value: [{ type: Input }], valueChange: [{ type: Output }], _radioButtons: [{ type: ContentChildren, args: [forwardRef(() => RadioButtonComponent), { descendants: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tYnV0dG9uLWdyb3VwLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3JhZGlvYnV0dG9uL3JhZGlvLWJ1dHRvbi1ncm91cC9yYWRpby1idXR0b24tZ3JvdXAuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0IsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQW9CLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUN6TCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBRWhFLE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFxQjtJQUNoRSxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMseUJBQXlCLENBQUM7SUFDeEQsS0FBSyxFQUFFLElBQUk7Q0FDZCxDQUFDO0FBV0YsTUFBTSxPQUFPLHlCQUF5QjtJQVR0QztRQVVxQixvQkFBZSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBYTdELHFEQUFxRDtRQUMzQyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFLLENBQUM7UUFFOUMsdUVBQXVFO1FBQ3ZFLGdFQUFnRTtRQUNoRSxjQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBRWpDLHdFQUF3RTtRQUN4RSxnRUFBZ0U7UUFDaEUsYUFBUSxHQUF5QixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFJMUMsb0RB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QUM7SUFFRCx5REFBeUQ7SUFDakQseUJBQXlCO1FBQzdCLGlEQUFpRDtRQUNqRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQztJQUVMLENBQUM7K0dBeEdRLHlCQUF5QjttR0FBekIseUJBQXlCLDJMQVB2QjtZQUNQLGtDQUFrQztTQUNyQyw0RUE4QmlDLG9CQUFvQjs7NEZBekI3Qyx5QkFBeUI7a0JBVHJDLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLDZDQUE2QztvQkFDdkQsU0FBUyxFQUFFO3dCQUNQLGtDQUFrQztxQkFDckM7b0JBQ0QsSUFBSSxFQUFFO3dCQUNGLE1BQU0sRUFBRSxZQUFZO3FCQUN2QjtpQkFDSjs4QkFLZ0IsS0FBSztzQkFBakIsS0FBSztnQkFXSSxXQUFXO3NCQUFwQixNQUFNO2dCQVV5RSxhQUFhO3NCQUE1RixlQUFlO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb250ZW50Q2hpbGRyZW4sIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBFeGlzdGluZ1Byb3ZpZGVyLCBmb3J3YXJkUmVmLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBSYWRpb0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL3JhZGlvYnV0dG9uLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBjb25zdCBSQURJT19HUk9VUF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBFeGlzdGluZ1Byb3ZpZGVyID0ge1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhZGlvQnV0dG9uR3JvdXBEaXJlY3RpdmUpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ3V4LXJhZGlvLWJ1dHRvbi1ncm91cCwgW3V4UmFkaW9CdXR0b25Hcm91cF0nLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBSQURJT19HUk9VUF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdyb2xlJzogJ3JhZGlvZ3JvdXAnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBSYWRpb0J1dHRvbkdyb3VwRGlyZWN0aXZlPFQgPSB1bmtub3duPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kgIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VEZXRlY3RvciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgICAvKiogRGVmaW5lIHRoZSBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIHdpdGhpbiB0aGUgZ3JvdXAgKi9cbiAgICBASW5wdXQoKSBzZXQgdmFsdWUodmFsdWU6IFQpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZFJhZGlvQnV0dG9uKCk7XG4gICAgfVxuXG4gICAgLyoqIFJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlICovXG4gICAgZ2V0IHZhbHVlKCk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEVtaXQgd2hlbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlIGNoYW5nZXMgKi9cbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgICAvKiogVXNlZCB0byBpbmZvcm0gQW5ndWxhciBmb3JtcyB0aGF0IHRoZSBjb21wb25lbnQgaGFzIGJlZW4gdG91Y2hlZCAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIC8qKiBVc2VkIHRvIGluZm9ybSBBbmd1bGFyIGZvcm1zIHRoYXQgdGhlIGNvbXBvbmVudCB2YWx1ZSBoYXMgY2hhbmdlZCAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBSYWRpb0J1dHRvbkNvbXBvbmVudCksIHsgZGVzY2VuZGFudHM6IHRydWUgfSkgX3JhZGlvQnV0dG9uczogUXVlcnlMaXN0PFJhZGlvQnV0dG9uQ29tcG9uZW50PjtcblxuICAgIC8qKiBVbnN1YnNjcmliZSBmcm9tIGFsbCBzdWJzY3JpcHRpb25zIG9uIGRlc3Ryb3kgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKiBJbnRlcm5hbGx5IHN0b3JlIHRoZSBjdXJyZW50IHZhbHVlICovXG4gICAgcHJpdmF0ZSBfdmFsdWU6IFQgPSBudWxsO1xuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkUmFkaW9CdXR0b24oKTtcblxuICAgICAgICAvLyB1cGRhdGUgdGhlIHNlbGVjdGVkIGl0ZW1zIGFueSB0aW1lIG5ldyBvbmVzIGFyZSBhZGRlZFxuICAgICAgICB0aGlzLl9yYWRpb0J1dHRvbnMuY2hhbmdlcy5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVTZWxlY3RlZFJhZGlvQnV0dG9uKCkpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLm5leHQoKTtcbiAgICAgICAgdGhpcy5fb25EZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKiBBbGxvdyBBbmd1bGFyIGZvcm1zIGZvciBwcm92aWRlIHVzIHdpdGggYSBjYWxsYmFjayBmb3Igd2hlbiB0aGUgaW5wdXQgdmFsdWUgY2hhbmdlcyAqL1xuICAgICBcbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgLyoqIEFsbG93IEFuZ3VsYXIgZm9ybXMgZm9yIHByb3ZpZGUgdXMgd2l0aCBhIGNhbGxiYWNrIGZvciB3aGVuIHRoZSB0b3VjaGVkIHN0YXRlIGNoYW5nZXMgKi9cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBBbGxvdyBBbmd1bGFyIGZvcm1zIHRvIGdpdmUgdXMgdGhlIGN1cnJlbnQgdmFsdWUgKi9cbiAgICAgXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIEFsbG93IEFuZ3VsYXIgZm9ybXMgdG8gZGlzYWJsZSB0aGUgY29tcG9uZW50ICovXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9yYWRpb0J1dHRvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JhZGlvQnV0dG9ucy5mb3JFYWNoKHJhZGlvID0+IHJhZGlvLnNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCkpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRW1pdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHZhbHVlICovXG4gICAgZW1pdENoYW5nZSh2YWx1ZTogVCk6IHZvaWQge1xuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLm5leHQodmFsdWUpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKiogRGV0ZXJtaW5lIGFuZCBzZXQgdGhlIGNvcnJlY3QgaW50ZXJuYWwgdGFiaW5kZXggKi9cbiAgICBkZXRlcm1pbmVBbmRTZXRJbnRlcm5hbFRhYkluZGV4KCkge1xuXG4gICAgICAgIGNvbnN0IGZpcnN0RW5hYmxlZCA9IHRoaXMuX3JhZGlvQnV0dG9ucy5maW5kKHJhZGlvID0+IHtcbiAgICAgICAgICAgIHJldHVybiByYWRpby5kaXNhYmxlZCA9PT0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3JhZGlvQnV0dG9ucy5mb3JFYWNoKHJhZGlvID0+IHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByYWRpby5zZXRJbnRlcm5hbFRhYmluZGV4KHJhZGlvLm9wdGlvbiA9PT0gdGhpcy5fdmFsdWUgPyAwIDogLTEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByYWRpby5zZXRJbnRlcm5hbFRhYmluZGV4KGZpcnN0RW5hYmxlZCA9PT0gcmFkaW8gPyAwIDogLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogSW5mb3JtIGFsbCBjaGlsZCByYWRpbyBidXR0b25zIG9mIHRoZSBsYXRlc3QgdmFsdWUgKi9cbiAgICBwcml2YXRlIHVwZGF0ZVNlbGVjdGVkUmFkaW9CdXR0b24oKTogdm9pZCB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgdmFsdWUgaW4gYWxsIHJhZGlvIGJ1dHRvbnNcbiAgICAgICAgaWYgKHRoaXMuX3JhZGlvQnV0dG9ucykge1xuICAgICAgICAgICAgdGhpcy5kZXRlcm1pbmVBbmRTZXRJbnRlcm5hbFRhYkluZGV4KCk7XG4gICAgICAgICAgICB0aGlzLl9yYWRpb0J1dHRvbnMuZm9yRWFjaChyYWRpbyA9PiByYWRpby53cml0ZVZhbHVlKHRoaXMuX3ZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgIH1cbn1cbiJdfQ==