Запретить пользователям перемещать темы в другие категории

Я ищу возможность отключить эту функцию, так как она может усложнить управление темами, когда у вас есть разные команды модераторов для разных категорий, и внезапно они обнаруживают, что в их категории появилась большая или спорная тема без предварительного уведомления.

Я прочитал здесь Access rights for moving a topic to another category, где сказано, что это действие должно быть доступно только пользователям с уровнем доверия 3. Однако в моей тестовой среде пользователь с уровнем доверия 2 смог это сделать.

Я попробовал включить опцию «запретить редактирование после правки поста сотрудником», но это, похоже, не повлияло на возможность перемещения темы в другую категорию.

Не упустил ли я что-то здесь? Вероятно, да :smiley:

Не уверен, потребуется ли какое-то тестирование. Модификация группы категорий всё ещё может перемещать тему через команду редактирования или перемещения.

Также стоит обратить внимание на плагин #plugin Custom Trust Levels.

Я проверил это и учту, но сначала попробую создать простой компонент, который скрывает этот селект для редактирования, кроме как для сотрудников.

Я предпочитаю плагины, которые делают простые вещи :slight_smile:

@Canapin предоставил мне код для скрытия кнопки «Нравится» в группах, не входящих в указанные группы.

Это может стать хорошей отправной точкой для вашей работы.

исправленная ссылка

Спасибо большое @Heliosurge (и всепроникающему @Canapin :stuck_out_tongue: ) Я как раз думал, где можно найти похожий плагин для примера :slight_smile:

Вам очень приятно! Команда и это сообщество в моём опыте потрясающие. :clinking_beer_mugs::smiling_face_with_sunglasses::+1:

Я посмотрел — это хороший MVP, но сообщество, на которое я ориентируюсь, довольно технически подкованное, и было бы лучше, если бы DOM полностью пропускал отрисовку этого компонента, а не просто скрывал его от глаз.

Для этого потребуется плагин, или я смогу реализовать это с помощью компонента?

Мне нужно примерно определить, генерируется ли HTML для этого селекта или нет, исходя из роли.

Я почти уверен, что компонента будет достаточно.

Я не программист.

Чтобы скрыть селектор категорий при редактировании первого поста (через действие «Редактировать пост», а не «Редактировать заголовок»), можно использовать следующий код:

<script type="text/discourse-plugin" version="1.6.0">
    let currentUser = api.getCurrentUser();
    api.modifyClass("component:composer-title", {
      pluginId: "PreventCategoryChange",
      didInsertElement: function() {
        if(currentUser.trust_level == 1) {
            let categoryInput = document.getElementsByClassName('category-input')[0];
            let miniTagChoser = document.getElementsByClassName('mini-tag-chooser')[0];
            if(categoryInput != null) {
                categoryInput.remove();
                if(miniTagChoser != null) {
                    miniTagChoser.style.marginLeft = '0';
                }
            }
        }
      }
    });
</script>

chrome_NTAAc37JXB

Я использовал уровень доверия, но, думаю, вы сможете проверить группу пользователя вместо этого — всё находится в объекте currentUser.

Я не знаю, как динамически убрать селектор категорий при редактировании заголовка.
Возможно, вы сможете разобраться, изучив связанные файлы:

discourse/app/assets/javascripts/discourse/app/templates/topic.hbs at 53695e7d29e718041fa53bf4fef21e02354a4088 · discourse/discourse · GitHub

discourse/app/assets/javascripts/discourse/app/controllers/topic.js at 8fc11215e195a5bd8db130f52717c126c119432b · discourse/discourse · GitHub

Спасибо большое @Canapin

Мне также нужно добавить что-то для редактирования заголовка, но это уже определенно помогает :slight_smile:

Когда будет готово, я опубликую это в разделе компонентов темы здесь, чтобы другие могли это использовать :wink:

Это discourse/app/assets/javascripts/discourse/app/templates/topic.hbs at 53695e7d29e718041fa53bf4fef21e02354a4088 · discourse/discourse · GitHub

похоже на правильный хендл для доступа, теперь если кто-то знает, как взаимодействовать с ним через компонент темы… :stuck_out_tongue:

Ради богов, я не могу найти хук, чтобы отследить момент, когда запускается редактирование заголовка. Кто-нибудь знает, на что можно подписаться?

Скрытие изменения категории при редактировании первого сообщения темы работает, оно срабатывает только в режиме редактирования и всё.

Отлично, благодаря хорошему другу, который страдает от бессонницы, мы выяснили, где найти нужный хук :stuck_out_tongue:

Вот он: он также корректирует визуальное оформление формы и позволяет выбрать минимальный уровень доверия, с которого доступ к редактированию категории будет доступен в любом случае (уровень доверия по умолчанию — 0, чтобы соответствовать настройкам Discourse по умолчанию)

Сейчас я создам новую тему в разделе #plugin.

Огромное спасибо @Canapin за то, что вы с самого начала указали нам верное направление :heart_eyes:

Я посмотрел ваш код, отличная работа :+1:

Кажется, вы научили меня больше, чем я вас!

Только небольшое замечание: то, что вы создали, это #theme-component, а не #plugin :slight_smile:

Просто для сведения: пользователи TL3 и TL4 могут перекатегоризировать любую тему, пока включена настройка «доверенные пользователи могут редактировать чужие». Пользователи TL0/1/2 должны иметь возможность делать это только для своих собственных тем и только в пределах периода редактирования [1]. Если вы заблокируете первый пост с помощью гаечного ключа, это также должно предотвратить редактирование категории (а также заголовка и тегов).

Я не на 100% уверен, что правильно понял ваш сценарий использования, но рад, что вы нашли решение. :slightly_smiling_face::+1:


  1. устанавливается параметром «время редактирования поста» для TL0 и TL1 и «время редактирования поста TL2» для TL2 и TL3 ↩︎

Ах, да, я не знал об этой опции:

Это предотвращает любые дальнейшие изменения (кроме удаления), даже со стороны модератора категории.

Но блокировку первого поста нельзя автоматизировать ни через таймер темы, ни через автоматизированную задачу.

Да, я был об этом осведомлён.

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

Я считаю, что важно добавить, что поскольку это компонент темы, пользователь может обойти эти ограничения, внедрив JavaScript (насколько я понимаю) или включив безопасный режим, если он доступен (см. настройку включить безопасный режим).

Для более безопасного способа вам потребуется плагин.

Да, поэтому я также изучал плагины, но для первой версии достаточно компонента.