Задача

Подключить функциональность визирования для нового раздела.

Решение

  1. Создать новый объект для детали [Визы] пользовательского раздела. Название объекта детали формируется из названия объекта раздела + Visa. Например, для раздела UsrInnerRequest название объекта UsrInnerRequestVisa. При создании объекта обязательно унаследоваться от объекта [Базовая виза], добавить поле взаимосвязи с разделом, остальные параметры настроить по примеру объекта [OrderVisa].

    Объект UsrInnerRequest должен администрироваться по записям.
  2. Подключить визирование на страницу редактирования пользовательского раздела, а именно из схемы страницы заказа [OrderPageV2] по ключевому слову Visa перенести все элементы на страницу пользовательского раздела.
  3. Подключить визирование в реестр пользовательского раздела, а именно из схемы реестра раздела Заказы [OrderSectionV2] по ключевому слову Visa перенести все элементы в схему реестра пользовательского раздела.
  4. Скопировать подпроцесс "Получение визы по заказу" и сменить параметр Заказ, вычитку данных и фильтрацию элементов с раздела [Заказ] на пользовательский объект раздела. Название подпроцесса: название раздела + VisaBaseSubprocess.
  5. Скопировать процесс "Визирование заказа" и сменить параметр Заказ, вычитку данных, фильтрацию элементов и ссылку на подпроцесс на актуальные значения. Название процесса: название раздела + VisaProcess. В процессе элементы отправки уведомлений заменить на новый элемент отправки.
  6. Добавить новую системную настройку «Процесс визирования [название пользовательского раздела]» со ссылкой на процесс из п. 5. Параметры настройки смотреть в системной настройке «Процесс визирования заказа».

Для отображения виз в коммуникационной панели необходимо дополнительно:

  1. Скопировать схему [OrderVisaNotificationProvider] и переименовать в Название раздела + VisaNotificationProvider. В схеме по ключевому слову Order заменить его на название объекта пользовательского раздела. И названия полей раздела [Заказы] заменить на названия соответствующих полей пользовательского раздела.
  2. Скриптом в таблице [Провайдер уведомлений] зарегистрировать ранее добавленную схему с типом 0 (в разделе [Справочник] не позволяет сохранить запись с типом 0):
insert into NotificationProvider (ClassName, Type)
values ('Terrasoft.Configuration.UsrInnerRequestVisaNotificationProvider','0')

 

Нравится

Поделиться

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

Вопрос

Как выполнить SQL запрос (чтение, запись, удаление) в базе данных On-demand?

Это может быть полезно если у пользователя нет доступа к базе данных,

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

Ответ

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

Опубликовать. Запустить. Пользоваться. 

Изображение удалено.

Прикрепленные файлы

Нравится

Поделиться

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

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

define("ContractPageV2", ["RightUtilities","ProcessModuleUtilities"], function(RightUtilities,ProcessModuleUtilities)

2. Добавляем в блок diff[] страницы редактирования раздела следующий код:

{
    "operation": "insert",
    "name": "YourButtonName", // название нашей кнопки (используется в коде, пользователь не видит)
    "values": {
        "itemType": 5,
        "style": "green", //цвет кнопки. Выбор из наших стандартных
        "classes": {
            "textClass": ["actions-button-margin-right"], //чтобы при добавлении еще одной кнопки был отступ справа
            "wrapperClass": ["actions-button-margin-right"]
        },
        "caption": { // заголовок вашей кнопки (который отображается пользователю)
            "bindTo": "Resources.Strings.YourButtoncaptionLocalizableString"    // можно задать явно. Например, "caption": "Красивая кнопка"
        },
        "click": {
            "bindTo": "onYourButtonClick" // Название метода, который будет отрабатывать при клике на кнопку
        },
        "visible": true, //Отвечает за видимость кнопки
        "enabled": true    //для ознакомления, можно удалить. Отвечает за активность кнопки
    },
    "parentName": "LeftContainer",
    "propertyName": "items",
    "index": 10 //следующая кнопка будет иметь индекс 11 и т.д.
}

3. Добавляем в блок methods{} страницы редактирования раздела следующий код:

onYourButtonClick: function() { //название метода, указанное при добавлении кнопки
    ProcessModuleUtilities.executeProcess({
        sysProcessName: "YourProcessName", //имя вашего процесса
        parameters: {
            ParamName: this.get("Id"), //слева название параметра процесса, в который мы передаем то, что справа
        },
        callback: function(item) { //этот блок не обязательнен
            this.onReloadCard(); //перезагружает страницу после окончания БП
            this.hideBodyMask(); //не выводит заглушку загрузки на карточке
        }.bind(this)
    });
}

4. Дублируем код для кнопки из пункта 2 в блок diff[] секции раздела. Все тоже самое, кроме атрибута "click": и нового "tag" (в блоке "values"):

"click": { "bindTo": "onCardAction" },
"tag": "onYourButtonClick",             //название метода, указанное при добавлении кнопки

 

Нравится

Поделиться

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

Вопрос

Есть ли возможность создать BusinessRule, которое будет отрабатывать изменения атрибута колонки (например, обязательность) по двум колонкам? 

Ответ

Вот пример бизнес правила, которое делает поле “UsrRequired” обязательным для заполнения только в случае, если поля “UsrText0” и “UsrText1” являются не заполненными:

rules: {
    "UsrRequired": {
        BindParameterRequiredAccountByType: {
            ruleType: BusinessRuleModule.enums.RuleType.BINDPARAMETER,
            property: BusinessRuleModule.enums.Property.REQUIRED,
            logical: Terrasoft.LogicalOperatorType.AND,
            conditions: [
                {
                    leftExpression: {
                        type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                        attribute: "UsrTest0",
                    },
                    comparisonType: Terrasoft.ComparisonType.EQUAL,
                    rightExpression: {
                        type: BusinessRuleModule.enums.ValueType.CONSTANT,
                        value: ""
                    }
                },
                {
                    leftExpression: {
                        type: BusinessRuleModule.enums.ValueType.ATTRIBUTE,
                        attribute: "UsrTest1",
                    },
                    comparisonType: Terrasoft.ComparisonType.EQUAL,
                    rightExpression: {
                        type: BusinessRuleModule.enums.ValueType.CONSTANT,
                        value: ""
                    }
                }
            ]
        }
    }
},

 

Нравится

Поделиться

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

Вопрос

Как можно создать ComboBox и заполнить его программно значениями...

Ответ

Пример кода:

define("CasePage", ["CasePageResources", "terrasoft"],
    function(resources, Terrasoft) {
    return {
        entitySchemaName: "Case",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        attributes: {
            "myEnum": {
                "dataValueType": Terrasoft.DataValueType.ENUM,
                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "caption": "myEnum"
            },
            "myList": {
                "dataValueType": Terrasoft.DataValueType.ENUM,
                "type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                "isCollection": true
            }
        },
        diff: /**SCHEMA_DIFF*/[
            {
                "operation": "insert",
                "name": "myEnum",
                "values": {
                    "caption": "myEnum",
                    "dataValueType": this.Terrasoft.DataValueType.ENUM,
                    "bindTo": "myEnum",
                    "layout": { "colSpan": 24, "rowSpan": 1, "column": 0, "row": 4 },
                    "controlConfig": {
                        "className": "Terrasoft.ComboBoxEdit",
                        "list": {
                            "bindTo": "myList"
                        },
                        "change": {
                            "bindTo": "onMyValueChange"
                        },
                        "prepareList": {
                            "bindTo": "prepareMyList"
                        }
                    }
                },
                "parentName": "SolutionTab_gridLayout",
                "propertyName": "items",
                "index": 1
            }
        ]/**SCHEMA_DIFF*/,
        methods: {
            onPageInitialized: function(callback, scope) {
                if (!this.get("myList")) {
                    this.set("myList", this.Ext.create("Terrasoft.Collection"));
                }
 
                if (callback) {
                    callback.call(scope || this);
                }
            },
            onEntityInitialized: function() {
                this.callParent(arguments);
 
                // and just for debug:
                document.scope = this;
            },
            prepareMyList: function(filter, list) {
                if (list === null) {
                    return;
                }
                list.clear();
                var columns = {};
 
                var value1 = {
                    displayValue: "a123",
                    value: "1"
                };
                var value2 = {
                    displayValue: "b234",
                    value: "2"
                };
                var value3 = {
                    displayValue: "c345",
                    value: "3"
                };
 
                columns[1] = value1;
                columns[2] = value2;
                columns[3] = value3;
 
                list.loadAll(columns);
            },
            onMyValueChange: function(val) {
                if (val && val.displayValue) {
                    console.log("you pick: ", val.displayValue);
                }
            }
        },
        rules: {}
    };
});

 

Нравится

Поделиться

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

Вопрос

Прошу подсказать каким образом можно добавить пункт меню в меню действий детали (там где три точечки).

И где нужно писать обработку при выборе этого пункта.

Ответ

Для добавления или изменения элементов в меню "Действия" детали, Вам необходимо смотреть в сторону замещения метода addToolsButtonMenuItems в схеме детали.

Базовую реализацию данного метода, Вы можете увидеть в схеме BaseGridDetalV2(NUI).

Нравится

Поделиться

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

Вопрос

Есть ли возможность показывать дату комментария в Ленте без обозначений "сегодня, вчера, позавчера"?

Ответ

Для этого необходимо переопределить метод getCreatedOnText() модуля SocialFeedUtilities. Поскольку модули в системе bpm'online расширять нельзя (можно только полностью заместить), необходимо создать замещающий клиентский модуль в пользовательском пакете, указать в качестве родительского модуля SocialFeedUtilities, полностью скопировать текст из аналогичного модуля в пакете ESN (вкладки "Исходный код" и "LESS") и заменить текст метода getCreatedOnText на такой:

getCreatedOnText: function() {
    var cultureSetting = Terrasoft.Resources.CultureSettings;
    var value = this.get("CreatedOn");
    if (value) {
        var datePart = Ext.Date.dateFormat(value, cultureSetting.dateFormat);
        var timePart = Ext.Date.dateFormat(value, cultureSetting.timeFormat);
        return Ext.String.format("{0} {2} {1}", datePart, timePart,
            FormatUtilsResources.localizableStrings.In);
        }
    return "";
}

Также необходимо в самом начале текста исходного кода добавить зависимость модуля от FormatUtilsResources, чтобы иметь доступ к локализированной строке FormatUtilsResources.localizableStrings.In модуля FormatUtils:

define("SocialFeedUtilities", ["FormatUtilsResources", "ESNFeedUtils", "ESNFeedModuleResources", 
    "FormatUtils", "ESNConstants", "NetworkUtilities", "ModalBox", "ServiceHelper", "MaskHelper", 
    "performancecountermanager", "css!SocialFeedUtilities"],
    function(FormatUtilsResources, ESNFeedUtils, resources, FormatUtils, ESNConstants, 
        NetworkUtilities, ModalBox, ServiceHelper, MaskHelper, performanceManager) {...

 

Нравится

Поделиться

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

Вопрос

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

Ответ

- Запустить мастер мобильного приложения

- Открыть рабочее место по умолчанию («Основное рабочее место»)

- Перейти к настройкам раздела

- Нажать «Сохранить»

- Создать ClientUnit-схему

- Добавить в нее след. код:

Terrasoft.sdk.GridPage.setSearchColumns("Contact", [“Name”, “Zip”]);

- Открыть MobileApplicationManifestDefaultWorkplace в пакете Custom

- Прописать свою схему для раздела «Контакты»:

{
    “Models”: {
        “Contact”: {
            "PagesExtensions": [
                "Имя_созданной_схемы"
            ]
        }
    }
}

 

Нравится

Поделиться

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

Вопрос

Как добавить в мобильное приложение стандартную деталь и вывести в нее специфичную колонку?

Ответ

1. Переходим в "Мастер мобильного приложения" (/0/Nui/ViewModule.aspx#SectionModuleV2/SysMobileWorkplaceSection)

2. Открываем нужное рабочее местое (по умолчанию DefaultWorkplace) нажимаем кноку ##RU=Настроить разделы;EN=Set up sections##

3. Выбираем нужный раздел, например "Контакты", и нажимаем кнопку "##RU=Настроить детали;EN=Details setup##"

4. Добавляем деталь:

Изображение удалено.

5. Переходим в раздел "Конфигурация" (/0/WorkspaceExplorerModule.aspx)

6. Добавляем новую схему типа "Module" с именем UsrContactCareerModuleConfig

7. Пишем в ней примерно такой код:

Terrasoft.sdk.GridPage.setPrimaryColumn("ContactCareer", "JobTitle");
Terrasoft.sdk.RecordPage.addColumn("ContactCareer", {
        name: "JobTitle",
        position: 1
    }, "primaryColumnSet");
Terrasoft.sdk.RecordPage.removeColumn("ContactCareer", "Contact", "primaryColumnSet");

Где ContactCareer - имя таблицы, которая соответствует нашей детали;

      JobTitle - имя колонки, которую нужно тобразить

Изображение удалено.

8. Подключаем данную схему в манифесте мобильного приложения MobileApplicationManifestDefaultWorkplace:

Находим блок модели ContactCareer и там в PagesExtensions добавляем наш модуль UsrContactCareerModuleConfig

Примерно так:

Изображение удалено.

 

Нравится

Поделиться

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

Вопрос

На странице редактирования активности типа email нужно включить возможность редактирования заголовка, но она в режиме disabled и мы не видим, где это можно включить.

Ответ

Для возможности редактирования заголовка для активностей типа “email”, нужно создать “замещающий клиентский модуль” и указать родительским объектом схему  “EmailPage” из пакета NUI.

Изображение удалено.

Скопировать в созданный модуль код из схемы “EmailPage”. И закомментировать бизнес-правило отвечающее за возможность редактирования поля “Заголовок”.

Изображение удалено.

Сохранить и опубликовать модуль. В результате поле “Заголовок” стает редактируемым.

Изображение удалено.

 

Нравится

Поделиться

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