Skip to content

Commit dc77515

Browse files
committed
refactor: input coercion
1 parent aa70a34 commit dc77515

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+421
-132
lines changed

src/cdk/clipboard/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ ng_module(
1010
),
1111
assets = glob(["**/*.html"]),
1212
deps = [
13+
"//src/cdk/coercion",
1314
"@npm//@angular/core",
1415
"@npm//rxjs",
1516
],

src/cdk/clipboard/copy-to-clipboard.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
Optional,
1818
OnDestroy,
1919
} from '@angular/core';
20+
import {coerceNumberProperty, NumberInput} from '@angular/cdk/coercion';
2021
import {Clipboard} from './clipboard';
2122
import {PendingCopy} from './pending-copy';
2223

@@ -48,7 +49,10 @@ export class CdkCopyToClipboard implements OnDestroy {
4849
* How many times to attempt to copy the text. This may be necessary for longer text, because
4950
* the browser needs time to fill an intermediate textarea element and copy the content.
5051
*/
51-
@Input('cdkCopyToClipboardAttempts') attempts: number = 1;
52+
@Input('cdkCopyToClipboardAttempts')
53+
get attempts(): number { return this._attempts; }
54+
set attempts(value: number) { this._attempts = coerceNumberProperty(value); }
55+
private _attempts = 1;
5256

5357
/**
5458
* Emits when some text is copied to the clipboard. The
@@ -109,4 +113,6 @@ export class CdkCopyToClipboard implements OnDestroy {
109113
this._pending.clear();
110114
this._destroyed = true;
111115
}
116+
117+
static ngAcceptInputType_attempts: NumberInput;
112118
}

src/cdk/drag-drop/directives/drop-list.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88

99
import {
1010
BooleanInput,
11+
NumberInput,
1112
coerceArray,
12-
coerceNumberProperty,
1313
coerceBooleanProperty,
14-
NumberInput,
14+
coerceNumberProperty,
1515
} from '@angular/cdk/coercion';
1616
import {
1717
ElementRef,

src/cdk/overlay/overlay-directives.ts

+25-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
*/
88

99
import {Direction, Directionality} from '@angular/cdk/bidi';
10-
import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion';
10+
import {
11+
BooleanInput,
12+
NumberInput,
13+
coerceBooleanProperty,
14+
coerceNumberProperty,
15+
} from '@angular/cdk/coercion';
1116
import {ESCAPE, hasModifierKey} from '@angular/cdk/keycodes';
1217
import {TemplatePortal} from '@angular/cdk/portal';
1318
import {
@@ -100,6 +105,9 @@ export class CdkOverlayOrigin {
100105
export class CdkConnectedOverlay implements OnDestroy, OnChanges {
101106
private _overlayRef: OverlayRef;
102107
private _templatePortal: TemplatePortal;
108+
private _viewportMargin = 0;
109+
private _open = false;
110+
private _disableClose = false;
103111
private _hasBackdrop = false;
104112
private _lockPosition = false;
105113
private _growAfterOpen = false;
@@ -131,7 +139,7 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
131139
@Input('cdkConnectedOverlayOffsetX')
132140
get offsetX(): number { return this._offsetX; }
133141
set offsetX(offsetX: number) {
134-
this._offsetX = offsetX;
142+
this._offsetX = coerceNumberProperty(offsetX);
135143

136144
if (this._position) {
137145
this._updatePositionStrategy(this._position);
@@ -142,7 +150,7 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
142150
@Input('cdkConnectedOverlayOffsetY')
143151
get offsetY() { return this._offsetY; }
144152
set offsetY(offsetY: number) {
145-
this._offsetY = offsetY;
153+
this._offsetY = coerceNumberProperty(offsetY);
146154

147155
if (this._position) {
148156
this._updatePositionStrategy(this._position);
@@ -168,16 +176,22 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
168176
@Input('cdkConnectedOverlayPanelClass') panelClass: string | string[];
169177

170178
/** Margin between the overlay and the viewport edges. */
171-
@Input('cdkConnectedOverlayViewportMargin') viewportMargin: number = 0;
179+
@Input('cdkConnectedOverlayViewportMargin')
180+
get viewportMargin(): number { return this._viewportMargin; }
181+
set viewportMargin(value: number) { this._viewportMargin = coerceNumberProperty(value); }
172182

173183
/** Strategy to be used when handling scroll events while the overlay is open. */
174184
@Input('cdkConnectedOverlayScrollStrategy') scrollStrategy: ScrollStrategy;
175185

176186
/** Whether the overlay is open. */
177-
@Input('cdkConnectedOverlayOpen') open: boolean = false;
187+
@Input('cdkConnectedOverlayOpen')
188+
get open() { return this._open; }
189+
set open(value: any) { this._open = coerceBooleanProperty(value); }
178190

179191
/** Whether the overlay can be closed by user interaction. */
180-
@Input('cdkConnectedOverlayDisableClose') disableClose: boolean = false;
192+
@Input('cdkConnectedOverlayDisableClose')
193+
get disableClose() { return this._disableClose; }
194+
set disableClose(value: any) { this._disableClose = coerceBooleanProperty(value); }
181195

182196
/** CSS selector which to set the transform origin. */
183197
@Input('cdkConnectedOverlayTransformOriginOn') transformOriginSelector: string;
@@ -428,6 +442,11 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges {
428442
this._positionSubscription.unsubscribe();
429443
}
430444

445+
static ngAcceptInputType_offsetX: NumberInput;
446+
static ngAcceptInputType_offsetY: NumberInput;
447+
static ngAcceptInputType_viewportMargin: NumberInput;
448+
static ngAcceptInputType_open: BooleanInput;
449+
static ngAcceptInputType_disableClose: BooleanInput;
431450
static ngAcceptInputType_hasBackdrop: BooleanInput;
432451
static ngAcceptInputType_lockPosition: BooleanInput;
433452
static ngAcceptInputType_flexibleDimensions: BooleanInput;

src/google-maps/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ ng_module(
1212
),
1313
deps = [
1414
"//src:dev_mode_types",
15+
"//src/cdk/coercion",
1516
"@npm//@angular/common",
1617
"@npm//@angular/core",
1718
"@npm//@types/googlemaps",

src/google-maps/google-map/google-map.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
EventEmitter,
2727
} from '@angular/core';
2828
import {isPlatformBrowser} from '@angular/common';
29+
import {NumberInput, coerceNumberProperty} from '@angular/cdk/coercion';
2930
import {Observable} from 'rxjs';
3031
import {MapEventManager} from '../map-event-manager';
3132

@@ -93,10 +94,10 @@ export class GoogleMap implements OnChanges, OnInit, OnDestroy {
9394
private _center: google.maps.LatLngLiteral|google.maps.LatLng;
9495

9596
@Input()
96-
set zoom(zoom: number) {
97-
this._zoom = zoom;
97+
set zoom(zoom: number | undefined) {
98+
this._zoom = zoom === undefined ? zoom : coerceNumberProperty(zoom);
9899
}
99-
private _zoom: number;
100+
private _zoom: number | undefined;
100101

101102
@Input()
102103
set options(options: google.maps.MapOptions) {
@@ -505,6 +506,8 @@ export class GoogleMap implements OnChanges, OnInit, OnDestroy {
505506
'Please wait for the API to load before trying to interact with it.');
506507
}
507508
}
509+
510+
static ngAcceptInputType_zoom: NumberInput;
508511
}
509512

510513
const cssUnitsPattern = /([A-Za-z%]+)$/;

src/google-maps/map-circle/map-circle.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
/// <reference types="googlemaps" />
1111

1212
import {Directive, Input, NgZone, OnDestroy, OnInit, Output} from '@angular/core';
13+
import {NumberInput, coerceNumberProperty} from '@angular/cdk/coercion';
1314
import {BehaviorSubject, combineLatest, Observable, Subject} from 'rxjs';
1415
import {map, take, takeUntil} from 'rxjs/operators';
1516

@@ -51,8 +52,8 @@ export class MapCircle implements OnInit, OnDestroy {
5152
}
5253

5354
@Input()
54-
set radius(radius: number) {
55-
this._radius.next(radius);
55+
set radius(radius: number | undefined) {
56+
this._radius.next(radius === undefined ? radius : coerceNumberProperty(radius));
5657
}
5758

5859
/**
@@ -282,4 +283,6 @@ export class MapCircle implements OnInit, OnDestroy {
282283
}
283284
}
284285
}
286+
287+
static ngAcceptInputType_radius: NumberInput;
285288
}

src/google-maps/map-ground-overlay/map-ground-overlay.ts

+14-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@
1010
/// <reference types="googlemaps" />
1111

1212
import {Directive, Input, NgZone, OnDestroy, OnInit, Output} from '@angular/core';
13+
import {
14+
BooleanInput,
15+
NumberInput,
16+
coerceBooleanProperty,
17+
coerceNumberProperty
18+
} from '@angular/cdk/coercion';
1319
import {BehaviorSubject, Observable, Subject} from 'rxjs';
1420
import {takeUntil} from 'rxjs/operators';
1521

@@ -27,6 +33,7 @@ import {MapEventManager} from '../map-event-manager';
2733
})
2834
export class MapGroundOverlay implements OnInit, OnDestroy {
2935
private _eventManager = new MapEventManager(this._ngZone);
36+
private _clickable = false;
3037

3138
private readonly _opacity = new BehaviorSubject<number>(1);
3239
private readonly _url = new BehaviorSubject<string>('');
@@ -58,12 +65,14 @@ export class MapGroundOverlay implements OnInit, OnDestroy {
5865
}
5966

6067
/** Whether the overlay is clickable */
61-
@Input() clickable: boolean = false;
68+
@Input()
69+
get clickable() { return this._clickable; }
70+
set clickable(value: any) { this._clickable = coerceBooleanProperty(value); }
6271

6372
/** Opacity of the overlay. */
6473
@Input()
6574
set opacity(opacity: number) {
66-
this._opacity.next(opacity);
75+
this._opacity.next(coerceNumberProperty(opacity));
6776
}
6877

6978
/**
@@ -189,4 +198,7 @@ export class MapGroundOverlay implements OnInit, OnDestroy {
189198
}
190199
}
191200
}
201+
202+
static ngAcceptInputType_clickable: BooleanInput;
203+
static ngAcceptInputType_opacity: NumberInput;
192204
}

src/google-maps/map-marker-clusterer/map-marker-clusterer.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,11 @@ describe('MapMarkerClusterer', () => {
8080
imagePath: undefined,
8181
imageSizes: undefined,
8282
maxZoom: undefined,
83-
minimumClusterSize: undefined,
83+
minimumClusterSize: 0,
8484
styles: undefined,
8585
title: undefined,
8686
zIndex: undefined,
87-
zoomOnClick: undefined,
87+
zoomOnClick: false,
8888
});
8989
});
9090

src/google-maps/map-marker-clusterer/map-marker-clusterer.ts

+56-27
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ import {
2525
SimpleChanges,
2626
ViewEncapsulation
2727
} from '@angular/core';
28+
import {
29+
BooleanInput,
30+
NumberInput,
31+
coerceArray,
32+
coerceBooleanProperty,
33+
coerceNumberProperty
34+
} from '@angular/cdk/coercion';
2835
import {Observable, Subject} from 'rxjs';
2936
import {takeUntil} from 'rxjs/operators';
3037

@@ -59,18 +66,25 @@ export class MapMarkerClusterer implements OnInit, AfterContentInit, OnChanges,
5966
ariaLabelFn: AriaLabelFn = () => ''
6067

6168
@Input()
62-
set averageCenter(averageCenter: boolean) {
63-
this._averageCenter = averageCenter;
69+
set averageCenter(averageCenter: boolean | undefined) {
70+
this._averageCenter = averageCenter === undefined
71+
? averageCenter
72+
: coerceBooleanProperty(averageCenter);
6473
}
65-
private _averageCenter: boolean;
74+
private _averageCenter: boolean | undefined;
6675

67-
@Input() batchSize?: number;
76+
@Input()
77+
get batchSize(): number | undefined { return this._batchSize; }
78+
set batchSize(batchSize: any) {
79+
this._batchSize = batchSize === undefined ? batchSize : coerceNumberProperty(batchSize);
80+
}
81+
private _batchSize?: number;
6882

6983
@Input()
70-
set batchSizeIE(batchSizeIE: number) {
71-
this._batchSizeIE = batchSizeIE;
84+
set batchSizeIE(batchSizeIE: number | undefined) {
85+
this._batchSizeIE = batchSizeIE === undefined ? batchSizeIE : coerceNumberProperty(batchSizeIE);
7286
}
73-
private _batchSizeIE: number;
87+
private _batchSizeIE?: number;
7488

7589
@Input()
7690
set calculator(calculator: Calculator) {
@@ -85,22 +99,26 @@ export class MapMarkerClusterer implements OnInit, AfterContentInit, OnChanges,
8599
private _clusterClass: string;
86100

87101
@Input()
88-
set enableRetinaIcons(enableRetinaIcons: boolean) {
89-
this._enableRetinaIcons = enableRetinaIcons;
102+
set enableRetinaIcons(enableRetinaIcons: boolean | undefined) {
103+
this._enableRetinaIcons = enableRetinaIcons === undefined
104+
? enableRetinaIcons
105+
: coerceBooleanProperty(enableRetinaIcons);
90106
}
91-
private _enableRetinaIcons: boolean;
107+
private _enableRetinaIcons: boolean | undefined;
92108

93109
@Input()
94-
set gridSize(gridSize: number) {
95-
this._gridSize = gridSize;
110+
set gridSize(gridSize: number | undefined) {
111+
this._gridSize = gridSize === undefined ? gridSize : coerceNumberProperty(gridSize);
96112
}
97-
private _gridSize: number;
113+
private _gridSize: number | undefined;
98114

99115
@Input()
100-
set ignoreHidden(ignoreHidden: boolean) {
101-
this._ignoreHidden = ignoreHidden;
116+
set ignoreHidden(ignoreHidden: boolean | undefined) {
117+
this._ignoreHidden = ignoreHidden === undefined
118+
? ignoreHidden
119+
: coerceBooleanProperty(ignoreHidden);
102120
}
103-
private _ignoreHidden: boolean;
121+
private _ignoreHidden: boolean | undefined;
104122

105123
@Input()
106124
set imageExtension(imageExtension: string) {
@@ -115,20 +133,20 @@ export class MapMarkerClusterer implements OnInit, AfterContentInit, OnChanges,
115133
private _imagePath: string;
116134

117135
@Input()
118-
set imageSizes(imageSizes: number[]) {
119-
this._imageSizes = imageSizes;
136+
set imageSizes(imageSizes: number | number[] | undefined) {
137+
this._imageSizes = imageSizes === undefined ? imageSizes : coerceArray(imageSizes);
120138
}
121-
private _imageSizes: number[];
139+
private _imageSizes: number[] | undefined;
122140

123141
@Input()
124-
set maxZoom(maxZoom: number) {
125-
this._maxZoom = maxZoom;
142+
set maxZoom(maxZoom: number | undefined) {
143+
this._maxZoom = maxZoom === undefined ? maxZoom : coerceNumberProperty(maxZoom);
126144
}
127-
private _maxZoom: number;
145+
private _maxZoom: number | undefined;
128146

129147
@Input()
130148
set minimumClusterSize(minimumClusterSize: number) {
131-
this._minimumClusterSize = minimumClusterSize;
149+
this._minimumClusterSize = coerceNumberProperty(minimumClusterSize);
132150
}
133151
private _minimumClusterSize: number;
134152

@@ -145,14 +163,14 @@ export class MapMarkerClusterer implements OnInit, AfterContentInit, OnChanges,
145163
private _title: string;
146164

147165
@Input()
148-
set zIndex(zIndex: number) {
149-
this._zIndex = zIndex;
166+
set zIndex(zIndex: number | undefined) {
167+
this._zIndex = zIndex === undefined ? zIndex : coerceNumberProperty(zIndex);
150168
}
151-
private _zIndex: number;
169+
private _zIndex: number | undefined;
152170

153171
@Input()
154172
set zoomOnClick(zoomOnClick: boolean) {
155-
this._zoomOnClick = zoomOnClick;
173+
this._zoomOnClick = coerceBooleanProperty(zoomOnClick);
156174
}
157175
private _zoomOnClick: boolean;
158176

@@ -480,4 +498,15 @@ export class MapMarkerClusterer implements OnInit, AfterContentInit, OnChanges,
480498
}
481499
}
482500
}
501+
502+
static ngAcceptInputType_averageCenter: BooleanInput;
503+
static ngAcceptInputType_batchSize: NumberInput;
504+
static ngAcceptInputType_batchSizeIE: NumberInput;
505+
static ngAcceptInputType_enableRetinaIcons: BooleanInput;
506+
static ngAcceptInputType_gridSize: NumberInput;
507+
static ngAcceptInputType_ignoreHidden: BooleanInput;
508+
static ngAcceptInputType_maxZoom: NumberInput;
509+
static ngAcceptInputType_minimumClusterSize: NumberInput;
510+
static ngAcceptInputType_zIndex: NumberInput;
511+
static ngAcceptInputType_zoomOnClick: BooleanInput;
483512
}

0 commit comments

Comments
 (0)