FEATURE: Add solved icon for topic titles in search results and other topic lists

This commit is contained in:
Vinoth Kannan 2019-03-13 15:59:07 +05:30
parent bd5685c836
commit e9be43becd
4 changed files with 51 additions and 30 deletions

View File

@ -0,0 +1,19 @@
module TopicAnswerMixin
def self.included(klass)
klass.attributes :has_accepted_answer, :can_have_answer
end
def has_accepted_answer
object.custom_fields["accepted_answer_post_id"] ? true : false
end
def can_have_answer
return true if SiteSetting.allow_solved_on_all_topics
return false if object.closed || object.archived
return scope.allow_accepted_answers_on_category?(object.category_id)
end
def include_can_have_answer?
SiteSetting.empty_box_on_unsolved
end
end

View File

@ -1,6 +1,7 @@
import Topic from "discourse/models/topic"; import Topic from "discourse/models/topic";
import User from "discourse/models/user"; import User from "discourse/models/user";
import TopicStatus from "discourse/raw-views/topic-status"; import TopicStatus from "discourse/raw-views/topic-status";
import TopicStatusIcons from "discourse/helpers/topic-status-icons";
import { popupAjaxError } from "discourse/lib/ajax-error"; import { popupAjaxError } from "discourse/lib/ajax-error";
import { withPluginApi } from "discourse/lib/plugin-api"; import { withPluginApi } from "discourse/lib/plugin-api";
import { ajax } from "discourse/lib/ajax"; import { ajax } from "discourse/lib/ajax";
@ -64,6 +65,12 @@ function acceptPost(post) {
function initializeWithApi(api) { function initializeWithApi(api) {
const currentUser = api.getCurrentUser(); const currentUser = api.getCurrentUser();
TopicStatusIcons.addObject([
"has_accepted_answer",
"check-square-o",
"solved"
]);
api.includePostAttributes( api.includePostAttributes(
"can_accept_answer", "can_accept_answer",
"can_unaccept_answer", "can_unaccept_answer",
@ -219,7 +226,7 @@ export default {
results.push({ results.push({
openTag: "span", openTag: "span",
closeTag: "span", closeTag: "span",
title: I18n.t("solved.has_accepted_answer"), title: I18n.t("topic_statuses.solved.help"),
icon: "check-square-o" icon: "check-square-o"
}); });
} else if ( } else if (

View File

@ -19,3 +19,7 @@ en:
other: "solutions" other: "solutions"
accepted_html: "{{icon}} Solved <span class='by'>by <a href data-user-card='{{username_lower}}'>{{username}}</a></span> in <a href='{{post_path}}' class='back'>post #{{post_number}}</a>" accepted_html: "{{icon}} Solved <span class='by'>by <a href data-user-card='{{username_lower}}'>{{username}}</a></span> in <a href='{{post_path}}' class='back'>post #{{post_number}}</a>"
accepted_notification: "<p><span>{{username}}</span> {{description}}</p>" accepted_notification: "<p><span>{{username}}</span> {{description}}</p>"
topic_statuses:
solved:
help: "This topic has a solution"

View File

@ -18,6 +18,10 @@ register_asset 'stylesheets/solutions.scss'
after_initialize do after_initialize do
[
'../app/serializers/concerns/topic_answer_mixin.rb'
].each { |path| load File.expand_path(path, __FILE__) }
# we got to do a one time upgrade # we got to do a one time upgrade
if defined?(UserAction::SOLVED) if defined?(UserAction::SOLVED)
unless $redis.get('solved_already_upgraded') unless $redis.get('solved_already_upgraded')
@ -479,42 +483,29 @@ SQL
end end
require_dependency 'topic_list_item_serializer' require_dependency 'topic_list_item_serializer'
require_dependency 'listable_topic_serializer' require_dependency 'search_topic_list_item_serializer'
require_dependency 'suggested_topic_serializer'
require_dependency 'category_detailed_serializer'
require_dependency 'user_summary_serializer'
class ::TopicListItemSerializer class ::TopicListItemSerializer
attributes :has_accepted_answer, :can_have_answer include TopicAnswerMixin
def has_accepted_answer
object.custom_fields["accepted_answer_post_id"] ? true : false
end
def can_have_answer
return true if SiteSetting.allow_solved_on_all_topics
return false if object.closed || object.archived
return scope.allow_accepted_answers_on_category?(object.category_id)
end
def include_can_have_answer?
SiteSetting.empty_box_on_unsolved
end
end end
class ::ListableTopicSerializer class ::SearchTopicListItemSerializer
attributes :has_accepted_answer, :can_have_answer include TopicAnswerMixin
end
def has_accepted_answer class ::SuggestedTopicSerializer
object.custom_fields["accepted_answer_post_id"] ? true : false include TopicAnswerMixin
end end
def can_have_answer class ::CategoryDetailedSerializer
return true if SiteSetting.allow_solved_on_all_topics include TopicAnswerMixin
return false if object.closed || object.archived end
return scope.allow_accepted_answers_on_category?(object.category_id)
end
def include_can_have_answer? class ::UserSummarySerializer::TopicSerializer
SiteSetting.empty_box_on_unsolved include TopicAnswerMixin
end
end end
TopicList.preloaded_custom_fields << "accepted_answer_post_id" if TopicList.respond_to? :preloaded_custom_fields TopicList.preloaded_custom_fields << "accepted_answer_post_id" if TopicList.respond_to? :preloaded_custom_fields