Merge pull request #3666 from evazion/fix-3664

Fix #3664: Highlight non-gentags in post tooltip
This commit is contained in:
Albert Yi
2018-04-26 11:40:59 -07:00
committed by GitHub
17 changed files with 2820 additions and 92 deletions

View File

@@ -6,6 +6,7 @@
//= require jquery.storageapi.js
//= require jquery.dropdown.min.js
//= require jquery.hammer.js
//= require jquery.qtip.js
//= require ugoira_player.js
//= require stupidtable.js
//= require rails.js

View File

@@ -0,0 +1,51 @@
Danbooru.PostTooltip = {};
Danbooru.PostTooltip.render_tooltip = function (event, qtip) {
var post_id = $(event.target).parents("[data-id]").data("id");
return $.get("/posts/" + post_id, { variant: "tooltip" }).done(function () {
qtip.elements.tooltip.removeClass("post-tooltip-loading");
});
};
// http://qtip2.com/options
Danbooru.PostTooltip.QTIP_OPTIONS = {
style: "qtip-light post-tooltip",
content: Danbooru.PostTooltip.render_tooltip,
overwrite: false,
position: {
my: "top left",
at: "bottom left",
target: "mouse",
viewport: $(window),
adjust: {
mouse: false,
y: 25,
method: "shift",
},
},
show: {
solo: true,
delay: 300,
effect: false,
ready: true,
event: "mouseenter",
},
hide: {
delay: 50,
fixed: true,
effect: false,
event: "mouseleave",
},
events: {
show: function (event, qtip) { qtip.elements.tooltip.addClass("post-tooltip-loading"); },
},
};
Danbooru.PostTooltip.initialize = function () {
$(document).on("mouseenter", ".post-preview img", function (event) {
$(this).qtip(Danbooru.PostTooltip.QTIP_OPTIONS, event);
});
};
$(document).ready(Danbooru.PostTooltip.initialize);

View File

@@ -4,8 +4,6 @@
Danbooru.Post.pending_update_count = 0;
Danbooru.Post.initialize_all = function() {
this.initialize_post_previews();
if ($("#c-posts").length) {
this.initialize_shortcuts();
this.initialize_saved_searches();
@@ -321,28 +319,6 @@
});
}
Danbooru.Post.initialize_post_previews = function() {
$(".post-preview").each(function(i, v) {
Danbooru.Post.initialize_title_for(v);
});
}
Danbooru.Post.initialize_title_for = function(post) {
var $post = $(post);
var $img = $post.find("img");
var score = null;
if ($post.data("views")) {
score = " views:" + $post.data("views");
} else {
score = " score:" + $post.data("score");
}
var uploader = " ";
if ($post.attr("data-uploader")) {
uploader += "user:" + $post.attr("data-uploader").replace(/_/g, " ");
}
$img.attr("title", $post.attr("data-tags") + uploader + " rating:" + $post.data("rating") + score);
}
Danbooru.Post.expand_image = function(e) {
if (Danbooru.test_max_width(660)) {
// just do the default behavior
@@ -519,7 +495,6 @@
if (data.has_visible_children) {
$post.addClass("post-status-has-children");
}
Danbooru.Post.initialize_title_for($post);
}
Danbooru.Post.vote = function(score, id) {

View File

@@ -1,10 +1,11 @@
@import "jquery-ui-1.11.2.min.scss";
@import "jquery.dropdown.scss";
@import "jquery.qtip.css";
@import "common/*";
// @import wildcards don't work with .erb files. Put .erb files in a separate
// directory and load them explicitly to work around this.
// https://github.com/rails/sass-rails/issues/185
@import "specific/*";
@import "specific/erb/posts";
@import "specific/erb/mod_queue";
@import "common/erb/tags";

View File

@@ -0,0 +1,33 @@
<% TagCategory.css_mapping.each do |category,cssmap| %>
.category-<%= category %> a, a.tag-type-<%= category %>, .ui-state-focus a.tag-type-<%= category %> {
color: <%= cssmap["color"] %>;
&:hover {
color: <%= cssmap["hover"] %>;
}
}
<% end %>
.category-banned a, a.tag-type-banned, .ui-state-focus a.tag-type-banned {
color: black;
background-color: red;
}
.inline-tag-list {
ul {
display: inline;
li {
display: inline;
margin-right: 0.5em;
}
}
}
.split-inline-tag-list {
@extend .inline-tag-list;
ul {
display: block;
}
}

View File

@@ -66,12 +66,6 @@ div#c-comments {
margin-right: 0.3em;
}
div.list-of-tags {
a {
margin-right: 0.5em;
}
}
div.notices {
margin: 1em 0;
}
@@ -133,12 +127,6 @@ div#c-comments {
div.post.blacklisted.blacklisted-active {
display: none;
}
div.list-of-tags {
span {
display: inline-block;
}
}
}
}

View File

@@ -0,0 +1,12 @@
.post-tooltip {
max-width: 660px;
border-color: #767676;
.qtip-content {
padding: 4px 6px;
}
&.post-tooltip-loading {
display: none !important;
}
}

View File

@@ -1,4 +1,4 @@
@import "../../common/000_vars.scss";
@import "../common/000_vars.scss";
article.post-preview {
height: 154px;
@@ -179,21 +179,6 @@ body[data-user-can-approve-posts="true"] .post-preview {
}
}
<% TagCategory.css_mapping.each do |category,cssmap| %>
.category-<%= category %> a, a.tag-type-<%= category %>, .ui-state-focus a.tag-type-<%= category %> {
color: <%= cssmap["color"] %>;
&:hover {
color: <%= cssmap["hover"] %>;
}
}
<% end %>
.category-banned a, a.tag-type-banned,, .ui-state-focus a.tag-type-banned {
color: black;
background-color: red;
}
.post-count {
color: #CCC;
margin-left: 0.2em;

View File

@@ -9,6 +9,7 @@ class ApplicationController < ActionController::Base
before_action :set_started_at_session
before_action :api_check
before_action :set_safe_mode
before_action :set_variant
# before_action :secure_cookies_check
layout "default"
helper_method :show_moderation_notice?
@@ -184,6 +185,10 @@ class ApplicationController < ActionController::Base
end
end
def set_variant
request.variant = params[:variant].try(:to_sym)
end
User::Roles.each do |role|
define_method("#{role}_only") do
if !CurrentUser.user.is_banned_or_ip_banned? && CurrentUser.user.__send__("is_#{role}?")

View File

@@ -31,7 +31,10 @@ class PostsController < ApplicationController
include_deleted = @post.is_deleted? || (@post.parent_id.present? && @post.parent.is_deleted?) || CurrentUser.user.show_deleted_children?
@parent_post_set = PostSets::PostRelationship.new(@post.parent_id, :include_deleted => include_deleted)
@children_post_set = PostSets::PostRelationship.new(@post.id, :include_deleted => include_deleted)
respond_with(@post)
respond_with(@post) do |format|
format.html.tooltip { render layout: false }
end
end
def show_seq

View File

@@ -113,6 +113,10 @@ module ApplicationHelper
link_to ip, moderator_ip_addrs_path(:search => {:ip_addr => ip})
end
def link_to_search(search)
link_to search, posts_path(tags: search)
end
def link_to_wiki(*wiki_titles, **options)
links = wiki_titles.map do |title|
link_to title.tr("_", " "), wiki_pages_path(title: title)

View File

@@ -1,5 +1,6 @@
class PostPresenter < Presenter
attr_reader :pool, :next_post_in_pool
delegate :tag_list_html, :split_tag_list_html, :inline_tag_list_html, :split_inline_tag_list_html, to: :tag_set_presenter
def self.preview(post, options = {})
if post.nil?
@@ -162,10 +163,6 @@ class PostPresenter < Presenter
categorized_tag_groups.join(" \n")
end
def humanized_categorized_tag_string
categorized_tag_groups.flatten.slice(0, 25).join(", ").tr("_", " ")
end
def safe_mode_message(template)
html = ["This image is unavailable on safe mode (#{Danbooru.config.app_name}). Go to "]
html << template.link_to("Danbooru", "https://danbooru.donmai.us") # XXX don't hardcode.
@@ -193,18 +190,6 @@ class PostPresenter < Presenter
end
end
def tag_list_html(template, options = {})
tag_set_presenter.tag_list_html(template, options.merge(:show_extra_links => CurrentUser.user.is_gold?))
end
def split_tag_list_html(template, options = {})
tag_set_presenter.split_tag_list_html(template, options.merge(:show_extra_links => CurrentUser.user.is_gold?))
end
def inline_tag_list_html(template)
tag_set_presenter.inline_tag_list(template)
end
def has_nav_links?(template)
has_sequential_navigation?(template.params) || @post.pools.undeleted.any? || @post.favorite_groups(active_id=template.params[:favgroup_id]).any?
end

View File

@@ -22,16 +22,16 @@ class TagSetPresenter < Presenter
html.html_safe
end
def split_tag_list_html(template, options = {})
def split_tag_list_html(template, category_list: TagCategory.split_header_list, headers: true, **options)
html = ""
TagCategory.split_header_list.each do |category|
category_list.each do |category|
typetags = typed_tags(category)
if typetags.any?
html << TagCategory.header_mapping[category]
html << TagCategory.header_mapping[category] if headers
html << %{<ul class="#{category}-tag-list">}
typetags.each do |tag|
html << build_list_item(tag, template, options)
html << build_list_item(tag, template, **options)
end
html << "</ul>"
end
@@ -41,17 +41,17 @@ class TagSetPresenter < Presenter
end
# compact (horizontal) list, as seen in the /comments index.
def inline_tag_list(template)
@tags.map do |tag_name|
<<-EOS
<span class="category-#{categories[tag_name]}">
#{template.link_to(tag_name.tr("_", " "), template.posts_path(tags: tag_name))}
</span>
EOS
end.join.html_safe
def inline_tag_list_html(template, classes: "inline-tag-list", **options)
html = split_tag_list_html(template, category_list: TagCategory.categorized_list, headers: false, name_only: true, humanize_tags: true, **options)
template.tag.span(html, class: classes)
end
private
def split_inline_tag_list_html(template, **options)
inline_tag_list_html(template, classes: "split-inline-tag-list", **options)
end
private
def typed_tags(name)
@typed_tags ||= {}
@typed_tags[name] ||= begin
@@ -72,34 +72,33 @@ private
end
end
def build_list_item(tag, template, options)
def build_list_item(tag, template, name_only: false, humanize_tags: true, show_extra_links: CurrentUser.is_gold?)
html = ""
html << %{<li class="category-#{categories[tag]}">}
current_query = template.params[:tags] || ""
unless options[:name_only]
unless name_only
if categories[tag] == Tag.categories.artist
html << %{<a class="wiki-link" href="/artists/show_or_new?name=#{u(tag)}">?</a> }
else
html << %{<a class="wiki-link" href="/wiki_pages/show_or_new?title=#{u(tag)}">?</a> }
end
if CurrentUser.user.is_gold? && current_query.present?
if show_extra_links && current_query.present?
html << %{<a rel="nofollow" href="/posts?tags=#{u(current_query)}+#{u(tag)}" class="search-inc-tag">+</a> }
html << %{<a rel="nofollow" href="/posts?tags=#{u(current_query)}+-#{u(tag)}" class="search-exl-tag">&ndash;</a> }
end
end
humanized_tag = tag.tr("_", " ")
path = options[:path_prefix] || "/posts"
humanized_tag = humanize_tags ? tag.tr("_", " ") : tag
if categories[tag] == Tag.categories.artist
itemprop = 'itemprop="author"'
else
itemprop = nil
end
html << %{<a class="search-tag" #{itemprop} href="#{path}?tags=#{u(tag)}">#{h(humanized_tag)}</a> }
html << %{<a class="search-tag" #{itemprop} href="/posts?tags=#{u(tag)}">#{h(humanized_tag)}</a> }
unless options[:name_only]
unless name_only
if counts[tag].to_i >= 10_000
post_count = "#{counts[tag].to_i / 1_000}k"
elsif counts[tag].to_i >= 1_000

View File

@@ -0,0 +1,7 @@
<%= @post.presenter.split_inline_tag_list_html(self) %>
<div class="post-tooltip-metatags">
<%= link_to_search "user:#{@post.uploader_name}" if CurrentUser.is_moderator? %>
<%= link_to_search "rating:#{@post.pretty_rating.downcase}" %>
<%= link_to_search "score:#{@post.score}" %>
</div>

View File

@@ -49,7 +49,7 @@
<span class="info">
<strong>Tags</strong>
<%= TagSetPresenter.new(upload.tag_string.split).inline_tag_list(self) %>
<%= TagSetPresenter.new(upload.tag_string.split).inline_tag_list_html(self) %>
</span>
</td>
<td>