Доброго времени суток, сообщество! Столкнулся со следующей проблемой и надеюсь на вашу помощь.
В разделе есть два преднастроенных фильтра: Дистрибьютор и ShipTo . Нужно чтобы после выбора значения в фильтре "Дистрибьютор" обновлялся параметр "filter" для фильтра "ShipTo".
Подробнее: В фильтре "ShipTo" пользователь должен иметь возможность выбрать запись только из тех, которые есть у Дистрибьютора, выбранного в фильтре "Дистрибьютор", на детали ShipTo.
Как реализовать фильтр в общем понятно. Но проблема в том, что фильтр инициализируется лишь раз, а мне надо чтобы при выборе одного фильтра проходила "переинициализация" другого.
Надеюсь понятно объяснил, это было не легко ![]()
Прилагаю код моих преднастроенных фильтров:
var self = this;
var fixedFilterConfig = {
entitySchema: this.entitySchema,
filters: [
{
name: "SxDistributor",
caption: this.get("Resources.Strings.SxDistributorFilterCaption"),
addSxDistributorCaption: this.get("Resources.Strings.SxAddDistributorFilterCaption"),
referenceSchemaName: "Account",
entityColumn: {
isLookup: true
},
notNeedCurrentUser: true,
dataValueType: this.Terrasoft.DataValueType.LOOKUP,
filter: function(){
// Получаем список контрагентов у которых есть тип "Дистрибьютор"
if(self.get('AccountId').length > 0) {
// Фильтруем контрагентов по полученному списку
return Terrasoft.createColumnInFilterWithParameters(
"Id", self.get('AccountId'));
}else{
return false;
}
},
getFilter: function (filterInfo) {
if(filterInfo.value) {
/* Генерируем фильтр для ShipTo */
var ShipToId = []; // Список ShipTo выбранного Контрагента
var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
rootSchemaName: 'SxShipTo'
});
esq.addColumn('Id');
esq.filters.add('SxAccount',
esq.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, 'SxAccount', filterInfo.value[0]));
esq.getEntityCollection(function (response) {
if (response.success) {
ShipToId = [];
response.collection.each(function (item) {
ShipToId.push(item.values.Id);
});
self.set('ShipToId', ShipToId);
// TODO Надо обновить filter для фильтра ShipTo
}
}, this);
/* Фильтруем раздел по полю Контрагент */
var filter;
filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
"SxAccount", filterInfo.value));
return filter;
}
}
},
{
name: "SxShipTo",
caption: this.get("Resources.Strings.SxShipToFilterCaption"),
addSxShipToCaption: this.get("Resources.Strings.SxAddShipToCaption"),
referenceSchemaName: "SxShipTo",
entityColumn: {
isLookup: true
},
notNeedCurrentUser: true,
dataValueType: this.Terrasoft.DataValueType.LOOKUP,
filter: function(){
// Получаем список записей ShipTo выбранного Контрагента
if(self.get('ShipToId').length > 0) {
return Terrasoft.createColumnInFilterWithParameters(
"Id", self.get('ShipToId'));
}else{
// Если ShipTo пустой ставим невыполнимый фильтр. Список пуст.
return Terrasoft.createColumnIsNullFilter("Id");
}
},
getFilter: function (filterInfo) {
// Фильтруем раздел по полю ShipTo
var filter;
filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
"SxShipTo", filterInfo.value));
return filter;
}
}
]
};
this.set("FixedFilterConfig", fixedFilterConfig);
}
Нравится
Вячеслав, добрый день!
К сожалению, на текущий момент нет возможности вызвать инициализацию отдельного фильтра в блоке фильтрации при получении значений другого (или в любой другой момент). Для того, чтобы реализовать подобный функционал, необходимо вносить довольно много изменений в базовые модули фильтрации.
Как вариант, можно вызвать повторную инициализацию всех фильтров, добавив вызов метода self.initFilters() примерно в том месте, где у Вас расположен комментарий
[javascript]
// TODO Надо обновить filter для фильтра ShipTo
[/javascript]
плюс использовать флаг для избежания зацикливания. Также необходимо учесть случай, когда происходит очистка значения фильтра "Дистрибьютор" (во время работы над Вашим вопросом у меня это вызвало больше всего проблем).
Вот примерный список изменений, который Вы можете добавить для работы функционала:
1) Изменить метод getFilter первого фильтра примерно так:
[javascript]
getFilter: function (filterInfo) {
if (!self.get("ChildFiltersInitializing")) {
if(filterInfo.value) {
/* Генерируем фильтр для ShipTo */
var ShipToId = []; // Список ShipTo выбранного Контрагента
var esq = Ext.create('Terrasoft.EntitySchemaQuery', {
rootSchemaName: 'SxShipTo'
});
esq.addColumn('Id');
esq.filters.add('SxAccount',
esq.createColumnFilterWithParameter(
Terrasoft.ComparisonType.EQUAL, 'SxAccount', filterInfo.value[0]));
esq.getEntityCollection(function (response) {
if (response.success) {
ShipToId = [];
response.collection.each(function (item) {
ShipToId.push(item.values.Id);
});
self.set('ShipToId', ShipToId);
// TODO Надо обновить filter для фильтра ShipTo
self.set("ChildFiltersInitializing", true);
self.initFilters();
}
}, this);
} else {
if ((self.get("ChildFiltersInitializing") !== undefined) && self.get("ShipToId")) {
self.set("ShipToId", null);
self.set("ChildFiltersInitializing", true);
self.initFilters();
}
}
}
/* Фильтруем раздел по полю Контрагент */
var filter;
filterInfo.value && (filter = Terrasoft.createColumnInFilterWithParameters(
"SxAccount", filterInfo.value));
return filter;
}
[/javascript]
2) добавить переопределение метода onFilterUpdate для инициализации флага:
[javascript]
onFilterUpdate: function() {
this.callParent(arguments);
if (this.get("ChildFiltersInitializing")) {
this.set("ChildFiltersInitializing", false);
}
}
[/javascript]
Возможно, понадобятся дополнительные изменения, в зависимости от Вашей итоговой реализации.