diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8a5af6ace..0548842b6 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -10,6 +10,11 @@ module ApplicationHelper render "diff_list", diff: diff, ul_class: ul_class, li_class: li_class end + def diff_name_html(this_name, prev_name) + pattern = Regexp.new('.') + DiffBuilder.new(this_name, prev_name, pattern).build + end + def diff_body_html(record, previous, field) return h(record[field]).gsub(/\r?\n/, '
').html_safe if previous.blank? diff --git a/app/helpers/artist_versions_helper.rb b/app/helpers/artist_versions_helper.rb index 1f55b471e..b9cf1269e 100644 --- a/app/helpers/artist_versions_helper.rb +++ b/app/helpers/artist_versions_helper.rb @@ -14,4 +14,24 @@ module ArtistVersionsHelper diff_list_html(new_urls, old_urls, latest_urls) end + + def artist_version_name_diff(artist_version) + previous = artist_version.previous + if previous.present? && (artist_version.name != previous.name) + name_diff = diff_name_html(artist_version.name, previous.name) + %(

Rename:
 #{name_diff}

).html_safe + else + "" + end + end + + def artist_version_group_name_diff(artist_version) + previous = artist_version.previous + if artist_version.group_name.present? || (previous.present? && previous.group_name.present?) + group_name_diff = diff_name_html(artist_version.group_name, previous.group_name) + %(Group:
 #{group_name_diff}

).html_safe + else + "" + end + end end diff --git a/app/helpers/pool_versions_helper.rb b/app/helpers/pool_versions_helper.rb new file mode 100644 index 000000000..c12e56a2c --- /dev/null +++ b/app/helpers/pool_versions_helper.rb @@ -0,0 +1,31 @@ +module PoolVersionsHelper + def pool_version_show_diff(pool_version) + previous = pool_version.previous + previous.present? && pool_version.description != previous.description + end + + def pool_version_name_diff(pool_version) + previous = pool_version.previous + if previous.present? && (pool_version.name != previous.name) + name_diff = diff_name_html(pool_version.pretty_name, previous.pretty_name) + %(

Rename:
 #{name_diff}

).html_safe + else + "" + end + end + + def pool_version_post_diff(pool_version) + previous = pool_version.previous + diff = {} + + if previous.present? + diff[:added_post_ids] = pool_version.post_ids - previous.post_ids + diff[:removed_post_ids] = previous.post_ids - pool_version.post_ids + else + diff[:added_post_ids] = pool_version.added_post_ids + diff[:removed_post_ids] = pool_version.removed_post_ids + end + + render "pool_versions/diff", diff: diff + end +end diff --git a/app/helpers/post_versions_helper.rb b/app/helpers/post_versions_helper.rb index 062deebf4..c2994004d 100644 --- a/app/helpers/post_versions_helper.rb +++ b/app/helpers/post_versions_helper.rb @@ -1,19 +1,48 @@ module PostVersionsHelper def post_version_diff(post_version) - diff = post_version.diff(post_version.previous) + previous = post_version.previous + post = post_version.post + + if post.nil? + latest_tags = post_version.tag_array + else + latest_tags = post.tag_array + latest_tags << "rating:#{post.rating}" if post.rating.present? + latest_tags << "parent:#{post.parent_id}" if post.parent_id.present? + latest_tags << "source:#{post.source}" if post.source.present? + end + + new_tags = post_version.tag_array + new_tags << "rating:#{post_version.rating}" if post_version.rating.present? + new_tags << "parent:#{post_version.parent_id}" if post_version.parent_id.present? + new_tags << "source:#{post_version.source}" if post_version.source.present? + + old_tags = previous.present? ? previous.tag_array : [] + if previous.present? + old_tags << "rating:#{previous.rating}" if previous.rating.present? + old_tags << "parent:#{previous.parent_id}" if previous.parent_id.present? + old_tags << "source:#{previous.source}" if previous.source.present? + end + + added_tags = new_tags - old_tags + removed_tags = old_tags - new_tags + obsolete_added_tags = added_tags - latest_tags, + obsolete_removed_tags = removed_tags & latest_tags, + unchanged_tags = new_tags & old_tags + html = '' - diff[:added_tags].each do |tag| - prefix = diff[:obsolete_added_tags].include?(tag) ? '+' : '+' + added_tags.each do |tag| + prefix = obsolete_added_tags.include?(tag) ? '+' : '+' html << prefix + link_to(wordbreakify(tag), posts_path(:tags => tag)) + '' html << " " end - diff[:removed_tags].each do |tag| - prefix = diff[:obsolete_removed_tags].include?(tag) ? '-' : '-' + removed_tags.each do |tag| + prefix = obsolete_removed_tags.include?(tag) ? '-' : '-' html << prefix + link_to(wordbreakify(tag), posts_path(:tags => tag)) + '' html << " " end - diff[:unchanged_tags].each do |tag| + unchanged_tags.each do |tag| html << '' + link_to(wordbreakify(tag), posts_path(:tags => tag)) + '' html << " " end diff --git a/app/helpers/wiki_page_versions_helper.rb b/app/helpers/wiki_page_versions_helper.rb index 0dd614045..6c8fb9b39 100644 --- a/app/helpers/wiki_page_versions_helper.rb +++ b/app/helpers/wiki_page_versions_helper.rb @@ -1,9 +1,28 @@ module WikiPageVersionsHelper - def wiki_other_names_diff(new_version, old_version) + def wiki_version_show_diff(wiki_page_version) + previous = wiki_page_version.previous + previous.present? && ((wiki_page_version.body != previous.body) || wiki_page_version.other_names_changed) + end + + def wiki_version_show_other_names(new_version, old_version) + ((new_version.other_names - old_version.other_names) | (old_version.other_names - new_version.other_names)).length > 0 + end + + def wiki_version_other_names_diff(new_version, old_version) new_names = new_version.other_names old_names = old_version.other_names latest_names = new_version.wiki_page.other_names diff_list_html(new_names, old_names, latest_names, ul_class: ["wiki-other-names-diff-list list-inline"], li_class: ["wiki-other-name"]) end + + def wiki_version_title_diff(wiki_page_version) + previous = wiki_page_version.previous + if previous.present? && (wiki_page_version.title != previous.title) + name_diff = diff_name_html(wiki_page_version.title, previous.title) + %((Rename: #{name_diff})).html_safe + else + "" + end + end end diff --git a/app/models/pool_version.rb b/app/models/pool_version.rb index 5e9f18342..b8e0e64d0 100644 --- a/app/models/pool_version.rb +++ b/app/models/pool_version.rb @@ -89,23 +89,6 @@ class PoolVersion < ApplicationRecord normalize_name(name).mb_chars.downcase end - def build_diff(other = previous) - diff = {} - - if other.nil? - diff[:added_post_ids] = added_post_ids - diff[:removed_post_ids] = removed_post_ids - diff[:added_desc] = description - else - diff[:added_post_ids] = post_ids - other.post_ids - diff[:removed_post_ids] = other.post_ids - post_ids - diff[:added_desc] = description - diff[:removed_desc] = other.description - end - - diff - end - def previous @previous ||= begin PoolVersion.where("pool_id = ? and version < ?", pool_id, version).order("version desc").limit(1).to_a @@ -115,6 +98,7 @@ class PoolVersion < ApplicationRecord def self.status_fields { + posts_changed: "Posts", name: "Renamed", description: "Description", was_deleted: "Deleted", @@ -124,6 +108,10 @@ class PoolVersion < ApplicationRecord } end + def posts_changed + ((post_ids - previous.post_ids) | (previous.post_ids - post_ids)).length > 0 + end + def was_deleted is_deleted && !previous.is_deleted end @@ -140,10 +128,6 @@ class PoolVersion < ApplicationRecord !is_active && previous.is_active end - def text_field_changed - previous.present? && (name_changed || description_changed) - end - def pretty_name name.tr("_", " ") end diff --git a/app/models/post_version.rb b/app/models/post_version.rb index fe73e2641..869fa2140 100644 --- a/app/models/post_version.rb +++ b/app/models/post_version.rb @@ -112,40 +112,6 @@ class PostVersion < ApplicationRecord } end - def diff(version = nil) - if post.nil? - latest_tags = tag_array - else - latest_tags = post.tag_array - latest_tags << "rating:#{post.rating}" if post.rating.present? - latest_tags << "parent:#{post.parent_id}" if post.parent_id.present? - latest_tags << "source:#{post.source}" if post.source.present? - end - - new_tags = tag_array - new_tags << "rating:#{rating}" if rating.present? - new_tags << "parent:#{parent_id}" if parent_id.present? - new_tags << "source:#{source}" if source.present? - - old_tags = version.present? ? version.tag_array : [] - if version.present? - old_tags << "rating:#{version.rating}" if version.rating.present? - old_tags << "parent:#{version.parent_id}" if version.parent_id.present? - old_tags << "source:#{version.source}" if version.source.present? - end - - added_tags = new_tags - old_tags - removed_tags = old_tags - new_tags - - return { - :added_tags => added_tags, - :removed_tags => removed_tags, - :obsolete_added_tags => added_tags - latest_tags, - :obsolete_removed_tags => removed_tags & latest_tags, - :unchanged_tags => new_tags & old_tags - } - end - def changes delta = { :added_tags => added_tags, diff --git a/app/views/artist_commentary_versions/index.html.erb b/app/views/artist_commentary_versions/index.html.erb index 573722507..fac35c5af 100644 --- a/app/views/artist_commentary_versions/index.html.erb +++ b/app/views/artist_commentary_versions/index.html.erb @@ -1,6 +1,6 @@
-

Artist Commentary Changes

+

Artist Commentary History

<%= render "posts/partials/common/inline_blacklist" %> diff --git a/app/views/artist_versions/_listing.html.erb b/app/views/artist_versions/_listing.html.erb index 5051698cd..e473de899 100644 --- a/app/views/artist_versions/_listing.html.erb +++ b/app/views/artist_versions/_listing.html.erb @@ -1,14 +1,13 @@
<%= table_for @artist_versions, {class: "striped autofit", width: "100%"} do |t| %> - <% t.column "Name" do |artist_version| %> + <% t.column "Name", td: {class: "diff-body"} do |artist_version| %> <%= link_to artist_version.name, artist_path(artist_version.artist_id) %> <%= link_to "»", artist_versions_path(search: {artist_id: artist_version.artist_id}, anchor: "artist-version-#{artist_version.id}") %> + <%= artist_version_name_diff(artist_version) %> <% end %> - <% t.column "Other Names" do |artist_version| %> - <% if artist_version.group_name.present? %> -

Group:
 <%= artist_version.group_name %>

- <% end %> + <% t.column "Other Names", td: {class: "diff-body"} do |artist_version| %> + <%= artist_version_group_name_diff(artist_version) %> <%= artist_version_other_names_diff(artist_version) %> <% end %> <% t.column "URLs", td: {class: "col-expand"} do |artist_version| %> diff --git a/app/views/note_versions/index.html.erb b/app/views/note_versions/index.html.erb index 674379814..c0e9b62fe 100644 --- a/app/views/note_versions/index.html.erb +++ b/app/views/note_versions/index.html.erb @@ -1,6 +1,6 @@
-

Note Changes

+

Note History

<%= render "listing" %> diff --git a/app/views/pool_versions/_listing.html.erb b/app/views/pool_versions/_listing.html.erb index e0102d63d..382814f3e 100644 --- a/app/views/pool_versions/_listing.html.erb +++ b/app/views/pool_versions/_listing.html.erb @@ -2,14 +2,15 @@ <%= table_for @pool_versions, {class: "striped autofit", width: "100%"} do |t| %> <% t.column column: "diff", width: "3%" do |pool_version| %> - <%= link_to_if pool_version.text_field_changed, "diff", diff_pool_version_path(pool_version.id) %> + <%= link_to_if pool_version_show_diff(pool_version), "diff", diff_pool_version_path(pool_version.id) %> <% end %> - <% t.column "Pool" do |pool_version| %> + <% t.column "Pool", td: {class: "diff-body"} do |pool_version| %> <%= link_to pool_version.pretty_name, pool_path(pool_version.pool_id), class: "pool-category-#{pool_version.pool.category}" %> <%= link_to "»", pool_versions_path(search: { pool_id: pool_version.pool_id }, anchor: "pool-version-#{pool_version.id}"), class: "pool-category-#{pool_version.pool.category}" %> + <%= pool_version_name_diff(pool_version) %> <% end %> <% t.column "Post Changes", td: { class: "col-expand" } do |pool_version| %> - <%= render "pool_versions/diff", diff: pool_version.build_diff %> + <%= pool_version_post_diff(pool_version) %> <% end %> <% t.column "Post Count" do |pool_version| %> <%= link_to pool_version.post_ids.size, pool_versions_path(search: { pool_id: pool_version.pool_id }) %> diff --git a/app/views/pool_versions/diff.html.erb b/app/views/pool_versions/diff.html.erb index 4d89b4707..0f0be8b1f 100644 --- a/app/views/pool_versions/diff.html.erb +++ b/app/views/pool_versions/diff.html.erb @@ -3,34 +3,18 @@
-

Pool Version Comparison: <%= @pool_version.name %>

+

Pool Version Comparison: <%= link_to @pool_version.pretty_name, pool_versions_path(search: { pool_id: @pool_version.pool_id }, anchor: "pool-version-#{@pool_version.id}"), class: "pool-category-#{@pool_version.pool.category}" %>

<% if @other_version.present? %>

Showing differences between <%= compact_time @pool_version.updated_at %> (<%= link_to_user @pool_version.updater %>) and <%= compact_time @other_version.updated_at %> (<%= link_to_user @other_version.updater %>)

-
-

Name:

-

- <% if @pool_version.name != @other_version.name %> - <%= @other_version.name %> -> <%= @pool_version.name %> - <% else %> - <%= @pool_version.name %> - <% end %> -

-
-
-

Posts:

-

<%= render "pool_versions/diff", diff: @pool_version.build_diff(@other_version) %>

-
-
-

Description:

-

- <% if @pool_version.description != @other_version.description %> + + <% if @pool_version.description != @other_version.description %> +

<%= diff_body_html(@pool_version, @other_version, :description) %> - <% else %> - Unchanged. - <% end %> -

-
+
+ <% else %> +

No changes to description.

+ <% end %> <% end %>
diff --git a/app/views/post_versions/index.html.erb b/app/views/post_versions/index.html.erb index bba7d89ae..9fbe4a28d 100644 --- a/app/views/post_versions/index.html.erb +++ b/app/views/post_versions/index.html.erb @@ -1,9 +1,9 @@
<% if listing_type(:post_id) == :revert && @post_versions.present? %> -

Tag History: <%= link_to "Post ##{params.dig(:search, :post_id)}", @post_versions[0].post %>

+

Post History: <%= link_to "Post ##{params.dig(:search, :post_id)}", @post_versions[0].post %>

<% else %> -

Tag History

+

Post History

<% end %> <%= search_form_for(post_versions_path, classes: "inline-form") do |f| %> diff --git a/app/views/wiki_page_versions/_listing.html.erb b/app/views/wiki_page_versions/_listing.html.erb index 21998b425..36469aca0 100644 --- a/app/views/wiki_page_versions/_listing.html.erb +++ b/app/views/wiki_page_versions/_listing.html.erb @@ -2,7 +2,7 @@ <%= form_tag(diff_wiki_page_versions_path, :method => :get) do %> <%= table_for @wiki_page_versions.includes(:updater, :tag), width: "100%" do |t| %> <% t.column column: "diff", width: "3%" do |wiki_page_version, i| %> - <%= link_to_if wiki_page_version.previous.present?, "diff", diff_wiki_page_versions_path(otherpage: wiki_page_version.previous.try(:id), thispage: wiki_page_version.id) %> + <%= link_to_if wiki_version_show_diff(wiki_page_version), "diff", diff_wiki_page_versions_path(otherpage: wiki_page_version.previous.try(:id), thispage: wiki_page_version.id) %> <% end %> <% if listing_type(:wiki_page_id, member_check: false, types: [:page, :global]) == :page %> @@ -14,12 +14,13 @@ <% end %> <% end %> - <% t.column "Title" do |wiki_page_version| %> + <% t.column "Title", td: {class: "diff-body"} do |wiki_page_version| %> <%= link_to "?", wiki_page_path(wiki_page_version.wiki_page_id) %> <%= link_to wiki_page_version.title, wiki_page_version %> <%= link_to "»", wiki_page_versions_path(search: { wiki_page_id: wiki_page_version.wiki_page_id }) %> + <%= wiki_version_title_diff(wiki_page_version) %> <% end %> <% t.column "Changes", width: "5%" do |wiki_page_version| %> <%= status_diff_html(wiki_page_version) %> diff --git a/app/views/wiki_page_versions/diff.html.erb b/app/views/wiki_page_versions/diff.html.erb index 5f749c1f8..e38bedb5b 100644 --- a/app/views/wiki_page_versions/diff.html.erb +++ b/app/views/wiki_page_versions/diff.html.erb @@ -4,13 +4,21 @@ <%= render "wiki_pages/sidebar" %> <% content_for(:content) do %> -

Wiki Page: <%= @thispage.title %>

+

Wiki Page Version Comparison: <%= link_to @thispage.title, wiki_page_versions_path(search: { wiki_page_id: @thispage.wiki_page_id }, anchor: "wiki-page-version-#{@thispage.id}"), class: "tag-type-#{@thispage.wiki_page.category_name}" %>

Showing differences between <%= compact_time @thispage.updated_at %> (<%= link_to_user @thispage.updater %>) and <%= compact_time @otherpage.updated_at %> (<%= link_to_user @otherpage.updater %>)

- <%= wiki_other_names_diff(@thispage, @otherpage) %> + <% if wiki_version_show_other_names(@thispage, @otherpage) %> +

<%= wiki_version_other_names_diff(@thispage, @otherpage) %>

+ <% else %> +

No changes to other names.

+ <% end %> -
- <%= diff_body_html(@thispage, @otherpage, :body) %> -
+ <% if @thispage.body != @otherpage.body %> +
+ <%= diff_body_html(@thispage, @otherpage, :body) %> +
+ <% else %> +

No changes to body.

+ <% end %> <% end %>