From 5d88d09d93ee0645ca5efc30649822f8b11106d4 Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Wed, 29 Jul 2020 00:31:16 +0000 Subject: [PATCH] Add search for a list of any changed tags This will facilitate users being able to monitor tag changes from a list of tags they are interested in. Currently, the only way to do this is 2 separate queries on the added_tags and removed_tags. --- app/models/post_version.rb | 12 ++++++++++-- app/views/post_versions/index.html.erb | 3 ++- app/views/post_versions/search.html.erb | 3 ++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/models/post_version.rb b/app/models/post_version.rb index a38ee2779..088041fc0 100644 --- a/app/models/post_version.rb +++ b/app/models/post_version.rb @@ -32,6 +32,10 @@ class PostVersion < ApplicationRecord end end + def changed_tags_include_any(tags) + where_array_includes_any(:added_tags, tags).or(where_array_includes_any(:removed_tags, tags)) + end + def tag_matches(string) tag = string.match(/\S+/)[0] return all if tag.nil? @@ -43,8 +47,12 @@ class PostVersion < ApplicationRecord q = super q = q.search_attributes(params, :updater_id, :post_id, :tags, :added_tags, :removed_tags, :rating, :rating_changed, :parent_id, :parent_changed, :source, :source_changed, :version) - if params[:changed_tags] - q = q.changed_tags_include_all(params[:changed_tags].scan(/[^[:space:]]+/)) + if params[:all_changed_tags] + q = q.changed_tags_include_all(params[:all_changed_tags].scan(/[^[:space:]]+/)) + end + + if params[:any_changed_tags] + q = q.changed_tags_include_any(params[:any_changed_tags].scan(/[^[:space:]]+/)) end if params[:tag_matches] diff --git a/app/views/post_versions/index.html.erb b/app/views/post_versions/index.html.erb index 246ecaac4..82e85628d 100644 --- a/app/views/post_versions/index.html.erb +++ b/app/views/post_versions/index.html.erb @@ -13,7 +13,8 @@ <%= f.input :updater_name, label: "Updater", input_html: { "data-autocomplete": "user", value: params.dig(:search, :updater_name) } %> <%= f.input :added_tags_include_all, label: "Added Tags", input_html: { "data-autocomplete": "tag-query", value: params.dig(:search, :added_tags_include_all) } %> <%= f.input :removed_tags_include_all, label: "Removed Tags", input_html: { "data-autocomplete": "tag-query", value: params.dig(:search, :removed_tags_include_all) } %> - <%= f.input :changed_tags, label: "Changed Tags", input_html: { "data-autocomplete": "tag-query", value: params.dig(:search, :changed_tags) } %> + <%= f.input :all_changed_tags, label: "All Changed Tags", input_html: { "data-autocomplete": "tag-query", value: params.dig(:search, :all_changed_tags) }, hint: "All tags must appear in either tag adds or removes" %> + <%= f.input :any_changed_tags, label: "Any Changed Tags", input_html: { "data-autocomplete": "tag-query", value: params.dig(:search, :any_changed_tags) }, hint: "Any tag must appear in either tag adds or removes" %> <%= f.submit "Search" %> <%= link_to "Advanced", search_post_versions_path(params.except(:controller, :action, :index, :commit, :type).permit!), class: "advanced-search-link" %> <% end %> diff --git a/app/views/post_versions/search.html.erb b/app/views/post_versions/search.html.erb index 5f862cb68..da3506350 100644 --- a/app/views/post_versions/search.html.erb +++ b/app/views/post_versions/search.html.erb @@ -7,7 +7,8 @@ <%= f.input :updater_name, label: "Updater", input_html: { value: params.dig(:search, :updater_name), "data-autocomplete": "user" } %> <%= f.input :added_tags_include_all, label: "Added tags", input_html: { value: params.dig(:search, :added_tags_include_all), "data-autocomplete": "tag-query" } %> <%= f.input :removed_tags_include_all, label: "Removed tags", input_html: { value: params.dig(:search, :removed_tags_include_all), "data-autocomplete": "tag-query" } %> - <%= f.input :changed_tags, label: "Changed tags", input_html: { value: params.dig(:search, :changed_tags), "data-autocomplete": "tag-query" } %> + <%= f.input :all_changed_tags, label: "All Changed Tags", input_html: { "data-autocomplete": "tag-query", value: params.dig(:search, :all_changed_tags) }, hint: "All tags must appear in either tag adds or removes" %> + <%= f.input :any_changed_tags, label: "Any Changed Tags", input_html: { "data-autocomplete": "tag-query", value: params.dig(:search, :any_changed_tags) }, hint: "Any tag must appear in either tag adds or removes" %> <%= f.input :post_id, input_html: { value: params.dig(:search, :post_id) } %> <%= f.input :parent_id, input_html: { value: params.dig(:search, :parent_id) } %> <%= f.input :rating, input_html: { value: params.dig(:search, :rating) } %>