Элемент управления [Профиль связанной сущности]
Glossary Item Box
Общие сведения
Элемент управления [Профиль связанной сущности] (класс Profile) — это конфигурационный модуль, который по умолчанию представляет собой информационный блок, наполняемый при загрузке страницы редактирования информацией о связанной Entity-сущности. В системе этот элемент используется как профиль связанной записи на странице редактирования записи раздела. Например, при открытии страницы редактирования [Контакт] в элементе [Профиль] (рис. 1) отобразится профиль контакта и информация о связанном контрагенте (связь по колонке [Контрагент] объекта [Контакт], рис. 2). Подробнее о профилях записи и связанной записи можно узнать из статьи "Страница записи раздела".
Родительским классом для класса Profile является BaseProfileSchema — базовая схема для создания любых профилей связанных записей в системе.
Рис. 1. — Профиль объекта [Контакт]
Рис. 2. — Связанный с контактом профиль связанной сущности [Контрагент]
Родительским классом для класса Profile является BaseProfileSchema — базовая схема для создания любых профилей связанных записей в системе.
Все профили должны наследоваться от BaseProfileSchema.
Схема BaseProfileSchema реализует возможность отобразить любой набор полей по связанной сущности, а также любое количество различных модулей.
Способ описания представления ничем не отличается от страницы редактирования, т.е. описывается свойством diff. При встраивании модуля в страницу редактирования в атрибутах модуля необходимо указать параметр masterColumnName, в котором хранится название колонки, по которой происходит связь профиля с основной схемой страницы редактирования. Опираясь на значение этой колонки, Profile будет загружать данные.
На этапе инициализации объекта профиля, для того чтобы получить дополнительную информацию о колонке, по которой он связан (фильтры, заголовок и т.п.), он отправляет сообщение GetColumnInfo. Затем он запрашивает значение колонки, по которой он связан, и, если она заполнена, инициализируются данные по этой записи. При очистке поля или смене значения происходит переинициализация данных в объекте профиля.
Если профиль пуст, т.е. не выбрана запись в поле связи, то в нем отображается название поля, по которому происходит связь, и два действия (рис. 3):
- [Добавить контрагента] — создать новую запись в справочнике поля связи.
- [Выбрать ] — выбрать существующую запись из списка доступных.
Рис. 3. — Пустой профиль связанной сущности
При выборе существующей связанной сущности на справочник накладывается вся бизнес-логика, которая была была определена в странице редактирования и была связана с атрибутом, ссылающимся на эту сущность. Т.е. сохраняется фильтрация, настройки колонок запроса и прочее.
Если атрибут удалить из схемы страницы редактирования, вся логика потеряется вместе с ним.
Устройство BaseProfileSchema
Интерфейс взаимодействия реализован стандартным механизмом сообщений. Используются следующие сообщения:
- OpenCard — инициирует открытие страницы добавления записи, используя стандартный механизм.
- UpdateCardProperty — обновляет значение атрибута страницы редактирования.
- GetColumnInfo — возвращает информацию о поле связи.
- GetColumnsValues — возвращает значения запрошенных колонок страницы редактирования.
- GetEntityColumnChanges — подписка на изменение данных на странице редактирования.
- CardModuleResponse — результат добавления новой записи через профиль.
Визуальное содержание профиля (кнопки, ссылки, модули) определяется в массиве модификаций diff.
Пример конфигурации схемы профиля
define("ContactProfileSchema", ["ProfileSchemaMixin"], function () { return { // Название схемы объекта. entitySchemaName: "Contact", // Миксины. mixins: { // Миксин, содержащий функции для получения иконок и картинок профиля. ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin" }, // Массив модификаций diff. diff: /**SCHEMA_DIFF*/[ { // Операция вставки. "operation": "insert", // Имя сущности. "name": "Account", // Имя родительского элемента, в который производится вставка. "parentName": "ProfileContentContainer", // Свойство элемента родителя, с которым производится операция. "propertyName": "items", // Значения вставляемого элемента. "values": { // Привязка к значению свойства Account объекта Contact. "bindTo": "Account", // Конфигурация разметки. Позиционирование элемента. "layout": { "column": 5, "row": 1, "colSpan": 19 } } } // ...Другие конфигурационные объекты массива модификаций. ]/**SCHEMA_DIFF*/ }; });
Пример встраивания профиля в страницу редактирования
//Определение схемы страницы редактирования и ее зависимостей. define("ContactPageV2", ["BaseFiltersGenerateModule", "BusinessRuleModule", "ContactPageV2Resources", "ConfigurationConstants", "ContactCareer", "DuplicatesSearchUtilitiesV2"], function (BaseFiltersGenerateModule, BusinessRuleModule, resources, ConfigurationConstants, ContactCareer) { return { entitySchemaName: "Contact", // Используемые модули. modules: /**SCHEMA_MODULES*/{ // Модуль профиля контрагента. "AccountProfile": { // Конфигурация профиля. "config": { // Название схемы. "schemaName": "AccountProfileSchema", // Признак, сообщающий о том, что конфигурация схемы проинициализирована. "isSchemaConfigInitialized": true, // Признак, сообщающий о том, что не используется HistoryState. "useHistoryState": false, // Параметры профиля. "parameters": { // Конфигурация модели представления. "viewModelConfig": { // Название колонки связанной сущности. masterColumnName: "Account" } } } } }/**SCHEMA_MODULES*/, // Массив модификаций. diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "parentName": "LeftModulesContainer", "propertyName": "items", // Название профиля. "name": "AccountProfile", // Значения. "values": { // Тип элемента — модуль. "itemType": Terrasoft.ViewItemType.MODULE } } ]/**SCHEMA_DIFF*/ }; });
Схема профиля BaseMultipleProfileSchema
Кроме схемы базового профиля BaseProfileSchema, имеются также дополнительные схемы, реализующие специфическую функциональность для пользовательских профилей.
Профиль, описываемый схемой BaseMultipleProfileSchema, может содержать в себе любое количество профилей и свободно между ними переключаться, пользуясь логикой выбора значений из нескольких справочников. Основное отличие от базового профиля — возможность встраивать другие профили в текущий профиль. При этом встроенные профили могут взаимодействовать друг с другом посредством сообщений. В остальном он работает со страницей редактирования так же, как и простой профиль.
Профили BaseMultipleProfileSchema должны наследоваться от BaseRelatedProfileSchema — базовой схемы для профиля, который может быть зависимым или встроенным в другие профили.
Пример модуля клиентского профиля BaseMultipleProfileSchema
// Определение профиля. define("ClientProfileSchema", ["ProfileSchemaMixin"], function () { return { // Миксины. mixins: { ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin" }, // Атрибуты. attributes: { // Видимость профиля контакта. "IsVisibleContactProfile": { dataValueType: this.Terrasoft.DataValueType.BOOLEAN, value: true } }, // Методы. methods: { // Дата-маркер. Нужен для автотестов. getProfileModuleContainerDataMarker: function () { return "client-profile-module-container"; }, // Возвращает заголовок. getBlankSlateHeaderCaption: function () { return this.get("Resources.Strings.Client"); }, // Возвращает иконку-предупреждение. getWarningIcon: function () { return this.getImageUrlByResourceKey("Resources.Images.WarningIcon"); }, // Проверка для отображения предупреждения. getIsVisibleWarning: function () { var masterColumnNames = this.get("MasterColumnNames"); if (!masterColumnNames) { return false; } var masterColumnValues = masterColumnNames.filter(function (columnName) { var value = this.get(columnName); return !this.Ext.isEmpty(value); }, this); return masterColumnValues.length > 1; }, // Обработчик события изменения колонки профиля. onProfileColumnChanged: function () { this.set("IsVisibleContactProfile", !this.getIsVisibleWarning()); return this.callParent(arguments); }, // Обработчик события изменения колонки. onColumnChanged: function () { this.callParent(arguments); this.set("IsVisibleContactProfile", !this.getIsVisibleWarning()); }, // Подсказка для кнопки [Очистить]. getClearButtonHint: function () { var clearActionCaption = this.get("Resources.Strings.ClearButtonCaption"); var masterColumnCaption = this.get("Resources.Strings.Client"); return this.Ext.String.format("{0} {1}", clearActionCaption, masterColumnCaption); } }, // Модули схемы. modules: /**SCHEMA_MODULES*/{ // Встраиваемый клиентский профиль контрагента. "AccountClientProfile": { // Конфигурация профиля. "config": { "schemaName": "ClientAccountProfileSchema", "isSchemaConfigInitialized": true, "useHistoryState": false, "parameters": { "viewModelConfig": { masterColumnName: "Account" } } } }, // Встраиваемый клиентский профиль контакта. "ContactClientProfile": { "config": { "schemaName": "ClientContactProfileSchema", "isSchemaConfigInitialized": true, "useHistoryState": false, "parameters": { "viewModelConfig": { masterColumnName: "Contact" } } } } }/**SCHEMA_MODULES*/, // Модификации отображения профиля. diff: /**SCHEMA_DIFF*/[ { "operation": "remove", "name": "ProfileIcon" }, { "operation": "remove", "name": "ProfileHeaderContainer" }, { "operation": "insert", "name": "ClientProfilesContainer", "parentName": "ProfileContentContainer", "propertyName": "items", "values": { "itemType": this.Terrasoft.ViewItemType.CONTAINER, "items": [], "layout": { "column": 0, "row": 0, "colSpan": 24, "rowSpan": 24 } } }, { "operation": "insert", "name": "WarningIcon", "parentName": "ClientProfilesContainer", "propertyName": "items", index: 0, "values": { "getSrcMethod": "getWarningIcon", "readonly": true, "generator": "ImageCustomGeneratorV2.generateSimpleCustomImage", "visible": { "bindTo": "getIsVisibleWarning" }, "classes": { "wrapClass": ["warning-icon"] }, "hint": { "bindTo": "Resources.Strings.WarningMessage" } } }, { "operation": "insert", "parentName": "ClientProfilesContainer", "propertyName": "items", "name": "AccountClientProfile", "values": { "itemType": this.Terrasoft.ViewItemType.MODULE } }, { "operation": "insert", "parentName": "ClientProfilesContainer", "propertyName": "items", "name": "ContactClientProfile", "values": { "itemType": this.Terrasoft.ViewItemType.MODULE, "visible": { "bindTo": "IsVisibleContactProfile" } } } ]/**SCHEMA_DIFF*/ }; } );
Пример встраиваемого клиентского профиля BaseRelatedProfileSchema
define("ClientContactProfileSchema", ["ProfileSchemaMixin"], function () { return { // Название схемы объекта. entitySchemaName: "Contact", // Миксины. mixins: { ProfileSchemaMixin: "Terrasoft.ProfileSchemaMixin" }, // Методы. methods: { getProfileHeaderCaption: function () { return this.get("Resources.Strings.ProfileHeaderCaption"); } }, // Массив модификаций. diff: /**SCHEMA_DIFF*/[ { "operation": "insert", "name": "Account", "parentName": "ProfileContentContainer", "propertyName": "items", "values": { "bindTo": "Account", "enabled": false, "layout": { "column": 5, "row": 1, "colSpan": 19 } } }, { "operation": "insert", "name": "Job", "parentName": "ProfileContentContainer", "propertyName": "items", "values": { "bindTo": "Job", "enabled": false, "layout": { "column": 5, "row": 2, "colSpan": 19 } } }, { "operation": "insert", "name": "Type", "parentName": "ProfileContentContainer", "propertyName": "items", "values": { "bindTo": "Type", "enabled": false, "layout": { "column": 5, "row": 3, "colSpan": 19 } } }, { "operation": "insert", "name": "MobilePhone", "parentName": "ProfileContentContainer", "propertyName": "items", "values": { "bindTo": "MobilePhone", "enabled": false, "layout": { "column": 5, "row": 4, "colSpan": 19 } } }, { "operation": "insert", "name": "Phone", "parentName": "ProfileContentContainer", "propertyName": "items", "values": { "bindTo": "Phone", "enabled": false, "layout": { "column": 5, "row": 5, "colSpan": 19 } } }, { "operation": "insert", "name": "Email", "parentName": "ProfileContentContainer", "propertyName": "items", "values": { "bindTo": "Email", "enabled": false, "layout": { "column": 5, "row": 6, "colSpan": 19 } } } ]/**SCHEMA_DIFF*/ }; });
Пример встраивания модуля клиентского профиля в страницу редактирования
// Модули страницы редактирования. modules: /**SCHEMA_MODULES*/{ // Название модуля. "ClientProfile": { // Конфигурация. "config": { // Признак,сообщающий о том, что конфигурация схемы проинициализирована. "isSchemaConfigInitialized": true, // Признак, сообщающий о том, что не используется HistoryState. "useHistoryState": false, // Имя схемы. "schemaName": "ClientProfileSchema", // Параметры. "parameters": { // Конфигурация модели представления. "viewModelConfig": { // Название колонки связанной сущности. "masterColumnName": "Client" } } } } }/**SCHEMA_MODULES*/, // Массив модификаций diff. diff: /**SCHEMA_DIFF*/[ { "operation": "insert", // Название профиля. "name": "ClientProfile", "parentName": "LeftModulesContainer", "propertyName": "items", // Значения. "values": { // Тип элемента — модуль. "itemType": Terrasoft.ViewItemType.MODULE } } ]/**SCHEMA_DIFF*/