Skip to content

Commit 5fcb4cf

Browse files
committed
feat(core): Added NumberControlValueAccessor
relates #14
1 parent 8dc960c commit 5fcb4cf

6 files changed

Lines changed: 69 additions & 15 deletions
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1-
export { NgqpDefaultControlValueAccessorDirective } from './default-control-value-accessor.directive';
2-
export { NgqpSelectControlValueAccessorDirective, NgqpSelectOptionDirective } from './select-control-value-accessor.directive';
1+
export { DefaultControlValueAccessorDirective } from './default-control-value-accessor.directive';
2+
export { NumberControlValueAccessorDirective } from './number-control-value-accessor.directive';
3+
export { SelectControlValueAccessorDirective, NgqpSelectOptionDirective } from './select-control-value-accessor.directive';

projects/ngqp/core/src/lib/accessors/default-control-value-accessor.directive.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { isPlatformBrowser } from '@angular/common';
44

55
export const NGQP_DEFAULT_VALUE_ACCESSOR: any = {
66
provide: NG_VALUE_ACCESSOR,
7-
useExisting: forwardRef(() => NgqpDefaultControlValueAccessorDirective),
7+
useExisting: forwardRef(() => DefaultControlValueAccessorDirective),
88
multi: true
99
};
1010

@@ -16,7 +16,7 @@ function isAndroid(navigator: Navigator): boolean {
1616
selector: 'input:not([type=checkbox]):not([type=radio])[queryParamName],textarea[queryParamName]',
1717
providers: [NGQP_DEFAULT_VALUE_ACCESSOR],
1818
})
19-
export class NgqpDefaultControlValueAccessorDirective implements ControlValueAccessor {
19+
export class DefaultControlValueAccessorDirective implements ControlValueAccessor {
2020

2121
private readonly supportsComposition: boolean;
2222
private composing = false;
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { Directive, ElementRef, forwardRef, HostListener, Renderer2 } from '@angular/core';
2+
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
3+
4+
export const NGQP_NUMBER_VALUE_ACCESSOR: any = {
5+
provide: NG_VALUE_ACCESSOR,
6+
useExisting: forwardRef(() => NumberControlValueAccessorDirective),
7+
multi: true
8+
};
9+
10+
@Directive({
11+
selector: 'input[type=number][queryParamName]',
12+
providers: [NGQP_NUMBER_VALUE_ACCESSOR],
13+
})
14+
export class NumberControlValueAccessorDirective implements ControlValueAccessor {
15+
16+
private fnChange = (_: number) => {};
17+
private fnTouched = () => {};
18+
19+
@HostListener('change', ['$event'])
20+
@HostListener('input', ['$event'])
21+
public onInput(event: UIEvent) {
22+
const value = (event.target as HTMLInputElement).value;
23+
this.fnChange(value === '' ? null : parseFloat(value));
24+
}
25+
26+
@HostListener('blur')
27+
public onBlur() {
28+
this.fnTouched();
29+
}
30+
31+
constructor(private renderer: Renderer2, private elementRef: ElementRef) {
32+
}
33+
34+
public writeValue(value: string) {
35+
const normalizedValue = value === null ? '' : value;
36+
this.renderer.setProperty(this.elementRef.nativeElement, 'value', normalizedValue);
37+
}
38+
39+
public registerOnChange(fn: any) {
40+
this.fnChange = fn;
41+
}
42+
43+
public registerOnTouched(fn: any) {
44+
this.fnTouched = fn;
45+
}
46+
47+
public setDisabledState(isDisabled: boolean) {
48+
this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);
49+
}
50+
51+
}

projects/ngqp/core/src/lib/accessors/select-control-value-accessor.directive.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
1414

1515
export const NGQP_SELECT_VALUE_ACCESSOR: StaticProvider = {
1616
provide: NG_VALUE_ACCESSOR,
17-
useExisting: forwardRef(() => NgqpSelectControlValueAccessorDirective),
17+
useExisting: forwardRef(() => SelectControlValueAccessorDirective),
1818
multi: true
1919
};
2020

2121
@Directive({
2222
selector: 'select:not([multiple])[queryParamName]',
2323
providers: [NGQP_SELECT_VALUE_ACCESSOR],
2424
})
25-
export class NgqpSelectControlValueAccessorDirective<T> implements ControlValueAccessor {
25+
export class SelectControlValueAccessorDirective<T> implements ControlValueAccessor {
2626

2727
public value: T | null = null;
2828
private selectedId: string | null = null;
@@ -108,7 +108,7 @@ export class NgqpSelectOptionDirective<T> implements OnDestroy {
108108
private readonly id: string | null = null;
109109

110110
constructor(
111-
@Optional() @Host() private parent: NgqpSelectControlValueAccessorDirective<T>,
111+
@Optional() @Host() private parent: SelectControlValueAccessorDirective<T>,
112112
private renderer: Renderer2,
113113
private elementRef: ElementRef,
114114
) {

projects/ngqp/core/src/lib/query-param-name.directive.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Directive, Host, Inject, Input, OnChanges, OnInit, Optional, Self, SimpleChanges, SkipSelf } from '@angular/core';
22
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
33
import { QueryParamGroupDirective } from './query-param-group.directive';
4-
import { NgqpDefaultControlValueAccessorDirective } from './accessors/accessors';
4+
import { DefaultControlValueAccessorDirective } from './accessors/accessors';
55

66
/**
77
* TODO Documentation
@@ -57,13 +57,13 @@ export class QueryParamNameDirective implements OnInit, OnChanges {
5757
// TODO Check against all our custom accessors (similar to selectValueAccessor in @angular/forms)
5858

5959
const customAccessor = valueAccessors
60-
.find(valueAccessor => valueAccessor.constructor !== NgqpDefaultControlValueAccessorDirective);
60+
.find(valueAccessor => valueAccessor.constructor !== DefaultControlValueAccessorDirective);
6161
if (customAccessor !== undefined) {
6262
return customAccessor;
6363
}
6464

6565
const defaultAccessor = valueAccessors
66-
.find(valueAccessor => valueAccessor.constructor === NgqpDefaultControlValueAccessorDirective);
66+
.find(valueAccessor => valueAccessor.constructor === DefaultControlValueAccessorDirective);
6767
if (defaultAccessor !== undefined) {
6868
return defaultAccessor;
6969
}

projects/ngqp/core/src/lib/query-param.module.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,20 @@ import { NgModule, Type } from '@angular/core';
22
import { QueryParamNameDirective } from './query-param-name.directive';
33
import { QueryParamGroupDirective } from './query-param-group.directive';
44
import {
5-
NgqpDefaultControlValueAccessorDirective,
6-
NgqpSelectControlValueAccessorDirective,
7-
NgqpSelectOptionDirective
5+
DefaultControlValueAccessorDirective,
6+
NgqpSelectOptionDirective,
7+
NumberControlValueAccessorDirective,
8+
SelectControlValueAccessorDirective
89
} from './accessors/accessors';
910

1011
const DIRECTIVES: Type<any>[] = [
1112
QueryParamNameDirective,
1213
QueryParamGroupDirective,
1314

1415
// Accessors
15-
NgqpDefaultControlValueAccessorDirective,
16-
NgqpSelectControlValueAccessorDirective,
16+
DefaultControlValueAccessorDirective,
17+
NumberControlValueAccessorDirective,
18+
SelectControlValueAccessorDirective,
1719
NgqpSelectOptionDirective,
1820
];
1921

0 commit comments

Comments
 (0)