Skip to content

Instantly share code, notes, and snippets.

@phpmaps
Created May 3, 2013 17:37
Show Gist options
  • Save phpmaps/5511762 to your computer and use it in GitHub Desktop.
Save phpmaps/5511762 to your computer and use it in GitHub Desktop.
Handle sticky popup form code review
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