Created
May 3, 2013 17:37
-
-
Save phpmaps/5511762 to your computer and use it in GitHub Desktop.
Handle sticky popup form code review
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require([ | |
"loqi/map", | |
"loqi/Pin", | |
"loqi/Popup", | |
"loqi/Symbols", | |
"dojo/query", | |
"dojo/on", | |
"dojo/dom-form", | |
"dojo/dom-construct", | |
"dojo/_base/event", | |
"esri/map", | |
"dojo/NodeList-data", | |
"dojo/NodeList-dom", | |
"dojo/NodeList-fx", | |
"dojo/NodeList-html", | |
"dojo/NodeList-manipulate", | |
"dojo/NodeList-traverse", | |
"esri/dijit/Geocoder", | |
"dojo/domReady!" | |
], function (map, Pin, Popup, s, $, on, domForm, domConstruct, event) { | |
Symbols = new s("/markers"); | |
geoloqi.auth = { | |
access_token: EditorConfig.access_token | |
}; | |
var pins = []; | |
var popup; | |
var newTriggerPin = null; | |
var centers = esri.geometry.Multipoint(); | |
on(document, ".loqi-popup form:submit", function(e){ | |
event.stop(e); | |
var formData = (domForm.toObject(e.target)); | |
if(formData.type ==="edit"){ | |
geoloqi.post("trigger/update/" + formData.trigger_id, { | |
name: formData.place_name, | |
trigger_on: formData.condition, | |
extra: { | |
message: formData.email | |
} | |
}, function(response, error) { | |
console.log(response, error); | |
//Check for a proper response (I did not do this part) | |
for (var i = 0; i < pins.length; i++) { | |
//Go through pins updating the last edited so popup shows last edits | |
if (pins[i].properties.place_id == response.place_id) { | |
pins[i].properties = { | |
type: "edit", | |
trigger_id: formData.trigger_id, | |
place_name: formData.place_name, | |
trigger_on: formData.condition, | |
message: formData.email | |
}; | |
//This part looks for open popups and closes them | |
var pinPopup = dojo.query(".loqi-popup"); | |
pinPopup.forEach(function(node, index, nodeList) { | |
esri.hide(node); | |
}); | |
} | |
} | |
} | |
); | |
} | |
if(formData.type ==="new"){ | |
geoloqi.post("trigger/create", { | |
place_name: formData.place_name, | |
latitude: newTriggerPin.getLat(), | |
longitude: newTriggerPin.getLng(), | |
radius: newTriggerPin.getRadius(), | |
trigger_on: formData.condition, | |
place_layer_id: EditorConfig.layer_id, | |
type: "callback", | |
url: EditorConfig.callback_url, | |
extra: { | |
message: formData.email | |
} | |
}, function(response, error){ | |
addTrigger(response); | |
newTriggerPin.close().remove(); | |
}); | |
} | |
}); | |
on(document, "#sidebar a:click", function(e){ | |
event.stop(e); | |
for (var i = 0; i < pins.length; i++) { | |
if(pins[i].properties.trigger_id === $(e.target).parent().attr("data-trigger-id")[0]){ | |
map.setExtent(pins[i].graphics.circle.geometry.getExtent()); | |
} | |
} | |
}); | |
on(document, "#cancel-trigger:click", function(e){ | |
event.stop(e); | |
if(newTriggerPin){ | |
newTriggerPin.remove().close(); | |
} | |
}); | |
on(document, "#new-trigger:click", function(e){ | |
event.stop(e); | |
var center = esri.geometry.webMercatorToGeographic(map.extent.getCenter()); | |
var radius = Math.min(map.extent.getHeight(),map.extent.getWidth())/2; | |
if(newTriggerPin && newTriggerPin.map){ | |
return; | |
} | |
newTriggerPin = new Pin({ | |
lat: center.y, | |
lng: center.x, | |
radius: radius, | |
map: map, | |
handleSymbol: Symbols.get("handle-green-arrows"), | |
circleSymbol: new esri.symbol.SimpleFillSymbol("solid", new esri.symbol.SimpleLineSymbol("solid",new dojo.Color([115, 182, 64, 1]), 2), new dojo.Color([115, 182, 64, 0.25])), | |
centerSymbol: Symbols.get("marker-large-green-cutout"), | |
properties: { | |
editing: false, | |
type: "new", | |
place_name: "", | |
entering: true, | |
message: "" | |
} | |
}); | |
newTriggerPin.bindPopup(popup).open(); | |
}); | |
on(document, "#delete-trigger:click", function(e){ | |
event.stop(e); | |
var trigger_id = $(e.target).attr("data-trigger-id")[0]; | |
removeTrigger(trigger_id); | |
}); | |
function removeTrigger(id){ | |
for (var i = 0; i < pins.length; i++) { | |
if(pins[i].properties.trigger_id === id){ | |
pins[i].hide(); | |
} | |
} | |
domConstruct.destroy("trigger-"+id); | |
geoloqi.post("trigger/delete/"+id); | |
} | |
function addTrigger(t){ | |
// place info | |
var p = t.place; | |
// make new pin | |
var pin = new Pin({ | |
lat: p.latitude, | |
lng: p.longitude, | |
radius: p.radius, | |
map: map, | |
handleSymbol: Symbols.get("handle-blue-arrows"), | |
centerSymbol: Symbols.get("marker-small-blue-cutout"), | |
properties: { | |
editing: true, | |
place_id: p.place_id, | |
type: "edit", | |
trigger_id: t.trigger_id, | |
place_name: t.place.display_name, | |
entering: t.trigger_on === "enter", | |
message: t.extra.message | |
} | |
}); | |
pin.bindPopup(popup); | |
// add pin to array | |
pins.push(pin); | |
//add pin to centers | |
centers.addPoint([p.longitude, p.latitude]); | |
// listen for the edit managers onGraphicClick event | |
dojo.connect(pin.edit, "onGraphicClick", function(e){ | |
var id = e.attributes.properties.trigger_id; | |
console.log(id); | |
}); | |
dojo.connect(pin, "onRadiusChanged", function(e){ | |
var place_id = e.properties.place_id; | |
geoloqi.post("place/update/"+place_id,{ | |
radius: e.getRadius() | |
}); | |
}); | |
dojo.connect(pin, "onPositionChanged", function(e){ | |
var place_id = e.properties.place_id; | |
geoloqi.post("place/update/"+place_id,{ | |
latitude: e.getLat(), | |
longitude: e.getLng() | |
}); | |
}); | |
domConstruct.place(ich.sidebar_item({ | |
trigger_id: t.trigger_id, | |
place_name: t.place.display_name | |
}), "list","last"); | |
} | |
map.on("load", function(){ | |
var geocoder = new esri.dijit.Geocoder({ | |
map: map, | |
autoComplete: true, | |
placeholder: "Find a place" | |
}, dojo.byId("search")); | |
geocoder.startup(); | |
popup = new Popup({ | |
map: map, | |
ich: ich.popup_content | |
}); | |
geoloqi.get("trigger/list", { | |
layer_id: EditorConfig.layer_id, | |
on: "places" | |
}, function(resp, error){ | |
for (var i = 0; i < resp.triggers.length; i++) { | |
// trigger info | |
var t = resp.triggers[i]; | |
addTrigger(t); | |
} | |
// setup the extent fo the map to the extent of all triggers | |
if(resp.triggers.length){ | |
map.setExtent(centers.getExtent()); | |
} | |
}); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment