Интересует как создать фильтр в разделе из кода на клиентской стороне по нажатию кнопки
Есть задача создавать фильтр из кода на клиентской стороне по кнопке и применять его на раздел, если он не был создан ранее
Нравится
Смотрите в коде функции onFilterUpdate устанавливает фильтр. initFilterAttributes в ней можно самостоятельно обработать данные фильтра из профиля при загрузке реестра.
Добрый день, Денис!
Прошу Вас уточнить более подробно бизнес-задачу, так как не совсем понятно, что конкретно Вы хотите сделать.
Светлана Змиёва, создание фильтра в разделе из кода клиентской части
Денис, Вы хотите, чтобы слева в разделе визуально сформировался и применился фильтр или чтобы просто данные реестра отфильтровались, как происходит при изменении быстрого фильтра?
Если Вы имеете в виду второй вариант, то обратите внимание на логику какого-нибудь раздела с быстрыми фильтрами по дате, ответственному и подобному.
Например, см. раздел «Маркетинговые планы», фильтр по выбору года в выпадающем списке.
В схеме CampaignPlannerSection логика отправки сообщения в «песочницу» на событии изменения года:
/**
* @override Terrasoft.BaseMarketingCalendarSection#calendarYearChanged
*/
calendarYearChanged: function (newValue) {
this.sandbox.publish("CalendarYearChanged", newValue, ["MarketingCalendarCampaignsModuleId"]);
}И базовая реализация этого поля и его обработчика с пустой функцией в BaseMarketingCalendarSection:
{
"operation": "insert",
"parentName": "LeftGridUtilsContainer",
"propertyName": "items",
"name": "CalendarYear",
"values": {
"dataValueType": Terrasoft.DataValueType.ENUM,
"caption": {bindTo: "Resources.Strings.YearControlLabel"},
"wrapClass": ["select-year-container"],
"controlConfig": {
"className": "Terrasoft.ComboBoxEdit",
"list": {
"bindTo": "CalendarYearList"
},
"prepareList": {
"bindTo": "loadCalendarYearList"
},
"value": {
"bindTo": "CalendarYear"
},
"change": {
"bindTo": "calendarYearChanged"
}
}
}
}
...
/**
* Fires when year in calendar changed.
*/
"CalendarYearChanged": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.PUBLISH
}
},
.....
/**
* Handles change of selected year in calendar.
* @protected
* @param {Object} newValue Selected year value.
*/
calendarYearChanged: Terrasoft.emptyFn,А в схеме BaseMarketingCalendarPage приём этого сообщения и наложение фильтров по году:
/**
* @inheritDoc Terrasoft.BaseSectionV2#subscribeSandboxEvents
* @overridden
*/
subscribeSandboxEvents: function() {
var resolvedClickSubscriberId = this.sandbox.id;
this.sandbox.subscribe("OpenCalendarGridSettings", function() {
this.openGridSettings();
}, this, [resolvedClickSubscriberId]);
this.sandbox.subscribe("SetCalendarScale", function(config) {
this.setScale(config.tag);
}, this, [resolvedClickSubscriberId]);
this.sandbox.subscribe("ToggleCalendar", function(value) {
this.set("IsRightGridContainerVisible", value);
}, this, [resolvedClickSubscriberId]);
this.sandbox.subscribe("SortGrid", function(tag) {
this.sortGrid(tag);
}, this, [resolvedClickSubscriberId]);
this.sandbox.subscribe("CalendarYearChanged", function(value) {
this.$CalendarYear = value;
this.reloadGridData();
}, this, [resolvedClickSubscriberId]);
},
...
/**
* @inheritdoc Terrasoft.GridUtilities#getFilters
* @returns {Terrasoft.FilterGroup}
*/
getFilters: function() {
var sectionFilters = this.get("SectionFilters");
if (Ext.isEmpty(sectionFilters)) {
return this.mixins.GridUtilities.getFilters.call(this);
}
var selectedYear = new Date().getFullYear();
if (!Terrasoft.isEmpty(this.$CalendarYear) && !Terrasoft.isEmpty(this.$CalendarYear.value)) {
selectedYear = this.$CalendarYear.value;
}
var serializationInfo = sectionFilters.getDefSerializationInfo();
serializationInfo.serializeFilterManagerInfo = true;
var deserializedFilters = Terrasoft.deserialize(sectionFilters.serialize(serializationInfo));
deserializedFilters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.GREATER_OR_EQUAL,
"StartDate", new Date(Date.UTC(selectedYear, 0)),
Terrasoft.DataValueType.DATE));
deserializedFilters.addItem(Terrasoft.createColumnFilterWithParameter(
Terrasoft.ComparisonType.LESS,
"StartDate", new Date(Date.UTC(selectedYear + 1, 0)),
Terrasoft.DataValueType.DATE));
...
Смотрите в коде функции onFilterUpdate устанавливает фильтр. initFilterAttributes в ней можно самостоятельно обработать данные фильтра из профиля при загрузке реестра.