Skip to content
This repository was archived by the owner on Jun 23, 2025. It is now read-only.

Commit 8ed927b

Browse files
TSHiYKsebholstein
authored andcommitted
feat(SebmGoogleMapMarker): support opacity
Closes #523 Closes #522
1 parent 468a1a8 commit 8ed927b

4 files changed

Lines changed: 55 additions & 8 deletions

File tree

src/core/directives/google-map-marker.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ let markerId = 0;
3838
selector: 'sebm-google-map-marker',
3939
inputs: [
4040
'latitude', 'longitude', 'title', 'label', 'draggable: markerDraggable', 'iconUrl',
41-
'openInfoWindow', 'fitBounds'
41+
'openInfoWindow', 'fitBounds', 'opacity'
4242
],
4343
outputs: ['markerClick', 'dragEnd']
4444
})
@@ -78,6 +78,11 @@ export class SebmGoogleMapMarker implements OnDestroy, OnChanges, AfterContentIn
7878
*/
7979
openInfoWindow: boolean = true;
8080

81+
/**
82+
* The marker's opacity between 0.0 and 1.0.
83+
*/
84+
opacity: number = 1;
85+
8186
/**
8287
* This event emitter gets emitted when the user clicks on the marker.
8388
*/
@@ -129,6 +134,9 @@ export class SebmGoogleMapMarker implements OnDestroy, OnChanges, AfterContentIn
129134
if (changes['iconUrl']) {
130135
this._markerManager.updateIcon(this);
131136
}
137+
if (changes['opacity']) {
138+
this._markerManager.updateOpacity(this);
139+
}
132140
}
133141

134142
private _addEventListeners() {
@@ -140,10 +148,11 @@ export class SebmGoogleMapMarker implements OnDestroy, OnChanges, AfterContentIn
140148
});
141149
this._observableSubscriptions.push(cs);
142150

143-
const ds = this._markerManager.createEventObservable<mapTypes.MouseEvent>('dragend', this)
144-
.subscribe((e: mapTypes.MouseEvent) => {
145-
this.dragEnd.emit({coords: {lat: e.latLng.lat(), lng: e.latLng.lng()}});
146-
});
151+
const ds =
152+
this._markerManager.createEventObservable<mapTypes.MouseEvent>('dragend', this)
153+
.subscribe((e: mapTypes.MouseEvent) => {
154+
this.dragEnd.emit(<MouseEvent>{coords: {lat: e.latLng.lat(), lng: e.latLng.lng()}});
155+
});
147156
this._observableSubscriptions.push(ds);
148157
}
149158

src/core/services/google-maps-types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export interface Marker extends MVCObject {
2727
setLabel(label: string|MarkerLabel): void;
2828
setDraggable(draggable: boolean): void;
2929
setIcon(icon: string): void;
30+
setOpacity(opacity: number): void;
3031
getLabel(): MarkerLabel;
3132
}
3233

@@ -37,6 +38,7 @@ export interface MarkerOptions {
3738
label?: string|MarkerLabel;
3839
draggable?: boolean;
3940
icon?: string;
41+
opacity?: number;
4042
}
4143

4244
export interface MarkerLabel {

src/core/services/managers/marker-manager.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,17 @@ export class MarkerManager {
4949
return this._markers.get(marker).then((m: Marker) => m.setIcon(marker.iconUrl));
5050
}
5151

52+
updateOpacity(marker: SebmGoogleMapMarker): Promise<void> {
53+
return this._markers.get(marker).then((m: Marker) => m.setOpacity(marker.opacity));
54+
}
55+
5256
addMarker(marker: SebmGoogleMapMarker) {
5357
const markerPromise = this._mapsWrapper.createMarker({
5458
position: {lat: marker.latitude, lng: marker.longitude},
5559
label: marker.label,
5660
draggable: marker.draggable,
57-
icon: marker.iconUrl
61+
icon: marker.iconUrl,
62+
opacity: marker.opacity
5863
});
5964
this._markers.set(marker, markerPromise);
6065
}

test/services/managers/marker-manager.spec.ts

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export function main() {
3333
position: {lat: 34.4, lng: 22.3},
3434
label: 'A',
3535
draggable: false,
36-
icon: undefined
36+
icon: undefined,
37+
opacity: 1
3738
});
3839
}));
3940
});
@@ -75,13 +76,43 @@ export function main() {
7576
position: {lat: 34.4, lng: 22.3},
7677
label: 'A',
7778
draggable: false,
78-
icon: undefined
79+
icon: undefined,
80+
opacity: 1
7981
});
8082
const iconUrl = 'http://angular-maps.com/icon.png';
8183
newMarker.iconUrl = iconUrl;
8284
return markerManager.updateIcon(newMarker).then(
8385
() => { expect(markerInstance.setIcon).toHaveBeenCalledWith(iconUrl); });
8486
})));
8587
});
88+
89+
describe('set marker opacity', () => {
90+
it('should update that marker via setOpacity method when the markerOpacity changes',
91+
async(inject(
92+
[MarkerManager, GoogleMapsAPIWrapper],
93+
(markerManager: MarkerManager, apiWrapper: GoogleMapsAPIWrapper) => {
94+
const newMarker = new SebmGoogleMapMarker(markerManager);
95+
newMarker.latitude = 34.4;
96+
newMarker.longitude = 22.3;
97+
newMarker.label = 'A';
98+
99+
const markerInstance: Marker =
100+
jasmine.createSpyObj('Marker', ['setMap', 'setOpacity']);
101+
(<any>apiWrapper.createMarker).and.returnValue(Promise.resolve(markerInstance));
102+
103+
markerManager.addMarker(newMarker);
104+
expect(apiWrapper.createMarker).toHaveBeenCalledWith({
105+
position: {lat: 34.4, lng: 22.3},
106+
label: 'A',
107+
draggable: false,
108+
icon: undefined,
109+
opacity: 1
110+
});
111+
const opacity = 0.4;
112+
newMarker.opacity = opacity;
113+
return markerManager.updateOpacity(newMarker).then(
114+
() => { expect(markerInstance.setOpacity).toHaveBeenCalledWith(opacity); });
115+
})));
116+
});
86117
});
87118
}

0 commit comments

Comments
 (0)