메인 페이지의 카테고리 순서를 토픽 수 기준으로 정렬할 수 있는지 궁금합니다.
예시
카테고리 A: 100개 토픽
카테고리 B: 50개 토픽
카테고리 C: 20개 토픽
메인 페이지의 순서는 A-B-C가 됩니다. 만약 C가 갑자기 120개 토픽으로 변하면, 순서는 C-A-B가 됩니다.
이것이 합리적으로 구현 가능한가요? 카테고리가 너무 자주 이동하지 않도록 히스테리시스(Hysteresis)를 적용하는 것도 가능한가요?
메인 페이지의 카테고리 순서를 토픽 수 기준으로 정렬할 수 있는지 궁금합니다.
카테고리 A: 100개 토픽
카테고리 B: 50개 토픽
카테고리 C: 20개 토픽
메인 페이지의 순서는 A-B-C가 됩니다. 만약 C가 갑자기 120개 토픽으로 변하면, 순서는 C-A-B가 됩니다.
이것이 합리적으로 구현 가능한가요? 카테고리가 너무 자주 이동하지 않도록 히스테리시스(Hysteresis)를 적용하는 것도 가능한가요?
안녕하세요,
관심 있으시면 작은 컴포넌트를 만들어 드릴 수 있습니다. 혹시 카테고리 페이지(/categories)에 대해 말씀하시는 거죠?
정중한 제안에 감사드립니다. 다만, 저희 측에서는 테마 구성 요소로 구매할 만큼 충분히 필요하다고 느끼지 않습니다. 이 기능이 Discourse에 전반적으로 포함되면 좋겠다는 생각이 듭니다. 기존 최신순 정렬(순서가 너무 자주 바뀌는 문제)과 완전히 고정된 레이아웃 사이의 균형점을 잘 잡아줄 수 있을 것 같습니다.
아니, 아니, 무료예요
.
수정:
이 스크립트는 테마 컴포넌트에 설치할 수 있습니다.
이 스크립트는 카테고리 목록의 항목을 해당 페이지 내에서만 정렬합니다.
호환성을 더 잘 유지하기 위해 어떤 템플릿이나 내부 구조에도 영향을 미치지 않습니다.
사용 중인 테마에 따라 조정이 필요할 수 있습니다.
사용하시는 환경에서 잘 작동하는지 알려주세요.
<script type="text/discourse-plugin" version="0.8">
api.onPageChange((url, title) => {
const { defaultHomepage } = require('discourse/lib/utilities');
if (url !== '/categories' && (url !== '/' || defaultHomepage() !== 'categories')) {
return;
}
const desktop_category_page_style = api.container.lookup('service:site-settings').desktop_category_page_style;
const sort = ({parent, nodes, selector}) => {
if (!parent || !nodes.length) {
return
}
Array.from(nodes).sort((a, b) => {
const valueA = a.querySelector(selector).textContent;
const valueB = b.querySelector(selector).textContent;
return valueB - valueA;
})
.forEach(row => parent.appendChild(row));
}
if (desktop_category_page_style.startsWith('categories')) {
const parent = document.querySelector('.category-list tbody[aria-labelledby="categories-only-category"]');
sort({
parent: parent,
nodes: parent?.querySelectorAll('tr'),
selector: 'td.topics span.value'
})
}
else if (desktop_category_page_style === 'subcategories_with_featured_topics') {
const childs = document.querySelectorAll('table.category-list');
sort({
parent: childs[0]?.parentElement,
nodes: childs,
selector: 'th.parent-category span.value'
})
} else {
// boxes doesn't have a count displayed
}
});
</script>