Note that addNoteButton.hasClass("active") check in page.load is useless because page.unload removes this class.
newNoteMarker = null;
}
+ function updateControls() {
+ const zoomedOut = addNoteButton.hasClass("disabled");
+ const withoutText = content.find("textarea").val() === "";
+
+ content.find("#new-note-zoom-warning").prop("hidden", !zoomedOut);
+ content.find("input[type=submit]").prop("disabled", zoomedOut || withoutText);
+ }
+
page.pushstate = page.popstate = function (path) {
OSM.loadSidebarContent(path, function () {
page.load(path);
};
page.load = function (path) {
- if (addNoteButton.hasClass("disabled")) return;
- if (addNoteButton.hasClass("active")) return;
-
addNoteButton.addClass("active");
map.addLayer(noteLayer);
addNewNoteMarker(markerLatlng);
content.find("textarea")
- .on("input", disableWhenBlank)
+ .on("input", updateControls)
.focus();
- function disableWhenBlank(e) {
- $(e.target.form.add).prop("disabled", $(e.target).val() === "");
- }
-
content.find("input[type=submit]").on("click", function (e) {
const location = newNoteMarker.getLatLng().wrap();
const text = content.find("textarea").val();
});
});
+ addNoteButton.on("disabled enabled", updateControls);
+ updateControls();
+
return map.getState();
};
page.unload = function () {
+ addNoteButton.off("disabled enabled", updateControls);
removeNewNoteMarker();
addNoteButton.removeClass("active");
};
map.on("zoomend", update);
function update() {
- var disabled = OSM.STATUS === "database_offline" || map.getZoom() < 12;
+ var wasDisabled = link.hasClass("disabled"),
+ isDisabled = OSM.STATUS === "database_offline" || map.getZoom() < 12;
link
- .toggleClass("disabled", disabled)
- .attr("data-bs-original-title", I18n.t(disabled ?
+ .toggleClass("disabled", isDisabled)
+ .attr("data-bs-original-title", I18n.t(isDisabled ?
"javascripts.site.createnote_disabled_tooltip" :
"javascripts.site.createnote_tooltip"));
+
+ if (isDisabled && !wasDisabled) {
+ link.trigger("disabled");
+ } else if (wasDisabled && !isDisabled) {
+ link.trigger("enabled");
+ }
}
update();
:log_in => link_to(t(".anonymous_warning_log_in"), login_path(:referer => new_note_path)),
:sign_up => link_to(t(".anonymous_warning_sign_up"), user_new_path) %></p>
<% end %>
+ <p class="alert alert-warning" id="new-note-zoom-warning" hidden><%= t "javascripts.site.createnote_disabled_tooltip" %></p>
<form action="#">
<input type="hidden" name="lon" autocomplete="off">
<input type="hidden" name="lat" autocomplete="off">
end
end
+ test "cannot create new note when zoomed out" do
+ visit new_note_path(:anchor => "map=12/0/0")
+
+ within_sidebar do
+ assert_no_content "Zoom in to add a note"
+ assert_button "Add Note", :disabled => true
+
+ fill_in "text", :with => "Some newly added note description"
+
+ assert_no_content "Zoom in to add a note"
+ assert_button "Add Note", :disabled => false
+ end
+
+ find(".control-button.zoomout").click
+
+ within_sidebar do
+ assert_content "Zoom in to add a note"
+ assert_button "Add Note", :disabled => true
+ end
+
+ find(".control-button.zoomin").click
+
+ within_sidebar do
+ assert_no_content "Zoom in to add a note"
+ assert_button "Add Note", :disabled => false
+
+ click_on "Add Note"
+
+ assert_content "Unresolved note ##{Note.last.id}"
+ assert_content "Some newly added note description"
+ end
+ end
+
+ test "can open new note page when zoomed out" do
+ visit new_note_path(:anchor => "map=11/0/0")
+
+ within_sidebar do
+ assert_content "Zoom in to add a note"
+ assert_button "Add Note", :disabled => true
+
+ fill_in "text", :with => "Some newly added note description"
+
+ assert_content "Zoom in to add a note"
+ assert_button "Add Note", :disabled => true
+ end
+
+ find(".control-button.zoomin").click
+
+ within_sidebar do
+ assert_no_content "Zoom in to add a note"
+ assert_button "Add Note", :disabled => false
+ end
+ end
+
test "cannot create note when api is readonly" do
with_settings(:status => "api_readonly") do
visit new_note_path(:anchor => "map=18/0/0")