UNPKG

@bimeister/pupakit.forms

Version:
88 lines 14.8 kB
import { Directive, Optional } from '@angular/core'; import { NgControl } from '@angular/forms'; import { filterNotNil, isEmpty, isNil, shareReplayWithRefCount } from '@bimeister/utilities'; import { BehaviorSubject, combineLatest, of, Subscription } from 'rxjs'; import { delay, distinctUntilChanged, map, startWith, switchMap, take, tap } from 'rxjs/operators'; import { isFormControlValidStatus } from '../../functions/is-form-control-valid-status.function'; import '../../types/on-change-callback.type'; import '../../types/on-touched-callback.type'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; export class InputBaseControlValueAccessor { constructor(ngControl) { this.ngControl = ngControl; this.control$ = new BehaviorSubject(null); this.value$ = new BehaviorSubject(null); this.isDisabled$ = new BehaviorSubject(null); this.isTouched$ = new BehaviorSubject(null); this.isFocused$ = new BehaviorSubject(null); this.isFilled$ = new BehaviorSubject(false); this.isValid$ = this.control$.pipe(switchMap((control) => isNil(control) ? of(true) : control.statusChanges.pipe(startWith(control.status), map((status) => isFormControlValidStatus(status)))), distinctUntilChanged(), shareReplayWithRefCount()); this.onChangeCallback$ = new BehaviorSubject(null); this.onTouchedCallback$ = new BehaviorSubject(null); this.subscription = new Subscription(); if (isNil(ngControl)) { return; } ngControl.valueAccessor = this; this.setControlRef(ngControl); } handleChangedValue(onChangeCallback, value) { onChangeCallback(value); this.setValue(value); } ngOnInit() { this.subscription.add(this.processNgControlStatusChangesForHandleIsTouched()); } ngOnDestroy() { this.subscription.unsubscribe(); } updateValue(updatedValue) { this.isTouched$.next(true); this.isFilled$.next(!isEmpty(updatedValue)); combineLatest([this.onChangeCallback$, this.onTouchedCallback$]) .pipe(take(1)) .subscribe(([onChangeCallback, onTouchedCallback]) => { if (typeof onTouchedCallback === 'function') { onTouchedCallback(); } if (typeof onChangeCallback === 'function') { this.handleChangedValue(onChangeCallback, updatedValue); } }); } writeValue(newValue) { this.setValue(newValue); } registerOnChange(onChange) { this.onChangeCallback$.next(onChange); } registerOnTouched(onTouched) { this.onTouchedCallback$.next(onTouched); } setDisabledState(isDisabled) { this.processSetDisabledState(isDisabled); } processSetDisabledState(isDisabled) { const nextDisabledValue = isDisabled ? true : null; this.isDisabled$.next(nextDisabledValue); } setControlRef(control) { this.control$.next(control); } processNgControlStatusChangesForHandleIsTouched() { return this.control$ .pipe(filterNotNil(), switchMap((control) => control.statusChanges.pipe(delay(0), startWith(this.ngControl.touched), map(() => this.ngControl.touched), tap((isTouched) => this.isTouched$.next(isTouched))))) .subscribe(); } } InputBaseControlValueAccessor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: InputBaseControlValueAccessor, deps: [{ token: i1.NgControl, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); InputBaseControlValueAccessor.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: InputBaseControlValueAccessor, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: InputBaseControlValueAccessor, decorators: [{ type: Directive }], ctorParameters: function () { return [{ type: i1.NgControl, decorators: [{ type: Optional }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtYmFzZS1jb250cm9sLXZhbHVlLWFjY2Vzc29yLmFic3RyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RlY2xhcmF0aW9ucy9jbGFzc2VzL2Fic3RyYWN0L2lucHV0LWJhc2UtY29udHJvbC12YWx1ZS1hY2Nlc3Nvci5hYnN0cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUEyQyxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQVksdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25HLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVEQUF1RCxDQUFDO0FBQ2pHLE9BQWlDLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQWtDLHNDQUFzQyxDQUFDOzs7QUFHekUsTUFBTSxPQUFnQiw2QkFBNkI7SUErQmpELFlBQTJDLFNBQW9CO1FBQXBCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUE5QjVDLGFBQVEsR0FBeUMsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUUsV0FBTSxHQUF1QixJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2RCxnQkFBVyxHQUF1QyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUNyRixlQUFVLEdBQXVDLElBQUksZUFBZSxDQUFV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QUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLHVCQUF1QixDQUFDLFVBQW1CO1FBQ2pELE1BQU0saUJBQWlCLEdBQXNCLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRU8sYUFBYSxDQUFDLE9BQWtCO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTywrQ0FBK0M7UUFDckQsT0FBTyxJQUFJLENBQUMsUUFBUTthQUNqQixJQUFJLENBQ0gsWUFBWSxFQUFFLEVBQ2QsU0FBUyxDQUFDLENBQUMsT0FBa0IsRUFBRSxFQUFFLENBQy9CLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUN4QixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQ1IsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQ2pDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUNqQyxHQUFHLENBQUMsQ0FBQyxTQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUM3RCxDQUNGLENBQ0Y7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDOzsySEE5R21CLDZCQUE2QjsrR0FBN0IsNkJBQTZCOzRGQUE3Qiw2QkFBNkI7a0JBRGxELFNBQVM7OzBCQWdDSyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbFN0YXR1cywgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZmlsdGVyTm90TmlsLCBpc0VtcHR5LCBpc05pbCwgTnVsbGFibGUsIHNoYXJlUmVwbGF5V2l0aFJlZkNvdW50IH0gZnJvbSAnQGJpbWVpc3Rlci91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWxheSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2UsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzRm9ybUNvbnRyb2xWYWxpZFN0YXR1cyB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucy9pcy1mb3JtLWNvbnRyb2wtdmFsaWQtc3RhdHVzLmZ1bmN0aW9uJztcbmltcG9ydCB7IE9uQ2hhbmdlQ2FsbGJhY2sgfSBmcm9tICcuLi8uLi90eXBlcy9vbi1jaGFuZ2UtY2FsbGJhY2sudHlwZSc7XG5pbXBvcnQgeyBPblRvdWNoZWRDYWxsYmFjayB9IGZyb20gJy4uLy4uL3R5cGVzL29uLXRvdWNoZWQtY2FsbGJhY2sudHlwZSc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIElucHV0QmFzZUNvbnRyb2xWYWx1ZUFjY2Vzc29yPFQ+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnRyb2wkOiBCZWhhdmlvclN1YmplY3Q8TnVsbGFibGU8TmdDb250cm9sPj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWUkOiBCZWhhdmlvclN1YmplY3Q8VD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBpc0Rpc2FibGVkJDogQmVoYXZpb3JTdWJqZWN0PE51bGxhYmxlPGJvb2xlYW4+PiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBpc1RvdWNoZWQkOiBCZWhhdmlvclN1YmplY3Q8TnVsbGFibGU8Ym9vbGVhbj4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGlzRm9jdXNlZCQ6IEJlaGF2aW9yU3ViamVjdDxOdWxsYWJsZTxib29sZWFuPj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgaXNGaWxsZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaXNWYWxpZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmNvbnRyb2wkLnBpcGUoXG4gICAgc3dpdGNoTWFwKChjb250cm9sOiBOZ0NvbnRyb2wpID0+XG4gICAgICBpc05pbChjb250cm9sKVxuICAgICAgICA/IG9mKHRydWUpXG4gICAgICAgIDogY29udHJvbC5zdGF0dXNDaGFuZ2VzLnBpcGUoXG4gICAgICAgICAgICBzdGFydFdpdGgoY29udHJvbC5zdGF0dXMpLFxuICAgICAgICAgICAgbWFwKChzdGF0dXM6IEZvcm1Db250cm9sU3RhdHVzKSA9PiBpc0Zvcm1Db250cm9sVmFsaWRTdGF0dXMoc3RhdHVzKSlcbiAgICAgICAgICApXG4gICAgKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5V2l0aFJlZkNvdW50KClcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uQ2hhbmdlQ2FsbGJhY2skOiBCZWhhdmlvclN1YmplY3Q8T25DaGFuZ2VDYWxsYmFjazxUPj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9uQ2hhbmdlQ2FsbGJhY2s8VD4+KFxuICAgIG51bGxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblRvdWNoZWRDYWxsYmFjayQ6IEJlaGF2aW9yU3ViamVjdDxPblRvdWNoZWRDYWxsYmFjaz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9uVG91Y2hlZENhbGxiYWNrPihcbiAgICBudWxsXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByb3RlY3RlZCByZWFkb25seSBuZ0NvbnRyb2w6IE5nQ29udHJvbCkge1xuICAgIGlmIChpc05pbChuZ0NvbnRyb2wpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB0aGlzLnNldENvbnRyb2xSZWYobmdDb250cm9sKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRWYWx1ZSh2YWx1ZTogVCk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUNoYW5nZWRWYWx1ZShvbkNoYW5nZUNhbGxiYWNrOiBPbkNoYW5nZUNhbGxiYWNrPGFueT4sIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgb25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG4gICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRoaXMucHJvY2Vzc05nQ29udHJvbFN0YXR1c0NoYW5nZXNGb3JIYW5kbGVJc1RvdWNoZWQoKSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVWYWx1ZSh1cGRhdGVkVmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmlzVG91Y2hlZCQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmlzRmlsbGVkJC5uZXh0KCFpc0VtcHR5KHVwZGF0ZWRWYWx1ZSkpO1xuXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5vbkNoYW5nZUNhbGxiYWNrJCwgdGhpcy5vblRvdWNoZWRDYWxsYmFjayRdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtvbkNoYW5nZUNhbGxiYWNrLCBvblRvdWNoZWRDYWxsYmFja106IFtPbkNoYW5nZUNhbGxiYWNrPFQ+LCBPblRvdWNoZWRDYWxsYmFja10pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvblRvdWNoZWRDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIG9uQ2hhbmdlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5nZWRWYWx1ZShvbkNoYW5nZUNhbGxiYWNrLCB1cGRhdGVkVmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKG5ld1ZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogT25DaGFuZ2VDYWxsYmFjazxUPik6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayQubmV4dChvbkNoYW5nZSk7XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiBPblRvdWNoZWRDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2skLm5leHQob25Ub3VjaGVkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnByb2Nlc3NTZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzU2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dERpc2FibGVkVmFsdWU6IE51bGxhYmxlPGJvb2xlYW4+ID0gaXNEaXNhYmxlZCA/IHRydWUgOiBudWxsO1xuICAgIHRoaXMuaXNEaXNhYmxlZCQubmV4dChuZXh0RGlzYWJsZWRWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbnRyb2xSZWYoY29udHJvbDogTmdDb250cm9sKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sJC5uZXh0KGNvbnRyb2wpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTmdDb250cm9sU3RhdHVzQ2hhbmdlc0ZvckhhbmRsZUlzVG91Y2hlZCgpOiBTdWJzY3JpcHRpb24ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2wkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyTm90TmlsKCksXG4gICAgICAgIHN3aXRjaE1hcCgoY29udHJvbDogTmdDb250cm9sKSA9PlxuICAgICAgICAgIGNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgZGVsYXkoMCksXG4gICAgICAgICAgICBzdGFydFdpdGgodGhpcy5uZ0NvbnRyb2wudG91Y2hlZCksXG4gICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5uZ0NvbnRyb2wudG91Y2hlZCksXG4gICAgICAgICAgICB0YXAoKGlzVG91Y2hlZDogYm9vbGVhbikgPT4gdGhpcy5pc1RvdWNoZWQkLm5leHQoaXNUb3VjaGVkKSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIl19