dtext links: add search options for finding broken links.
Add "Wiki Exists?" and "Tag Exists?" options to /dtext_links. These can be used to find links to wikis or tags that don't exist (broken links).
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 %>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user