diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 9834213e1..31511217e 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -57,3 +57,4 @@ //= require vertices //= require watchlists //= require turbolinks +//= require search_tags \ No newline at end of file diff --git a/app/assets/javascripts/search_tags.js b/app/assets/javascripts/search_tags.js new file mode 100644 index 000000000..2aa798305 --- /dev/null +++ b/app/assets/javascripts/search_tags.js @@ -0,0 +1,19 @@ +$(document).on("turbolinks:load", function () { + $("#search_all_tags").change(evt => toggleSearchAllTags(evt)); +}); + +/** + * Dynamically enable/disable the OR/AND buttons in the media search form. + * If the user has decided to search for media regardless of the tags, + * i.e. they enable the "all" (tags) button, we disable the "OR/AND" buttons + * as it is pointless to search for media that references *all* available tags + * at once. + */ +function toggleSearchAllTags(evt) { + const searchAllTags = evt.target.checked; + if (searchAllTags) { + $("#search_tag_operator_or").prop("checked", true); + } + $("#search_tag_operator_or").prop("disabled", searchAllTags); + $("#search_tag_operator_and").prop("disabled", searchAllTags); +} diff --git a/app/controllers/media_controller.rb b/app/controllers/media_controller.rb index 23fd99052..a8efdbd2c 100644 --- a/app/controllers/media_controller.rb +++ b/app/controllers/media_controller.rb @@ -228,21 +228,6 @@ def search results = search.results @total = search.total - # in the case of a search with tag_operator 'or', we - # execute two searches and merge the results, where media - # with the selected tags are now shown at the front of the list - if (search_params[:tag_operator] == "or") \ - && (search_params[:all_tags] == "0") \ - && (search_params[:fulltext].size >= 2) - params["search"]["all_tags"] = "1" - search_no_tags = Medium.search_by(search_params, params[:page]) - search_no_tags.execute - results_no_tags = search_no_tags.results - results = (results + results_no_tags).uniq - @total = results.size - params["search"]["all_tags"] = "0" - end - if filter_media search_arel = Medium.where(id: results.pluck(:id)) visible_search_results = current_user.filter_visible_media(search_arel) diff --git a/app/models/medium.rb b/app/models/medium.rb index 0fe6faaa5..645371915 100644 --- a/app/models/medium.rb +++ b/app/models/medium.rb @@ -301,9 +301,6 @@ def self.search_by(search_params, _page) search_params[:all_terms] = "1" if search_params[:all_terms].blank? search_params[:all_teachers] = "1" if search_params[:all_teachers].blank? search_params[:term_ids].push("0") if search_params[:term_ids].present? - if search_params[:all_tags] == "1" && search_params[:tag_operator] == "and" - search_params[:tag_ids] = Tag.pluck(:id) - end user = User.find_by(id: search_params[:user_id]) search = Sunspot.new_search(Medium) search.build do @@ -336,15 +333,12 @@ def self.search_by(search_params, _page) with(:release_state, search_params[:access]) end end - if !search_params[:all_tags] == "1" && - !search_params[:tag_operator] == "or" && (search_params[:tag_ids]) - if search_params[:tag_operator] == "or" || search_params[:all_tags] == "1" - search.build do - with(:tag_ids).any_of(search_params[:tag_ids]) - end - else - search.build do + if search_params[:all_tags] == "0" && search_params[:tag_ids].any? + search.build do + if search_params[:tag_operator] == "and" with(:tag_ids).all_of(search_params[:tag_ids]) + else + with(:tag_ids).any_of(search_params[:tag_ids]) end end end diff --git a/app/views/main/start/_media_search.html.erb b/app/views/main/start/_media_search.html.erb index b836981b2..2a0f2dcfa 100644 --- a/app/views/main/start/_media_search.html.erb +++ b/app/views/main/start/_media_search.html.erb @@ -62,7 +62,8 @@ <%= f.radio_button :tag_operator, 'or', checked: true, - class: 'form-check-input' %> + class: 'form-check-input', + disabled: true %> <%= f.label :tag_operator, t('basics.OR'), value: 'or', @@ -71,7 +72,8 @@