Вопрос
Фильтрация выпадающего списка в пользовательском фиксированном фильтре раздела
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; } }); } },
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать