Skip to content

Commit

Permalink
Merge branch 'notes'
Browse files Browse the repository at this point in the history
Conflicts:
	Vendorfile
  • Loading branch information
tomhughes committed Apr 23, 2013
2 parents 32959ae + 52611a5 commit 0c8ad2f
Show file tree
Hide file tree
Showing 84 changed files with 3,162 additions and 107 deletions.
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ gem 'paperclip', '~> 2.0'
gem 'deadlock_retry', '>= 1.2.0'
gem 'i18n-js', '>= 3.0.0.rc2'
gem 'rack-cors'
gem 'jsonify-rails'

# We need ruby-openid 2.2.0 or later for ruby 1.9 support
gem 'ruby-openid', '>= 2.2.0'
Expand Down
6 changes: 6 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ GEM
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
json (1.7.7)
jsonify (0.3.1)
multi_json (~> 1.0)
jsonify-rails (0.3.2)
actionpack
jsonify (< 0.4.0)
jwt (0.1.8)
multi_json (>= 1.5)
libv8 (3.3.10.4)
Expand Down Expand Up @@ -183,6 +188,7 @@ DEPENDENCIES
i18n-js (>= 3.0.0.rc2)
iconv (= 0.1)
jquery-rails
jsonify-rails
libxml-ruby (>= 2.0.5)
memcached (>= 1.4.1)
minitest
Expand Down
7 changes: 7 additions & 0 deletions Vendorfile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ folder 'vendor/assets' do
folder 'jquery' do
from 'git://github.com/jevin/Autogrow-Textarea.git' do
file 'jquery.autogrowtextarea.js', 'jquery.autogrowtextarea.js'
end
end

folder 'ohauth' do
from 'git://github.com/tmcw/ohauth.git' do
file 'ohauth.js'
file 'sha.js'
end
end
end
Binary file added app/assets/images/closed_note_marker.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/assets/images/new_note_marker.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/assets/images/open_note_marker.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions app/assets/javascripts/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
//= require leaflet.pan
//= require leaflet.zoom
//= require i18n/translations
//= require oauth
//= require osm
//= require piwik
//= require map
Expand Down
22 changes: 21 additions & 1 deletion app/assets/javascripts/browse.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,27 @@ $(document).ready(function () {
});

var centre = bbox.getCenter();
updatelinks(centre.lng, centre.lat, 16, null, params.minlon, params.minlat, params.maxlon, params.maxlat);
updatelinks(centre.lon, centre.lat, 16, null, params.minlon, params.minlat, params.maxlon, params.maxlat);
} else if (params.type == "note") {
var object = {type: params.type, id: params.id};

map.setView([params.lat, params.lon], 16);

L.marker([params.lat, params.lon], { icon: getUserIcon() }).addTo(map);

var bbox = map.getBounds();

$("#loading").hide();
$("#browse_map .geolink").show();

$("a[data-editor=remote]").click(function () {
return remoteEditHandler(bbox);
});

updatelinks(params.lon, params.lat, 16, null,
bbox.getWestLng(), bbox.getSouthLat(),
bbox.getEastLng(), bbox.getNorthLat(),
object);
} else {
$("#object_larger_map").hide();
$("#object_edit").hide();
Expand Down
1 change: 1 addition & 0 deletions app/assets/javascripts/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
//= require index/browse
//= require index/export
//= require index/key
//= require index/notes

$(document).ready(function () {
var permalinks = $("#permalink").detach().html();
Expand Down
281 changes: 281 additions & 0 deletions app/assets/javascripts/index/notes.js.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,281 @@
//= require templates/notes/show
//= require templates/notes/new

$(document).ready(function () {
var params = OSM.mapParams();

var noteIcons = {
"new": L.icon({
iconUrl: "<%= image_path 'new_note_marker.png' %>",
iconSize: [22, 22],
iconAnchor: [11, 11]
}),
"open": L.icon({
iconUrl: "<%= image_path 'open_note_marker.png' %>",
iconSize: [22, 22],
iconAnchor: [11, 11]
}),
"closed": L.icon({
iconUrl: "<%= image_path 'closed_note_marker.png' %>",
iconSize: [22, 22],
iconAnchor: [11, 11]
})
};

var noteLayer = new L.LayerGroup();
var notes = {};
var newNote;

map.on("layeradd", function (e) {
if (e.layer == noteLayer) {
loadNotes();
map.on("moveend", loadNotes);
}
});

map.on("layerremove", function (e) {
if (e.layer == noteLayer) {
map.off("moveend", loadNotes);
noteLayer.clearLayers();
notes = {};
}
});

map.on("popupopen", function (e) {
$(e.popup._container).find(".comment").focus();
});

map.on("popupclose", function (e) {
if (newNote && e.popup == newNote._popup) {
$(newNote).oneTime(10, "removenote", function () {
map.removeLayer(newNote);
newNote = null;
});
}
});

if (OSM.STATUS != 'api_offline' && OSM.STATUS != 'database_offline') {
map.layersControl.addOverlay(noteLayer, I18n.t("browse.start_rjs.notes_layer_name"));

if (params.notes) map.addLayer(noteLayer);

if (params.note) {
$.ajax({
url: "/api/" + OSM.API_VERSION + "/notes/" + params.note + ".json",
success: function (feature) {
var marker = updateMarker(notes[feature.properties.id], feature);

notes[feature.properties.id] = marker;

map.addLayer(noteLayer);
marker.openPopup();
}
});
}
}

function updateMarker(marker, feature) {
if (marker)
{
marker.setIcon(noteIcons[feature.properties.status]);
marker._popup.setContent(createPopupContent(marker, feature.properties));
}
else
{
marker = L.marker(feature.geometry.coordinates.reverse(), {
icon: noteIcons[feature.properties.status],
opacity: 0.7
});

marker.addTo(noteLayer).bindPopup(
createPopupContent(marker, feature.properties),
popupOptions()
);
}

return marker;
}

var noteLoader;

function loadNotes() {
var bounds = map.getBounds();
var size = bounds.getSize();

if (size <= OSM.MAX_NOTE_REQUEST_AREA) {
var url = "/api/" + OSM.API_VERSION + "/notes.json?bbox=" + bounds.toBBOX();

if (noteLoader) noteLoader.abort();

noteLoader = $.ajax({
url: url,
success: function (json) {
var oldNotes = notes;

notes = {};

json.features.forEach(function (feature) {
var marker = oldNotes[feature.properties.id];

delete oldNotes[feature.properties.id];

notes[feature.properties.id] = updateMarker(marker, feature);
});

for (id in oldNotes) {
noteLayer.removeLayer(oldNotes[id]);
}

noteLoader = null;
}
});
}
};

function popupOptions() {
var mapSize = map.getSize();

return {
minWidth: 320,
maxWidth: mapSize.y * 1 / 3,
maxHeight: mapSize.y * 2 / 3,
offset: new L.Point(0, -3),
autoPanPadding: new L.Point(60, 40)
};
}

function createPopupContent(marker, properties) {
var content = $(JST["templates/notes/show"]({ note: properties }));

content.find("textarea").on("input", function (e) {
var form = e.target.form;

if ($(e.target).val() == "") {
$(form.close).val(I18n.t("javascripts.notes.show.resolve"));
$(form.comment).prop("disabled", true);
} else {
$(form.close).val(I18n.t("javascripts.notes.show.comment_and_resolve"));
$(form.comment).prop("disabled", false);
}
});

content.find("input[type=submit]").on("click", function (e) {
e.preventDefault();
var data = $(e.target).data();
updateNote(marker, e.target.form, data.method, data.url);
});

return content[0];
}

function createNote(marker, form, url) {
var location = marker.getLatLng();

$(form).find("input[type=submit]").prop("disabled", true);

$.ajax({
url: url,
type: "POST",
oauth: true,
data: {
lat: location.lat,
lon: location.lng,
text: $(form.text).val()
},
success: function (feature) {
notes[feature.properties.id] = updateMarker(marker, feature);
newNote = null;

$("#createnoteanchor").removeClass("disabled").addClass("geolink");
}
});
}

function updateNote(marker, form, method, url) {
$(form).find("input[type=submit]").prop("disabled", true);

$.ajax({
url: url,
type: method,
oauth: true,
data: {
text: $(form.text).val()
},
success: function (feature) {
if (feature.properties.status == "hidden") {
noteLayer.removeLayer(marker);

delete notes[feature.properties.id];
} else {
var popupContent = createPopupContent(marker, feature.properties);

marker.setIcon(noteIcons[feature.properties.status]);
marker._popup.setContent(popupContent);
}
}
});
}

$("#createnoteanchor").click(function (e) {
e.preventDefault();

if ($(e.target).hasClass("disabled")) return;

$(e.target).removeClass("geolink").addClass("disabled");

map.addLayer(noteLayer);

var mapSize = map.getSize();
var markerPosition;

if (mapSize.y > 800)
{
markerPosition = [mapSize.x / 2, mapSize.y / 2];
}
else if (mapSize.y > 400)
{
markerPosition = [mapSize.x / 2, 400];
}
else
{
markerPosition = [mapSize.x / 2, mapSize.y];
}

newNote = L.marker(map.containerPointToLatLng(markerPosition), {
icon: noteIcons["new"],
opacity: 0.7,
draggable: true
});

var popupContent = $(JST["templates/notes/new"]({ create_url: $(e.target).attr("href") }));

popupContent.find("textarea").on("input", function (e) {
var form = e.target.form;

if ($(e.target).val() == "") {
$(form.add).prop("disabled", true);
} else {
$(form.add).prop("disabled", false);
}
});

popupContent.find("input[type=submit]").on("click", function (e) {
e.preventDefault();
createNote(newNote, e.target.form, $(e.target).data("url"));
});

newNote.addTo(noteLayer).bindPopup(popupContent[0], popupOptions()).openPopup();

newNote.on("remove", function (e) {
$("#createnoteanchor").removeClass("disabled").addClass("geolink");
});

newNote.on("dragstart", function (e) {
$(newNote).stopTime("removenote");
});

newNote.on("dragend", function (e) {
e.target.openPopup();
});
});
});
25 changes: 25 additions & 0 deletions app/assets/javascripts/oauth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//= require sha
//= require ohauth

$.ajaxPrefilter(function(options, jqxhr) {
if (options.oauth && OSM.oauth_token) {
var ohauth = window.ohauth;
var url = options.url.replace(/\?$/, "");
var params = {
oauth_consumer_key: OSM.oauth_consumer_key,
oauth_token: OSM.oauth_token,
oauth_signature_method: "HMAC-SHA1",
oauth_timestamp: ohauth.timestamp(),
oauth_nonce: ohauth.nonce()
};

params.oauth_signature = ohauth.signature(
OSM.oauth_consumer_secret,
OSM.oauth_token_secret,
ohauth.baseString(options.type, url, $.extend({}, params, jqxhr.data))
);

options.headers = options.headers || {};
options.headers.Authorization = "OAuth " + ohauth.authHeader(params);
}
});
Loading

0 comments on commit 0c8ad2f

Please sign in to comment.