diff --git a/app/controllers/artist_urls_controller.rb b/app/controllers/artist_urls_controller.rb index cd3c97e54..2b2ba419e 100644 --- a/app/controllers/artist_urls_controller.rb +++ b/app/controllers/artist_urls_controller.rb @@ -1,5 +1,5 @@ class ArtistUrlsController < ApplicationController - respond_to :json, :xml, :html + respond_to :js, :json, :xml, :html before_action :member_only, except: [:index] def index diff --git a/app/controllers/related_tags_controller.rb b/app/controllers/related_tags_controller.rb index 8acd30756..6697aa81b 100644 --- a/app/controllers/related_tags_controller.rb +++ b/app/controllers/related_tags_controller.rb @@ -1,10 +1,9 @@ class RelatedTagsController < ApplicationController - respond_to :json - respond_to :html, :only=>[:show] + respond_to :json, :xml, :js, :html, except: [:update] before_action :require_reportbooru_key, only: [:update] def show - @query = RelatedTagQuery.new(params[:query].to_s.downcase, params[:category]) + @query = RelatedTagQuery.new(params[:query], category: params[:category], translated_tags: params[:translated_tags], artists: params[:artists]) respond_with(@query) do |format| format.json do render :json => @query.to_json diff --git a/app/javascript/src/javascripts/posts.js.erb b/app/javascript/src/javascripts/posts.js.erb index 795c23e87..777c99fdb 100644 --- a/app/javascript/src/javascripts/posts.js.erb +++ b/app/javascript/src/javascripts/posts.js.erb @@ -2,7 +2,6 @@ import Utility from './utility' import Hammer from 'hammerjs' -import RelatedTag from './related_tag.js.erb' import Cookie from './cookie' import Note from './notes' import SavedSearch from './saved_searches' @@ -85,11 +84,6 @@ Post.initialize_edit_dialog = function() { Post.open_edit_dialog(); e.preventDefault(); }); - - $("#toggle-related-tags-link").on("click.danbooru", function(e) { - RelatedTag.toggle(); - e.preventDefault(); - }); } Post.open_edit_dialog = function() { @@ -102,14 +96,11 @@ Post.open_edit_dialog = function() { $("#share").hide(); $("#post-sections li").removeClass("active"); $("#post-edit-link").parent("li").addClass("active"); - $("#related-tags-container").show(); var $tag_string = $("#post_tag_string,#upload_tag_string"); $("div.input").has($tag_string).prevAll().hide(); $("#open-edit-dialog").hide(); - $("#toggle-related-tags-link").show().click(); - var dialog = $("
").attr("id", "edit-dialog"); $("#form").appendTo(dialog); dialog.dialog({ @@ -161,17 +152,19 @@ Post.open_edit_dialog = function() { $tag_string.css({"resize": "none", "width": "100%"}); $tag_string.focus().selectEnd().height($tag_string[0].scrollHeight); + + $(document).trigger("danbooru:show-post-edit-form"); + $(document).trigger("danbooru:open-post-edit-dialog"); } Post.close_edit_dialog = function(e, ui) { $("#form").appendTo($("#c-posts #edit,#c-uploads #a-new")); $("#edit-dialog").remove(); - RelatedTag.show(); - $("#toggle-related-tags-link").hide(); var $tag_string = $("#post_tag_string,#upload_tag_string"); $("div.input").has($tag_string).prevAll().show(); $("#open-edit-dialog").show(); $tag_string.css({"resize": "", "width": ""}); + $(document).trigger("danbooru:close-post-edit-dialog"); } Post.initialize_similar = function() { @@ -439,9 +432,8 @@ Post.initialize_post_sections = function() { $("#comments").hide(); $("#share").hide(); $("#post_tag_string").focus().selectEnd().height($("#post_tag_string")[0].scrollHeight); - $("#related-tags-button").trigger("click"); - $("#fetch-data-manual").trigger("click"); $("#recommended").hide(); + $(document).trigger("danbooru:show-post-edit-form"); } else if (e.target.hash === "#recommended") { $("#comments").hide(); $("#edit").hide(); diff --git a/app/javascript/src/javascripts/related_tag.js.erb b/app/javascript/src/javascripts/related_tag.js.erb index 85980c60e..85b749722 100644 --- a/app/javascript/src/javascripts/related_tag.js.erb +++ b/app/javascript/src/javascripts/related_tag.js.erb @@ -1,22 +1,18 @@ -import Upload from './uploads'; import Utility from './utility'; -import Cookie from './cookie'; let RelatedTag = {}; RelatedTag.initialize_all = function() { - if ($("#c-posts #a-show").length || $("#c-uploads #a-new").length) { - this.initialize_buttons(); - $("#upload_tag_string,#post_tag_string").on("keyup.danbooru.relatedTags", RelatedTag.update_selected); - $("#related-tags-container").on("click.danbooru", "#artist-related-tags-column a.del", RelatedTag.disable_artist_url) - } -} - -RelatedTag.initialize_buttons = function() { - this.common_bind("#related-tags-button", ""); - <% TagCategory.related_button_list.each do |category| %> - RelatedTag.common_bind("#related-<%= category %>-button", "<%= category %>"); // eslint-disable-line indent - <% end %> + RelatedTag.artists = []; + RelatedTag.translated_tags = []; + $(document).on("click.danbooru", ".related-tags-button", RelatedTag.on_click_related_tags_button); + $(document).on("click.danbooru", ".related-tags a.search-tag", RelatedTag.toggle_tag); + $(document).on("click.danbooru", "#show-related-tags-link, #hide-related-tags-link", RelatedTag.toggle); + $(document).on("keyup.danbooru.relatedTags", "#upload_tag_string, #post_tag_string", RelatedTag.update_selected); + $(document).on("danbooru:update-source-data", RelatedTag.on_update_source_data); + $(document).on("danbooru:show-post-edit-form", RelatedTag.on_show_post_edit_form); + $(document).on("danbooru:open-post-edit-dialog", RelatedTag.on_open_post_edit_dialog); + $(document).on("danbooru:close-post-edit-dialog", RelatedTag.on_close_post_edit_dialog); } RelatedTag.tags_include = function(name) { @@ -24,20 +20,40 @@ RelatedTag.tags_include = function(name) { return $.inArray(name.toLowerCase(), current) > -1; } -RelatedTag.common_bind = function(button_name, category) { - $(button_name).on("click.danbooru", function(e) { - var $dest = $("#related-tags"); - $dest.empty(); - RelatedTag.build_recent_and_frequent($dest); - $dest.append("Loading..."); - $.get("/related_tag.json", { - "query": RelatedTag.current_tag(), - "category": category - }, RelatedTag.process_response); - e.preventDefault(); +RelatedTag.update_related_tags = function (category = "") { + $.get("/related_tag.js", { + "query": RelatedTag.current_tag(), + "category": category, + "translated_tags": RelatedTag.translated_tags.join(" "), + "artists": RelatedTag.artists.join(" "), }); } +RelatedTag.on_open_post_edit_dialog = function(event) { + $("#related-tags-container").removeClass("visible").addClass("hidden"); +} + +RelatedTag.on_close_post_edit_dialog = function(event) { + $("#related-tags-container").removeClass("hidden").addClass("visible"); +} + +RelatedTag.on_show_post_edit_form = function(event) { + RelatedTag.update_related_tags(); + $("#fetch-data-manual").click(); +} + +RelatedTag.on_click_related_tags_button = function (event) { + const category = $(event.target).data("category"); + RelatedTag.update_related_tags(category); + $("#related-tags-container").removeClass("hidden").addClass("visible"); +} + +RelatedTag.on_update_source_data = function (event, source) { + Danbooru.RelatedTag.artists = source.artists.map(artist => artist.name); + Danbooru.RelatedTag.translated_tags = source.translated_tags.map(tag => tag[0]); + RelatedTag.update_related_tags(); +} + RelatedTag.current_tag = function() { // 1. abc def | -> def // 2. abc def| -> def @@ -86,11 +102,6 @@ RelatedTag.current_tag = function() { return string.slice(a, b); } -RelatedTag.process_response = function(data) { - RelatedTag.recent_search = data; - RelatedTag.build_all(); -} - RelatedTag.update_selected = function(e) { var current_tags = $("#upload_tag_string,#post_tag_string").val().toLowerCase().match(/\S+/g) || []; var $all_tags = $("#related-tags a"); @@ -103,165 +114,6 @@ RelatedTag.update_selected = function(e) { }); } -RelatedTag.build_all = function() { - if (RelatedTag.recent_search === null || RelatedTag.recent_search === undefined) { - return; - } - - RelatedTag.show(); - - var query = RelatedTag.recent_search.query; - var related_tags = RelatedTag.recent_search.tags; - var wiki_page_tags = RelatedTag.recent_search.wiki_page_tags; - var other_wikis = RelatedTag.recent_search.other_wikis; - var $dest = $("#related-tags"); - $dest.empty(); - - this.build_recent_and_frequent($dest); - - $dest.append(this.build_html(query, related_tags, "general")); - this.build_translated($dest); - if (wiki_page_tags.length) { - $dest.append(RelatedTag.build_html("wiki:" + query, wiki_page_tags, "wiki")); - } - $.each(other_wikis, function(i, wiki) { - $dest.append(RelatedTag.build_html("wiki:" + wiki.title, wiki.wiki_page_tags, "otherwiki" + i.toString())); - }); - if (RelatedTag.recent_artists) { - var tags = []; - if (RelatedTag.recent_artists.length === 0) { - tags.push([" none", 0]); - } else if (RelatedTag.recent_artists.length === 1) { - tags.push([RelatedTag.recent_artists[0].name, 1]); - if (RelatedTag.recent_artists[0].is_banned === true) { - tags.push(["BANNED_ARTIST", "banned"]); - } - $.each(RelatedTag.recent_artists[0].sorted_urls, function(i, url) { - var x = url.url; - if (!url.is_active) { - x = "-" + x; - } - tags.push([" " + x, 0]); - }); - } else if (RelatedTag.recent_artists.length >= 10) { - tags.push([" none", 0]); - } else { - $.each(RelatedTag.recent_artists, function(i, artist) { - tags.push([artist.name, 1]); - }); - } - $dest.append(RelatedTag.build_html("artist", tags, "artist", true)); - } -} - -RelatedTag.build_recent_and_frequent = function($dest) { - var recent_tags = Cookie.get("recent_tags_with_categories"); - var favorite_tags = Cookie.get("favorite_tags_with_categories"); - if (recent_tags.length) { - $dest.append(this.build_html("recent", this.other_tags(recent_tags), "recent")); - } - if (favorite_tags.length) { - $dest.append(this.build_html("frequent", this.other_tags(favorite_tags), "frequent")); - } -} - -RelatedTag.other_tags = function(string) { - if (string && string.length) { - return $.map(string.match(/\S+ \d+/g), function(x, i) { - var submatch = x.match(/(\S+) (\d+)/); - return [[submatch[1], submatch[2]]]; - }); - } else { - return []; - } -} - -RelatedTag.build_translated = function($dest) { - if (RelatedTag.translated_tags && RelatedTag.translated_tags.length) { - $dest.append(this.build_html("Translated Tags", RelatedTag.translated_tags, "translated")); - } -} - -RelatedTag.build_html = function(query, related_tags, name, is_wide_column) { - if (query === null || query === "") { - return ""; - } - - query = query.replace(/_/g, " "); - var header = $(""); - - var match = query.match(/^wiki:(.+)/); - if (match) { - header.html($("").attr("href", "/wiki_pages?title=" + encodeURIComponent(match[1])).attr("target", "_blank").text(query)); - } else { - header.text(query); - } - - var $div = $(""); - $div.attr("id", name + "-related-tags-column"); - $div.addClass("tag-column"); - if (is_wide_column) { - $div.addClass("wide-column"); - } - var $ul = $("