Skip to content

Commit 6397599

Browse files
committed
add a tag diff to the /history endpoint
1 parent 4498909 commit 6397599

6 files changed

Lines changed: 144 additions & 1 deletion

File tree

app/helpers/tag_diff_helper.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# frozen_string_literal: true
2+
3+
module TagDiffHelper
4+
def tag_diff(current_tags, previous_tags)
5+
current_tags ||= {}
6+
previous_tags ||= {}
7+
8+
(current_tags.keys | previous_tags.keys).sort.filter_map do |key|
9+
if current_tags.key?(key) && previous_tags.key?(key)
10+
{ :type => "modified", :key => key, :old_value => previous_tags[key], :new_value => current_tags[key] } if current_tags[key] != previous_tags[key]
11+
elsif current_tags.key?(key)
12+
{ :type => "added", :key => key, :old_value => nil, :new_value => current_tags[key] }
13+
else
14+
{ :type => "removed", :key => key, :old_value => previous_tags[key], :new_value => nil }
15+
end
16+
end
17+
end
18+
end
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<%# locals: (new_element:, old_element:) %>
2+
<% if old_element %>
3+
<% diffs = tag_diff(new_element.tags, old_element.tags) %>
4+
<% if diffs.any? %>
5+
<details class="mb-3 border-bottom border-secondary-subtle pb-3">
6+
<summary class="text-secondary"><%= t("browse.tag_diff.summary", :old_version => old_element.version, :new_version => new_element.version) %></summary>
7+
<div class="border border-secondary-subtle rounded overflow-hidden mt-2">
8+
<table class="table mb-0 browse-tag-list align-middle table-sm">
9+
<tbody>
10+
<% diffs.each do |diff| %>
11+
<% case diff[:type] %>
12+
<% when "added" %>
13+
<tr class="table-secondary">
14+
<th scope="row" class="py-1 border-secondary-subtle fw-normal table-success" dir="auto"><span class="visually-hidden"><%= t("browse.tag_diff.type.added") %>:</span><%= format_key(diff[:key]) %> </th>
15+
<td class="py-1 border-secondary-subtle border-start table-success" dir="auto"><%= format_value(diff[:key], diff[:new_value]) %></td>
16+
</tr>
17+
<% when "removed" %>
18+
<tr class="table-secondary">
19+
<th scope="row" class="py-1 border-secondary-subtle fw-normal table-danger" dir="auto"><span class="visually-hidden"><%= t("browse.tag_diff.type.removed") %>:</span><%= format_key(diff[:key]) %> </th>
20+
<td class="py-1 border-secondary-subtle border-start table-danger" dir="auto"><%= format_value(diff[:key], diff[:old_value]) %></td>
21+
</tr>
22+
<% when "modified" %>
23+
<tr class="table-secondary">
24+
<th scope="row" rowspan="2" class="py-1 border-secondary-subtle fw-normal" dir="auto"><span class="visually-hidden"><%= t("browse.tag_diff.type.modified") %>:</span><%= format_key(diff[:key]) %> </th>
25+
<td class="py-1 border-secondary-subtle border-start table-success text-secondary" dir="auto"><span class="visually-hidden"><%= t("browse.tag_diff.status.new") %>:</span><%= format_value(diff[:key], diff[:new_value]) %></td>
26+
</tr>
27+
<tr class="table-secondary">
28+
<td class="py-1 border-secondary-subtle border-start table-danger text-secondary" dir="auto"><span class="visually-hidden"><%= t("browse.tag_diff.status.old") %>:</span><%= format_value(diff[:key], diff[:old_value]) %></td>
29+
</tr>
30+
<% end %>
31+
<% end %>
32+
</tbody>
33+
</table>
34+
</div>
35+
</details>
36+
<% end %>
37+
<% end %>

app/views/old_elements/index.html.erb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414
<% end %>
1515

1616
<div id="element_versions_list">
17-
<%= render :partial => "browse/#{@type}", :collection => @old_features.items %>
17+
<% @old_features.items.each_with_index do |item, index| %>
18+
<%= render :partial => "browse/#{@type}", :locals => { @type.to_sym => item } %>
19+
<% old_element = @old_features.items[index + 1] %>
20+
<%= render "browse/tag_diff", :new_element => item, :old_element => old_element if old_element %>
21+
<% end %>
1822
</div>
1923

2024
<% if @old_features.older_items_cursor %>

config/locales/en.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,15 @@ en:
337337
already_declared: "You have already declared that you consider your edits to be in the Public Domain."
338338
did_not_confirm: "You didn't confirm that you consider your edits to be in the Public Domain."
339339
browse:
340+
tag_diff:
341+
summary: "Tag changes from version #%{old_version} to #%{new_version}"
342+
type:
343+
added: "Added"
344+
removed: "Removed"
345+
modified: "Modified"
346+
status:
347+
new: "After"
348+
old: "Before"
340349
deleted_ago_by_html: "Deleted %{time_ago} by %{user}"
341350
edited_ago_by_html: "Edited %{time_ago} by %{user}"
342351
version: "Version"
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# frozen_string_literal: true
2+
3+
require "test_helper"
4+
5+
class TagDiffHelperTest < ActionView::TestCase
6+
def test_tag_diff
7+
old_tags = { "highway" => "trunk", "maxspeed" => "50", "ref" => "A1" }
8+
new_tags = { "highway" => "tertiary", "name" => "Main St", "ref" => "A1" }
9+
10+
diffs = tag_diff(new_tags, old_tags)
11+
12+
assert_equal 3, diffs.length
13+
14+
assert_equal "highway", diffs[0][:key]
15+
assert_equal "modified", diffs[0][:type]
16+
assert_equal "trunk", diffs[0][:old_value]
17+
assert_equal "tertiary", diffs[0][:new_value]
18+
19+
assert_equal "maxspeed", diffs[1][:key]
20+
assert_equal "removed", diffs[1][:type]
21+
assert_equal "50", diffs[1][:old_value]
22+
23+
assert_equal "name", diffs[2][:key]
24+
assert_equal "added", diffs[2][:type]
25+
assert_equal "Main St", diffs[2][:new_value]
26+
27+
assert_nil(diffs.find { |d| d[:key] == "ref" })
28+
end
29+
end

test/system/element_history_test.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,4 +339,50 @@ def check_element_history_pages(get_path)
339339
assert_no_link "Older Versions"
340340
end
341341
end
342+
343+
test "shows tag diff in way history" do
344+
way = create(:way, :with_history, :version => 2)
345+
way_v1 = way.old_ways.find_by(:version => 1)
346+
way_v2 = way.old_ways.find_by(:version => 2)
347+
348+
# 1. No change
349+
create(:old_way_tag, :old_way => way_v1, :k => "ref", :v => "A1")
350+
create(:old_way_tag, :old_way => way_v2, :k => "ref", :v => "A1")
351+
352+
# 2. Modification
353+
create(:old_way_tag, :old_way => way_v1, :k => "highway", :v => "trunk")
354+
create(:old_way_tag, :old_way => way_v2, :k => "highway", :v => "tertiary")
355+
356+
# 3. Addition
357+
create(:old_way_tag, :old_way => way_v2, :k => "maxspeed", :v => "50")
358+
359+
# 4. Removal
360+
create(:old_way_tag, :old_way => way_v1, :k => "operator", :v => "OldOp")
361+
362+
visit way_history_path(way)
363+
364+
within_sidebar do
365+
assert_text "Tag changes from version v1 to v2"
366+
367+
find("details summary", :text => "Tag changes from version v1 to v2").click
368+
369+
within "details" do
370+
# Modification
371+
assert_css "th[rowspan='2']", :text => "highway"
372+
assert_css "td.table-success", :text => "tertiary"
373+
assert_css "td.table-danger", :text => "trunk"
374+
375+
# Addition
376+
assert_css "th.table-success", :text => "maxspeed"
377+
assert_css "td.table-success", :text => "50"
378+
379+
# Removal
380+
assert_css "th.table-danger", :text => "operator"
381+
assert_css "td.table-danger", :text => "OldOp"
382+
383+
# No change (should NOT be here)
384+
assert_no_text "ref"
385+
end
386+
end
387+
end
342388
end

0 commit comments

Comments
 (0)