Имеется расширенный фильтр. Мне необходимо отобразить его лишь на чтение.
![]()
Как скрыть кнопку удаления строки и добавления нового условия?
"Действия" скрываются путем передачи в модуль конфига с параметром 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
};
}
}
};
}
В обоих случаях результат будет идентичен.
У вас настройка фильтра хранится в поле? Может, можно закрыть оператору доступ к данному полю на уровне прав доступа?
Владимир Соколов,
настройка фильтра да, хранится в поле. Пример использования есть в разделе "Модели машинного обучения" в карточке записи.
Если оставить возможность чтения поля без возможности редактирования на уровне прав, то системный модуль расширенных фильтров все равно будет редактируемый, а сама карточка не позволит сохранить изменения в колонке.