Панель действий

PDF
Основы

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

  • Индикатор стадий (1) — показывает состояние этапов бизнес-процесса в тех разделах, где работа с записями выполняется с использованием бизнес-процесса.
  • Панель действий (2):

    • Позволяет перейти к выполнению активности, работе с email-сообщениями или с лентой, не покидая раздел.
    • Отображает созданные по бизнес-процессу активности, которые находятся в неконечном состоянии и связаны с объектом раздела по соответствующему полю.
    • Может отображать автогенерируемую страницу, преднастроенную страницу, вопрос и страницу объекта в виде задач.
scr_intro_ui_actionsdashboard.png

Панель действий расположена в контейнере ActionDashboardContainer страницы записи раздела. Индикатор стадий расположен во вложенном контейнере HeaderContainer, а панель действий — в ContentContainer.

Расположение элементов панели действий конфигурируется схемой модели представления BaseActionsDashboard и унаследованной схемой SectionActionsDashboard пакета ActionsDashboard.

Добавить панель действий на страницу 

  1. Создайте схему модели представления, унаследованную от SectionActionsDashboard.
  2. Создайте схему замещающей модели представления страницы.
  3. В свойстве modules схемы замещающей модели представления страницы выполните настройку модуля.
  4. В свойстве diff схемы замещающей модели представления страницы добавьте модуль на страницу.

Добавить новый канал на панель действий  

Каналы в панели действий — это способ коммуникации с контактом. Канал создается для каждого раздела, в котором он подключен, например, для обращения, контакта или лида.

Чтобы добавить новый канал на панель действий:

  1. Создайте класс-наследник базового класса BaseMessagePublisher.
  2. Создайте схему замещающей модели представления SectionActionsDashboard
  3. В свойстве diff схемы замещающей модели представления укажите операцию insert для вставки вкладки CallsMessageTab и контейнера сообщений, а также укажите модуль, который будет отрисовываться в данном канале на одной из вкладок.
  4. Переопределите методы:
    • getSectionPublishers() — добавляет созданный канал в список издателей сообщений.
    •  getExtendedConfig() — определяет параметры вкладки.
  5. Создайте модуль-контейнер для прорисовки в панели дейтсвий страницы, в которой будет реализована логика добавляемого канала.
  6. Создайте схему модели представления, в которой будет реализована логика канала. В качестве родительской схемы установите BaseMessagePublisherPage.

Добавить пользовательское действие верификации 

Элемент процесса Действие верификации используется в продуктах линейки Financial Services Creatio при верификации заявки сотрудником компании. С его помощью можно создать проверку данных в кредитной заявке — набор необходимых действий верификации, которые должен провести ответственный сотрудник. При помощи этого элемента можно реализовать процесс принятия решения по кредитной заявке. От результата выполнения действия верификации зависит дальнейшее ветвление бизнес-процесса.

При создании настраиваемой страницы действия верификации, например, в бизнес-процессе Подтверждение заявки ( Approve application), есть возможность выбрать заранее созданную страницу с названием Преднастроенная страница верификации (Preconfigured verification page).

scr_process_default_page.png

Сама страница отображается, например, после нажатия на кнопку Завершить (Complete) активности Согласовать выдачу кредита (Approve loan issuance), которая создается при переходе заявки на стадию Верификация (Validation).

scr_approve_link.png

Структурные элементы преднастроенной страницы верификации:

  • Кнопки выбора результата выполнения действия верификации.
  • Поле Комментарий — содержит комментарий к действию верификации.
  • Деталь Сценарий разговора — содержит скрипт-подсказку для верификатора. Доступна только в режиме чтения.
  • Деталь Файлы и ссылки — содержит прикрепленные к действию верификации файлы и ссылки. Доступна только в режиме чтения.
  • Деталь Результаты проверок — содержит контрольные вопросы и ответы на них.

Важно. Если деталь не содержит прикрепленне данные, то она не отображается на странице.

scr_default_page.png

Creatio предоставляет возможность создавать пользовательские страницы верификации, наследующие преднастроенную.

Чтобы создать пользовательскую страницу верификации:

  1. Создайте клиентскую схему страницы действия верификации.
  2. Используйте созданную схему в бизнес-процессе.
Добавить панель действий на страницу записи
Средний

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

1. Создать схему модели представления панели действий

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Модель представления страницы (Add —> Page view model).

  3. Заполните свойства схемы.

    • Код (Code) — "UsrOrderActionsDashboard".
    • Заголовок (Title) — "OrderActionsDashboard".
    • Родительский объект (Parent object) — выберите "SectionActionsDashboard".
  4. Добавьте исходный код схемы модели представления панели действий.

    UsrOrderActionsDashboard
    define("UsrOrderActionsDashboard", [], function () {
        return {
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            methods: {},
            diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
        };
    });
    
  5. На панели инструментов дизайнера нажмите Сохранить (Save).

2. Создать схему замещающей модели представления страницы заказа 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающая модель представления (Add —> Replacing view model).

  3. Заполните свойства схемы.

    • Код (Code) — "OrderPageV2".
    • Заголовок (Title) — "Страница редактирования заказа" ("Order edit page").
    • Родительский объект (Parent object) — выберите "OrderPageV2".
  4. Реализуйте добавление модуля панели действий.

    • В свойство modules добавьте конфигурационный объект с настройками модуля ActionsDashboardModule.
    • В массив модификаций diff добавьте конфигурационный объект с настройками расположения модуля на странице.

    Исходный код схемы замещающей модели представления страницы заказа представлен ниже.

    OrderPageV2
    define("OrderPageV2", [],
        function () {
            return {
                /* Название схемы объекта. */
                entitySchemaName: "Order",
                /* Атрибуты модели представления. */
                attributes: {},
                /* Модули модели представления. */
                modules: /**SCHEMA_MODULES*/{
                    "ActionsDashboardModule": {
                        "config": {
                            "isSchemaConfigInitialized": true,
                            /* Имя схемы. */
                            "schemaName": "UsrOrderActionsDashboard",
                            "useHistoryState": false,
                            "parameters": {
                                /* Конфигурационный объект модели представления. */
                                "viewModelConfig": {
                                    /* Имя схемы сущности страницы. */
                                    "entitySchemaName": "Order",
                                    /* Конфигурационный объект блока Actions. */
                                    "actionsConfig": {
                                        /* Имя схемы для загрузки элементов в Actions. */
                                        "schemaName": "OrderStatus",
                                        /* Имя колонки в родительской схеме, которая ссылается на схему, содержащую элементы Actions. Если не указана, то в качестве значения устанавливается schemaName. */
                                        "columnName": "Status",
                                        /* Имя колонки для сортировки элементов. */
                                        "orderColumnName": "Position",
                                        /* Имя колонки для сортировки элементов в меню элемента. */
                                        "innerOrderColumnName": "Position"
                                    },
                                    /* Отвечает за отображение модуля панели действий. По умолчанию — true.*/
                                    "useDashboard": true,
                                    /* Отвечает за отображение блока Content. По умолчанию — true.*/
                                    "contentVisible": true,
                                    /* Отвечает за отображение блока Header. По умолчанию — true.*/
                                    "headerVisible": true,
                                    /* Конфигурационный объект элементов панели. */
                                    "dashboardConfig": {
                                        /* Связь активностей с объектом страницы. */
                                        "Activity": {
                                            /* Имя колонки объекта страницы. */
                                            "masterColumnName": "Id",
                                            /* Имя колонки в объекте [Activity]. */
                                            "referenceColumnName": "Order"
                                        }
                                    }
                                }
                            }
                        }
                    }
                }/**SCHEMA_MODULES*/,
                details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
                methods: {},
                /* Массив модификаций diff. */
                diff: /**SCHEMA_DIFF*/[
                    {
                        /* Операция добавления. */
                        "operation": "insert",
                        /* Имя сущности. */
                        "name": "ActionsDashboardModule",
                        /* Имя родительского элемента, в который выполняется вставка. */
                        "parentName": "ActionDashboardContainer",
                        /* Свойство элемента родителя, с которым выполняется операция. */
                        "propertyName": "items",
                        /* Значение добавляемого элемента. */
                        "values": {
                            /* CSS-класс для контейнера. */
                            "classes": { wrapClassName: ["actions-dashboard-module"] },
                            /* Тип добавляемого элемента — модуль. */
                            "itemType": Terrasoft.ViewItemType.MODULE
                        }
                    }
                ]/**SCHEMA_DIFF*/
            };
        });
    
  5. На панели инструментов дизайнера нажмите Сохранить (Save).

Результат выполнения примера

Чтобы посмотреть результат выполнения примера, обновите страницу раздела Заказы (Orders).

В результате выполнения примера на странице заказа отображается панель действий. Панель действий содержит состояние заказа и связанные незавершенные активности.

scr_action_dashboard_adding_2.png
Добавить новый канал на панель действий
Сложный

Пример. Добавить пользовательский канал на панель действий страницы контакта. Канал повторяет функциональность канала фиксации результатов звонка (канал CallMessagePublisher). Использовать изображение, которое приведено ниже.

1. Реализовать обработку событий 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Исходный код (Add —> Source code).

  3. Заполните свойства схемы.

    • Код (Code) — "UsrCallsMessagePublisher".
    • Заголовок (Title) — "Издатель сообщений логирования звонка" ("Call message logging publisher").
  4. Реализуйте логику обработки события.

    1. В пространстве имен Terrasoft.Configuration создайте класс CallsMessagePublisher, который является наследником класса BaseMessagePublisher. Класс BaseMessagePublisher содержит базовую логику сохранения объекта в базу данных и базовую логику обработчиков событий.

    2. В классе CallsMessagePublisher реализуйте логику обработки события для конкретного отправителя, например, заполнение колонок объекта Activity и последующую отправку сообщения.

    Исходный код схемы  типа Исходный код (Source code) представлен ниже.

    UsrCallsMessagePublisher
    using System.Collections.Generic;
    using Terrasoft.Core;
    
    namespace Terrasoft.Configuration
    {
        /* Класс-наследник BaseMessagePublisher. */
        public class CallsMessagePublisher : BaseMessagePublisher
        {
            /* Конструктор класса. */
            public CallsMessagePublisher(UserConnection userConnection, Dictionary<string, string> entityFieldsData): base(userConnection, entityFieldsData) {
                /* Схема, с которой работает CallsMessagePublisher. */
                EntitySchemaName = "Activity";
            }
        }
    }
    
  5. На панели инструментов дизайнера исходного кода нажмите Опубликовать (Publish) для выполнения изменений на уровне базы данных.

2. Создать схему замещающей модели представления панели действий  

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Замещающая модель представления (Add —> Replacing view model).

  3. Заполните свойства схемы.

    • Код (Code) — "SectionActionsDashboard".
    • Заголовок (Title) — "SectionActionsDashboard".
    • Родительский объект (Parent object) — выберите "SectionActionsDashboard".

    На заметку. Если нужно добавить канал только на одну страницу записи, то создайте модуль<имя_раздела>SectionActionsDashboard (например, BooksSectionActionsDashboard). В качестве родительского объекта выберите SectionActionsDashboard.

  4. Реализуйте логику работы нового канала.

    1. В свойстве methods реализуйте методы:

      • getSectionPublishers() — добавляет созданный канал в список издателей сообщений.
      • getExtendedConfig() — задает настройки отображения вкладки канала на панели действий. Чтобы метод отработал корректно, загрузите изображение иконки канала и укажите ее в параметре ImageSrc. Файл изображения иконки, используемый в данном примере, можно скачать здесь.
      • onGetRecordInfoForPublisher() — добавляет значение контакта из страницы записи раздела, который содержит панель действий.
      • getContactEntityParameterValue() — определяет значение контакта из страницы записи раздела, который содержит панель действий.
    2. В В массив модификаций diff добавьте конфигурационный объект с настройками расположения:

      • Вкладки CallsMessageTab.

      • Контейнера сообщений.

      • Модуля UsrCallsMessageModule. Это модуль, который отображается в текущем канале на одной из вкладок.

    Исходный код схемы замещающей модели представления панели действий представлен ниже.

    SectionActionsDashboard
    define("SectionActionsDashboard", ["SectionActionsDashboardResources", "UsrCallsMessagePublisherModule"], function(resources) {
            return {
                attributes: {},
                messages: {},
                methods: {
                    /* Задает настройки отображения вкладки канала на панели действий. */
                    getExtendedConfig: function() {
                        /* Вызов родительского метода. */
                        var config = this.callParent(arguments);
                        var lczImages = resources.localizableImages;
                        config.CallsMessageTab = {
                            /* Изображение вкладки. */
                            "ImageSrc": this.Terrasoft.ImageUrlBuilder.getUrl(lczImages.CallsMessageTabImage),
                            /* Значение маркера. */
                            "MarkerValue": "calls-message-tab",
                            /* Выравнивание. */
                            "Align": this.Terrasoft.Align.RIGHT,
                            /* Тэг. */
                            "Tag": "UsrCalls"
                        };
                        return config;
                    },
                    /* Переопределяет родительский и добавляет значение контакта из страницы записи раздела, который содержит панель действий. */
                    onGetRecordInfoForPublisher: function() {
                        var info = this.callParent(arguments);
                        info.additionalInfo.contact = this.getContactEntityParameterValue(info.relationSchemaName);
                        return info;
                    },
                    /* Определяет значение контакта из страницы записи раздела, в котором находится панель действий. */
                    getContactEntityParameterValue: function(relationSchemaName) {
                        var contact;
                        if (relationSchemaName === "Contact") {
                            var id = this.getMasterEntityParameterValue("Id");
                            var name = this.getMasterEntityParameterValue("Name");
                            if (id && name) {
                                contact = {value: id, displayValue: name};
                            }
                        } else {
                            contact = this.getMasterEntityParameterValue("Contact");
                        }
                        return contact;
                    },
                    /* Добавляет созданный канал в список издателей сообщений. */
                    getSectionPublishers: function() {
                        var publishers = this.callParent(arguments);
                        publishers.push("UsrCalls");
                        return publishers;
                    }
                },
                /* Массив модификаций diff. */
                diff: /**SCHEMA_DIFF*/[
                    /* Добавление вкладки CallsMessageTab. */
                    {
                        /* Операция добавления. */
                        "operation": "insert",
                        /* Имя сущности. */
                        "name": "CallsMessageTab",
                        /* Имя родительского элемента, в который выполняется вставка. */
                        "parentName": "Tabs",
                        /* Свойство элемента родителя, с которым выполняется операция. */
                        "propertyName": "tabs",
                        /* Значение добавляемого элемента. */
                        "values": {
                            /* Массив дочерних элементов. */
                            "items": []
                        }
                    },
                    /* Добавление контейнера сообщений. */
                    {
                        "operation": "insert",
                        "name": "CallsMessageTabContainer",
                        "parentName": "CallsMessageTab",
                        "propertyName": "items",
                        "values": {
                            /* Тип добавляемого элемента — контейнер. */
                            "itemType": this.Terrasoft.ViewItemType.CONTAINER,
                            /* CSS-класс для контейнера. */
                            "classes": {
                                "wrapClassName": ["calls-message-content"]
                            },
                            "items": []
                        }
                    },
                    /* Добавление модуля UsrCallsMessageModule. */
                    {
                        "operation": "insert",
                        "name": "UsrCallsMessageModule",
                        "parentName": "CallsMessageTab",
                        "propertyName": "items",
                        "values": {
                            /* CSS-класс для модуля вкладок. */
                            "classes": {
                                "wrapClassName": ["calls-message-module", "message-module"]
                            },
                            /* Тип добавляемого элемента — модуль. */
                            "itemType": this.Terrasoft.ViewItemType.MODULE,
                            /* Название модуля. */
                            "moduleName": "UsrCallsMessagePublisherModule",
                            /* Привязка метода, который выполняется после отрисовки элемента. */
                            "afterrender": {
                                "bindTo": "onMessageModuleRendered"
                            },
                            /* Привязка метода, который выполняется после перерисовки элемента. */
                            "afterrerender": {
                                "bindTo": "onMessageModuleRendered"
                            }
                        }
                    }
                ]/**SCHEMA_DIFF*/
            };
        }
    );
    
  5. На панели инструментов дизайнера нажмите Сохранить (Save).

В результате новый канал отображается на страницах записей разделов, в которых подключен SectionActionsDashboard.

3. Создать схему модуля контейнера 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Модуль (Add —> Module).

  3. Заполните свойства схемы.

    • Код (Code) — "UsrCallsMessagePublisherModule".
    • Заголовок (Title) — "Модуль издателя сообщений логирования звонка" ("Call messages logging publisher module").
    scr_module_props.png
  4. Реализуйте контейнер для отображения реализованного канала панели действий.

    Модуль UsrCallsMessagePublisherModule является контейнером панели действий для отображения страницы UsrCallsMessagePublisherPage, в которой реализована логика добавляемого канала.

    Исходный код схемы модуля представлен ниже.

    UsrCallsMessagePublisherModule
    define("UsrCallsMessagePublisherModule", ["BaseMessagePublisherModule"], function() {
            /* Определение класса.*/
            Ext.define("Terrasoft.configuration.UsrCallsMessagePublisherModule", {
                /* Базовый класс.*/
                extend: "Terrasoft.BaseMessagePublisherModule",
                /* Сокращенное имя класса.*/
                alternateClassName: "Terrasoft.UsrCallsMessagePublisherModule",
                /* Инициализация страницы, которая отрисовывается в текущем  модуле.*/
                initSchemaName: function() {
                    this.schemaName = "UsrCallsMessagePublisherPage";
                }
            });
            /* Возвращает объект класса, который определен в модуле.*/
            return Terrasoft.UsrCallsMessagePublisherModule;
        });
  5. На панели инструментов дизайнера нажмите Сохранить (Save).

4. Создать схему модели представления страницы бизнес-логики канала 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Модель представления страницы (Add —> Page view model).

  3. Заполните свойства схемы.

    • Код (Code) — "UsrCallsMessagePublisherPage".
    • Заголовок (Title) — "UsrCallsMessagePublisherPage".
    • Родительский объект (Parent object) — выберите "BaseMessagePublisherPage".
  4. Реализуйте логику работы страницы.

    1. Укажите имя схемы объекта, с которым работает страница (в данном случае Activity).

    2. Реализуйте логику публикации сообщения.

    3. Переопределите метод getServiceConfig, в котором укажите имя класса из конфигурации.

    UsrCallsMessagePublisherPage
    /* Задает класс, который будет работать с данной страницей.*/
    getServiceConfig: function() {
       return {
          className: "Terrasoft.Configuration.CallsMessagePublisher"
       };
    }
    

    Реализация логики публикации сообщения содержит большое количество методов, атрибутов и свойств. Полностью исходный код схемы UsrCallsMessagePublisherPage вы можете скачать по ссылке. Исходный код содержит  реализацию рабочего канала CallMessagePublisher, который используется для логирования входящих и исходящих звонков.

    Исходный код схемы модели представления рабочего канала представлен ниже.

    UsrCallsMessagePublisherPage
    define("UsrCallsMessagePublisherPage", ["ConfigurationConstants", "LookupQuickAddMixin", "ESNHtmlEditModule",
            "css!UsrCallsMessagePublisherModule"],
        function(ConfigurationConstants) {
            return {
                entitySchemaName: "Activity",
                mixins: {
                    LookupQuickAddMixin: "Terrasoft.LookupQuickAddMixin"
                },
                attributes: {
                    "EntitiesList": {
                        "dataValueType": Terrasoft.DataValueType.COLLECTION,
                        "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
                    },
                    //
                    "CallDirectionsList": {
                        "dataValueType": Terrasoft.DataValueType.COLLECTION
                    },
                    "Contact": {
                        "lookupListConfig": {
                            "columns": ["Account"]
                        }
                    }
                },
                methods: {
                    init: function() {
                        this.callParent(arguments);
                        this.setDefaultValues();
                    },
                    onLookupDataLoaded: function(config) {
                        this.callParent(arguments);
                        config.isLookupEdit = true;
                        this.mixins.LookupQuickAddMixin.onLookupDataLoaded.call(this, config);
                    },
                    getServiceConfig: function() {
                        return {
                            className: "Terrasoft.Configuration.CallsMessagePublisher"
                        };
                    },
                    onPublished: function() {
                        this.callParent(arguments);
                        this.set("Body", null);
                    },
                    getPublishMaskCaption: function() {
                        return this.get("Resources.Strings.PublishMaskCaption");
                    },
                    prepareCallDirectionsList: function(filter, list) {
                        if (!list) {
                            return;
                        }
                        list.clear();
                        this.getCallDirections(list);
                    },
                    getCallDirectionQuery: function() {
                        var query = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                            rootSchemaName: "CallDirection"
                        });
                        query.addColumn("Name");
                        var callDirectionFilter = this.getCallDirectionFilter(query);
                        query.filters.add("callDirectionFilter", callDirectionFilter);
                        return query;
                    },
                    getCallDirectionFilter: function(query) {
                        if (!query) {
                            return null;
                        }
                        var notDefinedDirection = -1;
                        return query.createColumnFilterWithParameter(Terrasoft.ComparisonType.NOT_EQUAL,
                            "Code", notDefinedDirection);
                    },
                    getCallDirections: function(list) {
                        var query = this.getCallDirectionQuery();
                        query.getEntityCollection(function(result) {
                            this.getCallDirectionsHandler(result, list);
                        }, this);
                    },
                    getCallDirectionsHandler: function(result, list) {
                        if (result.success) {
                            var self = this;
                            var collection = {};
                            var items = result.collection.getItems();
                            items.forEach(function(item) {
                                self.addCallDirectionToCollection(item, collection);
                            });
                            list.loadAll(collection);
                        }
                    },
                    addCallDirectionToCollection: function(item, collection) {
                        var id = item.get("Id");
                        var name = item.get("Name");
                        collection[id] = {
                            value: id,
                            displayValue: name
                        };
                    },
                    setDefaultValues: function() {
                        this.set("CallDirectionsList", this.Ext.create("Terrasoft.Collection"));
                        this.setDefaultContact();
                        this.setDefaultCallDirection();
                    },
                    onDashboardRealoaded: function() {
                        this.setDefaultValues();
                    },
                    getContactLookupValue: function(config) {
                        var result = this.Ext.isObject(config) ? {
                            Account: config.Account,
                            displayValue: config.displayValue,
                            value: config.value
                        } : null;
                        return result;
                    },
                    setDefaultContact: function() {
                        var config = this.getListenerRecordData();
                        if (!config) {
                            return;
                        }
                        var additionalInfo = config.additionalInfo;
                        var contact = this.getContactLookupValue(additionalInfo && additionalInfo.contact);
                        this.set("Contact", contact);
                    },
                    setDefaultCallDirection: function() {
                        var query = this.Ext.create("Terrasoft.EntitySchemaQuery", {
                            rootSchemaName: "CallDirection"
                        });
                        query.addColumn("Name");
                        var recordId = ConfigurationConstants.Activity.ActivityCallDirection.Incoming;
                        query.getEntity(recordId, function(result) {
                            this.setDefaultCallDirectionQueryHandler(result);
                        }, this);
                    },
                    setDefaultCallDirectionQueryHandler: function(result) {
                        if (result.success) {
                            var id = result.entity.get("Id");
                            var name = result.entity.get("Name");
                            var defaultCallDirection = {
                                value: id,
                                displayValue: name
                            };
                            this.set("CallDirection", defaultCallDirection);
                        }
                    },
                    getPublishDataItem: function(itemName, itemValue) {
                        if (!itemName || !itemValue) {
                            return;
                        }
                        return {"Key": itemName, "Value": itemValue};
                    },
                    getRelationSchemaForPublishData: function() {
                        var config = this.getListenerRecordData();
                        if (!config || !config.relationSchemaName || !config.relationSchemaRecordId) {
                            return null;
                        }
                        var relationSchemaName = config.relationSchemaName + "Id";
                        var relationSchemaRecordId = config.relationSchemaRecordId;
                        return this.getPublishDataItem(relationSchemaName, relationSchemaRecordId);
                    },
                    getContactForPublishData: function() {
                        var contact = this.get("Contact");
                        if (!contact || !contact.value) {
                            return null;
                        }
                        var contactValue = contact.value;
                        return this.getPublishDataItem("ContactId", contactValue);
                    },
                    getAccountForPublishData: function() {
                        var contact = this.get("Contact");
                        if (!contact || !contact.Account || !contact.Account.value) {
                            return null;
                        }
                        return this.getPublishDataItem("AccountId", contact.Account.value);
                    },
                    getCallDirectionToPublishData: function() {
                        var callDirection = this.get("CallDirection");
                        if (!callDirection || !callDirection.value) {
                            return null;
                        }
                        return this.getPublishDataItem("CallDirectionId", callDirection.value);
                    },
                    onNewCardSaved: function() {
                        if (!this.get("Body")) {
                            return;
                        }
                        this.publishMessage();
                    },
                    getPublishData: function() {
                        var publishData = [];
                        var contact = this.getContactForPublishData();
                        if (contact) {
                            publishData.push(contact);
                        }
                        var account = this.getAccountForPublishData();
                        if (account) {
                            publishData.push(account);
                        }
                        var relationSchema = this.getRelationSchemaForPublishData();
                        if (relationSchema) {
                            var itemIndex = publishData.findIndex(function(item) {
                                return item.Key === relationSchema.Key;
                            }, this);
                            if (itemIndex === -1) {
                                publishData.push(relationSchema);
                            }
                        }
                        var callDirection = this.getCallDirectionToPublishData();
                        if (callDirection) {
                            publishData.push(callDirection);
                        }
                        var callCategory = ConfigurationConstants.Activity.ActivityCategory.Call;
                        publishData.push(this.getPublishDataItem("ActivityCategoryId", callCategory));
                        var body = this.getClearBody(this.get("Body"));
                        publishData.push(this.getPublishDataItem("Body", body));
                        publishData.push(this.getPublishDataItem("DetailedResult", body));
                        var title = this.getCombinedTitle();
                        publishData.push(this.getPublishDataItem("Title", title));
                        publishData.push(this.getPublishDataItem("ResultId",
                            ConfigurationConstants.Activity.ActivityResult.Completed));
                        publishData.push(this.getPublishDataItem("StatusId",
                            ConfigurationConstants.Activity.Status.Done));
                        return publishData;
                    },
                    getCombinedTitle: function() {
                        var contact = this.get("Contact");
                        var callDirection = this.get("CallDirection");
                        var directionMessage;
                        var undefinedCallDirectionMessage;
                        if (callDirection.value === ConfigurationConstants.Activity.ActivityCallDirection.Incoming) {
                            directionMessage = this.get("Resources.Strings.IncomingCallString");
                            undefinedCallDirectionMessage = this.get("Resources.Strings.UndefinedIncomingCallString");
                        } else if (callDirection.value ===
                            ConfigurationConstants.Activity.ActivityCallDirection.Outgoing) {
                            directionMessage = this.get("Resources.Strings.OutgoingCallString");
                            undefinedCallDirectionMessage = this.get("Resources.Strings.UndefinedOutgoingCallString");
                        }
                        if (!contact) {
                            return undefinedCallDirectionMessage;
                        }
                        return  this.Ext.String.format("{0} {1}", directionMessage, contact.displayValue);
                    },
                    getClearBody: function(body) {
                        if (typeof(body) === "string") {
                            return body.replace(/<\/?[^>]+(>|$)/g, "").replace(/\n\n/g, "\n");
                        }
                    }
                },
                diff: /**SCHEMA_DIFF*/[
                    {
                        "operation": "insert",
                        "propertyName": "items",
                        "parentName": "LayoutContainer",
                        "name": "MainGridLayout",
                        "values": {
                            "itemType": this.Terrasoft.ViewItemType.GRID_LAYOUT,
                            "items": []
                        },
                        "index": 0
                    },
                    {
                        "operation": "insert",
                        "name": "Contact",
                        "parentName": "MainGridLayout",
                        "propertyName": "items",
                        "values": {
                            "layout": {
                                "column": 0,
                                "row": 0,
                                "colSpan": 11
                            },
                            "labelConfig": {
                                "classes": ["calls-message-contact"]
                            },
                            "bindTo": "Contact"
                        }
                    },
                    {
                        "operation": "insert",
                        "name": "CallDirection",
                        "parentName": "MainGridLayout",
                        "propertyName": "items",
                        "values": {
                            "layout": {
                                "column": 15,
                                "row": 0,
                                "colSpan": 9
                            },
                            "labelConfig": {
                                "classes": ["call-direction-message-contact"]
                            },
                            "bindTo": "CallDirection",
                            "contentType": this.Terrasoft.ContentType.ENUM,
                            "controlConfig": {
                                "prepareList": {
                                    "bindTo": "prepareCallDirectionsList"
                                }
                            }
                        }
                    },
                    {
                        "operation": "insert",
                        "name": "CallsMessagePublisherEdit",
                        "parentName": "MainGridLayout",
                        "propertyName": "items",
                        "values": {
                            "layout": {
                                "column": 0,
                                "row": 1,
                                "colSpan": 24,
                                "rowSpan": 2
                            },
                            "className": "Terrasoft.ESNHtmlEdit",
                            "itemType": this.Terrasoft.ViewItemType.MODEL_ITEM,
                            "dataValueType": this.Terrasoft.DataValueType.TEXT,
                            "contentType": this.Terrasoft.ContentType.RICH_TEXT,
                            "labelConfig": {
                                "visible": false
                            },
                            "value": {
                                "bindTo": "Body"
                            },
                            "placeholder": {
                                "bindTo": "Resources.Strings.WriteCommentHint"
                            },
                            "markerValue": "CallsMessagePublisherEdit",
                            "height": "100px",
                            "autoGrow": true,
                            "autoGrowMinHeight": 100
                        }
                    }
                ]/**SCHEMA_DIFF*/
            };
        }
    );
    
  5. На панели инструментов дизайнера нажмите Сохранить (Save).

Результат выполнения примера

Чтобы посмотреть результат выполнения примера, обновите страницу раздела Контакты (Contacts).

В результате выполнения примера на панели действий страницы контакта отображается пользовательский канал. Канал повторяет функциональность канала фиксации результатов звонка.

scr_calls_message_publisher_result.png
Создать пользовательскую страницу действия верификации
Сложный

Пример реализован для продуктов линейки Financial Services Creatio.

Пример. Создать страницу действия верификации, на которой будет скрыто поле Комментарий (Comment).

1. Создать схему страницы действия верификации 

  1. Перейдите в раздел Конфигурация (Configuration) и выберите пользовательский пакет, в который будет добавлена схема.
  2. На панели инструментов реестра раздела нажмите Добавить —> Модель представления страницы (Add —> Page view model).

  3. В дизайнере схем заполните свойства схемы:

    • Код (Code) — "UsrCommentlessAppValidationPage".
    • Заголовок (Title) — "Verification page without comments".
    • Родительский объект (Parent object) — выберите "Преднастроенная пользовательская страница" ("Preconfigured verification page").

    Для применения заданных свойств нажмите Применить (Apply).

2. Настроить представление страницы

В дизайнере схем добавьте необходимый исходный код. 

В массиве модификаций diff удалите из родительского элемента поле Комментарий (Comment).

UsrCommentlessAppValidationPage.js
define("UsrCommentlessAppValidationPage", [], function() {
    return {
        entitySchemaName: "AppValidation",
        diff: [{
            "operation": "remove",
            "name": "CommentContainer"
        }]
    };
});

2. Использовать созданную схему в бизнес-процессе 

Чтобы использовать созданную схему, необходимо указать ее в поле Выполнить на странице (Execute on page) элемента Действие верификации (Validation item) бизнес-процесса. Эта схема может быть использована как в новых, так и в уже существующих бизнес-процессах, например, Aprrove application.

scr_process_derived_page.png

Для применения изменений бизнес-процесс необходимо сохранить.

Важно. Чтобы изменения были окончательно применены, требуется перезапуск сайта приложения в IIS.

Результат выполнения примера

После окончательного применения изменений прежняя страница верификации будет заменена пользовательской, не содержащей поля Комментарий (Comment).

scr_custom_page.png