@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
119 lines • 15.7 kB
JavaScript
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==