Вопрос

Фильтрация записей в разделе

Добрый день. Необходимо отобразить записи в разделе в зависимости от значения колонки-справочника и от роли текущего пользователя. Пример:

"пользователь1" с ролью "роль1" видит в разделе записи со значением колонки "статус": "активно";

"пользователь2" с ролью "роль2" видит в разделе все записи.

Пытался переопределять метод initFixedFiltersConfig, не помогло.

Нравится

3 комментария

Здравствуйте!

Не совсем понятно, как была реализована фильтрация. Но попробую дать иную рекомендацию. Для того, чтобы при загрузке реестра не делать постоянные чтения вхождения польователя в роли, можно создать системную операцию. Например, "Видит все записи раздела" (CanReadAllDataInCustomSection). Дать права на эту системную операцию Роль2. Если ролей и условий больше - количество операций будет увеличиваться.

Далее смотрите в сторону метода getFilters(). Пример можно найти в NUI.ActivitySectionV2.

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

Права на операцию можно проверить, добавив в атрибуты следующий атрибут (см. системные секции, например UsersSectionV2):

                "SecurityOperationName": {
                    dataValueType: Terrasoft.DataValueType.STRING,
                    value: "CanReadAllDataInCustomSection"
                }

SecurityOperationName - будет fasle, если у пользователя нет прав на CanReadAllDataInCustomSection.

Итого, если SecurityOperationName === false, тогда добавляется фильтрация по Вашему условию, иначе ничего не добавляется.

 

Переопределить getFilters получилось, фильтр исправно накладывается.

Проблема с проверкой доступа на операцию, если использовать простое условие if (this.get("CanReadAllData") === false) { ... }, то оно не выполняется, т.к. значение атрибута равно "CanReadAllDataInCustomSection".

Пробовал использовать RightsUtilities, а конкретно метод checkCanExecuteOperation, но он является асинхронным и не успевает переопределить атрибут.

Решил проблему путем переопределения метода init и добавлением в chain соответствующих методов

Показать все комментарии