From 8531636330fffdf7b9ca56abd538971a7d0145d1 Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Mon, 6 Jan 2020 22:05:27 +0000 Subject: [PATCH 1/5] Change Desc Chg column to status column - Add a diff column - Reword post column name for better clarity --- app/helpers/pool_versions_helper.rb | 15 +++++++++++++++ app/views/pool_versions/_listing.html.erb | 9 ++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/app/helpers/pool_versions_helper.rb b/app/helpers/pool_versions_helper.rb index c52d6f44c..2e8184feb 100644 --- a/app/helpers/pool_versions_helper.rb +++ b/app/helpers/pool_versions_helper.rb @@ -3,4 +3,19 @@ module PoolVersionsHelper 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 end diff --git a/app/views/pool_versions/_listing.html.erb b/app/views/pool_versions/_listing.html.erb index 389db36de..a4ef76d2e 100644 --- a/app/views/pool_versions/_listing.html.erb +++ b/app/views/pool_versions/_listing.html.erb @@ -1,18 +1,21 @@
<%= table_for @pool_versions, {class: "striped autofit", width: "100%"} do |t| %> + <% t.column th: {width: "3%"} do |pool_version| %> + <%= link_to_if pool_version.previous.present?, "diff", diff_pool_version_path(pool_version.id) %> + <% end %> <% t.column "Pool" 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 }), class: "pool-category-#{pool_version.pool.category}" %> <% end %> - <% t.column "Changes", td: { class: "col-expand" } do |pool_version| %> + <% t.column "Post Changes", td: { class: "col-expand" } do |pool_version| %> <%= render "pool_versions/diff", diff: pool_version.build_diff %> <% 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 }) %> <% end %> - <% t.column "Desc Chg" do |pool_version| %> - <%= link_to_if pool_version.description_changed, pool_version.description_changed, diff_pool_version_path(pool_version.id) %> + <% t.column "Status", td: {class: "col-expand"} do |pool_version| %> + <%= pool_version_status_diff(pool_version) %> <% end %> <% t.column "Updater" do |pool_version| %> <% if pool_version.updater %> From 4ab90e5d6e7d77f5e8b4209e7d57df72069ae9e5 Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Tue, 7 Jan 2020 00:18:50 +0000 Subject: [PATCH 2/5] Move diff logic out of helper --- app/helpers/wiki_page_versions_helper.rb | 60 +++------------------- app/logical/diff_builder.rb | 57 ++++++++++++++++++++ app/views/wiki_page_versions/diff.html.erb | 5 +- 3 files changed, 68 insertions(+), 54 deletions(-) create mode 100644 app/logical/diff_builder.rb diff --git a/app/helpers/wiki_page_versions_helper.rb b/app/helpers/wiki_page_versions_helper.rb index 0f0d7e3f2..f68ab5c63 100644 --- a/app/helpers/wiki_page_versions_helper.rb +++ b/app/helpers/wiki_page_versions_helper.rb @@ -12,59 +12,13 @@ module WikiPageVersionsHelper status.join(" ") end - def wiki_page_diff(thispage, otherpage) + def wiki_other_names_diff(thispage, otherpage) + pattern = Regexp.new('\S+|\s+') + DiffBuilder.new("#{thispage.other_names}\n\n", "#{otherpage.other_names}\n\n", pattern).build + end + + def wiki_body_diff(thispage, otherpage) pattern = Regexp.new('(?:<.+?>)|(?:\w+)|(?:[ \t]+)|(?:\r?\n)|(?:.+?)') - other_names_pattern = Regexp.new('\S+|\s+') - - thisarr = thispage.body.scan(pattern) - otharr = otherpage.body.scan(pattern) - - if thispage.other_names.present? || otherpage.other_names.present? - thisarr = "#{thispage.other_names}\n\n".scan(other_names_pattern) + thisarr - otharr = "#{otherpage.other_names}\n\n".scan(other_names_pattern) + otharr - end - - cbo = Diff::LCS::ContextDiffCallbacks.new - diffs = thisarr.diff(otharr, cbo) - - escape_html = ->(str) {str.gsub(/&/, '&').gsub(//, '>')} - - output = thisarr - output.each { |q| q.replace(escape_html[q]) } - - diffs.reverse_each do |hunk| - 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 - - if newchange.action == '+' - output.insert(newstart, '') - end - - hunk.reverse_each do |chg| - case chg.action - when '-' - oldstart = chg.old_position - output[chg.old_position] = '
' if chg.old_element.match(/^\r?\n$/) - when '+' - if chg.new_element.match(/^\r?\n$/) - output.insert(chg.old_position, '
') - else - output.insert(chg.old_position, (escape_html[chg.new_element]).to_s) - end - end - end - - if newchange.action == '+' - output.insert(newstart, '') - end - - if hunk[0].action == '-' - output.insert((newstart == oldstart || newchange.action != '+') ? newstart + 1 : newstart, '') - output.insert(oldstart, '') - end - end - - output.join.gsub(/\r?\n/, '
').html_safe + DiffBuilder.new(thispage.body, otherpage.body, pattern).build end end diff --git a/app/logical/diff_builder.rb b/app/logical/diff_builder.rb new file mode 100644 index 000000000..971f60cd9 --- /dev/null +++ b/app/logical/diff_builder.rb @@ -0,0 +1,57 @@ +class DiffBuilder + attr_reader :this_text, :that_text, :pattern + + def initialize(this_text, that_text, pattern) + @this_text = this_text + @that_text = that_text + @pattern = pattern + end + + def build + thisarr = this_text.scan(pattern) + otharr = that_text.scan(pattern) + + cbo = Diff::LCS::ContextDiffCallbacks.new + diffs = thisarr.diff(otharr, cbo) + + escape_html = ->(str) {str.gsub(/&/, '&').gsub(//, '>')} + + output = thisarr + output.each { |q| q.replace(escape_html[q]) } + + diffs.reverse_each do |hunk| + 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 + + if newchange.action == '+' + output.insert(newstart, '
') + end + + hunk.reverse_each do |chg| + case chg.action + when '-' + oldstart = chg.old_position + output[chg.old_position] = '
' if chg.old_element.match(/^\r?\n$/) + when '+' + if chg.new_element.match(/^\r?\n$/) + output.insert(chg.old_position, '
') + else + output.insert(chg.old_position, (escape_html[chg.new_element]).to_s) + end + end + end + + if newchange.action == '+' + output.insert(newstart, '') + end + + if hunk[0].action == '-' + output.insert((newstart == oldstart || newchange.action != '+') ? newstart + 1 : newstart, '') + output.insert(oldstart, '') + end + end + + output.join.gsub(/\r?\n/, '
').html_safe + end +end diff --git a/app/views/wiki_page_versions/diff.html.erb b/app/views/wiki_page_versions/diff.html.erb index b60410d8c..3aeb38afc 100644 --- a/app/views/wiki_page_versions/diff.html.erb +++ b/app/views/wiki_page_versions/diff.html.erb @@ -7,7 +7,10 @@

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_page_diff(@thispage, @otherpage) %> + <%= wiki_other_names_diff(@thispage, @otherpage) %> +
+
+ <%= wiki_body_diff(@thispage, @otherpage) %>
<% else %>

The artist requested removal of this page.

From 34542fdf5c2b17a2ac5d1a7a1633d225d7c8391e Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Tue, 7 Jan 2020 00:19:24 +0000 Subject: [PATCH 3/5] Pool versions diff: Use diff builder to highlight description changes - Add highlights for name changes - Separate and name the sections --- app/helpers/pool_versions_helper.rb | 7 +++- .../src/styles/specific/pool_versions.scss | 13 +++++++ app/views/pool_versions/diff.html.erb | 37 ++++++++++++++----- 3 files changed, 46 insertions(+), 11 deletions(-) create mode 100644 app/javascript/src/styles/specific/pool_versions.scss diff --git a/app/helpers/pool_versions_helper.rb b/app/helpers/pool_versions_helper.rb index 2e8184feb..a23ddbe43 100644 --- a/app/helpers/pool_versions_helper.rb +++ b/app/helpers/pool_versions_helper.rb @@ -18,4 +18,9 @@ module PoolVersionsHelper status += ["Deactivated"] if !cur.is_active? && prev.is_active? status.join(" ") end -end + + def pool_page_diff(pool_version, other_version) + pattern = Regexp.new('(?:<.+?>)|(?:\w+)|(?:[ \t]+)|(?:\r?\n)|(?:.+?)') + DiffBuilder.new(other_version.description, pool_version.description, pattern).build + end +end \ No newline at end of file diff --git a/app/javascript/src/styles/specific/pool_versions.scss b/app/javascript/src/styles/specific/pool_versions.scss new file mode 100644 index 000000000..a7042242b --- /dev/null +++ b/app/javascript/src/styles/specific/pool_versions.scss @@ -0,0 +1,13 @@ +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; + } + } +} \ No newline at end of file diff --git a/app/views/pool_versions/diff.html.erb b/app/views/pool_versions/diff.html.erb index af13e23be..0bc5ca364 100644 --- a/app/views/pool_versions/diff.html.erb +++ b/app/views/pool_versions/diff.html.erb @@ -2,16 +2,33 @@

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

-
    -
  • - Posts: - <%= render "pool_versions/diff", diff: @pool_version.build_diff(@other_version) %> -
  • - <% if @other_version %> -
  • Old Desc: <%= @other_version.description %>
  • - <% end %> -
  • New Desc: <%= @pool_version.description %>
  • -
+ <% 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 %> + <%= pool_page_diff(@pool_version, @other_version) %> + <% else %> + Unchanged. + <% end %> +

+
+ <% end %>
From 9182a4f556be61aa0f50133673bcdc9ea6419c58 Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Tue, 7 Jan 2020 02:31:45 +0000 Subject: [PATCH 4/5] Highlight carriage return changes --- app/javascript/src/styles/specific/pool_versions.scss | 4 ++++ app/javascript/src/styles/specific/wiki_page_versions.scss | 4 ++++ app/logical/diff_builder.rb | 6 +++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/javascript/src/styles/specific/pool_versions.scss b/app/javascript/src/styles/specific/pool_versions.scss index a7042242b..1d7d6c8e7 100644 --- a/app/javascript/src/styles/specific/pool_versions.scss +++ b/app/javascript/src/styles/specific/pool_versions.scss @@ -9,5 +9,9 @@ div#c-pool-versions { 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/wiki_page_versions.scss b/app/javascript/src/styles/specific/wiki_page_versions.scss index 9fa6d6da5..e5ffb6769 100644 --- a/app/javascript/src/styles/specific/wiki_page_versions.scss +++ b/app/javascript/src/styles/specific/wiki_page_versions.scss @@ -9,6 +9,10 @@ div#c-wiki-page-versions { background: var(--wiki-page-versions-diff-ins-background); text-decoration: none; } + + span.paragraph-mark { + opacity: 0.25; + } } #a-index { diff --git a/app/logical/diff_builder.rb b/app/logical/diff_builder.rb index 971f60cd9..deacc480d 100644 --- a/app/logical/diff_builder.rb +++ b/app/logical/diff_builder.rb @@ -32,10 +32,10 @@ class DiffBuilder case chg.action when '-' oldstart = chg.old_position - output[chg.old_position] = '
' if chg.old_element.match(/^\r?\n$/) + output[chg.old_position] = '
' if chg.old_element.match(/^\r?\n$/) when '+' if chg.new_element.match(/^\r?\n$/) - output.insert(chg.old_position, '
') + output.insert(chg.old_position, '
') else output.insert(chg.old_position, (escape_html[chg.new_element]).to_s) end @@ -52,6 +52,6 @@ class DiffBuilder end end - output.join.gsub(/\r?\n/, '
').html_safe + output.join.gsub(/\r?\n/, '
').html_safe end end From ad1e22af0bb86e9a11485493340465f755118b73 Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Tue, 7 Jan 2020 01:34:47 +0000 Subject: [PATCH 5/5] Add search page - Fix issue with updater_name erroring out - Add search options is_new and name_changed --- app/controllers/pool_versions_controller.rb | 3 ++ app/models/pool_archive.rb | 30 ++++++++++++++++++- .../pool_versions/_secondary_links.html.erb | 5 ++++ app/views/pool_versions/diff.html.erb | 2 +- app/views/pool_versions/index.html.erb | 2 +- app/views/pool_versions/search.html.erb | 19 ++++++++++++ config/routes.rb | 3 ++ 7 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 app/views/pool_versions/_secondary_links.html.erb create mode 100644 app/views/pool_versions/search.html.erb diff --git a/app/controllers/pool_versions_controller.rb b/app/controllers/pool_versions_controller.rb index 27b718fcd..392556196 100644 --- a/app/controllers/pool_versions_controller.rb +++ b/app/controllers/pool_versions_controller.rb @@ -12,6 +12,9 @@ class PoolVersionsController < ApplicationController respond_with(@pool_versions) end + def search + end + def diff @pool_version = PoolArchive.find(params[:id]) diff --git a/app/models/pool_archive.rb b/app/models/pool_archive.rb index 288f12588..96a397b53 100644 --- a/app/models/pool_archive.rb +++ b/app/models/pool_archive.rb @@ -21,14 +21,34 @@ class PoolArchive < ApplicationRecord where_array_includes_any(:added_post_ids, [post_id]).or(where_array_includes_any(:removed_post_ids, [post_id])) end + def name_matches(name) + name = normalize_name_for_search(name) + name = "*#{name}*" unless name =~ /\*/ + where_ilike(:name, name) + end + def search(params) q = super - q = q.search_attributes(params, :pool_id, :post_ids, :added_post_ids, :removed_post_ids, :updater, :description, :description_changed, :name, :name_changed, :version, :is_active, :is_deleted, :category) + q = q.search_attributes(params, :pool_id, :post_ids, :added_post_ids, :removed_post_ids, :updater_id, :description, :description_changed, :name, :name_changed, :version, :is_active, :is_deleted, :category) if params[:post_id] q = q.for_post_id(params[:post_id].to_i) end + if params[:name_matches].present? + q = q.name_matches(params[:name_matches]) + end + + if params[:updater_name].present? + q = q.where(updater_id: User.name_to_id(params[:updater_name])) + end + + if params[:is_new].to_s.truthy? + q = q.where(version: 1) + elsif params[:is_new].to_s.falsy? + q = q.where("version != 1") + end + q.apply_default_order(params) end end @@ -61,6 +81,14 @@ class PoolArchive < ApplicationRecord sqs_service.send_message(msg, message_group_id: "pool:#{pool.id}") end + def self.normalize_name(name) + name.gsub(/[_[:space:]]+/, "_").gsub(/\A_|_\z/, "") + end + + def self.normalize_name_for_search(name) + normalize_name(name).mb_chars.downcase + end + def build_diff(other = previous) diff = {} diff --git a/app/views/pool_versions/_secondary_links.html.erb b/app/views/pool_versions/_secondary_links.html.erb new file mode 100644 index 000000000..baecd6434 --- /dev/null +++ b/app/views/pool_versions/_secondary_links.html.erb @@ -0,0 +1,5 @@ +<% content_for(:secondary_links) do %> + <%= quick_search_form_for(:name_matches, pool_versions_path, "pools", autocomplete: "pool") %> + <%= subnav_link_to "Listing", pool_versions_path %> + <%= subnav_link_to "Search", search_pool_versions_path %> +<% end %> diff --git a/app/views/pool_versions/diff.html.erb b/app/views/pool_versions/diff.html.erb index 0bc5ca364..6da3c0ec9 100644 --- a/app/views/pool_versions/diff.html.erb +++ b/app/views/pool_versions/diff.html.erb @@ -32,7 +32,7 @@ -<%= render "pools/secondary_links" %> +<%= render "secondary_links" %> <% content_for(:page_title) do %> Pool Version Comparison - <%= @pool_version.name %> - <%= Danbooru.config.app_name %> diff --git a/app/views/pool_versions/index.html.erb b/app/views/pool_versions/index.html.erb index 988d2279e..ceba9f95c 100644 --- a/app/views/pool_versions/index.html.erb +++ b/app/views/pool_versions/index.html.erb @@ -8,4 +8,4 @@ -<%= render "pools/secondary_links" %> +<%= render "secondary_links" %> diff --git a/app/views/pool_versions/search.html.erb b/app/views/pool_versions/search.html.erb new file mode 100644 index 000000000..da689feba --- /dev/null +++ b/app/views/pool_versions/search.html.erb @@ -0,0 +1,19 @@ +
+ +
+ +<%= render "secondary_links" %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index b82a84b5a..03ebe37c9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -191,6 +191,9 @@ Rails.application.routes.draw do member do get :diff end + collection do + get :search + end end resources :post_replacements, :only => [:index, :new, :create, :update] resources :post_votes, only: [:index]