Skip to content

Commit 876dd6d

Browse files
authored
Merge pull request #583 from NativeScript/hdeshev/reactive-forms-static
Value accessors using static selectors now.
2 parents a231d97 + 231465e commit 876dd6d

10 files changed

+41
-51
lines changed

.travis.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ before_cache:
2222

2323
cache:
2424
directories:
25-
- $HOME/.nvm
2625
- $HOME/.gradle/caches/
2726
- $HOME/.gradle/wrapper/
2827

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Usage:
2+
// node generate-value-accessor-selector TextField TextView
3+
4+
function generateValueAccessorSelector(tagNames) {
5+
const tags = [];
6+
tagNames.forEach(tagName => {
7+
tags.push(tagName); // regular tag
8+
tags.push(tagName.charAt(0).toLowerCase() + tagName.slice(1)); // lowercase first char
9+
tags.push(tagName.split(/(?=[A-Z])/).join("-").toLowerCase()); // kebab case
10+
});
11+
12+
const selectors = [];
13+
for (const tag of tags) {
14+
for (const directive of ["ngModel", "formControlName"]) {
15+
selectors.push(`${tag}[${directive}]`);
16+
}
17+
}
18+
return selectors.join(", ");
19+
}
20+
21+
process.argv.shift();
22+
process.argv.shift();
23+
console.log(generateValueAccessorSelector(process.argv));

nativescript-angular/value-accessors/base-value-accessor.ts

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,5 @@
11
import { ControlValueAccessor } from "@angular/forms";
22

3-
export function generateValueAccessorSelector(...tagNames: string[]): string {
4-
const tags: string[] = [];
5-
tagNames.forEach(tagName => {
6-
tags.push(tagName); // regular tag
7-
tags.push(tagName.charAt(0).toLowerCase() + tagName.slice(1)); // lowercase first char
8-
tags.push(tagName.split(/(?=[A-Z])/).join("-").toLowerCase()); // kebab case
9-
});
10-
11-
const selectors = [];
12-
for (const tag of tags) {
13-
for (const directive of ["ngModel", "formControlName"]) {
14-
selectors.push(`${tag}[${directive}]`);
15-
}
16-
}
17-
return selectors.join(", ");
18-
}
19-
203
export class BaseValueAccessor<TView> implements ControlValueAccessor {
214
constructor(public view: TView) { }
225

nativescript-angular/value-accessors/checked-value-accessor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
33
import { isBlank } from "../lang-facade";
4-
import { BaseValueAccessor, generateValueAccessorSelector } from "./base-value-accessor";
4+
import { BaseValueAccessor } from "./base-value-accessor";
55
import { Switch } from "ui/switch";
66

77
const CHECKED_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
@@ -17,7 +17,8 @@ const CHECKED_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
1717
* ```
1818
*/
1919
@Directive({
20-
selector: generateValueAccessorSelector("Switch"),
20+
// tslint:disable-next-line:max-line-length directive-selector
21+
selector: "Switch[ngModel], Switch[formControlName], switch[ngModel], switch[formControlName], switch[ngModel], switch[formControlName]",
2122
providers: [CHECKED_VALUE_ACCESSOR]
2223
})
2324
export class CheckedValueAccessor extends BaseValueAccessor<Switch> { // tslint:disable-line:directive-class-suffix

nativescript-angular/value-accessors/date-value-accessor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
33
import { isBlank, isDate } from "../lang-facade";
4-
import { BaseValueAccessor, generateValueAccessorSelector } from "./base-value-accessor";
4+
import { BaseValueAccessor } from "./base-value-accessor";
55
import { DatePicker } from "ui/date-picker";
66

77
const DATE_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
@@ -17,7 +17,8 @@ const DATE_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
1717
* ```
1818
*/
1919
@Directive({
20-
selector: generateValueAccessorSelector("DatePicker"),
20+
// tslint:disable-next-line:max-line-length directive-selector
21+
selector: "DatePicker[ngModel], DatePicker[formControlName], datePicker[ngModel], datePicker[formControlName], date-picker[ngModel], date-picker[formControlName]",
2122
providers: [DATE_VALUE_ACCESSOR]
2223
})
2324
export class DateValueAccessor extends BaseValueAccessor<DatePicker> { // tslint:disable-line:directive-class-suffix

nativescript-angular/value-accessors/number-value-accessor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
33
import { isBlank, isNumber } from "../lang-facade";
4-
import { BaseValueAccessor, generateValueAccessorSelector } from "./base-value-accessor";
4+
import { BaseValueAccessor } from "./base-value-accessor";
55
import { Slider } from "ui/slider";
66

77
const NUMBER_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
@@ -17,7 +17,8 @@ const NUMBER_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
1717
* ```
1818
*/
1919
@Directive({
20-
selector: generateValueAccessorSelector("Slider"),
20+
// tslint:disable-next-line:max-line-length directive-selector
21+
selector: "Slider[ngModel], Slider[formControlName], slider[ngModel], slider[formControlName], slider[ngModel], slider[formControlName]",
2122
providers: [NUMBER_VALUE_ACCESSOR]
2223
})
2324
export class NumberValueAccessor extends BaseValueAccessor<Slider> { // tslint:disable-line:directive-class-suffix

nativescript-angular/value-accessors/selectedIndex-value-accessor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Directive, ElementRef, forwardRef, AfterViewInit, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
3-
import { BaseValueAccessor, generateValueAccessorSelector } from "./base-value-accessor";
3+
import { BaseValueAccessor } from "./base-value-accessor";
44
import { View } from "ui/core/view";
55
import { convertToInt } from "../common/utils";
66

@@ -19,7 +19,8 @@ export type SelectableView = {selectedIndex: number} & View;
1919
* ```
2020
*/
2121
@Directive({
22-
selector: generateValueAccessorSelector("SegmentedBar", "ListPicker", "TabView"),
22+
// tslint:disable-next-line:max-line-length directive-selector
23+
selector: "SegmentedBar[ngModel], SegmentedBar[formControlName], segmentedBar[ngModel], segmentedBar[formControlName], segmented-bar[ngModel], segmented-bar[formControlName], ListPicker[ngModel], ListPicker[formControlName], listPicker[ngModel], listPicker[formControlName], list-picker[ngModel], list-picker[formControlName], TabView[ngModel], TabView[formControlName], tabView[ngModel], tabView[formControlName], tab-view[ngModel], tab-view[formControlName]",
2324
providers: [SELECTED_INDEX_VALUE_ACCESSOR]
2425
})
2526
export class SelectedIndexValueAccessor extends BaseValueAccessor<SelectableView> implements AfterViewInit { // tslint:disable-line:max-line-length directive-class-suffix

nativescript-angular/value-accessors/text-value-accessor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
33
import { isBlank } from "../lang-facade";
4-
import { BaseValueAccessor, generateValueAccessorSelector } from "./base-value-accessor";
4+
import { BaseValueAccessor } from "./base-value-accessor";
55
import { View } from "ui/core/view";
66

77
const TEXT_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
@@ -19,7 +19,8 @@ export type TextView = {text: string} & View;
1919
* ```
2020
*/
2121
@Directive({
22-
selector: generateValueAccessorSelector("TextField", "TextView", "SearchBar"),
22+
// tslint:disable-next-line:max-line-length directive-selector
23+
selector: "TextField[ngModel], TextField[formControlName], textField[ngModel], textField[formControlName], text-field[ngModel], text-field[formControlName], TextView[ngModel], TextView[formControlName], textView[ngModel], textView[formControlName], text-view[ngModel], text-view[formControlName], SearchBar[ngModel], SearchBar[formControlName], searchBar[ngModel], searchBar[formControlName], search-bar[ngModel], search-bar[formControlName]",
2324
providers: [TEXT_VALUE_ACCESSOR]
2425
})
2526
export class TextValueAccessor extends BaseValueAccessor<TextView> { // tslint:disable-line:directive-class-suffix

nativescript-angular/value-accessors/time-value-accessor.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Directive, ElementRef, forwardRef, HostListener } from "@angular/core";
22
import { NG_VALUE_ACCESSOR } from "@angular/forms";
33
import { isBlank, isDate } from "../lang-facade";
4-
import { BaseValueAccessor, generateValueAccessorSelector } from "./base-value-accessor";
4+
import { BaseValueAccessor } from "./base-value-accessor";
55
import { TimePicker } from "ui/time-picker";
66

77
const TIME_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
@@ -17,7 +17,8 @@ const TIME_VALUE_ACCESSOR = {provide: NG_VALUE_ACCESSOR,
1717
* ```
1818
*/
1919
@Directive({
20-
selector: generateValueAccessorSelector("TimePicker"),
20+
// tslint:disable-next-line:max-line-length directive-selector
21+
selector: "TimePicker[ngModel], TimePicker[formControlName], timePicker[ngModel], timePicker[formControlName], time-picker[ngModel], time-picker[formControlName]",
2122
providers: [TIME_VALUE_ACCESSOR]
2223
})
2324
export class TimeValueAccessor extends BaseValueAccessor<TimePicker> { // tslint:disable-line:directive-class-suffix

tests/app/tests/value-accessor-tests.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {TimePicker} from "ui/time-picker";
88
import {ListPicker} from "ui/list-picker";
99
import {TextField} from "ui/text-field";
1010
import {
11-
generateValueAccessorSelector,
1211
NumberValueAccessor,
1312
CheckedValueAccessor,
1413
DateValueAccessor,
@@ -144,26 +143,6 @@ describe("two-way binding via ng-model", () => {
144143
});
145144
})
146145

147-
describe("target selector registration", () => {
148-
it("supports uppercase(unchanged) camel tags", () => {
149-
assert.include(generateValueAccessorSelector("TextField"), "TextField[ngModel]");
150-
});
151-
it("supports lowercase camel tags", () => {
152-
assert.include(generateValueAccessorSelector("TextField"), "textField[ngModel]");
153-
});
154-
it("supports kebab case tags", () => {
155-
assert.include(generateValueAccessorSelector("TextField"), "text-field[ngModel]");
156-
});
157-
it("supports formControlName", () => {
158-
assert.include(generateValueAccessorSelector("TextField"), "TextField[formControlName]");
159-
});
160-
it("supports multiple tags", () => {
161-
const selector = generateValueAccessorSelector("TextField", "TextView");
162-
assert.include(selector, "TextField[ngModel]");
163-
assert.include(selector, "TextField[formControlName]");
164-
});
165-
});
166-
167146
function formatDate(date: Date) {
168147
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
169148
}

0 commit comments

Comments
 (0)