BPMonline 7.0.0.269. Проблемы с настройкой фильтрацией раздела (fixedFilterConfig)

Коллеги, день добрый!

Задача:
В разделе лиды сделать предустановленную фильтрацию лидов по региону текущего контакта

Дано:
1) в стандартной сущности Контакт (Contact) добавлено поле Регион контакта (ContactRegion, ссылка на справочник Регион (id,name,description))
2) в стандартной сущности Лид (Lead) добавлено поле Регион контрагента (AccountRegion, ссылка на справочник Регион)
3) Есть модуль ConfigurationConstantsEx (аналог ConfigurationConstants для новых значений справочников в том числе и ContactRegion)

Собсна, попробовал следующий вариант:
в Разделе контакты (ContactSection) добавил this.fixedFilterConfig

this.fixedFilterConfig = {
                                entitySchema: Lead,
                                filters: [
                                        {
                                                name: 'AccountRegionFilter',
                                                caption: resources.localizableStrings.mAccountRegionCaption,
                                                dataValueType: Terrasoft.DataValueType.LOOKUP,
                                                columnName: 'AccountRegion',
                                                defValue: {
                                                        //value: Terrasoft.currContactRegion.value,
                                                        value: ConfigurationConstantsEx.Lead.AccountRegion.MSK.value,
                                                        //displayValue: Terrasoft.currContactRegion.displayValue
                                                        displayValue: ConfigurationConstantsEx.Lead.AccountRegion.MSK.displayValue
                                                }
                                        },
                                        {
                                                name: 'StatusFilter',
                                                caption: resources.localizableStrings.mNewLeadStatus,
                                                dataValueType: Terrasoft.DataValueType.LOOKUP,
                                                columnName: 'Status',
                                                defValue: {
                                                        value: ConfigurationConstantsEx.Lead.Status.New.value,
                                                        displayValue: ConfigurationConstantsEx.Lead.Status.New.displayValue
                                                }
                                        }
                                ]
                        };

При попытке использовать статические значения для фильтров из ConfigurationConstantsEx все работает отлично...
а вот при попытке вытягивать значение из БД начинаются вполне предсказуемые проблемы

Код:

function getRegion(){
        var contactId = Terrasoft.SysValue.CURRENT_USER_CONTACT.value;

        var select = Ext.create('Terrasoft.EntitySchemaQuery', {
                rootSchemaName: 'Contact'
        });

        select.addColumn('ContactRegion.Id');
        select.addColumn('ContactRegion.Name');

        select.getEntity(contactId, function(response) {
                if (response && response.success) {
                        var entity = response.entity;
                        if (entity) {
                                Terrasoft.currContactRegion = {
                                                                displayValue: entity.get('ContactRegion.Name'),
                                                                value: entity.get('ContactRegion.Id')
                                                        };
                        }
                }
        }, this);
}

Проблема в том что на момент формирования секции и установки фильтров (fixedFilterConfig) функция getRegion() ничего не присваивает Terrasoft.currContactRegion ( так как ответа от сервера еще просто нет)
Ответ приходит уже после формирования визуального представления раздела (проверял, после формирования раздела Terrasoft.currContactRegion заполнен правильными значениями)
p.s. пробовал так же вариант с заполнением Terrasoft.currContactRegion ДО открытия раздела Лидов (в принципе получилось, но результат не радует так как пришлось наследовать совершенно ненужный мне модуль)
Вопроса у меня 3 
1) Может, кто сталкивался с подобной проблемой и нашел решение или я что-то делаю неправильно?
2) Есть ли возможность уже после формирования раздела программно установить значение определенного фильтра (на init например)?
3) Есть ли возможность добавить функцию получения данных контакта в Terrasoft.SysValue (что-нить типа Terrasoft.SysValue.CURRENT_CONTACT_REGION)?

С уважением, Волков Артем

Нравится

4 комментария

Добрый день.

1) Может, кто сталкивался с подобной проблемой и нашел решение или я что-то делаю неправильно?
Все работает предсказуемо и правильно - ответ от функции по заполнению значений из БД придет в callback асинхронно. Соответственно, нужно построить логику так, чтобы либо ждать, либо после выполнения запроса обновлять фильтр.

2) Есть ли возможность уже после формирования раздела программно установить значение определенного фильтра (на init например)?

В QuickFilterModule есть message для изменения фильтров AddFixedFilter, AddFolderFilter, AddCustomFilter. Как они работают можно посмотреть в модуле.
В SectionModule есть message для обновления фильтров QuickFilterChanged.
Примеры у нас есть в конфигурации.

3) Есть ли возможность добавить функцию получения данных контакта в Terrasoft.SysValue (что-нить типа Terrasoft.SysValue.CURRENT_CONTACT_REGION)?

Нет, к сожалению, нельзя.

Спасибо, Дмитрий!
Буду копать QuickFilterModule :)

С уважением, Волков Артем

Дмитрий, к сожалению,сам так и не осилил решение через message (инфы мало по работе с сообщениями) Может поможете?

пример тот же, хочу в функции getRegion() в модуле LeadSection после получения положительного ответа от сервера (if (response && response.success)) либо добавить фильтр через message(AddFixedFilter), либо изменить уже созданный в fixedFilterConfig

Заранее спасибо!

Артем, возможным решением будет добавить в Ваш метод GetRegion() строчки:

viewModel.clear(viewModel.get('currentTabName'));
viewModel.load(viewModel.get('currentTabName'));

как это делается в подписке на событие QuickFilterChanged в SectionModule для обносления реестра.

А для того чтобы отправить сообщение достаточно вызвать метод sandbox.publish().

Также альтернативой будет определить в разделе метод modifySelectQuery, в котором вы на основе этого атрибута дополнительно наложите фильтр на запрос. Например:

this.methods.modifySelectQuery = function(select, tabName, event) {
                var operationFilterType = this.get('OperationFilterType'); 
                if (operationFilterType === ‘Income') {
                                /*Накладываем фильтр на select* /
                }
}

Второй вариант будет лучше, скорее всего.

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