Есть задача создавать фильтр из кода на клиентской стороне по кнопке и применять его на раздел, если он не был создан ранее

Нравится

5 комментариев
Лучший ответ

Смотрите в коде функции 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 в ней можно самостоятельно обработать данные фильтра из профиля при загрузке реестра.

Показать все комментарии