UNPKG

ngrx-forms

Version:

Proper integration of forms in Angular 4 applications using ngrx

121 lines 16.1 kB
import { isPlatformBrowser } from '@angular/common'; import { Directive, forwardRef, HostListener, Inject, Input, Optional, PLATFORM_ID } from '@angular/core'; import { NGRX_FORM_VIEW_ADAPTER } from './view-adapter'; import * as i0 from "@angular/core"; /** * We must check whether the agent is Android because composition events * behave differently between iOS and Android. */ function isAndroid(navigator) { return /android (\d+)/.test(navigator.userAgent.toLowerCase()); } // tslint:disable:directive-class-suffix // tslint:disable:directive-selector // TODO: since this directive has a side-effect (setting the element's id attribute) // it should not blacklist other types of inputs but instead it should somehow figure // out whether it is the "active" view adapter and only perform its side effects if it // is active export class NgrxDefaultViewAdapter { constructor(renderer, elementRef, platformId = null, // we use a special injection string that should never exist at runtime to allow mocking this dependency for testing navigator = null) { this.renderer = renderer; this.elementRef = elementRef; this.platformId = platformId; this.nativeIdWasSet = false; this.onChange = () => void 0; this.onTouched = () => void 0; /** Whether the user is creating a composition string (IME events). */ this.isComposing = false; this.isCompositionSupported = isPlatformBrowser(this.platformId || '') && !isAndroid(navigator || window.navigator); } set ngrxFormControlState(value) { if (!value) { throw new Error('The control state must not be undefined!'); } this.state = value; const nativeId = this.elementRef.nativeElement.id; const shouldSetNativeId = value.id !== nativeId && this.nativeIdWasSet; if (shouldSetNativeId) { this.renderer.setProperty(this.elementRef.nativeElement, 'id', value.id); } } ngAfterViewInit() { const nativeId = this.elementRef.nativeElement.id; const shouldSetNativeId = this.state.id !== nativeId && !nativeId; if (shouldSetNativeId) { this.renderer.setProperty(this.elementRef.nativeElement, 'id', this.state.id); this.nativeIdWasSet = true; } } setViewValue(value) { const normalizedValue = value == null ? '' : value; this.renderer.setProperty(this.elementRef.nativeElement, 'value', normalizedValue); } setOnChangeCallback(fn) { this.onChange = fn; } setOnTouchedCallback(fn) { this.onTouched = fn; } setIsDisabled(isDisabled) { this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled); } handleInput({ target }) { if (this.isCompositionSupported && this.isComposing) { return; } this.onChange(target.value); } compositionStart() { this.isComposing = true; } compositionEnd({ target }) { this.isComposing = false; if (this.isCompositionSupported) { this.onChange(target.value); } } } NgrxDefaultViewAdapter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxDefaultViewAdapter, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: PLATFORM_ID, optional: true }, { token: 'ngrx-forms/never', optional: true }], target: i0.ɵɵFactoryTarget.Directive }); NgrxDefaultViewAdapter.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: NgrxDefaultViewAdapter, selector: "input:not([type=checkbox]):not([type=number]):not([type=radio]):not([type=range])[ngrxFormControlState],textarea[ngrxFormControlState]", inputs: { ngrxFormControlState: "ngrxFormControlState" }, host: { listeners: { "blur": "onTouched()", "input": "handleInput($event)", "compositionstart": "compositionStart()", "compositionend": "compositionEnd($event)" } }, providers: [{ provide: NGRX_FORM_VIEW_ADAPTER, useExisting: forwardRef(() => NgrxDefaultViewAdapter), multi: true, }], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: NgrxDefaultViewAdapter, decorators: [{ type: Directive, args: [{ selector: 'input:not([type=checkbox]):not([type=number]):not([type=radio]):not([type=range])[ngrxFormControlState],textarea[ngrxFormControlState]', providers: [{ provide: NGRX_FORM_VIEW_ADAPTER, useExisting: forwardRef(() => NgrxDefaultViewAdapter), multi: true, }], }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [PLATFORM_ID] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: ['ngrx-forms/never'] }] }]; }, propDecorators: { onTouched: [{ type: HostListener, args: ['blur'] }], ngrxFormControlState: [{ type: Input }], handleInput: [{ type: HostListener, args: ['input', ['$event']] }], compositionStart: [{ type: HostListener, args: ['compositionstart'] }], compositionEnd: [{ type: HostListener, args: ['compositionend', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92aWV3LWFkYXB0ZXIvZGVmYXVsdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQWlCLFNBQVMsRUFBYyxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUdoSixPQUFPLEVBQW1CLHNCQUFzQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBTXpFOzs7R0FHRztBQUNILFNBQVMsU0FBUyxDQUFDLFNBQW9CO0lBQ3JDLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELHdDQUF3QztBQUN4QyxvQ0FBb0M7QUFFcEMsb0ZBQW9GO0FBQ3BGLHFGQUFxRjtBQUNyRixzRkFBc0Y7QUFDdEYsWUFBWTtBQVNaLE1BQU0sT0FBTyxzQkFBc0I7SUEwQmpDLFlBQ1UsUUFBbUIsRUFDbkIsVUFBc0IsRUFDVyxhQUE0QixJQUFJO0lBQ3pFLG9IQUFvSDtJQUM1RSxZQUE4QixJQUFJO1FBSmxFLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNXLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBM0JuRSxtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUUvQixhQUFRLEdBQXlCLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRzlDLGNBQVMsR0FBZSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQWVwQyxzRUFBc0U7UUFDOUQsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFVMUIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FB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LEdBQUcsRUFBRSxDQUFDLHNCQUFzQixDQUFDO1lBQ3JELEtBQUssRUFBRSxJQUFJO1NBQ1osQ0FBQzs0RkFFUyxzQkFBc0I7a0JBUmxDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdJQUF3STtvQkFDbEosU0FBUyxFQUFFLENBQUM7NEJBQ1YsT0FBTyxFQUFFLHNCQUFzQjs0QkFDL0IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLENBQUM7NEJBQ3JELEtBQUssRUFBRSxJQUFJO3lCQUNaLENBQUM7aUJBQ0g7OzBCQThCSSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUU5QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGtCQUFrQjs0Q0F4QnhDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxNQUFNO2dCQUdQLG9CQUFvQjtzQkFBaEMsS0FBSztnQkFzRE4sV0FBVztzQkFEVixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVakMsZ0JBQWdCO3NCQURmLFlBQVk7dUJBQUMsa0JBQWtCO2dCQU1oQyxjQUFjO3NCQURiLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgZm9yd2FyZFJlZiwgSG9zdExpc3RlbmVyLCBJbmplY3QsIElucHV0LCBPcHRpb25hbCwgUExBVEZPUk1fSUQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgRm9ybUNvbnRyb2xTdGF0ZSB9IGZyb20gJy4uL3N0YXRlJztcclxuaW1wb3J0IHsgRm9ybVZpZXdBZGFwdGVyLCBOR1JYX0ZPUk1fVklFV19BREFQVEVSIH0gZnJvbSAnLi92aWV3LWFkYXB0ZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0b3Ige1xyXG4gIHVzZXJBZ2VudDogc3RyaW5nO1xyXG59XHJcblxyXG4vKipcclxuICogV2UgbXVzdCBjaGVjayB3aGV0aGVyIHRoZSBhZ2VudCBpcyBBbmRyb2lkIGJlY2F1c2UgY29tcG9zaXRpb24gZXZlbnRzXHJcbiAqIGJlaGF2ZSBkaWZmZXJlbnRseSBiZXR3ZWVuIGlPUyBhbmQgQW5kcm9pZC5cclxuICovXHJcbmZ1bmN0aW9uIGlzQW5kcm9pZChuYXZpZ2F0b3I6IE5hdmlnYXRvcik6IGJvb2xlYW4ge1xyXG4gIHJldHVybiAvYW5kcm9pZCAoXFxkKykvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcclxufVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxyXG4vLyB0c2xpbnQ6ZGlzYWJsZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuXHJcbi8vIFRPRE86IHNpbmNlIHRoaXMgZGlyZWN0aXZlIGhhcyBhIHNpZGUtZWZmZWN0IChzZXR0aW5nIHRoZSBlbGVtZW50J3MgaWQgYXR0cmlidXRlKVxyXG4vLyBpdCBzaG91bGQgbm90IGJsYWNrbGlzdCBvdGhlciB0eXBlcyBvZiBpbnB1dHMgYnV0IGluc3RlYWQgaXQgc2hvdWxkIHNvbWVob3cgZmlndXJlXHJcbi8vIG91dCB3aGV0aGVyIGl0IGlzIHRoZSBcImFjdGl2ZVwiIHZpZXcgYWRhcHRlciBhbmQgb25seSBwZXJmb3JtIGl0cyBzaWRlIGVmZmVjdHMgaWYgaXRcclxuLy8gaXMgYWN0aXZlXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnaW5wdXQ6bm90KFt0eXBlPWNoZWNrYm94XSk6bm90KFt0eXBlPW51bWJlcl0pOm5vdChbdHlwZT1yYWRpb10pOm5vdChbdHlwZT1yYW5nZV0pW25ncnhGb3JtQ29udHJvbFN0YXRlXSx0ZXh0YXJlYVtuZ3J4Rm9ybUNvbnRyb2xTdGF0ZV0nLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HUlhfRk9STV9WSUVXX0FEQVBURVIsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3J4RGVmYXVsdFZpZXdBZGFwdGVyKSxcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gIH1dLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdyeERlZmF1bHRWaWV3QWRhcHRlciBpbXBsZW1lbnRzIEZvcm1WaWV3QWRhcHRlciwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcHJpdmF0ZSBzdGF0ZTogRm9ybUNvbnRyb2xTdGF0ZTxhbnk+O1xyXG4gIHByaXZhdGUgbmF0aXZlSWRXYXNTZXQgPSBmYWxzZTtcclxuXHJcbiAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4gdm9pZCAwO1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdibHVyJylcclxuICBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB2b2lkIDBcclxuXHJcbiAgQElucHV0KCkgc2V0IG5ncnhGb3JtQ29udHJvbFN0YXRlKHZhbHVlOiBGb3JtQ29udHJvbFN0YXRlPGFueT4pIHtcclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29udHJvbCBzdGF0ZSBtdXN0IG5vdCBiZSB1bmRlZmluZWQhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdGF0ZSA9IHZhbHVlO1xyXG4gICAgY29uc3QgbmF0aXZlSWQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pZDtcclxuICAgIGNvbnN0IHNob3VsZFNldE5hdGl2ZUlkID0gdmFsdWUuaWQgIT09IG5hdGl2ZUlkICYmIHRoaXMubmF0aXZlSWRXYXNTZXQ7XHJcbiAgICBpZiAoc2hvdWxkU2V0TmF0aXZlSWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lkJywgdmFsdWUuaWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgY3JlYXRpbmcgYSBjb21wb3NpdGlvbiBzdHJpbmcgKElNRSBldmVudHMpLiAqL1xyXG4gIHByaXZhdGUgaXNDb21wb3NpbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIGlzQ29tcG9zaXRpb25TdXBwb3J0ZWQ6IGJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcclxuICAgIC8vIHdlIHVzZSBhIHNwZWNpYWwgaW5qZWN0aW9uIHN0cmluZyB0aGF0IHNob3VsZCBuZXZlciBleGlzdCBhdCBydW50aW1lIHRvIGFsbG93IG1vY2tpbmcgdGhpcyBkZXBlbmRlbmN5IGZvciB0ZXN0aW5nXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KCduZ3J4LWZvcm1zL25ldmVyJykgbmF2aWdhdG9yOiBOYXZpZ2F0b3IgfCBudWxsID0gbnVsbCxcclxuICApIHtcclxuICAgIHRoaXMuaXNDb21wb3NpdGlvblN1cHBvcnRlZCA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCB8fCAnJykgJiYgIWlzQW5kcm9pZChuYXZpZ2F0b3IgfHwgd2luZG93Lm5hdmlnYXRvcik7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBjb25zdCBuYXRpdmVJZCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmlkO1xyXG4gICAgY29uc3Qgc2hvdWxkU2V0TmF0aXZlSWQgPSB0aGlzLnN0YXRlLmlkICE9PSBuYXRpdmVJZCAmJiAhbmF0aXZlSWQ7XHJcbiAgICBpZiAoc2hvdWxkU2V0TmF0aXZlSWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lkJywgdGhpcy5zdGF0ZS5pZCk7XHJcbiAgICAgIHRoaXMubmF0aXZlSWRXYXNTZXQgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0Vmlld1ZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgbm9ybWFsaXplZFZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNldE9uQ2hhbmdlQ2FsbGJhY2soZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXRPblRvdWNoZWRDYWxsYmFjayhmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldElzRGlzYWJsZWQoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlSW5wdXQoeyB0YXJnZXQgfTogeyB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgfSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNDb21wb3NpdGlvblN1cHBvcnRlZCAmJiB0aGlzLmlzQ29tcG9zaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uQ2hhbmdlKHRhcmdldC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0JylcclxuICBjb21wb3NpdGlvblN0YXJ0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0NvbXBvc2luZyA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjb21wb3NpdGlvbmVuZCcsIFsnJGV2ZW50J10pXHJcbiAgY29tcG9zaXRpb25FbmQoeyB0YXJnZXQgfTogeyB0YXJnZXQ6IEhUTUxJbnB1dEVsZW1lbnQgfSk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0NvbXBvc2luZyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuaXNDb21wb3NpdGlvblN1cHBvcnRlZCkge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHRhcmdldC52YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==