diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index b5f8ebdf5..75985eac6 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -42,8 +42,8 @@ class ApplicationController < ActionController::Base
super
end
- def set_version_comparison
- params[:type] = %w[previous subsequent current].include?(params[:type]) ? params[:type] : "previous"
+ def set_version_comparison(default_type = "previous")
+ params[:type] = %w[previous subsequent current].include?(params[:type]) ? params[:type] : default_type
end
def model_name
diff --git a/app/controllers/post_versions_controller.rb b/app/controllers/post_versions_controller.rb
index 773fd2ff9..5a44fafe7 100644
--- a/app/controllers/post_versions_controller.rb
+++ b/app/controllers/post_versions_controller.rb
@@ -5,7 +5,7 @@ class PostVersionsController < ApplicationController
respond_to :js, only: [:undo]
def index
- set_version_comparison
+ set_version_comparison("current")
@post_versions = authorize PostVersion.paginated_search(params)
if request.format.html?
diff --git a/app/helpers/post_versions_helper.rb b/app/helpers/post_versions_helper.rb
index a4d8f1144..ddc6509b8 100644
--- a/app/helpers/post_versions_helper.rb
+++ b/app/helpers/post_versions_helper.rb
@@ -1,46 +1,51 @@
module PostVersionsHelper
def post_version_diff(post_version, type)
+ return "" if type == "previous" && post_version.version == 1
+
other = post_version.send(type)
- this_tags = post_version.tag_array
- this_tags << "rating:#{post_version.rating}" if post_version.rating.present?
- this_tags << "parent:#{post_version.parent_id}" if post_version.parent_id.present?
- this_tags << "source:#{post_version.source}" if post_version.source.present?
+ added_tags = post_version.added_tags
+ added_tags << "rating:#{post_version_value(post_version.rating)}" if post_version.rating_changed
+ added_tags << "parent:#{post_version_value(post_version.parent_id)}" if post_version.parent_changed
+ added_tags << "source:#{post_version_value(post_version.source)}" if post_version.source_changed
- other_tags = other.present? ? other.tag_array : []
- if other.present?
- other_tags << "rating:#{other.rating}" if other.rating.present?
- other_tags << "parent:#{other.parent_id}" if other.parent_id.present?
- other_tags << "source:#{other.source}" if other.source.present?
- elsif type == "subsequent"
- other_tags = this_tags
- end
+ removed_tags = post_version.removed_tags
- if type == "previous"
- added_tags = this_tags - other_tags
- removed_tags = other_tags - this_tags
+ if type == "previous" || other.nil?
+ obsolete_added_tags = []
+ obsolete_removed_tags = []
else
- added_tags = other_tags - this_tags
- removed_tags = this_tags - other_tags
+ other_tags = other.tags.split
+ other_tags << "rating:#{post_version_value(other.rating)}"
+ other_tags << "parent:#{post_version_value(other.parent_id)}"
+ other_tags << "source:#{post_version_value(other.source)}"
+ obsolete_added_tags = added_tags - other_tags
+ obsolete_removed_tags = removed_tags & other_tags
end
- unchanged_tags = this_tags & other_tags
-
html = ''
added_tags.each do |tag|
- html << '+' + link_to(wordbreakify(tag), posts_path(:tags => tag)) + ''
- html << " "
+ obsolete_class = (obsolete_added_tags.include?(tag) ? "diff-obsolete" : "");
+ html << %(#{link_to(wordbreakify(tag), posts_path(:tags => tag))} )
end
removed_tags.each do |tag|
- html << '-' + link_to(wordbreakify(tag), posts_path(:tags => tag)) + ''
- html << " "
- end
- unchanged_tags.each do |tag|
- html << '' + link_to(wordbreakify(tag), posts_path(:tags => tag)) + ''
- html << " "
+ obsolete_class = (obsolete_removed_tags.include?(tag) ? "diff-obsolete" : "");
+ html << %(#{link_to(wordbreakify(tag), posts_path(:tags => tag))} )
end
html << ""
html.html_safe
end
+
+ def post_version_field(post_version, field)
+ value = post_version_value(post_version.send(field))
+ prefix = (field == :parent_id ? "parent" : field.to_s)
+ search = prefix + ":" + value.to_s
+ display = (field == :rating ? post_version.pretty_rating : value)
+ %(#{field.to_s.titleize}: #{link_to(display, posts_path(:tags => search))}).html_safe
+ end
+
+ def post_version_value(value)
+ return (value.present? ? value : "none")
+ end
end
diff --git a/app/javascript/src/styles/base/040_colors.css b/app/javascript/src/styles/base/040_colors.css
index beef5495a..1b7c51541 100644
--- a/app/javascript/src/styles/base/040_colors.css
+++ b/app/javascript/src/styles/base/040_colors.css
@@ -89,6 +89,8 @@
--diff-list-added-color: green;
--diff-list-removed-color: red;
+ --diff-list-obsolete-added-color: darkGreen;
+ --diff-list-obsolete-removed-color: darkRed;
--wiki-page-versions-diff-del-background: #FCC;
--wiki-page-versions-diff-ins-background: #CFC;
@@ -299,6 +301,8 @@ body[data-current-user-theme="dark"] {
--diff-list-added-color: var(--green-1);
--diff-list-removed-color: var(--red-1);
+ --diff-list-obsolete-added-color: var(--green-3);
+ --diff-list-obsolete-removed-color: var(--red-3);
--dtext-blockquote-background: var(--grey-3);
--dtext-blockquote-border: 1px solid var(--grey-4);
diff --git a/app/javascript/src/styles/specific/post_versions.scss b/app/javascript/src/styles/specific/post_versions.scss
index 7c8bf1f9b..bff0195b7 100644
--- a/app/javascript/src/styles/specific/post_versions.scss
+++ b/app/javascript/src/styles/specific/post_versions.scss
@@ -10,4 +10,19 @@ body.c-post-versions.a-index {
.advanced-search-link {
margin: 0 1em;
}
+
+ ins.diff-obsolete a {
+ color: var(--diff-list-obsolete-added-color);
+ font-weight: bold;
+ }
+
+ del.diff-obsolete a {
+ color: var(--diff-list-obsolete-removed-color);
+ font-weight: bold;
+ }
+
+ td.tags-column,
+ td.edits-column {
+ width: 40%;
+ }
}
diff --git a/app/models/post_version.rb b/app/models/post_version.rb
index d45ea0e64..13fae86bf 100644
--- a/app/models/post_version.rb
+++ b/app/models/post_version.rb
@@ -130,6 +130,19 @@ class PostVersion < ApplicationRecord
}
end
+ def pretty_rating
+ case rating
+ when "q"
+ "Questionable"
+
+ when "e"
+ "Explicit"
+
+ when "s"
+ "Safe"
+ end
+ end
+
def changes
delta = {
:added_tags => added_tags,
diff --git a/app/views/post_versions/_listing.html.erb b/app/views/post_versions/_listing.html.erb
index 04eb02531..ffcf92c6d 100644
--- a/app/views/post_versions/_listing.html.erb
+++ b/app/views/post_versions/_listing.html.erb
@@ -3,34 +3,44 @@
<%= PostPresenter.preview(@post_versions.first.post, show_deleted: true) %>
<% end %>
- <%= table_for @post_versions, {id: "post-versions-table", class: "striped autofit"} do |t| %>
+ <%= table_for @post_versions, id: "post-versions-table", class: "striped autofit", width: "100%" do |t| %>
<% if policy(@post_versions).can_mass_undo? %>
- <% t.column tag.label(tag.input type: :checkbox, id: "post-version-select-all-checkbox", class: "post-version-select-checkbox"), column: "post-version-select" do |post_version| %>
+ <% t.column tag.label(tag.input type: :checkbox, id: "post-version-select-all-checkbox", class: "post-version-select-checkbox"), column: "post-version-select", width: "1%" do |post_version| %>
>
<% end %>
<% end %>
<% if listing_type(:post_id) == :standard %>
- <% t.column "Post" do |post_version| %>
+ <% t.column "Post", width: "1%" do |post_version| %>
<%= PostPresenter.preview(post_version.post, show_deleted: true) %>
<% end %>
<% end %>
- <% t.column "Version" do |post_version| %>
- <%= link_to "#{post_version.post_id}.#{post_version.version}", post_versions_path(search: { post_id: post_version.post_id }, anchor: "post-version-#{post_version.id}") %>
+ <% t.column "Version", width: "1%" do |post_version| %>
+ <%= link_to "#{post_version.post_id}.#{post_version.version}", post_versions_path(search: { post_id: post_version.post_id }, type: params[:type], anchor: "post-version-#{post_version.id}") %>
<% end %>
- <% t.column "Tags", td: {class: "col-expand"} do |post_version| %>
+ <% t.column "Tags", td: {class: "col-expand"}, width: "40%" do |post_version| %>
+