diff --git a/app/models/dtext_link.rb b/app/models/dtext_link.rb index caa77689a..d091d33e1 100644 --- a/app/models/dtext_link.rb +++ b/app/models/dtext_link.rb @@ -24,10 +24,38 @@ class DtextLink < ApplicationRecord where(model_id: WikiPage.search(params).reorder(nil)) end + def self.linked_wiki_exists(exists = true) + dtext_links = DtextLink.arel_table + wiki_pages = WikiPage.arel_table + wiki_exists = wiki_pages.project(1).where(wiki_pages[:is_deleted].eq(false)).where(wiki_pages[:title].eq(dtext_links[:link_target])).exists + + if exists + where(link_type: :wiki_link).where(wiki_exists) + else + where(link_type: :wiki_link).where.not(wiki_exists) + end + end + + def self.linked_tag_exists(exists = true) + dtext_links = DtextLink.arel_table + tags = Tag.arel_table + tag_exists = tags.project(1).where(tags[:post_count].gt(0)).where(tags[:name].eq(dtext_links[:link_target])).exists + + if exists + where(link_type: :wiki_link).where(tag_exists) + else + where(link_type: :wiki_link).where.not(tag_exists) + end + end + def self.search(params) q = super q = q.search_attributes(params, :model_type, :model_id, :link_type, :link_target) + q = q.model_matches(params[:model]) + q = q.linked_wiki_exists(params[:linked_wiki_exists].truthy?) if params[:linked_wiki_exists].present? + q = q.linked_tag_exists(params[:linked_tag_exists].truthy?) if params[:linked_tag_exists].present? + q.apply_default_order(params) end diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 090127c24..a51ac57bd 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -52,6 +52,10 @@ class WikiPage < ApplicationRecord end end + def tag_matches(params) + where(title: Tag.search(params).select(:name).reorder(nil)) + end + def default_order order(updated_at: :desc) end @@ -70,6 +74,10 @@ class WikiPage < ApplicationRecord q = q.other_names_match(params[:other_names_match]) end + if params[:tag].present? + q = q.tag_matches(params[:tag]) + end + if params[:hide_deleted].to_s.truthy? q = q.where("is_deleted = false") end diff --git a/app/views/dtext_links/index.html.erb b/app/views/dtext_links/index.html.erb index 5fc1b8b43..812888ebf 100644 --- a/app/views/dtext_links/index.html.erb +++ b/app/views/dtext_links/index.html.erb @@ -5,7 +5,14 @@ <%= fa.input :title, label: "Wiki", hint: "Use * for wildcard", input_html: { value: params.dig(:search, :model, :title), "data-autocomplete": "wiki-page" } %> <% end %> <%= f.input :link_target_ilike, label: "Link", hint: "Use * for wildcard", input_html: { value: params[:search][:link_target_ilike], data: { autocomplete: "wiki-page" } } %> - <%= f.input :link_type, label: "Type", collection: [["Wiki", "0"], ["External", "1"]], include_blank: true, selected: params[:search][:link_type] %> + <%= f.simple_fields_for :model do |fm| %> + <%= fm.simple_fields_for :tag do |ft| %> + <%= ft.input :category, label: "Wiki Type", collection: TagCategory.canonical_mapping.to_a, include_blank: true, selected: params.dig(:search, :model, :tag, :category) %> + <% end %> + <% end %> + <%= f.input :link_type, label: "Link Type", collection: [["Wiki", "0"], ["External", "1"]], include_blank: true, selected: params[:search][:link_type] %> + <%= f.input :linked_wiki_exists, label: "Wiki Exists?", collection: ["Yes", "No"], include_blank: true, selected: params[:search][:linked_wiki_exists] %> + <%= f.input :linked_tag_exists, label: "Tag Exists?", collection: ["Yes", "No"], include_blank: true, selected: params[:search][:linked_tag_exists] %> <%= f.submit "Search" %> <% end %>