Вывести на страницу редактирования раздела, поле другого справочного поля объекта

Добрый день!

Есть объект "Заявка", в нём поле "Анкета", мне нужно на страницу редактирования раздела заявки (вроде так называется, наследуется от BaseModulePageV2 ( NUI )) вывести поля анкеты.

Что я сделал: добавил в код страницы редактирования заявки и раздела заявки кусок:

dataModels: /**SCHEMA_DATA_MODELS*/{

                "AppQ": {

                    "entitySchemaName": "ApplicationQuestionnaire",

                    "primaryColumnValue": {

                        "bindTo": "ApplicationQuestionnaire"

                    }

                }

            }/**SCHEMA_DATA_MODELS*/,

 

В diff'е страницы редактирования заявки прописал несколько полей по типу:

{

                    "operation": "insert",

                    "name": "TscAppFilingMethod",

                    "values": {

                        "bindTo": "AppQ.AppFilingMethod",

                        "layout": {

                            "column": 0,

                            "row": 0,

                            "colSpan": 12,

                            "rowSpan": 1

                        },

                        "enabled": false

                    },

                    "parentName": "AppQInfoGroupGridLayout",

                    "propertyName": "items"

                }

Дальше происходит следующее:

  1. Если на страницу редактирования заходить напрямую по url, поля отображаются.
  2. Если заходить на страницу из раздела, то поля не отображаются пока не обновишь страницу. После обновления страницы поля есть, и даже если закрыть страницу редактирования и заново в неё войти из раздела, поля остаются, до момента пока не очистишь кэш браузера.

Когда поля не отображаются в консоль выводится следующее сообщение:

Заголовок для подписи "AppFilingMethod" не был найден.

Невозможно найти колонку по конфигурации: "{"bindTo":"AppQ.AppFilingMethod","layout":{"colSpan":12,"rowSpan":1,"column":0,"row":0},"enabled":false,"name":"AppFilingMethod"}" .

Отображаются эти ошибки как на странице раздела, так и на странице редактирования.

Нужно как-то проинициализировать AppQ на странице раздела или я не прав? Подскажите, пожалуйста. 

Использовать запросы и выводить виртуальные поля очень не хочется.

Нравится

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

eduard-t,

Добрый день.



Похоже, что никак. У нас в системе нет понимания как в таком кейсе будет работать сохранение и редактирование таких полей, соответственно могут возникнуть проблемы. В Ext мы официально и не поддерживаем несколько датасорсов, кроме как на преднастроенных страницах.



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

Или же придется использовать запросы. Например, можно решить так:

 

1.    Добавляем виртуальный атрибут нужного типа в секцию атрибутов:

attributes: {



    "AlternativeMobilePhone": {

        dataValueType: this.Terrasoft.DataValueType.TEXT,

        type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

        caption: "Alternative mobile phone",

        value: null

    },

            

2.    Выводим его на странице в секции дифов:



{

    "operation": "insert",

    "name": "AlternativeMobilePhone",

    "values": {

        "layout": {

            "colSpan": 12,

            "rowSpan": 1,

            "column": 0,

            "row": 2,

            "layoutName": "ContactTab"

        },

        "bindTo": "AlternativeMobilePhone"

    },

    "parentName": "ContactTab",

    "propertyName": "items",

    "index": 4

},

            

3.    Пишем функцию получения нужных данных и установки в вируальные атрибуты\атрибут:



getContactInfo: function() {

    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

        rootSchemaName: "Contact"

    });



    esq.addColumn("Phone");



    esq.filters.add("ContactFilter", this.Terrasoft.createColumnFilterWithParameter(

        this.Terrasoft.ComparisonType.EQUAL, "Id", this.get("Contact").value));

    esq.getEntityCollection(function(result) {

        if (result.success) {

            var collection = result.collection;

            if (collection && collection.collection.items.length > 0) {

                var item = collection.collection.items[0];



                this.set("AlternativeMobilePhone", item.get("Phone"));



            }

        }

    }.bind(this));

},

            

4.    При инициализации карточки вызываем этот метод:



onEntityInitialized: function() {

    this.callParent(arguments);

    this.getContactInfo();

},



5.    Для случаев изменения контакта в рантайме, делаем подписку на его изменение и вызов этого же метода получения нужной информации, делается это в блоке атрибутов:



"AnyName": {

    "value": false,

    "dataValueType": Terrasoft.DataValueType.BOOLEAN,

    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

    "dependencies": [

        {

            "columns": ["Contact"],

            "methodName": "getContactInfo"

        }

    ]

},

Добрый день. 



Попробуйте добавить в values свойство caption и указать конкретное название:

"layout": {

                            "column": 0,

                            "row": 0,

                            "colSpan": 12,

                            "rowSpan": 1,

                           "caption":"MyCaption"

                        }



После этого ошибка должна уйти. Или же проверьте есть ли заголовок данной колонки в объекте. 

Mykhailo Storozhuk,

Добрый день. Проблема не в этом, caption нормально подтягивается (из заголовка колонки анкеты), если колонка загружена, но колонка не загружается если заходить через раздел.

Если указать, как вы написали, то получаю просто надпись заголовка без значения:

Обновляю страницу, и всё подтягивается:

Как сделать, чтобы подтягивалось без обновления страницы?

eduard-t,

Добрый день.



Похоже, что никак. У нас в системе нет понимания как в таком кейсе будет работать сохранение и редактирование таких полей, соответственно могут возникнуть проблемы. В Ext мы официально и не поддерживаем несколько датасорсов, кроме как на преднастроенных страницах.



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

Или же придется использовать запросы. Например, можно решить так:

 

1.    Добавляем виртуальный атрибут нужного типа в секцию атрибутов:

attributes: {



    "AlternativeMobilePhone": {

        dataValueType: this.Terrasoft.DataValueType.TEXT,

        type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

        caption: "Alternative mobile phone",

        value: null

    },

            

2.    Выводим его на странице в секции дифов:



{

    "operation": "insert",

    "name": "AlternativeMobilePhone",

    "values": {

        "layout": {

            "colSpan": 12,

            "rowSpan": 1,

            "column": 0,

            "row": 2,

            "layoutName": "ContactTab"

        },

        "bindTo": "AlternativeMobilePhone"

    },

    "parentName": "ContactTab",

    "propertyName": "items",

    "index": 4

},

            

3.    Пишем функцию получения нужных данных и установки в вируальные атрибуты\атрибут:



getContactInfo: function() {

    var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {

        rootSchemaName: "Contact"

    });



    esq.addColumn("Phone");



    esq.filters.add("ContactFilter", this.Terrasoft.createColumnFilterWithParameter(

        this.Terrasoft.ComparisonType.EQUAL, "Id", this.get("Contact").value));

    esq.getEntityCollection(function(result) {

        if (result.success) {

            var collection = result.collection;

            if (collection && collection.collection.items.length > 0) {

                var item = collection.collection.items[0];



                this.set("AlternativeMobilePhone", item.get("Phone"));



            }

        }

    }.bind(this));

},

            

4.    При инициализации карточки вызываем этот метод:



onEntityInitialized: function() {

    this.callParent(arguments);

    this.getContactInfo();

},



5.    Для случаев изменения контакта в рантайме, делаем подписку на его изменение и вызов этого же метода получения нужной информации, делается это в блоке атрибутов:



"AnyName": {

    "value": false,

    "dataValueType": Terrasoft.DataValueType.BOOLEAN,

    "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,

    "dependencies": [

        {

            "columns": ["Contact"],

            "methodName": "getContactInfo"

        }

    ]

},

Mykhailo Storozhuk,

Большое спасибо! Не знал про существование ProfileSchema, это как раз то, что нужно.

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