X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=plugins%2Fgooglemap%2Fstatic%2Fjs%2Fgooglemap.js;h=764f1b4959de59704fdf7a5e0a73628ff982b3df;hb=354c5d2314bfd73dfc3520d2ef9845dd4c6e6200;hp=34b2b8de563b927c0af4d205a5ec6ae47a8e4c6d;hpb=a387c58445b7cde5ecf05a022c5a875645eeb463;p=myslice.git
diff --git a/plugins/googlemap/static/js/googlemap.js b/plugins/googlemap/static/js/googlemap.js
index 34b2b8de..764f1b49 100644
--- a/plugins/googlemap/static/js/googlemap.js
+++ b/plugins/googlemap/static/js/googlemap.js
@@ -8,13 +8,16 @@
* - infowindow is not properly reopened when the maps does not have the focus
*/
-// events that happen in the once-per-view range
-googlemap_debug=false;
-// more on a on-per-record basis
-googlemap_debug_detailed=false;
-
(function($){
+ // events that happen in the once-per-view range
+ var debug=false;
+ debug=true;
+
+ // more on a on-per-record basis
+ var debug_deep=false;
+ // debug_deep=true;
+
var GoogleMap = Plugin.extend({
init: function(options, element) {
@@ -28,21 +31,32 @@ googlemap_debug_detailed=false;
// we keep a couple of global hashes
// lat_lon --> { marker,
}
- // hrn --> {
, }
+ // id --> {
, }
this.by_lat_lon = {};
- this.by_hrn = {};
+ // locating checkboxes by DOM selectors might be abstruse, as we cannot safely assume
+ // all the items will belong under the toplevel
+ this.by_id = {};
+ this.by_init_id = {};
/* XXX Events */
this.elmt().on('show', this, this.on_show);
// TODO in destructor
- // $(window).unbind('Hazelnut');
+ // $(window).unbind('QueryTable');
var query = manifold.query_store.find_analyzed_query(this.options.query_uuid);
this.object = query.object;
- var keys = manifold.metadata.get_key(this.object);
+ // see querytable.js for an explanation
+ var keys = manifold.metadata.get_key(this.object);
+ this.canonical_key = (keys && keys.length == 1) ? keys[0] : undefined;
//
- this.key = (keys && keys.length == 1) ? keys[0] : null;
+ this.init_key = this.options.init_key;
+ // have init_key default to canonical_key
+ this.init_key = this.init_key || this.canonical_key;
+ // sanity check
+ if ( ! this.init_key ) messages.warning ("QueryTable : cannot find init_key");
+ if ( ! this.canonical_key ) messages.warning ("QueryTable : cannot find canonical_key");
+ if (debug) messages.debug("googlemap: canonical_key="+this.canonical_key+" init_key="+this.init_key);
//// Setup query and record handlers
// this query is the one about the slice itself
@@ -59,8 +73,7 @@ googlemap_debug_detailed=false;
/* PLUGIN EVENTS */
on_show: function(e) {
-// if (googlemap_debug) messages.debug("on_show");
- messages.debug("on_show");
+ if (debug) messages.debug("googlemap.on_show");
var googlemap = e.data;
google.maps.event.trigger(googlemap.map, 'resize');
}, // on_show
@@ -71,40 +84,23 @@ googlemap_debug_detailed=false;
initialize_map: function() {
this.markerCluster = null;
-
+ //create empty LatLngBounds object in order to automatically center the map on the displayed objects
+ this.bounds = new google.maps.LatLngBounds();
var center = new google.maps.LatLng(this.options.latitude, this.options.longitude);
var myOptions = {
zoom: this.options.zoom,
center: center,
+ scrollwheel: false,
mapTypeId: google.maps.MapTypeId.ROADMAP,
}
var domid = this.options.plugin_uuid + '--' + 'googlemap';
- var elmt = document.getElementById(domid);
- if (googlemap_debug) messages.debug("gmap.initialize_map based on domid=" + domid + " elmt=" + elmt);
+ var elmt = document.getElementById(domid);
+ if (debug) messages.debug("gmap.initialize_map based on domid=" + domid + " elmt=" + elmt);
this.map = new google.maps.Map(elmt, myOptions);
this.infowindow = new google.maps.InfoWindow();
}, // initialize_map
- // xxx probably not the right place
- // The function accepts both records and their key
- record_hrn : function (record) {
- var key_value;
- switch (manifold.get_type(record)) {
- case TYPE_VALUE:
- key_value = record;
- break;
- case TYPE_RECORD:
- if ( ! this.key in record ) return;
- key_value = record[this.key];
- break;
- default:
- throw "Not implemented";
- break;
- }
- return unfold.escape_id(key_value).replace(/\\/g, '');
- },
-
// return { marker: gmap_marker, ul :
}
create_marker_struct: function (object,lat,lon) {
// the DOM fragment
@@ -117,78 +113,84 @@ googlemap_debug_detailed=false;
title: object,
// gmap can deal with a DOM element but not a jquery object
content: dom.get(0),
- });
+ });
+ //extend the bounds to include each marker's position
+ this.bounds.extend(marker.position);
return {marker:marker, ul:ul};
},
- // add an entry in the marker
tag for that record
- // returns { checkbox : }
+ // given an input
element, this method inserts a
with embedded checkbox
+ // for displaying/selecting the resource corresponding to the input record
+ // returns the created element for further checkbox manipulation
create_record_checkbox: function (record,ul,checked) {
var checkbox = $("", {type:'checkbox', checked:checked, class:'geo'});
- var hrn=this.record_hrn(record);
+ var id=record[this.canonical_key];
+ var init_id=record[this.init_key];
+ // xxx use init_key to find out label - or should we explicitly accept an incoming label_key ?
+ var label=init_id;
ul.append($("
").addClass("geo").append(checkbox).
- append($("").addClass("geo").append(hrn)));
- var googlemap=this;
+ append($("").addClass("geo").append(label)));
+ // hash by id and by init_id
+ this.by_id[id]=checkbox;
+ this.by_init_id[init_id] = checkbox;
+ //
// the callback for when a user clicks
// NOTE: this will *not* be called for changes done by program
+ var self=this;
checkbox.change( function (e) {
- manifold.raise_event (googlemap.options.query_uuid,
- this.checked ? SET_ADD : SET_REMOVED, hrn);
+ manifold.raise_event (self.options.query_uuid, this.checked ? SET_ADD : SET_REMOVED, id);
});
return checkbox;
},
+ warning: function (record,message) {
+ try {messages.warning (message+" -- "+this.key+"="+record[this.key]); }
+ catch (err) {messages.warning (message); }
+ },
+
// retrieve DOM checkbox and make sure it is checked/unchecked
- set_checkbox: function(record, checked) {
- var hrn=this.record_hrn (record);
- if (! hrn) { messages.warning ("googlemap.set_checkbox: record has no hrn"); return; }
- var checkbox_s = this.by_hrn [ hrn ];
- if (! checkbox_s ) { messages.warning ("googlemap.set_checkbox: could not spot checkbox for hrn "+hrn); return; }
- checkbox_s.checkbox.prop('checked',checked);
- }, // set_checkbox
+ set_checkbox_from_record: function(record, checked) {
+ var init_id=record[this.init_key];
+ var checkbox = this.by_init_id [ init_id ];
+ if (checkbox) checkbox.prop('checked',checked);
+ else this.warning(record, "googlemap.set_checkbox_from_record - not found "+init_id);
+ },
+
+ set_checkbox_from_data: function(id, checked) {
+ var checkbox = this.by_id [ id ];
+ if (checkbox) checkbox.prop('checked',checked);
+ else messages.warning("googlemap.set_checkbox_from_data - id not found "+id);
+ },
// this record is *in* the slice
new_record: function(record) {
- if (googlemap_debug_detailed) messages.debug ("new_record");
+ if (debug_deep) messages.debug ("googlemap.new_record");
if (!(record['latitude'])) return false;
// get the coordinates
- var latitude=get_value(record['latitude']);
- var longitude=get_value(record['longitude']);
+ var latitude=unfold.get_value(record['latitude']);
+ var longitude=unfold.get_value(record['longitude']);
var lat_lon = latitude + longitude;
- // check if we've seen anything at that place already
- // xxx might make sense to allow for some fuzziness,
- // i.e. consider 2 places equal if not further away than 300m or so...
- var marker_s = this.by_lat_lon [lat_lon];
- if ( marker_s == null ) {
- marker_s = this.create_marker_struct (this.object, latitude, longitude);
- this.by_lat_lon [ lat_lon ] = marker_s;
- this.arm_marker(marker_s.marker, this.map);
+ // check if we've seen anything at that place already
+ // xxx might make sense to allow for some fuzziness,
+ // i.e. consider 2 places equal if not further away than 300m or so...
+ var marker_s = this.by_lat_lon [lat_lon];
+ if ( marker_s == null ) {
+ marker_s = this.create_marker_struct (this.object, latitude, longitude);
+ this.by_lat_lon [ lat_lon ] = marker_s;
+ this.arm_marker(marker_s.marker, this.map);
}
- // now add a line for this resource in the marker
- // xxx should compute checked here ?
- // this is where the checkbox will be appended
- var ul=marker_s.ul;
- var checkbox = this.create_record_checkbox (record, ul, false);
- if ( ! this.key in record ) return;
- var key_value = record[this.key];
- var hrn = unfold.escape_id(key_value).replace(/\\/g, '');
- this.by_hrn[hrn] = {
- checkbox: checkbox,
- // xxx Thierry sept 2013
- // xxx actually we might have just used a domid-based scheme instead of the hash
- // since at this point we only need to retrieve the checkbox from an hrn
- // but I was not sure enough that extra needs would not show up so I kept this in place
- // xxx not sure these are actually useful :
- value: key_value,
- record: record,
- }
+ // now add a line for this resource in the marker
+ // xxx should compute checked here ?
+ // this is where the checkbox will be appended
+ var ul=marker_s.ul;
+ var checkbox = this.create_record_checkbox (record, ul, false);
}, // new_record
arm_marker: function(marker, map) {
- if (googlemap_debug_detailed) messages.debug ("arm_marker content="+marker.content);
+ if (debug_deep) messages.debug ("arm_marker content="+marker.content);
var googlemap = this;
google.maps.event.addListener(marker, 'click', function () {
googlemap.infowindow.close();
@@ -201,43 +203,43 @@ googlemap_debug_detailed=false;
/*************************** RECORD HANDLER ***************************/
on_new_record: function(record) {
- if (googlemap_debug_detailed) messages.debug("on_new_record");
+ if (debug_deep) messages.debug("on_new_record");
if (this.received_all)
// update checkbox for record
- this.set_checkbox(record, true);
+ this.set_checkbox_from_record(record, true);
else
// store for later update of checkboxes
this.in_set_backlog.push(record);
},
on_clear_records: function(record) {
- if (googlemap_debug_detailed) messages.debug("on_clear_records");
+ if (debug_deep) messages.debug("on_clear_records");
},
// Could be the default in parent
on_query_in_progress: function() {
- if (googlemap_debug) messages.debug("on_query_in_progress (spinning)");
+ if (debug) messages.debug("on_query_in_progress (spinning)");
this.spin();
},
on_query_done: function() {
- if (googlemap_debug) messages.debug("on_query_done");
+ if (debug) messages.debug("on_query_done");
if (this.received_all) {
this.unspin();
- }
+ }
this.received_set = true;
},
on_field_state_changed: function(data) {
- if (googlemap_debug_detailed) messages.debug("on_field_state_changed");
+ if (debug_deep) messages.debug("on_field_state_changed");
switch(data.request) {
case FIELD_REQUEST_ADD:
case FIELD_REQUEST_ADD_RESET:
- this.set_checkbox(data.value, true);
+ this.set_checkbox_from_data(data.value, true);
break;
case FIELD_REQUEST_REMOVE:
case FIELD_REQUEST_REMOVE_RESET:
- this.set_checkbox(data.value, false);
+ this.set_checkbox_from_data(data.value, false);
break;
default:
break;
@@ -248,22 +250,22 @@ googlemap_debug_detailed=false;
// all : this
on_all_new_record: function(record) {
- if (googlemap_debug_detailed) messages.debug("on_all_new_record");
+ if (debug_deep) messages.debug("on_all_new_record");
this.new_record(record);
},
on_all_clear_records: function() {
- if (googlemap_debug) messages.debug("on_all_clear_records");
+ if (debug) messages.debug("on_all_clear_records");
},
on_all_query_in_progress: function() {
- if (googlemap_debug) messages.debug("on_all_query_in_progress (spinning)");
+ if (debug) messages.debug("on_all_query_in_progress (spinning)");
// XXX parent
this.spin();
},
on_all_query_done: function() {
- if (googlemap_debug) messages.debug("on_all_query_done");
+ if (debug) messages.debug("on_all_query_done");
// MarkerClusterer
var markers = [];
@@ -278,17 +280,22 @@ googlemap_debug_detailed=false;
//map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
this.map.fitBounds(bounds);
});
-
+ //now fit the map to the bounds
+ this.map.fitBounds(this.bounds);
+ // Fix the zoom of fitBounds function, it's too close when there is only 1 marker
+ if(markers.length==1){
+ this.map.setZoom(this.map.getZoom()-4);
+ }
var googlemap = this;
if (this.received_set) {
/* ... and check the ones specified in the resource list */
$.each(this.in_set_backlog, function(i, record) {
- googlemap.set_checkbox(record, true);
+ googlemap.set_checkbox_from_record(record, true);
});
// reset
googlemap.in_set_backlog = [];
- if (googlemap_debug) messages.debug("unspinning");
+ if (debug) messages.debug("unspinning");
this.unspin();
}
this.received_all = true;