ここでの問題は技術的な制限ではなく、スペースの制約です。
ncaming215:
タグは 40 個ちょっとあります
これはここで指摘されています。
ユーザーとしての体験を想像してみてください。ウェブサイトでメニューを開くと、以下のような表示になります。
言い過ぎかもしれませんが、圧倒されてしまうでしょう。特に、そのメニューには結果を絞り込むための検索機能がない場合です。
そこで、あなたがやりたいこととユーザーが体験したいことのバランスを取る方法を探してみましょう。どうすればよいでしょうか?タググループの数を制限し、さらに表示可能なものがあることを示すことです。例えば、以下のような形です。
では、それをどう実装するかというと?
コードは以下の通りです。
<script type="text/discourse-plugin" version="0.8">
const MAX_TAGS_TO_SHOW = 20;
const Category = require("discourse/models/category").default;
const siteSettings = api.container.lookup("site-settings:main");
const tagStyle = siteSettings.tag_style;
const getNumberOfTags = (tags, categoryTagsGroups) => {
let count = 0;
count = tags.length;
for (const categoryTagsGroup of categoryTagsGroups) {
count = count + categoryTagsGroup.tags.length;
}
return count;
};
fetch("/tags.json")
.then(response => response.json())
.then(data => {
try {
const tags = data.tags;
const hasCategoryTagGroups = data.extras?.categories;
if (hasCategoryTagGroups) {
const categoryTagsGroups = data.extras.categories;
let moreCount = getNumberOfTags(tags, categoryTagsGroups);
let visibleCount = 0;
const content = [];
for (const categoryTagsGroup of categoryTagsGroups) {
const category = Category.findById(categoryTagsGroup.id);
const name = category.name;
const childTags = categoryTagsGroup.tags;
const childTagNodes = [];
childTags.forEach((tag, index) => {
if (visibleCount <= MAX_TAGS_TO_SHOW) {
childTagNodes.push(
api.h(
"li.tag-link-item",
api.h(
`a.discourse-tag.tag-link.${tagStyle}`,
{ href: `/tag/${tag.text}` },
tag.text
)
)
);
moreCount--;
visibleCount++;
}
});
if (childTagNodes.length) {
content.push([
api.h("li.heading", api.h("span", name)),
childTagNodes
]);
}
}
api.decorateWidget("menu-links:after", helper => {
if (helper.attrs.name !== "general-links") return;
return api.h("div.clearfix", [
api.h("ul.tag-links", [
api.h("a.categories-link", { href: "/tags" }, [
"Tags ",
moreCount ? `(${moreCount} more)...` : ""
]),
content
]),
api.h("hr")
]);
});
}
} catch (error) {
console.error("There's an issue in the hamburger tags theme component");
console.error(error);
}
})
.catch(console.error);
</script>
これはテーマの header タブに追加します。上部にある以下の部分を変更して、表示したいタグの数に設定できます。
const MAX_TAGS_TO_SHOW = 20;
次に、リンクのスタイルを設定するために少し CSS を追加する必要があります。以下は基本的な例です。
.tag-links {
.heading {
padding: 0.25em 0.5em;
}
.tag-link-item {
background-color: transparent;
display: inline-flex;
align-items: center;
padding: 0.25em 0.5em;
width: 50%;
box-sizing: border-box;
.tag-link {
display: inline-flex;
width: 100%;
&:hover {
color: var(--primary);
}
}
}
}
上記の JavaScript は、サイト設定で指定されたタグスタイルを尊重します。また、あなたのサイトがタグに非常に依存している場合、そのメニューにカテゴリを表示する必要はないかもしれません。それらを非表示にすることで、ユーザーの混乱を減らすことができます。
さらに、拡張されたタグセクションを追加した場合、このリンクは冗長になります。
そのため、以下のように非表示にしましょう。
.panel-body {
.category-links,
.categories-separator,
.widget-link[href="/tags"] {
display: none;
}
}
最後に、ここで指摘されている通りです。
このデータは、/tags にアクセスしない限り、デフォルトではクライアントに渡されません。そのため、上記のコードはホームページで追加のリクエストを追加します(アクセスごとに 1 回のみ実行されます)。Discourse は仕組みを非常にシンプルに保とうとしているため、データが必須でない限り、デフォルトでは読み込みません。
この機能が近い将来に Discourse コアに追加されるとは思えません。したがって、サーバー側で動作するプラグインを作成しない限り、追加のリクエストを行うのがほぼ唯一の選択肢です。