import Component from "@glimmer/component"; import { on } from "@ember/modifier"; import { action } from "@ember/object"; import { service } from "@ember/service"; import { themePrefix } from "virtual:theme"; import PluginOutlet from "discourse/components/plugin-outlet"; import BulkSelectCheckbox from "discourse/components/topic-list/bulk-select-checkbox"; import TopicExcerpt from "discourse/components/topic-list/topic-excerpt"; import TopicLink from "discourse/components/topic-list/topic-link"; import UnreadIndicator from "discourse/components/topic-list/unread-indicator"; import TopicPostBadges from "discourse/components/topic-post-badges"; import TopicStatus from "discourse/components/topic-status"; import lazyHash from "discourse/helpers/lazy-hash"; import topicFeaturedLink from "discourse/helpers/topic-featured-link"; import { shortDateNoYear } from "discourse/lib/formatter"; import dAvatar from "discourse/ui-kit/helpers/d-avatar"; import { categoryLinkHTML } from "discourse/ui-kit/helpers/d-category-link"; import dConcatClass from "discourse/ui-kit/helpers/d-concat-class"; import dDiscourseTags from "discourse/ui-kit/helpers/d-discourse-tags"; import dFormatDate from "discourse/ui-kit/helpers/d-format-date"; import dIcon from "discourse/ui-kit/helpers/d-icon"; import dNumber from "discourse/ui-kit/helpers/d-number"; import { i18n } from "discourse-i18n"; import { topicWasUpdatedAfterLastPost } from "../../lib/topic-activity"; import { getTopicStatusBadge } from "../../lib/topic-status-badge"; export default class HighContextTopicCard extends Component { @service capabilities; get hasSolved() { return ( this.args.topic.has_accepted_answer || this.args.topic.accepted_answer ); } get hasVotes() { return this.args.topic.can_vote && this.args.topic.vote_count > 0; } get voteCountLabel() { return i18n(themePrefix("vote_count"), { count: this.args.topic.vote_count, }); } get hasAssigned() { return this.args.topic.assigned_to_user || this.hasIndirectAssignments; } get assignedUser() { return this.args.topic.assigned_to_user; } get hasIndirectAssignments() { const indirect = this.args.topic.indirectly_assigned_to; return indirect && Object.keys(indirect).length > 0; } get indirectAssignees() { const indirect = this.args.topic.indirectly_assigned_to; if (!indirect) { return []; } return Object.values(indirect).map((assignment) => ({ user: assignment.assigned_to, postNumber: assignment.post_number, })); } get hasTags() { return this.args.topic.tags?.length > 0; } get hasReplies() { return this.args.topic.replyCount > 0; } get hasLikes() { return this.args.topic.like_count > 0; } get replyCountLabel() { return i18n(themePrefix("reply_count"), { count: this.args.topic.replyCount, }); } get likeCountLabel() { return i18n(themePrefix("like_count"), { count: this.args.topic.like_count, }); } get hasExcerpt() { return this.args.topic.excerpt || this.args.topic.hasExcerpt; } get statusBadge() { return getTopicStatusBadge(this.args.topic); } get topicCreator() { return this.args.topic.creator; } get hasLastReplyContext() { return this.hasReplies && !topicWasUpdatedAfterLastPost(this.args.topic); } get hasContext() { return this.hasLastReplyContext || this.hasAssigned; } get lastPoster() { return { user: this.args.topic.lastPosterUser, username: this.args.topic.last_poster_username, }; } get topicTimestamp() { return shortDateNoYear(new Date(this.args.topic.created_at)); } @action onTitleFocus(event) { event.target.closest(".topic-list-item").classList.add("selected"); } @action onTitleBlur(event) { event.target.closest(".topic-list-item").classList.remove("selected"); } }