Показать пользовательский HTML в заголовке для участников конкретной группы

Привет, семья Discourse! Надеюсь, что для этого есть простое решение! Мне кажется, ответ в том, что мне нужно использовать какой-то JavaScript.

У нас есть 4 кнопки в секции «after header» настроек CSS/HTML администратора.

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

Например, допустим, мы хотим, чтобы эти основные 4 кнопки были видны всем, но при этом хотим, чтобы ещё одна кнопка была видна только членам определённой ГРУППЫ.

Я не знаю JS, так что если это действительно просто и кто-то сможет помочь с фрагментом кода или чем-то подобным, это было бы очень полезно :folded_hands:

Я нашел эту статью, которая кажется очень похожей для платформы Zendesk, но я думаю, что это именно тот тип функциональности, который нам нужен!

<div id="after-header">Вещь</div>
<script type="text/discourse-plugin" version="0.8">
    api.onPageChange(() => {
        let currentUser = api.getCurrentUser();
        var groups = currentUser.groups;
        const isInGroup1 = groups.some(g => g.name === 'group1');
        const isInGroup2 = groups.some(g => g.name === 'group2');
        const isInGroup3 = groups.some(g => g.name === 'group3');
        if (isInGroup1) { 
            $("#after-header").addClass("group1");
         }
        if (isInGroup2) { 
            $("#after-header").addClass("group2");
         }
        if (isInGroup3) { 
            $("#after-header").addClass("group3");
         }         
    });
</script>
.button-a,
.button-b {
    display: none;
}
#after-header.group1 .button-a {
    display: block
}
#after-header.group2 .button-b {
    display: block
}

Кажется, это также работает, если заменить
api.onPageChange(() => {
на
$( document ).ready(function() {
и тогда скрипт не будет загружаться на каждой странице, но я никогда не уверен, где именно мне нужно использовать api.onPageChange(() => {.

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

ха-ха, это было как раз то, что я собирался выяснить следующим

Привет,

Я искал что-то подобное, но с исключением определённых групп, поэтому решил попробовать ChatGPT, и вот что он ответил:

Чтобы создать HTML-тему в Discourse, которая запускает скрипт с исключением определённых групп, вам нужно использовать возможности кастомизации тем Discourse вместе с JavaScript для обработки исключений групп. Discourse предоставляет api.getCurrentUser() для получения данных пользователя, включая его группы, что может быть полезно для условного запуска вашего скрипта.

Вот пример того, как это можно реализовать в секции </head> вашей темы или компонента:

<script type="text/discourse-plugin" version="0.8">
    api.onPageChange(() => {
        // Получаем данные текущего пользователя
        const currentUser = api.getCurrentUser();

        if (currentUser) {
            // Список названий групп, которые нужно исключить из выполнения скрипта
            const excludedGroups = ['group1', 'group2'];

            // Получаем группы пользователя
            const userGroups = currentUser.groups.map(group => group.name);

            // Проверяем, состоит ли пользователь в какой-либо из исключённых групп
            const isExcluded = excludedGroups.some(group => userGroups.includes(group));

            if (!isExcluded) {
                // Здесь ваш собственный код скрипта
                console.log('Скрипт выполнен для этого пользователя.');
                // Пример: запуск любой пользовательской логики для пользователей, не входящих в исключённые группы
                // customScriptFunction();
            } else {
                console.log('Пользователь состоит в исключённой группе, скрипт не выполнен.');
            }
        }
    });
</script>

Пояснение:

  1. api.onPageChange(): Запускает скрипт при каждом изменении страницы.
  2. api.getCurrentUser(): Получает данные текущего вошедшего пользователя.
  3. excludedGroups: Список групп, которые нужно исключить.
  4. userGroups.includes(group): Проверяет, состоит ли пользователь в какой-либо из исключённых групп.
  5. Условное выполнение скрипта: Скрипт будет выполнен только если пользователь не входит ни в одну из исключённых групп.

Вы можете заменить customScriptFunction(); на любой скрипт, который вам нужно запустить. Дайте знать, если потребуются дополнительные изменения!

Я просто в шоке от этого :exploding_head:. Я ещё не пробовал, но правильный ли этот код от ChatGPT?