Вопрос

Добавление Email контакта в карточку обращения

Добрый день!

Мне необходимо добавить Email контакта в карточку обращения:

Для этого я создал замещающий  клиентский модуль схемы CasePage:

define("CasePage", ["CasePageResources", "BusinessRuleModule", "ServiceHelper", "TimezoneUtils",
	"ConfigurationConstants", "ServiceDeskConstants", "EvrazConstants", "CaseSectionActionsDashboard"],
		function(resources, BusinessRuleModule, ServiceHelper, TimezoneUtils, ConfigurationConstants,
			ServiceDeskConstants, EvrazConstants) {
	return {
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "Email",
				"values": {
					"layout": {
						"column": 0,
						"row": 2,
						"colSpan": 24,
						"rowSpan": 1
					},
					"bindTo": "Contact"
				},
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"index": 2
			}
		]/**SCHEMA_DIFF*/,
	};
});

Поле появилось, но оно отображает только ФИО контакта, как мне провалиться глубже и добраться до поля Email? Подскажите пожалуйста

Нравится

8 комментариев

Вам необходимо:

1) в конфигурационном объекте одноименного атрибута,

пробросить колонку с Email

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

 

attributes: {
...
	"Email": {
		lookupListConfig: {
			columns: ["Email"]
		},
		dependencies: [
			{
				columns: ["Email"],
				methodName: "onEmailChange"
			}
		]
	}
...
},



2) В методе загрузки страницы для поля Email заменить его displayValue

methods: {
...
    "onEntityInitialized": function() {
         this.callParent(arguments);
         //инициируем подмену displayValue на значении в поле
         //при первоначальной загрузке страницы
         this.onEmailChange();
    },
    "onEmailChange": function() {
         //получим объект текущего значения в поле
         var contactLookupObject = this.get("Email");
         //Если: значение в поле установлено
         if (!Ext.isEmpty(contactLookupObject)){
              //то: изменим в полученном объекте справочного поля 
              //displayValue на значение "проброшенной" колонки Email
              contactLookupObject.displayValue = currentContactLookupObject.Email;
              //Установим обновленный объект обратно в атрибут
              this.set("Email", contactLookupObject);
         }
    },
 
...
}



 

Севостьянов Илья Сергеевич,

Илья, спасибо что откликнулись!

Хотел уточнить, "в конфигурационном объекте одноименного атрибута, пробросить колонку с Email" - это значит добавить в объект Case поле, которое ссылается на колонку Email справочника Контакт?

Молчанов Антон Сергеевич,

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

см. статью на академии https://academy.terrasoft.ru/documents/technic-sdk/7-10/atributy-svoyst…

по конфигурационному объекту для атрибутов.

в частности описание свойства lookupListConfig и его полей.

Добавьте комментарий

Севостьянов Илья Сергеевич,

Примерно понял, у меня получилась такая замещающая схема:

define("CasePage", ["CasePageResources", "BusinessRuleModule", "ServiceHelper", "TimezoneUtils",
	"ConfigurationConstants", "ServiceDeskConstants", "EvrazConstants", "CaseSectionActionsDashboard"],
		function(resources, BusinessRuleModule, ServiceHelper, TimezoneUtils, ConfigurationConstants,
			ServiceDeskConstants, EvrazConstants) {
	return {
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: {
			"Email": {
				lookupListConfig: {
					columns: ["Email"]
				},
				dependencies: [
					{
						columns: ["Email"],
						methodName: "onEmailChange"
					}
				]
			}
		},
		methods: {
			"onEntityInitialized": function() {
				this.callParent(arguments);
				this.onEmailChange();
			},
			"onEmailChange": function() {
			var contactLookupObject = this.get("Email");
			if (!Ext.isEmpty(contactLookupObject)) {
			contactLookupObject.displayValue = currentContactLookupObject.Email;
			this.set("Email", contactLookupObject);
			}
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "Email",
				"values": {
					"layout": {
						"column": 0,
						"row": 2,
						"colSpan": 24,
						"rowSpan": 1
					},
					"bindTo": "Email"
				},
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"index": 2
			}
		]/**SCHEMA_DIFF*/,		
	};
});

При попытке сохранить схему возникает ошибка: 

'currentContactLookupObject.Email' is not defined

Подскажите пожалуйста, как мне приравнять displayValue к значению "проброшенной" колонки Email?

contactLookupObject.displayValue = currentContactLookupObject.Email;
замените на 
contactLookupObject.displayValue = contactLookupObject.Email;

опечаточка в имени объекта, копипаста :)

currentContactLookupObject нигде не объявлятся

Илья, добрый день!

Заменил строку currentContactLookupObject.Email на contactLookupObject.Email

При попытке зайти на страничку CasePage, консоль браузера выдаёт ошибку:

Uncaught Terrasoft.NullOrEmptyException: Заголовок для подписи "Email" не был найден. 

Подскажите пожалуйста, в чем может быть проблема. Я так понимаю Email содержит пустое значение?

попробуйте в определении вашего поля, явно задать заголовок

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "Email",
		"caption": "Заголовок",
		"values": {
			"layout": {
				"column": 0,
				"row": 2,
				"colSpan": 24,
				"rowSpan": 1
			},
			"bindTo": "Email"
		},
		"parentName": "ProfileContainer",
		"propertyName": "items",
		"index": 2
	}
]/**SCHEMA_DIFF*/,

 

Илья, добрый день! 
Задать заголовок таким образом: 
"caption": "Заголовок" 
у меня не получилось (опять также ошибка: Заголовок для подписи "Email" не был найден)

сделал так:
"caption": {"bindTo": "Resources.Strings.Email"} 

Соответственно добавил "Email" в LocalizableString 

В итоге получился вот такой код:

define("CasePage", ["CasePageResources", "BusinessRuleModule", "ServiceHelper", "TimezoneUtils",
	"ConfigurationConstants", "ServiceDeskConstants", "EvrazConstants", "CaseSectionActionsDashboard"],
		function(resources, BusinessRuleModule, ServiceHelper, TimezoneUtils, ConfigurationConstants,
			ServiceDeskConstants, EvrazConstants) {
	return {
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: {
			"Email": {
				lookupListConfig: {
					columns: ["Email"]
				},
				dependencies: [
					{
						columns: ["Email"],
						methodName: "onEmailChange"
					}
				]
			}
		},
		methods: {
			"onEntityInitialized": function() {
				this.callParent(arguments);
				this.onEmailChange();
			},
			"onEmailChange": function() {
				var contactLookupObject = this.get("Email");
				if (!Ext.isEmpty(contactLookupObject)) {
					contactLookupObject.displayValue = contactLookupObject.Email;
					this.set("Email", contactLookupObject);
				}
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "Email",
				"values": {
					"layout": {
						"column": 0,
						"row": 2,
						"colSpan": 24,
						"rowSpan": 1
					},
					"bindTo": "Email",
					"labelConfig": {"caption": {"bindTo": "Resources.Strings.Email"}}
				},
				"parentName": "ProfileContainer",
				"propertyName": "items",
				"index": 2
			}
		]/**SCHEMA_DIFF*/		
	};
});

При попытке зайти на страничку CasePage - она не загружается, а консоль браузера выдаёт ошибки:

Может быть дело в том, что в объекте Case нет колонки Email?

Колонку Email мне необходимо получить из объекта Contact.

Но в моём коде нет ссылок на объект Contact
 
Показать все комментарии