CSS를 조금 더 꾸며서, 이 기능을 사용하는 지정된 카테고리 내 모든 스레드의 모든 답글에 알약 모양(pill)이 표시됩니다. 아마도 꾸민 것을 되돌려야 할 것 같지만, 다른 방법을 아시는 분이 있다면 유지하고 싶습니다. 현재 상태가 꽤 보기 좋다고 생각하기 때문입니다.
자, 말했듯이 나는 코더는 아니지만, Grok에게 질문하는 데는 꽤 능숙합니다. 여기 두 가지 문제를 모두 해결하는 코드가 있습니다.
2번부터 X번까지의 답변에서 더 이상 빈 CSS 버블이 표시되지 않습니다.
인용된 솔루션에서 주제 ID가 중복 표시되지 않습니다.
지구상에서 아무도 신경 쓰지 않을 수도 있지만, Discourse를 티켓팅 시스템으로 사용하는 우리에게는 주제를 추적하는 데 좋은 방법인 것 같습니다.
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";
class TopicIdentifier extends Component {
get topicId() {
return this.args.post?.topic?.id;
}
get shouldShow() {
const firstPost = this.args.post?.post_number === 1; // 주제 내 첫 번째 게시물
const desiredCategories = [9, 23]; // 이 요소가 표시되기를 원하는 카테고리 ID의 쉼표로 구분된 목록
const isInCategory = desiredCategories.includes(
this.args.post?.topic.category.id
);
return firstPost && isInCategory;
}
<template>
{{#if this.shouldShow}}
<!-- 아래 내용을 수정할 수 있으며, {{this.topicId}}는 주제 ID가 채워지는 부분입니다 -->
Issue Tracking # is
{{this.topicId}}
<!-- 위 내용을 수정할 수 있습니다 -->
{{/if}}
</template>
}
export default apiInitializer("0.8.40", (api) => {
api.decorateCookedElement((element, helper) => {
```gjs
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";
class TopicIdentifier extends Component {
get topicId() {
return this.args.post?.topic?.id;
}
get shouldShow() {
const firstPost = this.args.post?.post_number === 1; // 주제 내 첫 번째 게시물
const desiredCategories = [9, 23]; // 이 요소가 표시되기를 원하는 카테고리 ID의 쉼표로 구분된 목록
const isInCategory = desiredCategories.includes(
this.args.post?.topic.category.id
);
return firstPost && isInCategory;
}
<template>
{{#if this.shouldShow}}
<!-- 아래 내용을 수정할 수 있으며, {{this.topicId}}는 주제 ID가 채워지는 부분입니다 -->
Issue Tracking # is
{{this.topicId}}
<!-- 위 내용을 수정할 수 있습니다 -->
{{/if}}
</template>
}
export default apiInitializer("0.8.40", (api) => {
api.decorateCookedElement((element, helper) => {
// 이것이 첫 번째 게시물이고 솔루션 인용문 안에 있지 않은 경우에만 진행
// 이것이 첫 번째 게시물이고, 인용문이 아니며, 원하는 카테고리 안에 있는 경우에만 진행
const post = helper?.model;
const desiredCategories = [9, 23]; // TopicIdentifier의 카테고리와 일치
if (
if (
helper?.model?.post_number !== 1 ||
!post ||
post.post_number !== 1 ||
!desiredCategories.includes(post.topic?.category?.id) || // 카테고리 확인
element.classList.contains("post__contents-cooked-quote") || // 요소 자체가 인용문 내용인지 확인
element.closest("aside.accepted-answer") || // 솔루션/인용문 래퍼 확인
element.closest(".quote") // 일반 인용문에 대한 추가 확인
) {
return;
}
const wrapper = document.createElement("div");
wrapper.className = "tracking-id";
helper?.renderGlimmer(
wrapper,
<template><TopicIdentifier @post={{helper.model}} /></template>
);
element.appendChild(wrapper);
});
});
또 다른 작은 이상 사항을 발견했습니다. 원하지 않는 토픽의 첫 번째 게시글에서도 빈 클래스 버블이 표시되고 있어서 코드를 조금 수정해야 했습니다. 최종 버전은 다음과 같습니다.
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";
class TopicIdentifier extends Component {
get topicId() {
return this.args.post?.topic?.id;
}
get shouldShow() {
const firstPost = this.args.post?.post_number === 1; // 토픽의 첫 번째 게시글
const desiredCategories = [9, 23]; // 이 요소가 표시되기를 원하는 카테고리 ID 목록 (쉼표로 구분)
const isInCategory = desiredCategories.includes(
this.args.post?.topic.category.id
);
return firstPost && isInCategory;
}
<template>
{{#if this.shouldShow}}
<!-- 아래 내용을 수정할 수 있으며, {{this.topicId}} 부분은 토픽 ID가 채워지는 곳입니다 -->
이슈 추적 번호는
{{this.topicId}}
<!-- 위 내용을 수정할 수 있습니다 -->
{{/if}}
</template>
}
export default apiInitializer("0.8.40", (api) => {
api.decorateCookedElement((element, helper) => {
// 이 게시글이 첫 번째 게시글이고 해결책 인용 블록 안에 있지 않은 경우에만 진행
// 이 게시글이 첫 번째 게시글이고, 인용 블록이 아니며, 원하는 카테고리에 있는 경우에만 진행
const post = helper?.model;
const desiredCategories = [9, 23]; // TopicIdentifier의 카테고리와 일치
if (
if (
helper?.model?.post_number !== 1 ||
!post ||
post.post_number !== 1 ||
!desiredCategories.includes(post.topic?.category?.id) || // 카테고리 확인
element.classList.contains("post__contents-cooked-quote") || // 요소 자체가 인용 콘텐츠인지 확인
element.closest("aside.accepted-answer") || // 해결책/인용 래퍼 확인
element.closest(".quote") // 일반 인용에 대한 추가 확인
) {
return;
}
const wrapper = document.createElement("div");
wrapper.className = "tracking-id";
helper?.renderGlimmer(
wrapper,
<template><TopicIdentifier @post={{helper.model}} /></template>
);
element.appendChild(wrapper);
});
});
element.classList.contains("post__contents-cooked-quote") || // 요소 자체가 인용 콘텐츠인지 확인
element.closest("aside.accepted-answer") || // 해결책/인용 래퍼 확인
element.closest(".quote") // 일반 인용에 대한 추가 확인
) {
return;
}
const wrapper = document.createElement("div");
wrapper.className = "tracking-id";
helper?.renderGlimmer(
wrapper,
<template><TopicIdentifier @post={{helper.model}} /></template>
);
element.appendChild(wrapper);
});
});
그리고 제 질문에 대한 답을 드리자면, 모든 코드를 새로운 테마 컴포넌트로 이동시켰는데도 여전히 정상적으로 작동합니다.