Сложный кастомный фильтр

Здравствуйте!

Система - bpm'online service enterprice 7.13 

Раздел Конфигурации(он же Продукты на других версиях) в карточке единицы конфигурации есть деталь Комплектация, где присутствует возможность добавить связанные продукты(ед. конфигурации).

Интересует возможность добавления в контейнер секции(Конфигурации) поля для ввода и кнопки после нажатия на которою устанавливался бы фильтр на ед. конфигурации по названию(которое было введено в поле) и плюс в грид выводились все комплектующие данной ед. конфигурации.

Можно ли такое реализовать?

Нравится

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

Андреев Андрей Сергеевич,

Так, ну тогда можно попробовать следующий вариант:

1) Создаем контейнер и поле для поиска

{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
                    "layout": {
                        "column": 25,
                        "row": 1,
                        "colSpan": 4
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "UsrEmail",
                "values": {
                    "bindTo": "UsrEmailFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrEmailFilter"},
                    "layout": {
                        "column": 5,
                        "row": 2,
                        "colSpan": 4
                    },
                    "controlConfig": {
                        "change": {
                            "bindTo": "emailChanged"
                        }
                    }
                }
            }

2) Добавляем атрибуты

 

  attributes: {
            "UsrEmailFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrEmails": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            }
        },

3) Добавляем методы

 

emailChanged: function(a, b, c) {
                this.set("UsrEmails", a);
                this.onUsrFilterChanged();
                debugger;
            },
            clearFilter: function() {
                this.set("UsrEmailFilter", "");
                this.onUsrFilterChanged();
            },
 
            onUsrFilterChanged: function() {
                this.reloadGridData();
            },
 
            initQueryFilters: function(esq) {
                this.callParent(arguments);
 
                var usrEmailFilter = this.get("UsrEmails");
 
                if (usrEmailFilter) {
                    esq.filters.add("UsrEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.CONTAIN, "[Account:Id].Email".substring(), usrEmailFilter));
                } else {
                    esq.filters.removeByKey("UsrEmailFilter");
                }
            }

Конкретно в данном примере вы на выходе получите поле для фильтрации контрагентов по Email.

Ваша же задача, доработать initQueryFilters, во первых заменить на продукты фильтр и дополнить значениям с детали.



Делаете esq запрос,с фильтрами, по названию, в примере выше есть, формируйте коллекцию Id записей, затем по этой коллекции, делайте еще одну выборку уже в деталь, на выходе получите еще одну коллекцию ID продуктов записей, дополните её значениями первой коллекции, после чего, весь этот массив данных передайте в initQueryFilters и через обычный for (i=0; collection.lenghr; i++) { постройте и верните filterGroup }

Можете скриншотами показать, что вы хотите? Как-то все запутано звучит.

Что касается, первой части "Поле для ввода" и "Кнопки" по нажатию на которой в гриде отобразить подходящие значения - реализовать можно, делается достаточно быстро.

В моем понимании этой части вашей задачи все выглядит так: есть раздел Контрагент => Ввел в нужном Поле например Наша компания => клик Найти => в гриде раздела отобразились все записи с названием "Наша компания".

Если верно, то что вы хотите во 2-ой части своего вопроса?

Литвинко Павел,

http://prntscr.com/lj4zpx

На скрине сама секция - Техника аки Конфигурации

1.Контейнер где должен располагаться фильтр(поле и кнопка)

2. Сущность секции аки Запись



http://prntscr.com/lj50rz

На этом скрине карточка сущности.

В выделенной области есть деталь Комплектующие где хранятся связи с другими такими же записями того же раздела



Суть фильтра такова.

Вводишь в поле Название записи и после нажатие на кнопку происходит фильтрация и в гриде остается запись с этим названием плюс все записи что в детальке Комплектующие данной записи т.е. связанные.



Как сделать такого рода фильтрацию?

 

Андреев Андрей Сергеевич,

Так, ну тогда можно попробовать следующий вариант:

1) Создаем контейнер и поле для поиска

{
                "operation": "insert",
                "name": "MyFilterContainer",
                "parentName": "LeftGridUtilsContainer",
                "propertyName": "items",
                "index": 0,
                "values": {
                    "id": "MyFilterContainer",
                    "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                    "items": [],
                    "layout": {
                        "column": 25,
                        "row": 1,
                        "colSpan": 4
                    }
                }
            },
            {
                "operation": "insert",
                "parentName": "MyFilterContainer",
                "propertyName": "items",
                "name": "UsrEmail",
                "values": {
                    "bindTo": "UsrEmailFilter",
                    "caption": {"bindTo": "Resources.Strings.UsrEmailFilter"},
                    "layout": {
                        "column": 5,
                        "row": 2,
                        "colSpan": 4
                    },
                    "controlConfig": {
                        "change": {
                            "bindTo": "emailChanged"
                        }
                    }
                }
            }

2) Добавляем атрибуты

 

  attributes: {
            "UsrEmailFilter": {
                "dataValueType": Terrasoft.DataValueType.TEXT
            },
            "UsrEmails": {
                "dataValueType": Terrasoft.DataValueType.TEXT,
                "values": ""
            }
        },

3) Добавляем методы

 

emailChanged: function(a, b, c) {
                this.set("UsrEmails", a);
                this.onUsrFilterChanged();
                debugger;
            },
            clearFilter: function() {
                this.set("UsrEmailFilter", "");
                this.onUsrFilterChanged();
            },
 
            onUsrFilterChanged: function() {
                this.reloadGridData();
            },
 
            initQueryFilters: function(esq) {
                this.callParent(arguments);
 
                var usrEmailFilter = this.get("UsrEmails");
 
                if (usrEmailFilter) {
                    esq.filters.add("UsrEmailFilter", this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.CONTAIN, "[Account:Id].Email".substring(), usrEmailFilter));
                } else {
                    esq.filters.removeByKey("UsrEmailFilter");
                }
            }

Конкретно в данном примере вы на выходе получите поле для фильтрации контрагентов по Email.

Ваша же задача, доработать initQueryFilters, во первых заменить на продукты фильтр и дополнить значениям с детали.



Делаете esq запрос,с фильтрами, по названию, в примере выше есть, формируйте коллекцию Id записей, затем по этой коллекции, делайте еще одну выборку уже в деталь, на выходе получите еще одну коллекцию ID продуктов записей, дополните её значениями первой коллекции, после чего, весь этот массив данных передайте в initQueryFilters и через обычный for (i=0; collection.lenghr; i++) { постройте и верните filterGroup }

Литвинко Павел,

Спасибо большое!

Чекните ЛС плз.

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