Вопрос

Создание справочника с множественным выбором в разделе [Case]

Добрый день, коллеги.

Есть задача в разделе Обращения [Case] добавить справочник с множественным выбором.

Большая просьба подсказать, что я делаю не правильно?

1. Создал Объект, Название = [UsrTemplate], Заголовок = [Шаблоны].

Родительский объект = Базовый справочник

2. В объекте [Case] добавил Поле, тип справочник, Название = [UsrNewTemplateSpr].

Для поля [UsrNewTemplateSpr] в разделе Справочник выбрал значение [Шаблоны]

3. Наполнил справочник [Шаблоны] данными.

4. В схеме [CasePage] добавил код в разделе [methods]

methods: {

                      

    openUsrNewTemplateSprLookup: function() 

    {    

                        

        var config = 

        {

               entitySchemaName: "UsrTemplate",

               multiSelect: true,

               columns: ["Name"]

        };

        

                this.openLookup(config, this.addCallBack, this);

     },

 

    addCallBack: function(args) 

    {

        this.selectedRows = args.selectedRows.getItems();

        this.selectedItems = [];

        /// this.selectedRows.forEach(function(item) {}, this);

    },

},



5. Сохраняю схему,  но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось сделать.

 

 

Очень надеюсь на обратную связь.

С уважением,

Дмитрий.

Нравится

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

mdv,

Не нужно было создавать замещающий модуль для этого, а нужно было добавить лок. строку в схему карточки CasePage.



Про фильтрацию можно почитать тут.

Фильтр может выглядеть так: 



 

// UsrLogic название твоего поля в Entity Case и шаблонов
const LogicId = this.get("UsrLogic").value;
config.filters = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrLogic", LogicId);

1) Привидите весь код страницы

2)  Поясните что значит

>но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось

И как в раздел вы добавляете справочник?

Григорий Чех пишет:

1) Привидите весь код страницы

2)  Поясните что значит

>но множественного выбора в разделе [Case] в справочнике [UsrNewTemplateSpr] так и не получилось

И как в раздел вы добавляете справочник?

Григорий Чех,

Георгий, спасибо.

1) Код CasePage:

==

define("CasePage", [], function() {

    return {

        entitySchemaName: "Case",

        attributes: {},

        modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

        businessRules: /**SCHEMA_BUSINESS_RULES*/{

            "UsrNewTemplateSpr": {

                "88cf5000-655d-4765-969d-14b79c4b2a87": {

                    "uId": "88cf5000-655d-4765-969d-14b79c4b2a87",

                    "enabled": true,

                    "removed": false,

                    "ruleType": 1,

                    "baseAttributePatch": "UsrLogic",

                    "comparisonType": 3,

                    "type": 1,

                    "attribute": "UsrLogic"

                }

            },

            "UsrOldTemplateSpr": {

                "ebd03987-37ae-4531-9338-c87ee009dbc5": {

                    "uId": "ebd03987-37ae-4531-9338-c87ee009dbc5",

                    "enabled": true,

                    "removed": false,

                    "ruleType": 1,

                    "baseAttributePatch": "UsrLogic",

                    "comparisonType": 3,

                    "type": 1,

                    "attribute": "UsrLogic"

                }

            }

        }/**SCHEMA_BUSINESS_RULES*/,

        methods: {

                    

                    addCallBack: function(args) 

                    {

                            this.selectedRows = args.selectedRows.getItems();

                            this.selectedItems = [];

                            /// this.selectedRows.forEach(function(item) {}, this);

                    },

                    

                    openUsrNewTemplateSprLookup: function() 

                    {    

                        

                        var config = 

                        {

                            entitySchemaName: "UsrTemplate",

                            multiSelect: true,

                            columns: ["Name"]

                        };

                        

                        this.openLookup(config, this.addCallBack, this);

                     },

                     

                },

        dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,

        diff: /**SCHEMA_DIFF*/[

            {

                "operation": "merge",

                "name": "ProcessingTab",

                "values": {

                    "order": 0

                }

            },

            {

                "operation": "merge",

                "name": "ESNTab",

                "values": {

                    "order": 5

                }

            },

            {

                "operation": "merge",

                "name": "SolutionTab",

                "values": {

                    "order": 1

                }

            },

            {

                "operation": "merge",

                "name": "SatisfactionLevelComment",

                "values": {

                    "layout": {

                        "colSpan": 24,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 1

                    }

                }

            },

            {

                "operation": "merge",

                "name": "CaseInformationTab",

                "values": {

                    "order": 2

                }

            },

            {

                "operation": "insert",

                "name": "UsrLogic9f0f812c-bb72-4617-8c90-6f19661b00d1",

                "values": {

                    "layout": {

                        "colSpan": 24,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 3,

                        "layoutName": "CaseInformation_gridLayout"

                    },

                    "bindTo": "UsrLogic"

                },

                "parentName": "CaseInformation_gridLayout",

                "propertyName": "items",

                "index": 3

            },

            {

                "operation": "insert",

                "name": "UsrNewTemplateSpr4dc847cf-00f3-4d64-a814-04acaed66407",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 4,

                        "layoutName": "CaseInformation_gridLayout"

                    },

                    "bindTo": "UsrNewTemplateSpr"

                },

                "parentName": "CaseInformation_gridLayout",

                "propertyName": "items",

                "index": 4

            },

            {

                "operation": "insert",

                "name": "UsrNewTemplate953c074b-a456-4786-98d2-5abb6a3bf38d",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 12,

                        "row": 4,

                        "layoutName": "CaseInformation_gridLayout"

                    },

                    "bindTo": "UsrNewTemplate"

                },

                "parentName": "CaseInformation_gridLayout",

                "propertyName": "items",

                "index": 5

            },

            {

                "operation": "insert",

                "name": "UsrOldTemplateSpr402b5c7a-3848-4df4-b26f-dc8fa1e56c48",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 5,

                        "layoutName": "CaseInformation_gridLayout"

                    },

                    "bindTo": "UsrOldTemplateSpr"

                },

                "parentName": "CaseInformation_gridLayout",

                "propertyName": "items",

                "index": 6

            },

            {

                "operation": "insert",

                "name": "UsrOldTemplate86822e69-1e25-442b-b648-ea0b5816675d",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 12,

                        "row": 5,

                        "layoutName": "CaseInformation_gridLayout"

                    },

                    "bindTo": "UsrOldTemplate"

                },

                "parentName": "CaseInformation_gridLayout",

                "propertyName": "items",

                "index": 7

            },

            {

                "operation": "merge",

                "name": "NotesFilesTab",

                "values": {

                    "order": 4

                }

            },

            {

                "operation": "move",

                "name": "ResoluitonContainer",

                "parentName": "ProfileContainer",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "move",

                "name": "ServiceItem",

                "parentName": "ProfileContainer",

                "propertyName": "items",

                "index": 5

            },

            {

                "operation": "move",

                "name": "SolutionCaptionProfile",

                "parentName": "ResolutionGridLayout",

                "propertyName": "items",

                "index": 0

            },

            {

                "operation": "move",

                "name": "ParentCase",

                "parentName": "SolutionTab_gridLayout",

                "propertyName": "items",

                "index": 1

            },

            {

                "operation": "move",

                "name": "FirstSolutionProvidedOn",

                "parentName": "TermsControlGroup_GridLayout",

                "propertyName": "items",

                "index": 3

            }

        ]/**SCHEMA_DIFF*/

    };

});

 

==

 

2) Нет возможности выбрать несколько записей справочника, только одну

 

Григорий Чех,

3. И как в раздел вы добавляете справочник?

Справочник создавал через конфигурацию системы, добавлял справочник в раздел через Мастер разделов

mdv,

Насколько я знаю в системе нет возможности в справочное поле раздела засунуть больше 1-ой записи справочника. Для этого как правило создается деталька которая будет связывать записи раздела и записи справочника многие ко многим, при этом на обработчик события добавления записи на деталь вешается мультивыбор из справочника. 

Ссылка на гайд как сделать.

Андреев Андрей Сергеевич пишет:

mdv,

Насколько я знаю в системе нет возможности в справочное поле раздела засунуть больше 1-ой записи справочника. Для этого как правило создается деталька которая будет связывать записи раздела и записи справочника многие ко многим, при этом на обработчик события добавления записи на деталь вешается мультивыбор из справочника. 

Ссылка на гайд как сделать.

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

Андрей, спасибо, задача состоит в том,  чтобы можно было выбрать несколько записей из справочника, а дальше в функции  addCallBack: function(args)     { }  я выбранные записи сохраню в нужных дополнительных полях. 

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

Спасибо.

 

mdv, 

 

mdv пишет:

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

что означает "в разделе"? насколько я понимаю заполнения поля происходят в карточке этого раздела.

Карточка вот так выглядит: 

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



Правильно я понимаю, что вы хотите кликнув на справочное поле в карточке, чтобы у вас открылась карточка с мультивыбором и выбрав несколько они должны заполнится в такие же справочные поля? Но что при этом должно остаться в самом справочном поле на которое вы изначально кликали?   

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

Андрей, не хотел утомлять описанием всей задачи, давайте все-таки постараюсь подробно описать бизнес-кейс.

Есть тип Обращений по актуализации Логик и Шаблонов, названия которых необходимо указать в обращении, в специально созданных текстовых полях. Затем в отчетах Excel удобно будет выбирать необходимую информацию по этому типу обращений с названиями логик и шаблонов.

 

Связь Логик и Шаблонов - одна (Логика) ко многим (Шаблоны).

Я настроил через бизнес-правила фильтр, чтобы при выборе значения в справочнике Логика, в справочнике Шаблоны отображаются все названия Шаблонов, которые связаны с выбранной Логикой.

На данный момент, задача заключается в следующем:

1. При открытии справочника "Шаблоны" сделать возможным выбор несколько записей.

2. Обработать значения выбранных записей из справочника "Шаблоны" и записать данные в дополнительно созданные текстовые поля в таблицу Обращение [CASE].

 

При открытии сейчас открывается справочник, как на рис.1.

Рис.1.



А хотелось, чтобы открывался справочник с мультивыбором, например, как на рис. 2  



Спасибо.

 

mdv,

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



Вместо лукапного поля Новые шаблоны(выбор) добавить кнопку с обработчиком при нажатии: 

 

// кнопка в массиве diff
{
    "operation": "insert",
    "parentName": "Header",
    "propertyName": "items",
    "name": "SelectTemplateButton",
    "values": {
        "itemType": Terrasoft.ViewItemType.BUTTON,
        "style": Terrasoft.controls.ButtonEnums.style.GREEN,
        "caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"},
        "classes": {"textClass": "actions-button-margin-right"},
    // Тут обработчик
        "click": {"bindTo": "onOpenTemplateLookup"},
    // Размещение в контейнере страницы вместо своего поля
        "layout": {
            "colSpan": 10,
            "rowSpan": 1,
            "column": 0,
            "row": 5,
            "layoutName": "Header"
        }
    }
},

где в onOpenTemplateLookup:



 

onOpenTemplateButton: function {
    let config = {
        // Название схемы объекта, записи которого будут отображены в справочнике.
        entitySchemaName: "UseTemplates",
        // Возможность множественного выбора.
        multiSelect: true,
        // Колонки, которые будут использованы в справочнике, например, для сортировки.
        columns: ["Number", "Date", "Type"]
    };
    // Тут фильтры накладываешь свои
    let FiltersGroup = this.Terrasoft.createFilterGroup();
    config.filters = FiltersGroup;
    this.openLookup(config, this.addCallBack, this);
}

Ну потом все как всегда, в колбеке свою логику пишешь и всё.

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

Андрей, огромное спасибо за идею и реализацию, внесу изменения  и по результатам обязательно отпишусь. Хороших выходных!

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

Андрей, не отображается кнопка на странице [Case] на вкладке [Информация по обращению].

Как Вы и советовали я в схеме [CasePage] закомментировал  код справочника [Новые шаблоны (выбор)]. Справочник перестал отображаться.

    /*{

                "operation": "insert",

                "name": "UsrNewTemplateSpr4dc847cf-00f3-4d64-a814-04acaed66407",

                "values": {

                    "layout": {

                        "colSpan": 12,

                        "rowSpan": 1,

                        "column": 0,

                        "row": 5,

                        "layoutName": "CaseInformation_gridLayout"

                    },

                    "bindTo": "UsrNewTemplateSpr"

                },

                "parentName": "CaseInformation_gridLayout",

                "propertyName": "items",

                "index": 5

            },*/

Затем по аналогии добавил код для кнопки [SelectTemplateButton]

    {

                    "operation": "insert",

                    "parentName": "CaseInformation_gridLayout",

                    "name": "SelectTemplateButton",

                    "propertyName": "items",

                    "values": {

                                "itemType": Terrasoft.ViewItemType.BUTTON,

                                "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                                "caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"},

                                "classes": {"textClass": "actions-button-margin-right"},

                                "click": {"bindTo": "onOpenTemplateButton"},

                                "layout": {

                                    "colSpan": 12,

                                    "rowSpan": 1,

                                    "column": 0,

                                    "row": 5,

                                    "layoutName": "CaseInformation_gridLayout"

                                },

                               "bindTo": "SelectTemplateButton",

                               },

                    "index": 5

            },

В чем моя ошибка, почему кнопка не отображается  на странице [Case] на вкладке [Информация по обращению]?

Спасибо.

Андрей, хотя в дизайнере страницы кнопка присутствует

 

 

mdv,

"caption": {"bindTo": "Resources.Strings.SelectTemplateCaption"},

Это локализованная строчка в схеме карточки и скорее всего у тебя её нет. Тебе нужно её добавить.

Сюда: 



Название должно быть равно SelectTemplateCaption ну и значение сам подберешь. 

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

Спасибо, 

SelectTemplateCaption нужно добавить в модуль BaseModulePageV2?

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

Андрей, огромное спасибо.

Создал замещающий модуль от BaseModulePageV2 и добавил строчку SelectTemplateCaption, кнопка появилась, справочник с мультивыбором открывается.

Осталось настроить фильтрацию справочника [Шаблоны] по выбранному предварительно значению из справочника [Логики].

 

Спасибо.

 

mdv,

Не нужно было создавать замещающий модуль для этого, а нужно было добавить лок. строку в схему карточки CasePage.



Про фильтрацию можно почитать тут.

Фильтр может выглядеть так: 



 

// UsrLogic название твоего поля в Entity Case и шаблонов
const LogicId = this.get("UsrLogic").value;
config.filters = Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "UsrLogic", LogicId);

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

Огромное спасибо!!!

mdv,

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

Андрей, а можно реализовать фильтрацию многие ко многим?

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

Я по аналогии с [Шаблонами] сделал кнопку для мультивыбора [Логики].

Для этого удалили в объекте [Case] поле справочник [UsrLogic], который был связан с объектом [UsrLogic].

По кнопке у меня открывается для мультивыбора содержимое объекта [UsrLogic].

Ниже обработчик на открытие справочника с мультивыбором шаблона, который написан по вашим рекомендациям, когда выбиралась только одна логика из справочника:

onOpenTemplateButton: function () 

                    {

                        let config = {

                            

                            entitySchemaName: "UsrTemplate",

                            multiSelect: true,

                            columns: ["Name"]

                        };

                            

                        let FiltersGroup = this.Terrasoft.createFilterGroup();

                        config.filters = FiltersGroup;

                        this.openLookup(config, this.addCallBack, this);

                        

                        const LogicId = this.get("UsrLogic").value;

                        config.filters = Terrasoft.createColumnFilterWithParameter

                        (Terrasoft.ComparisonType.EQUAL, "Usrlogic", LogicId);


                    },

 

Спасибо.

 

mdv,

// Массив для Id-шек твоей логики которые ты должен сюда записать и потом фильтр что ниже прикрепить для фильтрации шаблонов.
let logicIds = [];
// .... тут должно быть заполнение массива. 
let logicFilters = this.Terrasoft.createColumnInFilterWithParameters("UsrLogic", logicIds);
 
config.filters.add(logicFilter);

в колбеке выбора логик записывай выбранные записи сразу в массив logicIds или перед этим в атрибут. Про атрибуты можно почитать тут.

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

Андрей, спасибо.

Можно пару вопросов?

У меня нет ID-шек у объекта  [Логики]. Есть только поля [Название] и [Описание] .

У объекта [Шаблоны] есть поля  [Название], [Описание] и [UsrLogic]

Справочники [Логики] и [Шаблоны] связаны по полям

[Шаблоны].[UsrLogic]  и [Логики].[Название]

Я правильно понимаю, что мне нужно в колбеке логик собрать массив из выбранных из справочника  [Логики].[Название]?

т.е. 

addCallBackNewLogic: function(args) 

{

    var items = args.selectedRows.collection.items;

    var count = 0;

    let logicIds = [];

    Terrasoft.each(items, function (item) {

                    logicIds [count] = item.displayValue;

                    count++;

                      }, this);

},

 

Спасибо.

mdv, 

 

Что-то мне не верится что у тебя нету Id(-шек). Скрин Entity Логики и Шаблонов скинь.

Что-то такое должно у тебя быть, если ты от базового(-ых) объектов наследовался: 

 

Даже если, как ты говоришь, у тебя нету Id(-шек), тогда можно сделать следующим образом:

1. Оставить кнопку только выбрать шаблоны.

2. При нажатии открывается справочник выбор логик. 

3. В колбеке выбора логик получается коллекция имен в дебагере можешь узнать как именно её получить. Далее, вызывается метод в который ты передаешь массив и по нему фильтруешь шаблоны и открываешь окно выбора.

4. А дальше все по плану.

 

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

Андрей, спасибо. С вами скоро станешь "монстром" в справочниках. :)

Спасибо за очередную идею, попробую реализовать.

Вот скрины, оба объекта от базового справочника. Нo ID не отображается.

 

 

 

 

mdv,

Раз: 

Два: 

и должны появится твои колонки в том числе и Id. 

Андреев Андрей Сергеевич пишет:

mdv, 

Что-то мне не верится что у тебя нету Id(-шек). Скрин Entity Логики и Шаблонов скинь.

Что-то такое должно у тебя быть, если ты от базового(-ых) объектов наследовался: 

Даже если, как ты говоришь, у тебя нету Id(-шек), тогда можно сделать следующим образом:

1. Оставить кнопку только выбрать шаблоны.

2. При нажатии открывается справочник выбор логик. 

3. В колбеке выбора логик получается коллекция имен в дебагере можешь узнать как именно её получить. Далее, вызывается метод в который ты передаешь массив и по нему фильтруешь шаблоны и открываешь окно выбора.

4. А дальше все по плану.

 

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

Андрей, огромнейшее спасибо, реализовал вашу последнюю идею, всё получилось шикарно.

mdv,

Пожалуйста!

*Если не делал на основании Id, то лучше переделать на Id. 

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

понял, спасибо!

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