В этой статье приводятся два способа настройки видимости кнопок в зависимости от группы пользователя:
- С помощью виджета Код (рекоммендуемый).
- Через привязку свойства Скрыть к контекстным переменным.
Для начала создайте пользовательский виджет или страницу. Затем добавьте контекстные переменные.
Для способа 1:
firstButtonVisibleFor — рекомендуем по умолчанию указать «Администраторы»
secondButtonVisibleFor — рекомендуем по умолчанию указать «Администраторы»
Для способа 2:
Создайте две переменные с типом Да\Нет
hideFirstButton - по умолчанию Да
hideSecondButton - по умолчанию Да
Шаблон
Для способа 1:
- Добавить в шаблон виджет Код.
- В виджете Код разбить код html или js на блоки, заключённые в условие if {<html>}. Это необходимо для определения того, что увидит пользователь у себя на странице.
Код:
<%if(getData()[0].visible){%>
<a class="btn btn-primary" href="(p:run/x/x)"><%-getData()[0].name%></a>
<%}%>
<%if(getData()[1].visible){%>
<a class="btn btn-primary" href="(p:run/x/x)"><%-getData()[1].name%></a>
<%}%>
Для способа 2:
Для нужных элементов настройте связь свойства Скрыть с контекстными переменными hideFirstButton и hideSecondButton.
Недостаток данного метода состоит в том, что открыв код страницы в баузере, пользователь увидит html-код скрытого элемента, что может быть неприемлемо, когда речь идёт об изоляции по правам доступа.
Сценарии
В сценариях настроить структуру данных, которые передаются через getData() в шаблон. В данном примере через getData() передаётся массив структур, который содержит связку: названия кнопки — name, список групп — groups, признак отвечающий за видимость — visible (false по умолчанию, чтобы не показывать никому).
Код:
let visibleSettings:{
name: string,
groups: string | undefined,
visible: boolean
}[] =
[
{
name: "Первая кнопка",
groups: Context.data.firstButtonVisibleFor,
visible: false
},
{
name: "Вторая кнопка",
groups: Context.data.secondButtonVisibleFor,
visible: false
}
];
function getData() {
return visibleSettings;
}
Основная функция работает по алгоритму:
- Получить текущего пользователя. Если пользователь входит хотя бы в одну группу, то:
- Для кажого элемента с настройкой прав (в текущем примере это две кнопки) взять строку с названиями групп и разбить на отдельные названия-группы.
- Для каждого названия-группы искать соответствующий объект-группу в системе.
- Для каждой найденной группы проверить совпадения с группами пользователя. Если совпадение найдено, то установить текущему элементу свойство "видим".
Код:
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++;
}
}
}
Использование
Настроенный виджет необходимо опубликовать. После этого его можно использовать. При добавлении виджета (или страницы) появится форма, на которой будет предложено ввести данные. Через запятую с пробелом ", " укажите список групп пользователей, которые увидят тот или иной элемент. Так как на текущий момент в системе нет переменных типа элемент оргструктуры и группа, то список групп задаётся именно строками.
По аналогии с группами можно переписать код для определения видимости по должности пользователя, по наличию опеределённых прав у пользователя или по любому другому принципу.