UNPKG

ember-g-map

Version:

An ember-cli addon for integration with google maps.

152 lines (120 loc) 3.85 kB
import Ember from 'ember'; import layout from '../templates/components/g-map-polyline'; import GMapComponent from './g-map'; import compact from '../utils/compact'; const { isEmpty, isPresent, observer, computed, run, assert, typeOf } = Ember; const allowedPolylineOptions = Ember.A(['strokeColor', 'strokeWeight', 'strokeOpacity', 'zIndex', 'geodesic', 'icons', 'clickable', 'draggable', 'visible', 'path']); const GMapPolylineComponent = Ember.Component.extend({ layout, classNames: ['g-map-polyline'], map: computed.alias('mapContext.map'), init() { this._super(...arguments); this.infowindow = null; this.set('coordinates', Ember.A()); if (isEmpty(this.get('group'))) { this.set('group', null); } const mapContext = this.get('mapContext'); assert('Must be inside {{#g-map}} component with context set', mapContext instanceof GMapComponent); mapContext.registerPolyline(this); }, didInsertElement() { this._super(...arguments); if (isEmpty(this.get('polyline'))) { const options = compact(this.getProperties(allowedPolylineOptions)); const polyline = new google.maps.Polyline(options); this.set('polyline', polyline); } this.setMap(); this.setPath(); this.updatePolylineOptions(); this.setOnClick(); this.setOnDrag(); }, willDestroyElement() { this.unsetPolylineFromMap(); this.get('mapContext').unregisterPolyline(this); }, registerCoordinate(coordinate) { this.get('coordinates').addObject(coordinate); }, unregisterCoordinate(coordinate) { this.get('coordinates').removeObject(coordinate); this.setPath(); }, unsetPolylineFromMap() { const polyline = this.get('polyline'); if (isPresent(polyline)) { polyline.setMap(null); } }, mapWasSet: observer('map', function() { run.once(this, 'setMap'); }), setMap() { const map = this.get('map'); const polyline = this.get('polyline'); if (isPresent(polyline) && isPresent(map)) { polyline.setMap(map); } }, setPath() { const polyline = this.get('polyline'); const coordinates = this.get('coordinates'); const path = this.get('path'); if (isPresent(polyline)) { if (isPresent(coordinates) && isEmpty(path)) { let coordArray = Ember.A(this.get('coordinates').mapBy('coordinate')).compact(); polyline.setPath(coordArray); } if (isPresent(path) && isEmpty(coordinates)) { polyline.setPath(path); } } }, polylineOptionsChanged: observer(...allowedPolylineOptions, function() { run.once(this, 'updatePolylineOptions'); }), updatePolylineOptions() { const polyline = this.get('polyline'); const options = compact(this.getProperties(allowedPolylineOptions)); if (isPresent(polyline) && isPresent(Object.keys(options))) { polyline.setOptions(options); } }, setOnClick() { const polyline = this.get('polyline'); if (isPresent(polyline)) { polyline.addListener('click', (e) => this.sendOnClick(e)); } }, sendOnClick(e) { const { onClick } = this.attrs; const polyline = this.get('polyline'); if (typeOf(onClick) === 'function') { onClick(e, polyline); } else { this.sendAction('onClick', e, polyline); } }, setOnDrag() { const polyline = this.get('polyline'); if (isPresent(polyline)) { polyline.addListener('dragend', (e) => this.sendOnDrag(e)); } }, sendOnDrag(e) { const { onDrag } = this.attrs; const polyline = this.get('polyline'); if (typeOf(onDrag) === 'function') { onDrag(e, polyline); } else { this.sendAction('onDrag', e, polyline); } } }); GMapPolylineComponent.reopenClass({ positionalParams: ['mapContext'] }); export default GMapPolylineComponent;