diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index c7cd7d9d2..21b5e2b4c 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -1,11 +1,38 @@
require 'dtext'
module ApplicationHelper
+ def listing_type(*fields, member_check: true, types: [:revert, :standard])
+ (fields.reduce(false) { |acc, field| acc || params.dig(:search, field).present? } && (!member_check || CurrentUser.is_member?) ? types[0] : types[1])
+ end
+
def diff_list_html(new, old, latest, ul_class: ["diff-list"], li_class: [])
diff = SetDiff.new(new, old, latest)
render "diff_list", diff: diff, ul_class: ul_class, li_class: li_class
end
+ def diff_body_html(record, previous, field)
+ return h(record[field]).gsub(/\r?\n/, '¶
').html_safe if previous.blank?
+
+ pattern = Regexp.new('(?:<.+?>)|(?:\w+)|(?:[ \t]+)|(?:\r?\n)|(?:.+?)')
+ DiffBuilder.new(record[field], previous[field], pattern).build
+ end
+
+ def status_diff_html(record)
+ previous = record.previous
+
+ return "New" if previous.blank?
+
+ statuses = []
+ record.class.status_fields.each do |field, status|
+ if record.has_attribute?(field)
+ statuses += [status] if record[field] != previous[field]
+ else
+ statuses += [status] if record.send(field)
+ end
+ end
+ statuses.join("
").html_safe
+ end
+
def wordbreakify(string)
lines = string.scan(/.{1,10}/)
wordbreaked_string = lines.map {|str| h(str)}.join("")
diff --git a/app/helpers/artist_commentary_versions_helper.rb b/app/helpers/artist_commentary_versions_helper.rb
deleted file mode 100644
index 0a52fed5d..000000000
--- a/app/helpers/artist_commentary_versions_helper.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-module ArtistCommentaryVersionsHelper
- def artist_commentary_versions_listing_type
- params.dig(:search, :post_id).present? ? :revert : :standard
- end
-end
diff --git a/app/helpers/artist_versions_helper.rb b/app/helpers/artist_versions_helper.rb
index acd1c685e..1f55b471e 100644
--- a/app/helpers/artist_versions_helper.rb
+++ b/app/helpers/artist_versions_helper.rb
@@ -1,8 +1,4 @@
module ArtistVersionsHelper
- def artist_versions_listing_type
- (params.dig(:search, :artist_id).present? && CurrentUser.is_member?) ? :revert : :standard
- end
-
def artist_version_other_names_diff(artist_version)
new_names = artist_version.other_names
old_names = artist_version.previous.try(:other_names)
diff --git a/app/helpers/note_versions_helper.rb b/app/helpers/note_versions_helper.rb
index c29996ef0..e020b5c45 100644
--- a/app/helpers/note_versions_helper.rb
+++ b/app/helpers/note_versions_helper.rb
@@ -1,34 +1,23 @@
module NoteVersionsHelper
- def note_versions_listing_type
- ((params.dig(:search, :post_id).present? || params.dig(:search, :note_id).present?) && CurrentUser.is_member?) ? :revert : :standard
- end
-
- def note_version_body_diff_info(note_version)
- previous = note_version.previous
- if previous.nil?
- return ""
- end
-
- html = ""
- if note_version.body == previous.body
- html += '(body not changed)'
- end
-
- html.html_safe
- end
-
def note_version_position_diff(note_version)
previous = note_version.previous
- html = "#{note_version.width}x#{note_version.height}"
- html += " #{note_version.x},#{note_version.y}"
+ html = "#{note_version.x},#{note_version.y}"
if previous.nil?
html
- elsif note_version.x == previous.x && note_version.y == previous.y && note_version.width == previous.width && note_version.height == previous.height
+ else
+ "#{previous.x},#{previous.y} -> " + html
+ end
+ end
+
+ def note_version_size_diff(note_version)
+ previous = note_version.previous
+
+ html = "#{note_version.width}x#{note_version.height}"
+ if previous.nil?
html
else
- html = '' + html + ''
- html.html_safe
+ "#{previous.width}x#{previous.height} -> " + html
end
end
end
diff --git a/app/helpers/pool_versions_helper.rb b/app/helpers/pool_versions_helper.rb
deleted file mode 100644
index 4c6fe01e8..000000000
--- a/app/helpers/pool_versions_helper.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-module PoolVersionsHelper
- def pool_versions_listing_type
- params.dig(:search, :pool_id).present? ? :revert : :standard
- end
-
- def pool_version_status_diff(pool_version)
- cur = pool_version
- prev = pool_version.previous
-
- return "New" if prev.blank?
-
- status = []
- status += ["Renamed"] if cur.name != prev.name
- status += ["DescChanged"] if cur.description != prev.description
- status += ["Deleted"] if cur.is_deleted? && !prev.is_deleted?
- status += ["Undeleted"] if !cur.is_deleted? && prev.is_deleted?
- status += ["Activated"] if cur.is_active? && !prev.is_active?
- status += ["Deactivated"] if !cur.is_active? && prev.is_active?
- status.join(" ")
- end
-
- def pool_page_diff(pool_version, other_version)
- pattern = Regexp.new('(?:<.+?>)|(?:\w+)|(?:[ \t]+)|(?:\r?\n)|(?:.+?)')
- DiffBuilder.new(pool_version.description, other_version.description, pattern).build
- end
-end
diff --git a/app/helpers/post_versions_helper.rb b/app/helpers/post_versions_helper.rb
index 3e354f7c1..062deebf4 100644
--- a/app/helpers/post_versions_helper.rb
+++ b/app/helpers/post_versions_helper.rb
@@ -1,8 +1,4 @@
module PostVersionsHelper
- def post_versions_listing_type
- params.dig(:search, :post_id).present? ? :revert : :standard
- end
-
def post_version_diff(post_version)
diff = post_version.diff(post_version.previous)
html = ''
diff --git a/app/helpers/wiki_page_versions_helper.rb b/app/helpers/wiki_page_versions_helper.rb
index 88a4b110d..0dd614045 100644
--- a/app/helpers/wiki_page_versions_helper.rb
+++ b/app/helpers/wiki_page_versions_helper.rb
@@ -1,21 +1,4 @@
module WikiPageVersionsHelper
- def wiki_page_versions_listing_type
- params.dig(:search, :wiki_page_id).present? ? :page : :global
- end
-
- def wiki_page_version_status_diff(wiki_page_version)
- cur = wiki_page_version
- prev = wiki_page_version.previous
-
- return "New" if prev.blank?
-
- status = []
- status += ["Renamed"] if cur.title != prev.title
- status += ["Deleted"] if cur.is_deleted? && !prev.is_deleted?
- status += ["Undeleted"] if !cur.is_deleted? && prev.is_deleted?
- status.join(" ")
- end
-
def wiki_other_names_diff(new_version, old_version)
new_names = new_version.other_names
old_names = old_version.other_names
@@ -23,9 +6,4 @@ module WikiPageVersionsHelper
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_body_diff(thispage, otherpage)
- pattern = Regexp.new('(?:<.+?>)|(?:\w+)|(?:[ \t]+)|(?:\r?\n)|(?:.+?)')
- DiffBuilder.new(thispage.body, otherpage.body, pattern).build
- end
end
diff --git a/app/javascript/src/styles/common/diffs.scss b/app/javascript/src/styles/common/diffs.scss
index 43a5bc9b3..f126b2e6d 100644
--- a/app/javascript/src/styles/common/diffs.scss
+++ b/app/javascript/src/styles/common/diffs.scss
@@ -39,3 +39,19 @@
color: var(--diff-list-obsolete-removed-color);
}
}
+
+.diff-body {
+ del {
+ background: var(--wiki-page-versions-diff-del-background);
+ text-decoration: none;
+ }
+
+ ins {
+ background: var(--wiki-page-versions-diff-ins-background);
+ text-decoration: none;
+ }
+
+ span.paragraph-mark {
+ opacity: 0.25;
+ }
+}
diff --git a/app/javascript/src/styles/common/versions.scss b/app/javascript/src/styles/common/versions.scss
new file mode 100644
index 000000000..5913cc2b1
--- /dev/null
+++ b/app/javascript/src/styles/common/versions.scss
@@ -0,0 +1,13 @@
+body.a-index {
+ div#p-revert-listing {
+ display: flex;
+
+ table.striped {
+ flex: 1;
+ }
+ }
+
+ div#p-revert-listing > article.post-preview {
+ margin-top: 2em;
+ }
+}
diff --git a/app/javascript/src/styles/specific/artist_commentary_versions.scss b/app/javascript/src/styles/specific/artist_commentary_versions.scss
new file mode 100644
index 000000000..c60410940
--- /dev/null
+++ b/app/javascript/src/styles/specific/artist_commentary_versions.scss
@@ -0,0 +1,15 @@
+div#c-artist-commentary-versions {
+ #a-index {
+ div.commentary-body-section {
+ padding: 0.5em;
+ margin-bottom: 0.5em;
+ border: var(--footer-border);
+ }
+
+ td.original-column,
+ td.translated-column {
+ padding-top: 0.5em;
+ vertical-align: top;
+ }
+ }
+}
diff --git a/app/javascript/src/styles/specific/pool_versions.scss b/app/javascript/src/styles/specific/pool_versions.scss
deleted file mode 100644
index 1d7d6c8e7..000000000
--- a/app/javascript/src/styles/specific/pool_versions.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-div#c-pool-versions {
- #a-diff {
- del {
- background: var(--wiki-page-versions-diff-del-background);
- text-decoration: none;
- }
-
- ins {
- background: var(--wiki-page-versions-diff-ins-background);
- text-decoration: none;
- }
-
- span.paragraph-mark {
- opacity: 0.25;
- }
- }
-}
\ No newline at end of file
diff --git a/app/javascript/src/styles/specific/post_versions.scss b/app/javascript/src/styles/specific/post_versions.scss
index a52116b41..7c8bf1f9b 100644
--- a/app/javascript/src/styles/specific/post_versions.scss
+++ b/app/javascript/src/styles/specific/post_versions.scss
@@ -10,9 +10,4 @@ body.c-post-versions.a-index {
.advanced-search-link {
margin: 0 1em;
}
-
- #p-revert-listing {
- display: flex;
- table#post-versions-table { flex: 1; }
- }
}
diff --git a/app/javascript/src/styles/specific/wiki_page_versions.scss b/app/javascript/src/styles/specific/wiki_page_versions.scss
index 15921873e..c83da2c0f 100644
--- a/app/javascript/src/styles/specific/wiki_page_versions.scss
+++ b/app/javascript/src/styles/specific/wiki_page_versions.scss
@@ -1,22 +1,18 @@
div#c-wiki-page-versions {
#a-diff {
- del, .wiki-other-names-diff-list .removed {
+ ul.wiki-other-names-diff-list li.removed {
background: var(--wiki-page-versions-diff-del-background);
text-decoration: none;
}
- ins, .wiki-other-names-diff-list .added {
+ ul.wiki-other-names-diff-list li.added {
background: var(--wiki-page-versions-diff-ins-background);
text-decoration: none;
}
- .wiki-other-names-diff-list .obsolete {
+ ul.wiki-other-names-diff-list li.obsolete {
text-decoration: dotted underline;
}
-
- span.paragraph-mark {
- opacity: 0.25;
- }
}
#a-index {
diff --git a/app/logical/diff_builder.rb b/app/logical/diff_builder.rb
index e3d7192ee..1d623261f 100644
--- a/app/logical/diff_builder.rb
+++ b/app/logical/diff_builder.rb
@@ -20,6 +20,14 @@ class DiffBuilder
output.each { |q| q.replace(escape_html[q]) }
diffs.reverse_each do |hunk|
+ old_cr = hunk[0].try(:old_element)
+ new_cr = hunk[1].try(:new_element)
+ if old_cr && new_cr && old_cr.match?(/^\r?\n$/) && new_cr.match?(/^\r?\n$/)
+ hunk_position = hunk[0].old_position
+ output[hunk_position] = '¶¶
'
+ next
+ end
+
newchange = hunk.max {|a, b| a.old_position <=> b.old_position}
newstart = newchange.old_position
oldstart = hunk.min {|a, b| a.old_position <=> b.old_position}.old_position
diff --git a/app/models/artist_commentary_version.rb b/app/models/artist_commentary_version.rb
index 0f90027d9..e362821cb 100644
--- a/app/models/artist_commentary_version.rb
+++ b/app/models/artist_commentary_version.rb
@@ -7,4 +7,24 @@ class ArtistCommentaryVersion < ApplicationRecord
q = q.search_attributes(params, :post, :updater, :original_title, :original_description, :translated_title, :translated_description)
q.apply_default_order(params)
end
+
+ def previous
+ @previous ||= begin
+ ArtistCommentaryVersion.where("post_id = ? and updated_at < ?", post_id, updated_at).order("updated_at desc").limit(1).to_a
+ end
+ @previous.first
+ end
+
+ def self.status_fields
+ {
+ original_title: "OrigTitle",
+ original_description: "OrigDesc",
+ translated_title: "TransTitle",
+ translated_description: "TransDesc",
+ }
+ end
+
+ def unchanged_empty?(field)
+ self[field].strip.empty? && (previous.nil? || previous[field].strip.empty?)
+ end
end
diff --git a/app/models/artist_version.rb b/app/models/artist_version.rb
index bfd9a92a9..d8486cae3 100644
--- a/app/models/artist_version.rb
+++ b/app/models/artist_version.rb
@@ -24,6 +24,46 @@ class ArtistVersion < ApplicationRecord
extend SearchMethods
def previous
- ArtistVersion.where("artist_id = ? and created_at < ?", artist_id, created_at).order("created_at desc").first
+ @previous ||= begin
+ ArtistVersion.where("artist_id = ? and created_at < ?", artist_id, created_at).order("created_at desc").limit(1).to_a
+ end
+ @previous.first
+ end
+
+ def self.status_fields
+ {
+ name: "Renamed",
+ urls_changed: "URLs",
+ other_names_changed: "OtherNames",
+ group_name: "GroupName",
+ was_deleted: "Deleted",
+ was_undeleted: "Undeleted",
+ was_banned: "Banned",
+ was_unbanned: "Unbanned",
+ }
+ end
+
+ def other_names_changed
+ ((other_names - previous.other_names) | (previous.other_names - other_names)).length > 0
+ end
+
+ def urls_changed
+ ((urls - previous.urls) | (previous.urls - urls)).length > 0
+ end
+
+ def was_deleted
+ !is_active && previous.is_active
+ end
+
+ def was_undeleted
+ is_active && !previous.is_active
+ end
+
+ def was_banned
+ is_banned && !previous.is_banned
+ end
+
+ def was_unbanned
+ !is_banned && previous.is_banned
end
end
diff --git a/app/models/note_version.rb b/app/models/note_version.rb
index 231cb73f4..0e65e5738 100644
--- a/app/models/note_version.rb
+++ b/app/models/note_version.rb
@@ -13,6 +13,35 @@ class NoteVersion < ApplicationRecord
end
def previous
- NoteVersion.where("note_id = ? and updated_at < ?", note_id, updated_at).order("updated_at desc").first
+ @previous ||= begin
+ NoteVersion.where("note_id = ? and updated_at < ?", note_id, updated_at).order("updated_at desc").limit(1).to_a
+ end
+ @previous.first
+ end
+
+ def self.status_fields
+ {
+ body: "Body",
+ was_moved: "Moved",
+ was_resized: "Resized",
+ was_deleted: "Deleted",
+ was_undeleted: "Undeleted",
+ }
+ end
+
+ def was_moved
+ x != previous.x || y != previous.y
+ end
+
+ def was_resized
+ width != previous.width || height != previous.height
+ end
+
+ def was_deleted
+ !is_active && previous.is_active
+ end
+
+ def was_undeleted
+ is_active && !previous.is_active
end
end
diff --git a/app/models/pool_archive.rb b/app/models/pool_archive.rb
index 8bb69f611..f2fe3b031 100644
--- a/app/models/pool_archive.rb
+++ b/app/models/pool_archive.rb
@@ -108,7 +108,41 @@ class PoolArchive < ApplicationRecord
end
def previous
- PoolArchive.where("pool_id = ? and version < ?", pool_id, version).order("version desc").first
+ @previous ||= begin
+ PoolArchive.where("pool_id = ? and version < ?", pool_id, version).order("version desc").limit(1).to_a
+ end
+ @previous.first
+ end
+
+ def self.status_fields
+ {
+ name: "Renamed",
+ description: "Description",
+ was_deleted: "Deleted",
+ was_undeleted: "Undeleted",
+ was_activated: "Activated",
+ was_deactivated: "Deactivated",
+ }
+ end
+
+ def was_deleted
+ is_deleted && !previous.is_deleted
+ end
+
+ def was_undeleted
+ !is_deleted && previous.is_deleted
+ end
+
+ def was_activated
+ is_active && !previous.is_active
+ end
+
+ def was_deactivated
+ !is_active && previous.is_active
+ end
+
+ def text_field_changed
+ previous.present? && (name_changed || description_changed)
end
def pretty_name
diff --git a/app/models/post_archive.rb b/app/models/post_archive.rb
index 83fdd3fed..454475ca8 100644
--- a/app/models/post_archive.rb
+++ b/app/models/post_archive.rb
@@ -92,19 +92,31 @@ class PostArchive < ApplicationRecord
end
def previous
- # HACK: if all the post versions for this post have already been preloaded,
- # we can use that to avoid a SQL query.
- if association(:post).loaded? && post && post.association(:versions).loaded?
- post.versions.sort_by(&:version).reverse.find { |v| v.version < version }
- else
- PostArchive.where("post_id = ? and version < ?", post_id, version).order("version desc").first
+ @previous ||= begin
+ # HACK: if all the post versions for this post have already been preloaded,
+ # we can use that to avoid a SQL query.
+ if association(:post).loaded? && post && post.association(:versions).loaded?
+ ver = [post.versions.sort_by(&:version).reverse.find { |v| v.version < version }]
+ else
+ ver = PostArchive.where("post_id = ? and version < ?", post_id, version).order("version desc").limit(1).to_a
+ end
end
+ @previous.first
end
def visible?
post&.visible?
end
+ def self.status_fields
+ {
+ tags: "Tags",
+ rating: "Rating",
+ parent_id: "Parent",
+ source: "Source",
+ }
+ end
+
def diff(version = nil)
if post.nil?
latest_tags = tag_array
diff --git a/app/models/wiki_page_version.rb b/app/models/wiki_page_version.rb
index 3dbdec763..e5d03ccfd 100644
--- a/app/models/wiki_page_version.rb
+++ b/app/models/wiki_page_version.rb
@@ -23,7 +23,32 @@ class WikiPageVersion < ApplicationRecord
end
def previous
- WikiPageVersion.where("wiki_page_id = ? and id < ?", wiki_page_id, id).order("id desc").first
+ @previous ||= begin
+ WikiPageVersion.where("wiki_page_id = ? and id < ?", wiki_page_id, id).order("id desc").limit(1).to_a
+ end
+ @previous.first
+ end
+
+ def self.status_fields
+ {
+ body: "Body",
+ other_names_changed: "OtherNames",
+ title: "Renamed",
+ was_deleted: "Deleted",
+ was_undeleted: "Undeleted",
+ }
+ end
+
+ def other_names_changed
+ ((other_names - previous.other_names) | (previous.other_names - other_names)).length > 0
+ end
+
+ def was_deleted
+ is_deleted && !previous.is_deleted
+ end
+
+ def was_undeleted
+ !is_deleted && previous.is_deleted
end
def category_name
diff --git a/app/views/artist_commentary_versions/_listing.html.erb b/app/views/artist_commentary_versions/_listing.html.erb
index 2f2e1f18d..fd4fb089d 100644
--- a/app/views/artist_commentary_versions/_listing.html.erb
+++ b/app/views/artist_commentary_versions/_listing.html.erb
@@ -1,33 +1,60 @@
-