...

Управление видимостью элементов виджета

Тема в разделе "Примеры сценариев", создана пользователем ELMA365, 1 дек 2021.

  1. ELMA365

    ELMA365 Moderator

    В этой статье приводятся два способа настройки видимости кнопок в зависимости от группы пользователя:
    1. С помощью виджета Код (рекоммендуемый).
    2. Через привязку свойства Скрыть к контекстным переменным.
    Для начала создайте пользовательский виджет или страницу. Затем добавьте контекстные переменные.

    Для способа 1:

    firstButtonVisibleFor — рекомендуем по умолчанию указать «‎Администраторы»

    secondButtonVisibleFor — рекомендуем по умолчанию указать «‎Администраторы»

    Для способа 2:

    Создайте две переменные с типом Да\Нет

    hideFirstButton - по умолчанию Да

    hideSecondButton - по умолчанию Да


    Шаблон
    Для способа 1:

    1. Добавить в шаблон виджет Код.
    2. В виджете Код разбить код html или js на блоки, заключённые в условие if {<html>}. Это необходимо для определения того, что увидит пользователь у себя на странице.
    Код:
    
    <%if(getData()[0].visible){%>
    <
    class="btn btn-primary" href="(p:run/x/x)"><%-getData()[0].name%></a>
    <%}%>
    <%if(
    getData()[1].visible){%>
    <
    class="btn btn-primary" href="(p:run/x/x)"><%-getData()[1].name%></a>
    <%}%>
    Для способа 2:

    Для нужных элементов настройте связь свойства Скрыть с контекстными переменными hideFirstButton и hideSecondButton.

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

    [​IMG]


    Сценарии
    В сценариях настроить структуру данных, которые передаются через getData() в шаблон. В данном примере через getData() передаётся массив структур, который содержит связку: названия кнопки — name, список групп — groups, признак отвечающий за видимость — visible (false по умолчанию, чтобы не показывать никому).
    Код:
    
    let visibleSettings:{
    namestring,
    groupsstring undefined,
    visibleboolean
    }[] =
    [
    {
    name"Первая кнопка",
    groupsContext.data.firstButtonVisibleFor,
    visiblefalse
    },
    {
    name"Вторая кнопка",
    groupsContext.data.secondButtonVisibleFor,
    visiblefalse
    }
    ];

    function 
    getData() {
    return 
    visibleSettings;
    }
    Основная функция работает по алгоритму:
    1. Получить текущего пользователя. Если пользователь входит хотя бы в одну группу, то:
    2. Для кажого элемента с настройкой прав (в текущем примере это две кнопки) взять строку с названиями групп и разбить на отдельные названия-группы.
    3. Для каждого названия-группы искать соответствующий объект-группу в системе.
    4. Для каждой найденной группы проверить совпадения с группами пользователя. Если совпадение найдено, то установить текущему элементу свойство "видим".
    Код:
    
    async function onInit() {
        const 
    user await System.users.getCurrentUser();
        if (
    user.data.groupIds) {
            
    let i 0;
            for (const 
    rowGgroups of visibleSettings) {
                if (
    rowGgroups.groups) {
                    
    // конвертировать строчные названия групп в объекты UserGroupItem
                    
    for (const groupName of rowGgroups.groups!.split(", ")) {
                        const 
    tempGroupItems await System.userGroups.search().where(ug => ug.__name.eq(groupName)).size(1000).all();
                        for (const 
    checkingGroup of tempGroupItems) {
                            if (
    checkingGroup) {
                                
    // сверить группы пользователя с проверяемой группой group
                                
    for (const group of user.data.groupIds!) {
                                    if (
    group.id == checkingGroup.id) {
                                        
    // первый способ
                                        
    rowGgroups.visible true;
                                        
    // второй способ
                                        /*switch (i) {
                                            case 0: Context.data.hideFirstButton = false; break;
                                            case 1: Context.data.hideSecondButton= false; break;
                                            default: break;
                                        }*/
                                        
    break;
                                    }
                                }
                            }
                        }
                    }
                }
                
    i++;
            }
        }
    }
    Использование
    Настроенный виджет необходимо опубликовать. После этого его можно использовать. При добавлении виджета (или страницы) появится форма, на которой будет предложено ввести данные. Через запятую с пробелом ", " укажите список групп пользователей, которые увидят тот или иной элемент. Так как на текущий момент в системе нет переменных типа элемент оргструктуры и группа, то список групп задаётся именно строками.

    По аналогии с группами можно переписать код для определения видимости по должности пользователя, по наличию опеределённых прав у пользователя или по любому другому принципу.
    Последнее редактирование: 3 дек 2021