$("<button type='button' class='btn-close'>")
.attr("aria-label", I18n.t("javascripts.close"))
.click(close))),
- $("<div>").append(
- $("<div class='d-flex'>").append(
- $("<p class='alert alert-warning'>")
- .text(I18n.t("browse.start_rjs.feature_error", { message: message }))))));
+ $("<p class='alert alert-warning'>")
+ .text(I18n.t("browse.start_rjs.feature_error", { message: message }))));
}
function getData() {
OSM.initializeNotesLayer = function (map) {
- var noteLayer = map.noteLayer,
- notes = {};
+ let noteLoader;
+ const noteLayer = map.noteLayer;
+ let notes = {};
var noteIcons = {
"new": L.icon({
map.on("moveend", loadNotes);
map.fire("overlayadd", { layer: noteLayer });
}).on("remove", () => {
+ if (noteLoader) noteLoader.abort();
+ noteLoader = null;
map.off("moveend", loadNotes);
noteLayer.clearLayers();
notes = {};
if (marker) {
marker.setIcon(noteIcons[feature.properties.status]);
} else {
+ let title;
+ const description = feature.properties.comments[0];
+
+ if (description?.action === "opened") {
+ title = description.text;
+ }
+
marker = L.marker(feature.geometry.coordinates.reverse(), {
icon: noteIcons[feature.properties.status],
- title: feature.properties.comments[0].text,
+ title,
opacity: 0.8,
interactive: true
});
return marker.id;
};
- var noteLoader;
-
function loadNotes() {
var bounds = map.getBounds();
var size = bounds.getSize();
},
updateLayers: function (layerParam) {
- var layers = layerParam || "M";
+ const oldBaseLayer = this.getMapBaseLayer();
+ let newBaseLayer;
- for (let i = this.baseLayers.length - 1; i >= 0; i--) {
- if (layers.indexOf(this.baseLayers[i].options.code) === -1) {
- this.removeLayer(this.baseLayers[i]);
+ for (const layer of this.baseLayers) {
+ if (!newBaseLayer || layerParam.includes(layer.options.code)) {
+ newBaseLayer = layer;
}
}
- for (let i = this.baseLayers.length - 1; i >= 0; i--) {
- if (layers.indexOf(this.baseLayers[i].options.code) >= 0 || i === 0) {
- this.addLayer(this.baseLayers[i]);
- return;
- }
+ if (newBaseLayer !== oldBaseLayer) {
+ if (oldBaseLayer) this.removeLayer(oldBaseLayer);
+ if (newBaseLayer) this.addLayer(newBaseLayer);
}
},
}
}
+/* Rules for the issues page */
+
+.issues.issues-index {
+ td.reporter_users {
+ max-width: 5rem;
+ }
+}
+
/* Rules for the account confirmation page */
.accounts-terms-show {
end
@issues, @newer_issues_id, @older_issues_id = get_page_items(@issues, :limit => @params[:limit])
+
+ @unique_reporters = @issues.each_with_object({}) do |issue, reporters|
+ user_ids = issue.reports.order(:created_at => :desc).pluck(:user_id).uniq
+ reporters[issue.id] = {
+ :count => user_ids.size,
+ :users => User.in_order_of(:id, user_ids.first(3))
+ }
+ end
+
render :partial => "page" if turbo_frame_request_id == "pagination"
end
<th><%= t ".reports" %></th>
<th><%= t ".reported_item" %></th>
<th><%= t ".reported_user" %></th>
+ <th class="reporter_users"><%= t ".reporter_users" %></th>
<th><%= t ".last_updated" %></th>
</tr>
</thead>
<td class="text-nowrap"><%= link_to t(".reports_count", :count => issue.reports_count), issue %></td>
<td><%= link_to reportable_title(issue.reportable), reportable_url(issue.reportable) %></td>
<td><%= link_to issue.reported_user.display_name, issue.reported_user if issue.reported_user %></td>
+ <td class="reporter_users text-truncate">
+ <% @unique_reporters[issue.id][:users].each do |reporter| %>
+ <%= link_to reporter.display_name, reporter, :class => "d-block text-truncate", :title => reporter.display_name %>
+ <% end %>
+ <% if @unique_reporters[issue.id][:count] > 3 %>
+ <p class="m-0"><%= t ".more_reporters", :count => @unique_reporters[issue.id][:count] - 3 %></p>
+ <% end %>
+ </td>
<td>
<% if issue.user_updated %>
<%= t ".last_updated_time_ago_user_html", :user => link_to(issue.user_updated.display_name, issue.user_updated),
reports: Reports
last_updated: Last Updated
last_updated_time_ago_user_html: "%{time_ago} by %{user}"
+ reporter_users: Reporter Users
reports_count:
one: "%{count} Report"
other: "%{count} Reports"
+ more_reporters: "and %{count} more"
reported_item: Reported Item
states:
ignored: Ignored
assert_no_content(/extra_#{n}[^\d]/i)
end
end
+
+ def test_single_issue_reporters
+ sign_in_as(create(:moderator_user))
+ issue = create(:issue, :assigned_role => "moderator")
+ issue.reports << create(:report, :user => create(:user, :display_name => "Test Name"))
+
+ visit issues_path
+ assert_content issue.reported_user.display_name
+ assert_content issue.reports.first.user.display_name
+ end
+
+ def test_multiple_issue_reporters
+ sign_in_as(create(:moderator_user))
+ issue = create(:issue, :assigned_role => "moderator")
+
+ create_list(:report, 5, :issue => issue)
+
+ visit issues_path
+ 0.upto(1).each do |n|
+ assert_no_content issue.reports[n].user.display_name
+ end
+ 2.upto(4).each do |n|
+ assert_content issue.reports[n].user.display_name
+ end
+ end
+
+ def test_ordering_issue_reporters
+ sign_in_as(create(:moderator_user))
+ issue = create(:issue, :assigned_role => "moderator")
+
+ create_list(:report, 5, :issue => issue)
+
+ 4.downto(0).each do |n|
+ issue.reports << create(:report, :user => issue.reports[n].user)
+ end
+
+ visit issues_path
+ 0.upto(2).each do |n|
+ assert_content issue.reports[n].user.display_name
+ end
+ 3.upto(4).each do |n|
+ assert_no_content issue.reports[n].user.display_name
+ end
+ end
end
--- /dev/null
+require "application_system_test_case"
+
+class NoteLayerTest < ApplicationSystemTestCase
+ test "note marker should have description as a title" do
+ position = (1.1 * GeoRecord::SCALE).to_i
+ create(:note, :latitude => position, :longitude => position) do |note|
+ create(:note_comment, :note => note, :body => "Note description")
+ end
+
+ visit root_path(:anchor => "map=18/1.1/1.1&layers=N")
+ all "img.leaflet-marker-icon", :count => 1 do |marker|
+ assert_equal "Note description", marker["title"]
+ end
+ end
+
+ test "note marker should not have a title if the note has no visible description" do
+ position = (1.1 * GeoRecord::SCALE).to_i
+ create(:note, :latitude => position, :longitude => position) do |note|
+ create(:note_comment, :note => note, :body => "Note description is hidden", :visible => false)
+ create(:note_comment, :note => note, :body => "Note comment visible", :event => "commented")
+ end
+
+ visit root_path(:anchor => "map=18/1.1/1.1&layers=N")
+ all "img.leaflet-marker-icon", :count => 1 do |marker|
+ assert_equal "", marker["title"]
+ end
+ end
+
+ test "note marker should not have a title if the note has no visible description and comments" do
+ position = (1.1 * GeoRecord::SCALE).to_i
+ create(:note, :latitude => position, :longitude => position) do |note|
+ create(:note_comment, :note => note, :body => "Note description is hidden", :visible => false)
+ end
+
+ visit root_path(:anchor => "map=18/1.1/1.1&layers=N")
+ all "img.leaflet-marker-icon", :count => 1 do |marker|
+ assert_equal "", marker["title"]
+ end
+ end
+end