ngrx-forms
Version:
Proper integration of forms in Angular 4 applications using ngrx
121 lines • 16.1 kB
JavaScript
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==