Вопрос

Фильтр в методе loadGridData, множественный выбор

Добрый день!

 

Пытаюсь добавить фильтр в метод loadGridData, фильтр успешно отрабатывает, показывает нужные данные, но при нажатии кнопки "Действия" - "Выбрать все" выбираются все записи, даже которые скрыты. Подскажите, как можно убрать этот эффект?

 

Мой код:

loadGridData: function() {
					this.beforeLoadGridData();
					var esq = this.getGridDataESQ();
					esq.filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Owner", Terrasoft.SysValue.CURRENT_USER_CONTACT.value));
					this.initQueryColumns(esq);
					this.initQuerySorting(esq);
					this.initQueryFilters(esq);
					this.initQueryOptions(esq);
					this.initQueryEvents(esq);
					esq.getEntityCollection(function(response) {
						this.destroyQueryEvents(esq);
						this.updateLoadedGridData(response, this.onGridDataLoaded, this);
						this.checkNotFoundColumns(response);
					}, this);
				}

 

Скриншот проблемы:

Изображение удалено.

 

Нравится

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

Роман Сидаш,

Что касается мобильного приложения, то там логика работы фильтров немного иная. Для понимания наведу пример кастомного мобильного фильтра на раздел контрагенты:

Ext.define('Ext.Terrasoft.ListLogicalFilter', {
 
    extend: 'Terrasoft.controls.BaseFilterModule',
 
    xtype: 'tslistlogicalfilter',
 
    config: {
        columnName: null,
        title: null,
        compareType: null,
        checked: false,
        component: {
            xtype: 'tscheckbox',
            checked: false,
            style: 'margin-top: 10px;'
        }
    },
 
    initialize: function() {
        Ext.apply(this.config.component, {
            label: this.initialConfig.title
        });
        this.callParent(arguments);
        var component = this.getComponent();
        component.setChecked(this.getChecked());
        component.on('check', this.execute, this);
        component.on('uncheck', this.execute, this);
    },
 
    getFilter: function() {
        var component = this.getComponent();
        if (!component.config) {
            return null;
        }
        var value = component.getChecked();
        if (value === true) {
            var compareType = this.getCompareType() || Terrasoft.ComparisonTypes.Equal;
            return Ext.create('Terrasoft.Filter', {
                property: this.getColumnName(),
                compareType: compareType,
                valueIsMacros: true,
                value: Terrasoft.ValueMacros.CurrentUserContactId
            });
        }
        return null;
    }
 
});
Terrasoft.sdk.GridPage.setAdditionalFilterModule('Account', {
    type: 'tslistlogicalfilter',
    columnName: 'Owner',
    compareType: Terrasoft.ComparisonTypes.Equal,
    title: 'Мои account',
    checked: true
});

После его добавления при открытии списка контрагентов данный фильтр будет автоматически применён.

Ярким примером подобных фильтров является фильтр на период в активности. Если необходимо реализовать логику применения своего фильтра, то рекомендую ознакомится с кодом схемы MobileActivityGridPageControllerV2 пакета Mobile и тоё его части, что отвечает за PeriodFilter. Там описана логика его инициализации, смены значения и прочее.

Попробуйте решить свою задачу другим способом:

Заместить метод getFilters, добавив в него еще свой кастомный фильтр, а loadGridData не трогать

            getFilters: function() {

                var filters = this.callParent(arguments);

                return this.initCustomSectionFilters(filters);

            },

initCustomSectionFilters(filters) {

                filters.add("CurrentUser", this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Owner", Terrasoft.SysValue.CURRENT_USER_CONTACT.value));    

                return filters;

            }

Трефилов Павел Сергеевич,

спасибо! это то, что нужно

 

А можете еще подсказать, если аналогично для мобильного приложения делать, то нужно реализовывать подобное и в клиентском модуле реестра мобильного приложения?

Роман Сидаш,

про мобильное приложение к сожалению не подскажу, мы не делали такой доработки. Но вероятно есть похожие методы, нужно смотреть модуль для приложения.

Роман Сидаш,

Что касается мобильного приложения, то там логика работы фильтров немного иная. Для понимания наведу пример кастомного мобильного фильтра на раздел контрагенты:

Ext.define('Ext.Terrasoft.ListLogicalFilter', {
 
    extend: 'Terrasoft.controls.BaseFilterModule',
 
    xtype: 'tslistlogicalfilter',
 
    config: {
        columnName: null,
        title: null,
        compareType: null,
        checked: false,
        component: {
            xtype: 'tscheckbox',
            checked: false,
            style: 'margin-top: 10px;'
        }
    },
 
    initialize: function() {
        Ext.apply(this.config.component, {
            label: this.initialConfig.title
        });
        this.callParent(arguments);
        var component = this.getComponent();
        component.setChecked(this.getChecked());
        component.on('check', this.execute, this);
        component.on('uncheck', this.execute, this);
    },
 
    getFilter: function() {
        var component = this.getComponent();
        if (!component.config) {
            return null;
        }
        var value = component.getChecked();
        if (value === true) {
            var compareType = this.getCompareType() || Terrasoft.ComparisonTypes.Equal;
            return Ext.create('Terrasoft.Filter', {
                property: this.getColumnName(),
                compareType: compareType,
                valueIsMacros: true,
                value: Terrasoft.ValueMacros.CurrentUserContactId
            });
        }
        return null;
    }
 
});
Terrasoft.sdk.GridPage.setAdditionalFilterModule('Account', {
    type: 'tslistlogicalfilter',
    columnName: 'Owner',
    compareType: Terrasoft.ComparisonTypes.Equal,
    title: 'Мои account',
    checked: true
});

После его добавления при открытии списка контрагентов данный фильтр будет автоматически применён.

Ярким примером подобных фильтров является фильтр на период в активности. Если необходимо реализовать логику применения своего фильтра, то рекомендую ознакомится с кодом схемы MobileActivityGridPageControllerV2 пакета Mobile и тоё его части, что отвечает за PeriodFilter. Там описана логика его инициализации, смены значения и прочее.

Дима Вовченко,

спасибо!

Подскажите, а в Вашем примере кода для чего нужна секция "config", вернее свойства его, которые равны null?

Роман Сидаш,

Давно писал код и точно сказать не могу, насколько помню, пытался реализовать применение фильтра по нажатию на чек-бокс и 

config нужен для него. Однако, с ним не срослось и фильтр всегда применялся автоматом при старте страницы.

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