Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(697)

Side by Side Diff: lib/src/google-map/google-map.html

Issue 1418513006: update elements and fix some bugs (Closed) Base URL: git@github.com:dart-lang/polymer_elements.git@master
Patch Set: code review updates Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/src/google-chart/google-chart.html ('k') | lib/src/google-map/google-map-directions.html » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 <!-- Copyright (c) 2015 Google Inc. All rights reserved. --> 1 <!-- Copyright (c) 2015 Google Inc. All rights reserved. -->
2 2
3 <link rel="import" href="../polymer/polymer.html"> 3 <link rel="import" href="../polymer/polymer.html">
4 <link rel="import" href="../google-apis/google-maps-api.html"> 4 <link rel="import" href="../google-apis/google-maps-api.html">
5 <link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html "> 5 <link rel="import" href="../iron-resizable-behavior/iron-resizable-behavior.html ">
6 <link rel="import" href="../iron-selector/iron-selector.html">
6 <link rel="import" href="google-map-marker.html"> 7 <link rel="import" href="google-map-marker.html">
7 <!-- 8 <!--
8 The `google-map` element renders a Google Map. 9 The `google-map` element renders a Google Map.
9 10
10 <b>Example</b>: 11 <b>Example</b>:
11 12
12 <style> 13 <style>
13 google-map { 14 google-map {
14 height: 600px; 15 height: 600px;
15 } 16 }
(...skipping 15 matching lines...) Expand all
31 var map = document.querySelector('google-map'); 32 var map = document.querySelector('google-map');
32 map.latitude = 37.77493; 33 map.latitude = 37.77493;
33 map.longitude = -122.41942; 34 map.longitude = -122.41942;
34 map.addEventListener('google-map-ready', function(e) { 35 map.addEventListener('google-map-ready', function(e) {
35 alert('Map loaded!'); 36 alert('Map loaded!');
36 }); 37 });
37 </script> 38 </script>
38 39
39 <b>Example</b> - with Google directions, using data-binding inside another Polym er element 40 <b>Example</b> - with Google directions, using data-binding inside another Polym er element
40 41
41 <google-map map="{{map}}" libraries="places"></google-map> 42 <google-map map="{{map}}"></google-map>
42 <google-map-directions map="{{map}}" 43 <google-map-directions map="{{map}}"
43 start-address="San Francisco" end-address="Mountain View"> 44 start-address="San Francisco" end-address="Mountain View">
44 </google-map-directions> 45 </google-map-directions>
45 46
46 @demo 47 @demo
47 --> 48 -->
48 49
49 <dom-module id="google-map"> 50 <dom-module id="google-map">
50 51
51 <style> 52 <style>
(...skipping 10 matching lines...) Expand all
62 bottom: 0; 63 bottom: 0;
63 left: 0; 64 left: 0;
64 } 65 }
65 66
66 </style> 67 </style>
67 <template> 68 <template>
68 <google-maps-api id="api" 69 <google-maps-api id="api"
69 api-key="[[apiKey]]" 70 api-key="[[apiKey]]"
70 client-id="[[clientId]]" 71 client-id="[[clientId]]"
71 version="[[version]]" 72 version="[[version]]"
72 libraries="[[libraries]]"
73 signed-in="[[signedIn]]" 73 signed-in="[[signedIn]]"
74 language="[[language]]" 74 language="[[language]]"
75 on-api-load="_mapApiLoaded"></google-maps-api> 75 on-api-load="_mapApiLoaded"></google-maps-api>
76 76
77 <div id="map"></div> 77 <div id="map"></div>
78 78
79 <content id="markers" select="google-map-marker"></content> 79 <iron-selector id="selector" multi="[[!singleInfoWindow]]" selected-attribut e="open" activate-event="google-map-marker-open" on-google-map-marker-close="_de selectMarker">
80 80 <content id="markers" select="google-map-marker"></content>
81 </iron-selector>
82 <content id="objects" select="*"></content>
81 </template> 83 </template>
82 </dom-module> 84 </dom-module>
83 85
84 <script> 86 <script>
85 87
86 Polymer({ 88 Polymer({
87 89
88 is: 'google-map', 90 is: 'google-map',
89 91
90 92
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 /** 165 /**
164 * A Maps API object. 166 * A Maps API object.
165 */ 167 */
166 map: { 168 map: {
167 type: Object, 169 type: Object,
168 notify: true, 170 notify: true,
169 value: null 171 value: null
170 }, 172 },
171 173
172 /** 174 /**
173 * A comma separated list (e.g. "places,geometry") of libraries to load
174 * with this map. Defaults to "". For more information see
175 * https://developers.google.com/maps/documentation/javascript/libraries.
176 */
177 libraries: {
178 type: String,
179 value: ''
180 },
181
182 /**
183 * A longitude to center the map on. 175 * A longitude to center the map on.
184 */ 176 */
185 longitude: { 177 longitude: {
186 type: Number, 178 type: Number,
187 value: -122.41942, 179 value: -122.41942,
188 notify: true, 180 notify: true,
189 reflectToAttribute: true 181 reflectToAttribute: true
190 }, 182 },
191 183
192 /** 184 /**
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 value: function() { return {}; } 336 value: function() { return {}; }
345 }, 337 },
346 338
347 /** 339 /**
348 * The markers on the map. 340 * The markers on the map.
349 */ 341 */
350 markers: { 342 markers: {
351 type: Array, 343 type: Array,
352 value: function() { return []; }, 344 value: function() { return []; },
353 readOnly: true 345 readOnly: true
346 },
347
348 /**
349 * The non-marker objects on the map.
350 */
351 objects: {
352 type: Array,
353 value: function() { return []; },
354 readOnly: true
355 },
356
357 /**
358 * If set, all other info windows on markers are closed when opening a new one.
359 */
360 singleInfoWindow: {
361 type: Boolean,
362 value: false
354 } 363 }
355
356 }, 364 },
357 365
358 behaviors: [ 366 behaviors: [
359 Polymer.IronResizableBehavior 367 Polymer.IronResizableBehavior
360 ], 368 ],
361 369
362 listeners: { 370 listeners: {
363 'iron-resize': 'resize' 371 'iron-resize': 'resize'
364 }, 372 },
365 373
366 observers: [ 374 observers: [
367 '_debounceUpdateCenter(latitude, longitude)' 375 '_debounceUpdateCenter(latitude, longitude)'
368 ], 376 ],
369 377
370 attached: function() { 378 attached: function() {
371 this._initGMap(); 379 this._initGMap();
372 }, 380 },
373 381
374 detached: function() { 382 detached: function() {
375 if (this._mutationObserver) { 383 if (this._mutationObserver) {
376 this._mutationObserver.disconnect(); 384 this._mutationObserver.disconnect();
377 this._mutationObserver = null; 385 this._mutationObserver = null;
378 } 386 }
387 if (this._objectsMutationObserver) {
388 this._objectsMutationObserver.disconnect();
389 this._objectsMutationObserver = null;
390 }
379 }, 391 },
380 392
381 _initGMap: function() { 393 _initGMap: function() {
382 if (this.map) { 394 if (this.map) {
383 return; // already initialized 395 return; // already initialized
384 } 396 }
385 if (this.$.api.libraryLoaded !== true) { 397 if (this.$.api.libraryLoaded !== true) {
386 return; // api not loaded 398 return; // api not loaded
387 } 399 }
388 if (!this.isAttached) { 400 if (!this.isAttached) {
389 return; // not attached 401 return; // not attached
390 } 402 }
391 403
392 this.map = new google.maps.Map(this.$.map, this._getMapOptions()); 404 this.map = new google.maps.Map(this.$.map, this._getMapOptions());
393 this._listeners = {}; 405 this._listeners = {};
394 this._updateCenter(); 406 this._updateCenter();
395 this._loadKml(); 407 this._loadKml();
396 this._updateMarkers(); 408 this._updateMarkers();
409 this._updateObjects();
397 this._addMapListeners(); 410 this._addMapListeners();
398 this.fire('google-map-ready'); 411 this.fire('google-map-ready');
399 }, 412 },
400 413
401 _mapApiLoaded: function() { 414 _mapApiLoaded: function() {
402 this._initGMap(); 415 this._initGMap();
403 }, 416 },
404 417
405 _getMapOptions: function() { 418 _getMapOptions: function() {
406 var mapOptions = { 419 var mapOptions = {
(...skipping 12 matching lines...) Expand all
419 // We use getAttribute here because the default value of this.draggable = false even when not set. 432 // We use getAttribute here because the default value of this.draggable = false even when not set.
420 if (this.getAttribute('draggable') != null) { 433 if (this.getAttribute('draggable') != null) {
421 mapOptions.draggable = this.draggable 434 mapOptions.draggable = this.draggable
422 } 435 }
423 for (var p in this.additionalMapOptions) 436 for (var p in this.additionalMapOptions)
424 mapOptions[p] = this.additionalMapOptions[p]; 437 mapOptions[p] = this.additionalMapOptions[p];
425 438
426 return mapOptions; 439 return mapOptions;
427 }, 440 },
428 441
429 // watch for future updates 442 _attachChildrenToMap: function(children) {
443 if (this.map) {
444 for (var i = 0, child; child = children[i]; ++i) {
445 child.map = this.map;
446 }
447 }
448 },
449
450 // watch for future updates to marker objects
430 _observeMarkers: function() { 451 _observeMarkers: function() {
431 // Watch for future updates. 452 // Watch for future updates.
432 if (this._mutationObserver) { 453 if (this._mutationObserver) {
433 return; 454 return;
434 } 455 }
435 this._mutationObserver = new MutationObserver( this._updateMarkers.bind(th is)); 456 this._mutationObserver = new MutationObserver(this._updateMarkers.bind(thi s));
436 this._mutationObserver.observe(this, { 457 this._mutationObserver.observe(this.$.selector, {
437 childList: true 458 childList: true
438 }); 459 });
439 }, 460 },
440 461
441 _updateMarkers: function() { 462 _updateMarkers: function() {
442 var newMarkers = Array.prototype.slice.call( 463 var newMarkers = Array.prototype.slice.call(
443 Polymer.dom(this.$.markers).getDistributedNodes()); 464 Polymer.dom(this.$.markers).getDistributedNodes());
444 465
445 // do not recompute if markers have not been added or removed 466 // do not recompute if markers have not been added or removed
446 if (newMarkers.length === this.markers.length) { 467 if (newMarkers.length === this.markers.length) {
447 var added = newMarkers.filter(function(m) { 468 var added = newMarkers.filter(function(m) {
448 return this.markers && this.markers.indexOf(m) === -1; 469 return this.markers && this.markers.indexOf(m) === -1;
449 }.bind(this)); 470 }.bind(this));
450 if (added.length === 0) { 471 if (added.length === 0) {
451 // set up observer first time around 472 // set up observer first time around
452 if (!this._mutationObserver) { 473 if (!this._mutationObserver) {
453 this._observeMarkers(); 474 this._observeMarkers();
454 } 475 }
455 return; 476 return;
456 } 477 }
457 } 478 }
458 479
459 this._observeMarkers(); 480 this._observeMarkers();
460 481
461 this.markers = this._setMarkers(newMarkers); 482 this.markers = this._setMarkers(newMarkers);
462 483
463 // Set the map on each marker and zoom viewport to ensure they're in view. 484 // Set the map on each marker and zoom viewport to ensure they're in view.
464 if (this.markers.length && this.map) { 485 this._attachChildrenToMap(this.markers);
465 for (var i = 0, m; m = this.markers[i]; ++i) {
466 m.map = this.map;
467 }
468 }
469 if (this.fitToMarkers) { 486 if (this.fitToMarkers) {
470 this._fitToMarkersChanged(); 487 this._fitToMarkersChanged();
471 } 488 }
472 }, 489 },
473 490
491 // watch for future updates to non-marker objects
492 _observeObjects: function() {
493 if (this._objectsMutationObserver) {
494 return;
495 }
496 this._objectsMutationObserver = new MutationObserver(this._updateObjects.b ind(this));
497 this._objectsMutationObserver.observe(this, {
498 childList: true
499 });
500 },
501
502 _updateObjects: function() {
503 var newObjects = Array.prototype.slice.call(
504 Polymer.dom(this.$.objects).getDistributedNodes());
505
506 // Do not recompute if objects have not been added or removed.
507 if (newObjects.length === this.objects.length) {
508 var added = newObjects.filter(function(o) {
509 return this.objects.indexOf(o) === -1;
510 }.bind(this));
511 if (added.length === 0) {
512 // Set up observer first time around.
513 this._observeObjects();
514 return;
515 }
516 }
517
518 this._observeObjects();
519 this._setObjects(newObjects);
520 this._attachChildrenToMap(this.objects);
521 },
522
474 /** 523 /**
475 * Clears all markers from the map. 524 * Clears all markers from the map.
476 * 525 *
477 * @method clear 526 * @method clear
478 */ 527 */
479 clear: function() { 528 clear: function() {
480 for (var i = 0, m; m = this.markers[i]; ++i) { 529 for (var i = 0, m; m = this.markers[i]; ++i) {
481 m.marker.setMap(null); 530 m.marker.setMap(null);
482 } 531 }
483 }, 532 },
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 switch (attrName) { 689 switch (attrName) {
641 case 'draggable': 690 case 'draggable':
642 this.map.setOptions({draggable: this.draggable}); 691 this.map.setOptions({draggable: this.draggable});
643 break; 692 break;
644 } 693 }
645 }, 694 },
646 695
647 _fitToMarkersChanged: function() { 696 _fitToMarkersChanged: function() {
648 // TODO(ericbidelman): respect user's zoom level. 697 // TODO(ericbidelman): respect user's zoom level.
649 698
650 if (this.map && this.fitToMarkers) { 699 if (this.map && this.fitToMarkers && this.markers.length > 0) {
651 var latLngBounds = new google.maps.LatLngBounds(); 700 var latLngBounds = new google.maps.LatLngBounds();
652 for (var i = 0, m; m = this.markers[i]; ++i) { 701 for (var i = 0, m; m = this.markers[i]; ++i) {
653 latLngBounds.extend( 702 latLngBounds.extend(
654 new google.maps.LatLng(m.latitude, m.longitude)); 703 new google.maps.LatLng(m.latitude, m.longitude));
655 } 704 }
656 705
657 // For one marker, don't alter zoom, just center it. 706 // For one marker, don't alter zoom, just center it.
658 if (this.markers.length > 1) { 707 if (this.markers.length > 1) {
659 this.map.fitBounds(latLngBounds); 708 this.map.fitBounds(latLngBounds);
660 } 709 }
661 710
662 this.map.setCenter(latLngBounds.getCenter()); 711 this.map.setCenter(latLngBounds.getCenter());
663 } 712 }
664 }, 713 },
665 714
666 _addMapListeners: function() { 715 _addMapListeners: function() {
667 google.maps.event.addListener(this.map, 'center_changed', function() { 716 google.maps.event.addListener(this.map, 'center_changed', function() {
668 var center = this.map.getCenter(); 717 var center = this.map.getCenter();
669 this.latitude = center.lat(); 718 this.latitude = center.lat();
670 this.longitude = center.lng(); 719 this.longitude = center.lng();
671 }.bind(this)); 720 }.bind(this));
672 721
673 google.maps.event.addListener(this.map, 'zoom_changed', function() { 722 google.maps.event.addListener(this.map, 'zoom_changed', function() {
674 this.zoom = this.map.getZoom(); 723 this.zoom = this.map.getZoom();
675 }.bind(this)); 724 }.bind(this));
676 725
677 google.maps.event.addListener(this.map, 'maptypeid_changed', function() { 726 google.maps.event.addListener(this.map, 'maptypeid_changed', function() {
678 this.mapType = this.map.getMapTypeId(); 727 this.mapType = this.map.getMapTypeId();
679 }.bind(this)); 728 }.bind(this));
680 729
681 this._clickEventsChanged(); 730 this._clickEventsChanged();
682 this._dragEventsChanged(); 731 this._dragEventsChanged();
683 this._mouseEventsChanged(); 732 this._mouseEventsChanged();
684 }, 733 },
685 734
686 _clearListener: function(name) { 735 _clearListener: function(name) {
687 if (this._listeners[name]) { 736 if (this._listeners[name]) {
688 google.maps.event.removeListener(this._listeners[name]); 737 google.maps.event.removeListener(this._listeners[name]);
689 this._listeners[name] = null; 738 this._listeners[name] = null;
690 } 739 }
691 }, 740 },
692 741
693 _forwardEvent: function(name) { 742 _forwardEvent: function(name) {
694 this._listeners[name] = google.maps.event.addListener(this.map, name, func tion(event) { 743 this._listeners[name] = google.maps.event.addListener(this.map, name, func tion(event) {
695 this.fire('google-map-' + name, event); 744 this.fire('google-map-' + name, event);
696 }.bind(this)); 745 }.bind(this));
697 } 746 },
747
748 _deselectMarker: function(e, detail) {
749 // If singleInfoWindow is set, update iron-selector's selected attribute to be null.
750 // Else remove the marker from iron-selector's selected array.
751 var markerIndex = this.$.selector.indexOf(e.target);
752
753 if (this.singleInfoWindow) {
754 this.$.selector.selected = null;
755 } else if (this.$.selector.selectedValues) {
756 this.$.selector.selectedValues = this.$.selector.selectedValues.filter(fun ction(i) {return i !== markerIndex});
757 }
758 }
698 759
699 }); 760 });
700 761
701 </script> 762 </script>
OLDNEW
« no previous file with comments | « lib/src/google-chart/google-chart.html ('k') | lib/src/google-map/google-map-directions.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698