Сортировка категорий по количеству тем

Интересно, рассматривалась ли когда-либо идея сортировать категории на главной странице по количеству тем?

Пример

Категория A имеет 100 тем
Категория B имеет 50 тем
Категория C имеет 20 тем.

Порядок на главной странице был бы ABC. Если C внезапно изменится на 120 тем, порядок станет CAB.

Было бы это разумно реализуемо? Была бы возможна даже гистерезисная задержка, чтобы категории не перемещались слишком часто?

1 лайк

Привет,

Я могу создать небольшой компонент, если вам это интересно. Чтобы убедиться, вы имеете в виду страницу категорий (/categories), верно?

Это доброе предложение. Однако, с нашей стороны, это не является достаточным основанием для покупки в качестве компонента темы. Мне кажется, что это всё равно была бы приятная функция для Discourse в целом. Я чувствую, что это стало бы хорошим балансом между существующей сортировкой «по последним» (которая слишком часто меняет порядок) и полностью фиксированной разметкой.

1 лайк

Нет, нет, бесплатно :slight_smile:.

РЕДАКТИРОВАНИЕ:

Вы можете установить этот скрипт в компонент темы.

Он сортирует элементы списка категорий только на самой странице.
Это не влияет ни на один шаблон или внутренний код, чтобы обеспечить лучшую совместимость.
В зависимости от вашей темы могут потребоваться корректировки.

Дайте знать, если это сработает для вас.

js
<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 {
        // у блоков нет отображаемого счетчика
    }
});
</script>
1 лайк