Фильтрация выпадающего списка в пользовательском фиксированном фильтре раздела
24 мая 2019 12:28
Добрый день, подскажите как реализовать данную задачу.
В разделе создал пользовательские фильтры Улица, Дом , Квартира. Значения в фильтре Дом зависят от Улицы, а значения в фильтре Квартира от значения Дом.
Если нажимать на "лупу" то фильтрация успешно отрабатывает. Но если вводить значения в поле - фильтр в выпадающем списке не срабатывает.
Как реализовать фильтрацию выпадающего списка в разделе?
Код схемы раздела:
define("VcApartments1Section", ["BaseFiltersGenerateModule", "css!VcMyFilterStyle"],
function(BaseFiltersGenerateModule) {
return {
entitySchemaName: "VcApartments",
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "MyFilterGroupContainer",
"parentName": "LeftGridUtilsContainer",
"propertyName": "items",
"index": 0,
"values": {
"id": "MyFilterGroupContainer",
"itemType": this.Terrasoft.ViewItemType.CONTAINER,
"items": []
}
},
{
"operation": "insert",
"name": "MyFilterContainer",
"parentName": "MyFilterGroupContainer",
"propertyName": "items",
"index": 0,
"values": {
"id": "MyFilterContainer",
"itemType": this.Terrasoft.ViewItemType.CONTAINER,
"items": []
}
},
{
"operation": "insert",
"parentName": "MyFilterContainer",
"propertyName": "items",
"name": "VcStreetFilter",
"values": {
"bindTo": "VcStreetFilter",
"caption": "Улица"
}
},
{
"operation": "insert",
"name": "MyFilterContainer2",
"parentName": "MyFilterGroupContainer",
"propertyName": "items",
"index": 1,
"values": {
"id": "MyFilterContainer2",
"itemType": this.Terrasoft.ViewItemType.CONTAINER,
"items": []
}
},
{
"operation": "insert",
"parentName": "MyFilterContainer2",
"propertyName": "items",
"name": "VcHouseFilter",
"values": {
"bindTo": "VcHouseFilter",
"caption": "Дом"
// "controlConfig": {
// "prepareList": {
// "bindTo": "VcHouseFilter"
// }
// // "contentType": Terrasoft.ContentType.ENUM
// }
}
},
{
"operation": "insert",
"name": "MyFilterContainer3",
"parentName": "MyFilterGroupContainer",
"propertyName": "items",
"index": 2,
"values": {
"id": "MyFilterContainer3",
"itemType": this.Terrasoft.ViewItemType.CONTAINER,
"items": []
}
},
{
"operation": "insert",
"parentName": "MyFilterContainer3",
"propertyName": "items",
"name": "VcNameFilter",
"values": {
"bindTo": "VcNameFilter",
"caption": "Квартира"
}
}
]/**SCHEMA_DIFF*/,
attributes: {
"VcStreetFilter": {
"dataValueType": Terrasoft.DataValueType.LOOKUP,
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
isLookup: true,
caption: "VcStreet",
referenceSchemaName: "VcStreet"
},
"VcHouseFilter": {
"dataValueType": Terrasoft.DataValueType.LOOKUP,
"lookupListConfig": {
// Массив фильтров, применяемых к запросу для формирования данных поля-справочника.
"filters": [
function() {
var filterGroup = Ext.create("Terrasoft.FilterGroup");
var VcStreetFilter = this.get("VcStreetFilter");
if (VcStreetFilter && VcStreetFilter.value) {
filterGroup.add("VcStreetFilter",Terrasoft.createColumnFilterWithParameter
(Terrasoft.ComparisonType.EQUAL, "[VcHouses:Id].VcStreet", VcStreetFilter.value));
} else {
filterGroup.removeByKey("VcStreetFilter");
}
return filterGroup;
}
]
},
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
isLookup: true,
caption: "VcHouse",
referenceSchemaName: "VcHouses"
},
"VcNameFilter": {
"dataValueType": Terrasoft.DataValueType.LOOKUP,
"lookupListConfig": {
// Массив фильтров, применяемых к запросу для формирования данных поля-справочника.
"filters": [
function() {
var filterGroup = Ext.create("Terrasoft.FilterGroup");
var VcHouseFilter = this.get("VcHouseFilter");
if (VcHouseFilter && VcHouseFilter.value) {
filterGroup.add("VcHouseFilter",Terrasoft.createColumnFilterWithParameter
(Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcHouse", VcHouseFilter.value));
} else {
filterGroup.removeByKey("VcHouseFilter");
}
return filterGroup;
}
]
},
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
isLookup: true,
caption: "VcName",
referenceSchemaName: "VcApartments"
}
},
mixins: {
LookupQuickAddMixin: "Terrasoft.LookupQuickAddMixin"
},
methods: {
onLookupChange: function(newValue, columnName) {
this.callParent(arguments);
if (columnName === "VcStreetFilter") {
this.set("VcStreetFilter", newValue);
this.onVcStreetFilterChanged();
}
if (columnName === "VcHouseFilter") {
this.set("VcHouseFilter", newValue);
this.onVcHouseFilterChanged();
}
if (columnName === "VcNameFilter") {
this.set("VcNameFilter", newValue);
this.onVcNameFilterChanged();
}
},
// Обновляет грид
onVcStreetFilterChanged: function() {
this.reloadGridData();
},
onVcHouseFilterChanged: function() {
this.reloadGridData();
},
onVcNameFilterChanged: function() {
this.reloadGridData();
},
// Инициализирует фиксированные фильтры
initQueryFilters: function(esq) {
this.callParent(arguments);
// Фильтр по Улице
var VcStreetFilter = this.get("VcStreetFilter");
if (VcStreetFilter && VcStreetFilter.value) {
esq.filters.add("VcStreetFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcStreet", VcStreetFilter.value));
} else {
esq.filters.removeByKey("VcStreetFilter");
}
// Фильтр по Дому
var VcHouseFilter = this.get("VcHouseFilter");
if (VcHouseFilter && VcHouseFilter.value) {
esq.filters.add("VcHouseFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].VcHouse", VcHouseFilter.value));
} else {
esq.filters.removeByKey("VcHouseFilter");
}
// Фильтр по названию
var VcNameFilter = this.get("VcNameFilter");
if (VcNameFilter && VcNameFilter.value) {
esq.filters.add("VcNameFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "[VcApartments:Id].Id", VcNameFilter.value));
} else {
esq.filters.removeByKey("VcNameFilter");
}
}
}
};
});
Нравится
2 комментария
Лучший ответ
27 мая 2019 12:06
Сталкивался с подобной проблемой. Пришлось заместить данные методы на странице редактирования (в моем случае) InvoiceSectionV2
/**
* @inheritdoc Terrasoft.BaseViewModel#onLookupDataLoaded
* @override
*/
onLookupDataLoaded: function(config) {
this.callParent(arguments);
this.mixins.LookupQuickAddMixin.onLookupDataLoaded.call(this, config);
},
getLookupListConfig: function() {
return this.mixins.LookupQuickAddMixin.getLookupListConfig.apply(this, arguments);
},
/**
* @inheritdoc Terrasoft.BaseViewModel#getLookupQuery
* @override
*/
getLookupQuery: function(filterValue, columnName) {
var esq = this.callParent(arguments);
this.applyColumnsOrderToLookupQuery(esq, columnName);
var filterGroup = this.getLookupQueryFilters(columnName);
esq.filters.addItem(filterGroup);
return esq;
},
/**
* Applies order information to lookup entity schema query.
* @protected
* @param {Terrasoft.EntitySchemaQuery} esq Entity schema query.
* @param {String} columnName Lookup column name.
*/
applyColumnsOrderToLookupQuery: function(esq, columnName) {
var lookupColumn = this.getColumnByName(columnName);
var lookupListConfig = lookupColumn.lookupListConfig;
if (!lookupListConfig || !lookupListConfig.orders) {
return;
}
var columns = esq.columns;
this.Terrasoft.each(lookupListConfig.orders, function(order) {
var orderColumnPath = order.columnPath;
if (!columns.contains(orderColumnPath)) {
esq.addColumn(orderColumnPath);
}
var sortedColumn = columns.get(orderColumnPath);
var direction = order.direction;
sortedColumn.orderDirection = direction ? direction : Terrasoft.OrderDirection.ASC;
var position = order.position;
sortedColumn.orderPosition = position ? position : 1;
this.shiftColumnsOrderPosition(columns, sortedColumn);
}, this);
},
/**
* Shift columns order position.
* @private
* @param {Array} columns Entity columns.
* @param {Object} sortedColumn Entity sorting column.
*/
shiftColumnsOrderPosition: function(columns, sortedColumn) {
var sortedColumnOrderPosition = sortedColumn.orderPosition;
if (Ext.isNumber(sortedColumnOrderPosition)) {
columns.each(function(column) {
if (column !== sortedColumn && Ext.isNumber(column.orderPosition) &&
column.orderPosition >= sortedColumnOrderPosition) {
column.orderPosition += 1;
}
});
}
},
27 мая 2019 12:06
Сталкивался с подобной проблемой. Пришлось заместить данные методы на странице редактирования (в моем случае) InvoiceSectionV2
/**
* @inheritdoc Terrasoft.BaseViewModel#onLookupDataLoaded
* @override
*/
onLookupDataLoaded: function(config) {
this.callParent(arguments);
this.mixins.LookupQuickAddMixin.onLookupDataLoaded.call(this, config);
},
getLookupListConfig: function() {
return this.mixins.LookupQuickAddMixin.getLookupListConfig.apply(this, arguments);
},
/**
* @inheritdoc Terrasoft.BaseViewModel#getLookupQuery
* @override
*/
getLookupQuery: function(filterValue, columnName) {
var esq = this.callParent(arguments);
this.applyColumnsOrderToLookupQuery(esq, columnName);
var filterGroup = this.getLookupQueryFilters(columnName);
esq.filters.addItem(filterGroup);
return esq;
},
/**
* Applies order information to lookup entity schema query.
* @protected
* @param {Terrasoft.EntitySchemaQuery} esq Entity schema query.
* @param {String} columnName Lookup column name.
*/
applyColumnsOrderToLookupQuery: function(esq, columnName) {
var lookupColumn = this.getColumnByName(columnName);
var lookupListConfig = lookupColumn.lookupListConfig;
if (!lookupListConfig || !lookupListConfig.orders) {
return;
}
var columns = esq.columns;
this.Terrasoft.each(lookupListConfig.orders, function(order) {
var orderColumnPath = order.columnPath;
if (!columns.contains(orderColumnPath)) {
esq.addColumn(orderColumnPath);
}
var sortedColumn = columns.get(orderColumnPath);
var direction = order.direction;
sortedColumn.orderDirection = direction ? direction : Terrasoft.OrderDirection.ASC;
var position = order.position;
sortedColumn.orderPosition = position ? position : 1;
this.shiftColumnsOrderPosition(columns, sortedColumn);
}, this);
},
/**
* Shift columns order position.
* @private
* @param {Array} columns Entity columns.
* @param {Object} sortedColumn Entity sorting column.
*/
shiftColumnsOrderPosition: function(columns, sortedColumn) {
var sortedColumnOrderPosition = sortedColumn.orderPosition;
if (Ext.isNumber(sortedColumnOrderPosition)) {
columns.each(function(column) {
if (column !== sortedColumn && Ext.isNumber(column.orderPosition) &&
column.orderPosition >= sortedColumnOrderPosition) {
column.orderPosition += 1;
}
});
}
},
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать