Вопрос

Проблемы с настройкой раздела шаблонов Email

Возникла необходимость доработать раздел шаблонов email сообщений. Добавил замещающую схему для раздела и страницы. Если входить в раздел из справочников, то всё работает нормально, но если зайти в раздел напрямую из меню разделов, то страница падает с ошибкой 

Uncaught TypeError: Cannot read property 'primaryDisplayColumn' of undefined
    at constructor.<anonymous> (ProfileUtilities.js:90)
    at constructor.nextStep (commonutils.js:103)
    at commonutils.js:488
    at Object.execCb (require.js:1693)
    at Module.check (require.js:881)
    at Module.enable (require.js:1173)
    at Module.init (require.js:786)
    at require.js:1457
(anonymous) @ ProfileUtilities.js:90
nextStep @ commonutils.js:103
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
req.nextTick @ require.js:1812
localRequire @ require.js:1446
requirejs @ require.js:1794
Terrasoft.utils.common.require @ commonutils.js:487
(anonymous) @ ProfileUtilities.js:86
nextStep @ commonutils.js:103
Terrasoft.utils.common.chain @ commonutils.js:106
getSectionDefaultGridSettings @ ProfileUtilities.js:84
initSectionProfile @ ProfileUtilities.js:101
(anonymous) @ ProfileUtilities.js:121
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1011
(anonymous) @ require.js:134
requestObject.onreadystatechange @ profile.js:39
XMLHttpRequest.send (async)
profileRequest @ profile.js:44
load @ profile.js:50
(anonymous) @ require.js:1092
(anonymous) @ require.js:134
on @ require.js:515
callPlugin @ require.js:953
fetch @ require.js:822
check @ require.js:854
enable @ require.js:1173
enable @ require.js:1554
(anonymous) @ require.js:1158
(anonymous) @ require.js:134
each @ require.js:59
enable @ require.js:1110
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
req.nextTick @ require.js:1812
localRequire @ require.js:1446
requirejs @ require.js:1794
Terrasoft.utils.common.require @ commonutils.js:487
requireProfile @ ProfileUtilities.js:30
getProfile @ ProfileUtilities.js:113
initSchemaProfile @ SchemaBuilderV2.js:162
nextStep @ commonutils.js:103
(anonymous) @ SchemaBuilderV2.js:156
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
req.nextTick @ require.js:1812
localRequire @ require.js:1446
requirejs @ require.js:1794
Terrasoft.utils.common.require @ commonutils.js:487
getEntitySchema @ SchemaBuilderV2.js:94
initSchemaEntitySchema @ SchemaBuilderV2.js:154
nextStep @ commonutils.js:103
(anonymous) @ SchemaBuilderV2.js:142
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
enable @ require.js:1173
init @ require.js:786
(anonymous) @ require.js:1457
setTimeout (async)
req.nextTick @ require.js:1812
localRequire @ require.js:1446
requirejs @ require.js:1794
Terrasoft.utils.common.require @ commonutils.js:487
getSchemaResources @ SchemaBuilderV2.js:89
initSchemaResources @ SchemaBuilderV2.js:140
nextStep @ commonutils.js:103
initSchemaCustomAttributes @ SchemaBuilderV2.js:134
nextStep @ commonutils.js:103
requireSchema @ SchemaBuilderV2.js:114
nextStep @ commonutils.js:103
(anonymous) @ SchemaBuilderV2.js:221
nextStep @ commonutils.js:103
Terrasoft.utils.common.chain @ commonutils.js:106
requireAllSchemaHierarchy @ SchemaBuilderV2.js:219
buildSchemaHierarchy @ SchemaBuilderV2.js:317
(anonymous) @ SchemaBuilderV2.js:286
(anonymous) @ commonutils.js:488
execCb @ require.js:1693
check @ require.js:881
(anonymous) @ require.js:1136
(anonymous) @ require.js:134
(anonymous) @ require.js:1186
each @ require.js:59
emit @ require.js:1185
check @ require.js:936
enable @ require.js:1173
init @ require.js:786
callGetModule @ require.js:1200
completeLoad @ require.js:1587
onScriptLoad @ require.js:1714
core.js:581 user: BPMOutsource2/aa3ba720-d1cd-46f3-9cce-33ccc71e0113
 file: https://msk10crm3.simple.ru:886/0/configuration/69de87c92ca4b610d0b1c9948902105fru-RU/ProfileUtilities.js
 line: 90
 column: 45
 message: Uncaught TypeError: Cannot read property 'primaryDisplayColumn' of undefined 
 date: Tue Dec 19 2017 19:47:38 GMT+0300 (Russia TZ 2 Standard Time)
 stack: TypeError: Cannot read property 'primaryDisplayColumn' of undefined
    at constructor.<anonymous> (https://msk10crm3.simple.ru:886/0/configuration/69de87c92ca4b610d0b1c9948902105fru-RU/ProfileUtilities.js:90:45)
    at constructor.nextStep (https://msk10crm3.simple.ru:886/0/core/hash/Terrasoft/utils/common/commonutils.js:103:10)
    at https://msk10crm3.simple.ru:886/0/core/hash/Terrasoft/utils/common/commonutils.js:488:12
    at Object.execCb (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1693:33)
    at Module.check (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:881:51)
    at Module.enable (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1173:22)
    at Module.init (https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:786:26)
    at https://msk10crm3.simple.ru:886/core/c3a883e5c39cffb863b2f781f396c705/requirejs/require.js:1457:36

Также возникла проблема при попытке скрыть действие активной строки в зависимости от значения атрибута на странице. Если привязать видимость действия к атрибуту, то оно вообще перестаёт отображаться вне зависимости от его значения. Значение атрибута определяется при помощи запроса к сервису, сам метод вызывает из onRender. 

//attributes
            CanAddOrEdit: {
                type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                dataValueType: Terrasoft.DataValueType.BOOLEAN,
                value: false
            },
//diff
            {
                "operation": "merge",
                "name": "DataGridActiveRowCopyAction",
                "values": {
                    "visible": {"bindTo": "CanAddOrEdit"}
                }
            }

Кто-то либо сталкивался с подобными проблемами?

Нравится

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

Добрый день!

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

А на счет второго вопроса - сложность в том, что строчка реестра - это чаще всего BaseSectionGridRowViewModel (если он для раздела не переопределен) и он не видит атрибуты и методы, которые определены в разделе. Для того, чтобы переопределить свой SectionGridRowViewModel необходимо для начала сообщить разделу, что у него будет другой SectionGridRowViewModel, переопределив метод в разделе:

getGridRowViewModelClassName: function() {
	return "Terrasoft.UsrEmailTemplateSectionGridRowViewModel";
}

В данном примере имя одной строки раздела будет определено как UsrEmailTemplateSectionGridRowViewModel. diff остается такой же, как указан у вас.

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

define("UsrEmailTemplateSectionGridRowViewModel", ["ext-base",
	"terrasoft", "BaseSectionGridRowViewModel"],
	function(Ext, Terrasoft) {
 
	Ext.define("Terrasoft.configuration.UsrEmailTemplateSectionGridRowViewModel", {
		extend: "Terrasoft.BaseSectionGridRowViewModel",
		alternateClassName: "Terrasoft.UsrEmailTemplateSectionGridRowViewModel",
		CanAddOrCopy: function() {
			var result = ... //логика для определения видимости кнопки
			return result;
		}
	});
	return Terrasoft.UsrEmailTemplateSectionGridRowViewModel;
});

Таким образом можно методом или атрибутом управлять видимостью кнопок действий для активной строки.

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

Золотарев Артем Андреевич, Ошибку с замещением удалось исправить, проблема была в том, что в коде замещающей схемы не было явно указано значение entitySchemaName.

Спасибо за пример со строками реестра. Он заработал. Но у меня такой вопрос, как можно задать значение извне или самой RowViewModel взять его? У меня возможность добавлять, изменять или копировать определяется единоразово при обращении к сервису. Не хотелось бы делал вызов к сервису при клике на каждую строку.

В общем, удалось сделать через статические методы класса. Для моего случая достаточно и такой реализации. И соответственно, надо вызвать в коде реестра установку значения.

define("SxEmailTemplateSectionGridRowViewModel", ["ext-base",
    "terrasoft", "BaseSectionGridRowViewModel"],
    function(Ext, Terrasoft) {
 
    Ext.define("Terrasoft.configuration.SxEmailTemplateSectionGridRowViewModel", {
        extend: "Terrasoft.BaseSectionGridRowViewModel",
        alternateClassName: "Terrasoft.SxEmailTemplateSectionGridRowViewModel",
        statics: {
            _canAddOrEdit: false,
            setCanAddOrEdit: function(value) {
                _canAddOrEdit = value;
            },
            getCanAddOrEdit: function() {
                return _canAddOrEdit;
            }
        },
        getCanCopy: function() {
            return Terrasoft.SxEmailTemplateSectionGridRowViewModel.getCanAddOrEdit();
        }
    });
    return Terrasoft.SxEmailTemplateSectionGridRowViewModel;
});

 

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