Skip to content

Commit e44ff83

Browse files
authored
feat(google-maps): Add support for the gmp-click event (#33147)
Add an output to proxy the gmp-click event and an input for gmpClickable which is set on the AdvancedMarkerElement. Everything is the same pattern as gmpDrag Fixes #33145
1 parent 62e0d4f commit e44ff83

3 files changed

Lines changed: 39 additions & 2 deletions

File tree

goldens/google-maps/index.api.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,8 @@ export class MapAdvancedMarker implements OnInit, OnChanges, OnDestroy, MapAncho
314314
set content(content: Node | google.maps.marker.PinElement | null);
315315
// (undocumented)
316316
getAnchor(): google.maps.marker.AdvancedMarkerElement;
317+
readonly gmpClick: Observable<google.maps.marker.AdvancedMarkerClickEvent>;
318+
set gmpClickable(clickable: boolean);
317319
set gmpDraggable(draggable: boolean);
318320
readonly mapClick: Observable<google.maps.MapMouseEvent>;
319321
readonly mapDblclick: Observable<MouseEvent>;
@@ -337,7 +339,7 @@ export class MapAdvancedMarker implements OnInit, OnChanges, OnDestroy, MapAncho
337339
set title(title: string);
338340
set zIndex(zIndex: number);
339341
// (undocumented)
340-
static ɵdir: i0.ɵɵDirectiveDeclaration<MapAdvancedMarker, "map-advanced-marker", ["mapAdvancedMarker"], { "title": { "alias": "title"; "required": false; }; "position": { "alias": "position"; "required": false; }; "content": { "alias": "content"; "required": false; }; "gmpDraggable": { "alias": "gmpDraggable"; "required": false; }; "options": { "alias": "options"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; }, { "mapClick": "mapClick"; "mapDblclick": "mapDblclick"; "mapMouseout": "mapMouseout"; "mapMouseover": "mapMouseover"; "mapMouseup": "mapMouseup"; "mapRightclick": "mapRightclick"; "mapDrag": "mapDrag"; "mapDragend": "mapDragend"; "mapDragstart": "mapDragstart"; "markerInitialized": "markerInitialized"; }, never, never, true, never>;
342+
static ɵdir: i0.ɵɵDirectiveDeclaration<MapAdvancedMarker, "map-advanced-marker", ["mapAdvancedMarker"], { "title": { "alias": "title"; "required": false; }; "position": { "alias": "position"; "required": false; }; "content": { "alias": "content"; "required": false; }; "gmpDraggable": { "alias": "gmpDraggable"; "required": false; }; "gmpClickable": { "alias": "gmpClickable"; "required": false; }; "options": { "alias": "options"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; }, { "mapClick": "mapClick"; "mapDblclick": "mapDblclick"; "mapMouseout": "mapMouseout"; "mapMouseover": "mapMouseover"; "mapMouseup": "mapMouseup"; "mapRightclick": "mapRightclick"; "mapDrag": "mapDrag"; "mapDragend": "mapDragend"; "mapDragstart": "mapDragstart"; "gmpClick": "gmpClick"; "markerInitialized": "markerInitialized"; }, never, never, true, never>;
341343
// (undocumented)
342344
static ɵfac: i0.ɵɵFactoryDeclaration<MapAdvancedMarker, never>;
343345
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ describe('MapAdvancedMarker', () => {
3434
title: undefined,
3535
content: undefined,
3636
gmpDraggable: undefined,
37+
gmpClickable: undefined,
3738
zIndex: undefined,
3839
map: mapSpy,
3940
});
@@ -46,6 +47,7 @@ describe('MapAdvancedMarker', () => {
4647
map: mapSpy,
4748
content: undefined,
4849
gmpDraggable: true,
50+
gmpClickable: true,
4951
zIndex: 1,
5052
};
5153
const advancedMarkerSpy = createAdvancedMarkerSpy(options);
@@ -56,6 +58,7 @@ describe('MapAdvancedMarker', () => {
5658
fixture.componentInstance.title = options.title!;
5759
fixture.componentInstance.content = options.content!;
5860
fixture.componentInstance.gmpDraggable = options.gmpDraggable!;
61+
fixture.componentInstance.gmpClickable = options.gmpClickable!;
5962
fixture.componentInstance.zIndex = options.zIndex!;
6063

6164
fixture.detectChanges();
@@ -69,6 +72,7 @@ describe('MapAdvancedMarker', () => {
6972
title: 'marker title',
7073
content: undefined,
7174
gmpDraggable: true,
75+
gmpClickable: true,
7276
zIndex: 1,
7377
};
7478
const advancedMarkerSpy = createAdvancedMarkerSpy(options);
@@ -87,6 +91,7 @@ describe('MapAdvancedMarker', () => {
8791
title: 'marker title',
8892
content: undefined,
8993
gmpDraggable: true,
94+
gmpClickable: true,
9095
zIndex: 1,
9196
};
9297

@@ -95,6 +100,7 @@ describe('MapAdvancedMarker', () => {
95100
title: 'marker title 2',
96101
content: undefined,
97102
gmpDraggable: false,
103+
gmpClickable: false,
98104
zIndex: 999,
99105
map: mapSpy,
100106
};
@@ -106,6 +112,7 @@ describe('MapAdvancedMarker', () => {
106112
fixture.componentInstance.title = expectedOptions.title!;
107113
fixture.componentInstance.content = expectedOptions.content!;
108114
fixture.componentInstance.gmpDraggable = expectedOptions.gmpDraggable!;
115+
fixture.componentInstance.gmpClickable = expectedOptions.gmpClickable!;
109116
fixture.componentInstance.zIndex = expectedOptions.zIndex!;
110117
fixture.componentInstance.options = options!;
111118

@@ -132,6 +139,7 @@ describe('MapAdvancedMarker', () => {
132139
expect(customSpy).not.toHaveBeenCalledWith('drag', jasmine.any(Function));
133140
expect(customSpy).not.toHaveBeenCalledWith('dragend', jasmine.any(Function));
134141
expect(customSpy).not.toHaveBeenCalledWith('dragstart', jasmine.any(Function));
142+
expect(customSpy).not.toHaveBeenCalledWith('gmp-click', jasmine.any(Function));
135143
});
136144

137145
it('should be able to add an event listener after init', () => {
@@ -162,6 +170,7 @@ describe('MapAdvancedMarker', () => {
162170
[position]="position"
163171
[content]="content"
164172
[gmpDraggable]="gmpDraggable"
173+
[gmpClickable]="gmpClickable"
165174
[zIndex]="zIndex"
166175
(mapClick)="handleClick()"
167176
(mapDblclick)="handleDblclick()"
@@ -181,6 +190,7 @@ class TestApp {
181190
position!: google.maps.LatLng | google.maps.LatLngLiteral;
182191
content!: Node | google.maps.marker.PinElement;
183192
gmpDraggable!: boolean;
193+
gmpClickable!: boolean;
184194
zIndex!: number;
185195
options!: google.maps.marker.AdvancedMarkerElementOptions;
186196

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ export class MapAdvancedMarker
105105
}
106106
private _draggable: boolean | undefined;
107107

108+
/**
109+
* If `true`, the `AdvancedMarkerElement` will be clickable and trigger the
110+
* gmp-click event, and will be interactive for accessibility purposes (e.g.
111+
* allowing keyboard navigation via arrow keys).
112+
* @see https://developers.google.com/maps/documentation/javascript/reference/advanced-markers#AdvancedMarkerElementOptions.gmpClickable
113+
*/
114+
@Input()
115+
set gmpClickable(clickable: boolean) {
116+
this._clickable = clickable;
117+
}
118+
private _clickable: boolean | undefined;
119+
108120
/**
109121
* Options for constructing an AdvancedMarkerElement.
110122
* https://developers.google.com/maps/documentation/javascript/reference/advanced-markers#AdvancedMarkerElementOptions
@@ -183,6 +195,14 @@ export class MapAdvancedMarker
183195
@Output() readonly mapDragstart: Observable<google.maps.MapMouseEvent> =
184196
this._eventManager.getLazyEmitter<google.maps.MapMouseEvent>('dragstart');
185197

198+
/**
199+
* This event is fired when the user starts dragging the AdvancedMarkerElement.
200+
* https://developers.google.com/maps/documentation/javascript/reference/advanced-markers#AdvancedMarkerElement.gmp-click
201+
*/
202+
@Output()
203+
readonly gmpClick: Observable<google.maps.marker.AdvancedMarkerClickEvent> =
204+
this._eventManager.getLazyEmitter<google.maps.marker.AdvancedMarkerClickEvent>('gmp-click');
205+
186206
/** Event emitted when the marker is initialized. */
187207
@Output() readonly markerInitialized: EventEmitter<google.maps.marker.AdvancedMarkerElement> =
188208
new EventEmitter<google.maps.marker.AdvancedMarkerElement>();
@@ -228,7 +248,7 @@ export class MapAdvancedMarker
228248
}
229249

230250
ngOnChanges(changes: SimpleChanges<this>) {
231-
const {advancedMarker, _content, _position, _title, _draggable, _zIndex} = this;
251+
const {advancedMarker, _content, _position, _title, _draggable, _clickable, _zIndex} = this;
232252
if (advancedMarker) {
233253
if (changes['title']) {
234254
advancedMarker.title = _title;
@@ -238,6 +258,10 @@ export class MapAdvancedMarker
238258
advancedMarker.gmpDraggable = _draggable;
239259
}
240260

261+
if (changes['gmpClickable']) {
262+
advancedMarker.gmpClickable = _clickable;
263+
}
264+
241265
if (changes['content']) {
242266
advancedMarker.content = _content;
243267
}
@@ -283,6 +307,7 @@ export class MapAdvancedMarker
283307
content: this._content || options.content,
284308
zIndex: this._zIndex ?? options.zIndex,
285309
gmpDraggable: this._draggable ?? options.gmpDraggable,
310+
gmpClickable: this._clickable ?? options.gmpClickable,
286311
map: this._googleMap.googleMap,
287312
};
288313
}

0 commit comments

Comments
 (0)