Имеется расширенный фильтр. Мне необходимо отобразить его лишь на чтение.
Как скрыть кнопку удаления строки и добавления нового условия?
"Действия" скрываются путем передачи в модуль конфига с параметром actionsVisible: false.
В модуле FilterEditModule не нашел подобного функционала для добавления или удаления условий.
Нашел в классе Terrasoft.controls.FilterEdit.Filter метод, возвращающий как раз таки права на удаление, выделение и т.д.
/** * @inheritdoc Terrasoft.FilterEdit.Item#getAllowedManageOperations * @protected * @override */ getAllowedManageOperations: function() { var filterManager = this.filterManager; if (!filterManager) { return { canViewEnabled: true, canEditEnabled: true, canEditLeftExpression: true, canEditRightExpression: true, canEditComparisonType: true, canRemove: true, canSelect: true }; } var filterManageOperations = filterManager.getAllowedFilterManageOperations(this.instance); var isEnableComparisonType = this._isEnableComparisonType(); if (isEnableComparisonType !== undefined) { filterManageOperations.canEditComparisonType = isEnableComparisonType; } return filterManageOperations; },
Как я могу переопределить этот метод, если мне нужно расширить логику лишь для одного модуля, а не во всю систему.
Есть и обходной вариант - подгружать из базы значение фильтра из базы и ререндерить его, но в таком случае все равно пользователь может работать с фильтром.
Нравится
У кейса есть 2 способа решения:
1) Расширить класс BaseFilterProvider.
Такой вариант подойдет, если в системе часто придется использовать одинаковую логику отображения модуля расширенных фильтров на разных страницах. В дальнейшем его можно использовать при передаче конфига модулю расширенных фильтров.
Пример расширенного модуля (комментарии для понимания разницы)
define("BpFilterReadonlyProvider", [], function() { /** * @class Terrasoft.data.filters.FilterReadonlyProvider * Readonly filters provider. */ Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", { extend: "Terrasoft.BaseFilterProvider", alternateClassName: "Terrasoft.FilterReadonlyProvider", rootSchemaName: "", canDisplayId: false, sandbox: null, // Управление операциями внутри фильтра (для каждого фильтра по отдельности). getAllowedFilterManageOperations: function() { return { // Видимость признака "Активен". canViewEnabled: true, // Возможность изменения признака "Активен". canEditEnabled: false, // Возможность изменения левой части выражения. canEditLeftExpression: false, // Возможность изменения правой части выражения. canEditRightExpression: false, // Возможность изменения условия сравнения. canEditComparisonType: false, // Видимость кнопки удаления ('X'). canRemove: false, // Возможность выбрать отдельный фильтр. canSelect: false }; }, // Управление группами фильтров. getAllowedFilterGroupManageOperations: function() { return { // Видимость признака "Активен". canViewEnabled: true, // Возможность изменения признака "Активен". canEditEnabled: false, // Видимость типа группы ("И" / "ИЛИ"). canViewGroupType: true, // Возможность редактирования типа группы. canEditGroupType: false, // Видимость кнопки "Добавить условие". canAddFilters: false, // Видимость кнопки удаления ('X'). canRemove: false, // Возможность выбора группы фильтра. canSelect: false }; } }); return Terrasoft.FilterReadonlyProvider; } );
Передача конфига модулю
updateFilterModule: function() { this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]); }, ... getRequirementsModuleConfig: function() { return { // Объект rootSchemaName: "SxCandidate", // Колонка со значением фильтра filters: this.$RequirementFilterValue, // Видимость кнопки "Действия" actionsVisible: false, // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом) filterProviderClassName: "Terrasoft.FilterReadonlyProvider" }; }
2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.
При передаче конфига модулю, возможно прямо в нем переопределить методы, возвращающие права на редактирование и отображение элементов.
updateFilterModule: function() { this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]); }, ... getRequirementsModuleConfig: function() { return { rootSchemaName: "SxCandidate", filters: this.$RequirementFilterValue, actionsVisible: false, entitySchemaFilterProviderConfig: { canDisplayId: true, shouldHideLookupActions: true, isColumnSettingsHidden: true, getAllowedFilterManageOperations: function() { return { canViewEnabled: true, canEditEnabled: false, canEditLeftExpression: false, canEditRightExpression: false, canEditComparisonType: false, canRemove: false, canSelect: false }; }, getAllowedFilterGroupManageOperations: function() { return { canViewEnabled: true, canEditEnabled: false, canViewGroupType: true, canEditGroupType: false, canAddFilters: false, canRemove: false, canSelect: false }; } } }; }
В обоих случаях результат будет идентичен.
Можно наложить фильтр в раздел и пользователь его вообще не увидит в расширенных фильтрах.
https://community.terrasoft.ru/questions/interesuet-kak-sozdat-filtr-v-…
https://community.terrasoft.ru/questions/vidimost-sotrudnikov-v-kontakt…
https://community.terrasoft.ru/questions/bystryy-filtr-po-celochislenno…
Полозюков Евгений Петрович,
задача в другом. Допустим, менеджер заполняет фильтрацию внутри карточки (аналогично фильтрам в карточке раздела "Модели машинного обучения"). Затем, этот фильтр мне нужно отобразить оператору только для чтения уже в совершенно другом месте.
Фильтр корректно подтягиваю, скрываю кнопку "действия" в модуле. Но оператор может скрыть часть фильтров, случайно нажав на "Х". Этого и хочу избежать.
Подкопаев Михаил Олегович,
Скажите оператору чтобы не занимался ерундой. При разработке мы исходим из того что люди не злоумышленники и не собираются ломать систему. Исключение портальные пользователи.
У кейса есть 2 способа решения:
1) Расширить класс BaseFilterProvider.
Такой вариант подойдет, если в системе часто придется использовать одинаковую логику отображения модуля расширенных фильтров на разных страницах. В дальнейшем его можно использовать при передаче конфига модулю расширенных фильтров.
Пример расширенного модуля (комментарии для понимания разницы)
define("BpFilterReadonlyProvider", [], function() { /** * @class Terrasoft.data.filters.FilterReadonlyProvider * Readonly filters provider. */ Ext.define("Terrasoft.data.filters.FilterReadonlyProvider", { extend: "Terrasoft.BaseFilterProvider", alternateClassName: "Terrasoft.FilterReadonlyProvider", rootSchemaName: "", canDisplayId: false, sandbox: null, // Управление операциями внутри фильтра (для каждого фильтра по отдельности). getAllowedFilterManageOperations: function() { return { // Видимость признака "Активен". canViewEnabled: true, // Возможность изменения признака "Активен". canEditEnabled: false, // Возможность изменения левой части выражения. canEditLeftExpression: false, // Возможность изменения правой части выражения. canEditRightExpression: false, // Возможность изменения условия сравнения. canEditComparisonType: false, // Видимость кнопки удаления ('X'). canRemove: false, // Возможность выбрать отдельный фильтр. canSelect: false }; }, // Управление группами фильтров. getAllowedFilterGroupManageOperations: function() { return { // Видимость признака "Активен". canViewEnabled: true, // Возможность изменения признака "Активен". canEditEnabled: false, // Видимость типа группы ("И" / "ИЛИ"). canViewGroupType: true, // Возможность редактирования типа группы. canEditGroupType: false, // Видимость кнопки "Добавить условие". canAddFilters: false, // Видимость кнопки удаления ('X'). canRemove: false, // Возможность выбора группы фильтра. canSelect: false }; } }); return Terrasoft.FilterReadonlyProvider; } );
Передача конфига модулю
updateFilterModule: function() { this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]); }, ... getRequirementsModuleConfig: function() { return { // Объект rootSchemaName: "SxCandidate", // Колонка со значением фильтра filters: this.$RequirementFilterValue, // Видимость кнопки "Действия" actionsVisible: false, // Имя класса-провайдера (не забудьте подключить в зависимостях свой модуль с этим классом) filterProviderClassName: "Terrasoft.FilterReadonlyProvider" }; }
2) Второй вариант более быст и удобен. Подойдет, если такой кейс единичный в системе.
При передаче конфига модулю, возможно прямо в нем переопределить методы, возвращающие права на редактирование и отображение элементов.
updateFilterModule: function() { this.sandbox.publish("SetFilterModuleConfig", this.getRequirementsModuleConfig(), [this.modules.FilterModule.moduleId]); }, ... getRequirementsModuleConfig: function() { return { rootSchemaName: "SxCandidate", filters: this.$RequirementFilterValue, actionsVisible: false, entitySchemaFilterProviderConfig: { canDisplayId: true, shouldHideLookupActions: true, isColumnSettingsHidden: true, getAllowedFilterManageOperations: function() { return { canViewEnabled: true, canEditEnabled: false, canEditLeftExpression: false, canEditRightExpression: false, canEditComparisonType: false, canRemove: false, canSelect: false }; }, getAllowedFilterGroupManageOperations: function() { return { canViewEnabled: true, canEditEnabled: false, canViewGroupType: true, canEditGroupType: false, canAddFilters: false, canRemove: false, canSelect: false }; } } }; }
В обоих случаях результат будет идентичен.
У вас настройка фильтра хранится в поле? Может, можно закрыть оператору доступ к данному полю на уровне прав доступа?
Владимир Соколов,
настройка фильтра да, хранится в поле. Пример использования есть в разделе "Модели машинного обучения" в карточке записи.
Если оставить возможность чтения поля без возможности редактирования на уровне прав, то системный модуль расширенных фильтров все равно будет редактируемый, а сама карточка не позволит сохранить изменения в колонке.