Вопрос

Как передать идентификатор контрагента, из карточки заказа, на страницу редактирования детали "Продукт в заказе" через сообщения sandbox?

Ответ

Код замещающей схемы страницы Заказа:

define("OrderPageV2", ["OrderPageV2Resources", "GeneralDetails"],
function(resources, GeneralDetails) {
    return {
        entitySchemaName: "Order",
        details: /**SCHEMA_DETAILS*/{
        }/**SCHEMA_DETAILS*/,
        diff: /**SCHEMA_DIFF*/[
        ]/**SCHEMA_DIFF*/,
        attributes: {},
        methods: {
            onEntityInitialized: function() {
                this.callParent(arguments);
                this.sandbox.subscribe("OrderProductPageAsksForData", function(arg) {
                    console.log("OrderProductPageV2 запрашивает данные прямо сейчас,");
                    console.log("по Id песочницы: " + arg.sandboxId);
                    // Высылаем данные.
                    this.sendDataToOrderProductPage(arg.sandboxId);
                }, this, [this.sandbox.id]);
                console.log("Мы(OrderPageV2) подписались на сообщение: OrderProductPageAsksForData.");
                console.log("Id песочницы в этой карточке(OrderPageV2) следующий:");
                console.log(this.sandbox.id);
            },
            sendDataToOrderProductPage: function(sandboxId) {
                this.sandbox.publish("DataToOrderProductPage", { accountId: this.get("Account").value }, [sandboxId]);
                console.log("AccountId отправлен сообщением для OrderProductPageV2 по Id: " + sandboxId);
            }
        },
        rules: {},
        messages: {
            "DataToOrderProductPage": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.PUBLISH
            },
            "OrderProductPageAsksForData": {
                mode: Terrasoft.MessageMode.PTP,
                direction: Terrasoft.MessageDirectionType.SUBSCRIBE
            }
        },
        userCode: {}
    };
});

Код замещающей схемы страницы детали Продукт в заказе:

define("OrderProductPageV2", ["BusinessRuleModule", "OrderUtilities"],
    function(BusinessRuleModule) {
        return {
            entitySchemaName: "OrderProduct",
            mixins: {},
            attributes: {},
            methods: {
                onEntityInitialized: function() {
                    this.callParent(arguments);
                    this.sandbox.subscribe("DataToOrderProductPage", function(arg) {
                        console.log("OrderPageV2 передает нам данные!");
                        alert("accountId: " + arg.accountId);
                    }, this, [this.sandbox.id]);
                    console.log("Мы(OrderProductPageV2) подписались на сообщение: DataToOrderProductPage.");
                    console.log("По нашему(OrderProductPageV2) Id песочницы:");
                    console.log(this.sandbox.id);
                    this.sandbox.publish("OrderProductPageAsksForData", {
                        sandboxId: this.sandbox.id
                    }, [this.getOrderPageSandboxId()]);
                    console.log("Запросили данные у OrderPageV2, по её Id песочницы: " + this.getOrderPageSandboxId());
                },
                getOrderPageSandboxId: function() {
                    var index = this.sandbox.id.indexOf("_detail_ProductInProducts");
                    return this.sandbox.id.substring(0, index);
                }
            },
            messages: {
                "DataToOrderProductPage": {
                    mode: Terrasoft.MessageMode.PTP,
                    direction: Terrasoft.MessageDirectionType.SUBSCRIBE
                },
                "OrderProductPageAsksForData": {
                    mode: Terrasoft.MessageMode.PTP,
                    direction: Terrasoft.MessageDirectionType.PUBLISH
                }
            },
            diff: /**SCHEMA_DIFF*/[
            ]/**SCHEMA_DIFF*/,
            rules: {
            }
        };
    }
);

 

Нравится

Поделиться

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

Вопрос

Кнопка Редактировать, как скрыть для пользователей портала?

Ответ

setIsEditTemplateButtonVisible: function(scope) {
var select = Ext.create("Terrasoft.EntitySchemaQuery", {
    rootSchemaName: "SysAdminUnit"
});
 
select.addMacrosColumn(Terrasoft.QueryMacrosType.PRIMARY_COLUMN, "Id");
select.addColumn("ConnectionType");
 
var filters = Ext.create("Terrasoft.FilterGroup");
filters.addItem(select.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL, "Id",
    scope.Terrasoft.SysValue.CURRENT_USER.value));
select.filters = filters;
 
select.execute(function(response) {
    if (response.success) {
        if (response.collection.getCount() > 0) {
            var connectionType = response.collection.getByIndex(0).get("ConnectionType");
            if(connectionType === 1){
                scope.set("isEditTemplateButtonVisible", false);
            }else{
                scope.set("isEditTemplateButtonVisible", true);
            }
        }
    }
}, this);

 

Нравится

Поделиться

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

Вопрос

При создании Листинга возникает сообщение с запросом адреса.

Ответ

При добавлении листинга система пытается определить текущее местоположение пользователя, но не может получить данные контакта. Для решения проблемы необходимо предоставить пользователям права на чтение собственного контакта.

Нравится

Поделиться

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

Добавляем в карточку контакта

diff: /**SCHEMA_DIFF*/[
    {
        "operation": "remove",
        "name": "AccountProfile"
    }
}]/**SCHEMA_DIFF*/,

 

Нравится

Поделиться

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

Вопрос

После создания web service ошибка при входе в конфигурацию: "An item with the same key has already been added"

Ответ

Возникает по причине того что пользователь мог создать несколько схем исходного кода с одинаковыми namespace.

Необходимо удалить схемы добавленных сервисов из SysSchema после чего заставить приложение быть перекомпилированным обнулив:

update SysWorkspace set AssemblyData = null

 

Нравится

Поделиться

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

Вопрос

Как скрыть кнопки "Добавить" для некоторых типов раздела?

Ответ

Создать замещающую схему раздела:

define("DocumentSectionV2", ["VisaHelper", "ConfigurationConstants", "BaseFiltersGenerateModule"],
    function(VisaHelper, ConfigurationConstants, BaseFiltersGenerateModule) {
        return {
            entitySchemaName: "Document",
            methods: {
                initEditPages: function() {
                    var enabledEditPages = new this.Terrasoft.Collection();
                    this.callParent(arguments);
                    var editPages = this.get("EditPages");
                    var items = editPages.getItems();
                    for (var i = 0; i < items.length; i++) {
                        if (items[i].values.Id !== "2015b538-40d0-4cbf-9301-fa8cae37ae94") {
                            enabledEditPages.add(items[i]);
                        }
                    }
                    this.set("EnabledEditPages", enabledEditPages);
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "SeparateModeAddRecordButton",
                    "parentName": "SeparateModeActionButtonsLeftContainer",
                    "propertyName": "items",
                    "values": {
                        "controlConfig": {
                            "menu": {
                                "items": {
                                    "bindTo": "EnabledEditPages",
                                    "bindConfig": {
                                        "converter": function(editPages) {
                                            if (editPages.getCount() > 1) {
                                                return editPages;
                                            } else {
                                                return null;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                },
                {
                    "operation": "merge",
                    "name": "CombinedModeAddRecordButton",
                    "parentName": "CombinedModeActionButtonsSectionContainer",
                    "propertyName": "items",
                    "values": {
                        "controlConfig": {
                            "menu": {
                                "items": {
                                    "bindTo": "EnabledEditPages",
                                    "bindConfig": {
                                        "converter": function(editPages) {
                                            if (editPages.getCount() > 1) {
                                                return editPages;
                                            } else {
                                                return null;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            ]/**SCHEMA_DIFF*/
        };
    }
);

 

Нравится

Поделиться

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

Вопрос

Существует ли возможность редактировать длину заголовка поля на странице, а то то как выглядит моя группа полей (см. прилож. скриншот) не совсем удобочитаемо. И если существует, то прошу подсказать как это реализовать.

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

Ответ

Изменить ширину расположение заголовка можно, как вариант, с помощью кода.

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

Примерный алгоритм (на примере колонки с типом «Строка»):

- создать свой модуль(пример модуля CommonCSSV2);

- во вкладке LESS прописать свои CSS (для понимания какие параметры стиля Вам необходимо использовать поможет, например, вкладка Elements в консоли браузера, т.е. отладка приложения). Стоит учесть, что необходимо будет изменять настройки самого контрола, не label;

- на странице страницы в define прописать пользовательский модуль. Например:

define("DashboardDesignerV2", ["css!DashboardDesignerV2CSS""CommonCSSV2"]

- в diff кнопки подключить пользовательский CSS класс . Например:

diff: /**SCHEMA_DIFF*/ [
    {
        "operation": "merge",
        "name": "Confirmed",
        "parentName": "Header",
        "propertyName": "items",
        "values": {
            "wrapClass": ["contact-header-container-label"],
            "layout": {
                "column": 4,
                "row": 3,
                "colSpan": 8
            }
        }
    },

 

Нравится

Поделиться

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

Вопрос

У меня проблема в загрузке изображений после добавления стандартного функционала Примечаний.

Примечания добавлены в деталь. Для детали создан собственный объект. Примечания добавляется в схему карточки детали следующим образом... текст сохраняется, изоражения даже не загружаются. Метод insertImagesToNotes не выполняется. Почему?

Ответ

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

Это можно исправить, посмотрев что реализовано в BaseModulePageV2 и воссоздать это у себя в схеме детали.

Для этого необходимо создать объект для детали, на основании Base object with notes (Base), создать мастером деталей деталь на основании этого объекта.

В конфигураторе, в схеме карточки детали добавить:



1. Зависимость от NotesUtilities для requirejs;

2. Атрибут:

attributes: {
    "NotesImagesCollection": {dataValueType:Terrasoft.DataValueType.COLLECTION}
},

3. Миксин:

mixins: {
    NotesUtilities: "Terrasoft.NotesUtilities"
},

4. Методы:

methods: {
        onNotesImagesUploadComplete: function() {
                this.hideBodyMask();
                this.updateFileDetail();
        },
        onNotesImagesUpload: function() {
                this.showBodyMask();
        },
        init: function(callback, scope) {
                this.callParent(arguments);
               this.mixins.NotesUtilities.initNotesImagesCollection.call(this);
        }
},

5. Поле для заметок в diff:

{
        "operation": "insert",
        "parentName": "Header",
        "propertyName": "items",
        "name": "Notes",
        "bindTo": "Notes",
        "values": {
                contentType: Terrasoft.ContentType.RICH_TEXT,
                "layout" : {column: 0, row: 1, colSpan: 24},
                "controlConfig": {
                        "imageLoaded": {
                                "bindTo": "insertImagesToNotes"
                        },
                        "images": {
                                "bindTo": "NotesImagesCollection"
                        }
                }
        },
        "index": 1
}

Код тестовой схемы для страницы редактирования детали:

define("UsrUsrMyDetail1Page", ["NotesUtilities"], function() {
	return {
		entitySchemaName: "UsrMyDetail",
		details: {},
		attributes: {
			"NotesImagesCollection": {dataValueType: Terrasoft.DataValueType.COLLECTION}
		},
		mixins: {
			NotesUtilities: "Terrasoft.NotesUtilities"
		},
		diff: [{
			"operation": "insert",
			"name": "UsrIntbcb7788a-2890-4358-bff3-102e82ea7889",
			"values": {
				"layout": {
					"colSpan": 12,
					"rowSpan": 1,
					"column": 0,
					"row": 0,
					"layoutName": "Header"
				},
				"labelConfig": {},
				"enabled": true,
				"bindTo": "UsrInt"
			},
			"parentName": "Header",
			"propertyName": "items",
			"index": 0
		},
		{
			"operation": "insert",
			"parentName": "Header",
			"propertyName": "items",
			"name": "Notes",
			"bindTo": "Notes",
			"values": {
				contentType: Terrasoft.ContentType.RICH_TEXT,
				"layout" : {column: 0, row: 1, colSpan: 24},
				"controlConfig": {
					"imageLoaded": {
						"bindTo": "insertImagesToNotes"
					},
					"images": {
						"bindTo": "NotesImagesCollection"
					}
				}
			},
			"index": 1
		}],
		methods: {
			onNotesImagesUploadComplete: function() {
				this.hideBodyMask();
				this.updateFileDetail();
			},
			onNotesImagesUpload: function() {
				this.showBodyMask();
			},
			init: function(callback, scope) {
				this.callParent(arguments);
				this.mixins.NotesUtilities.initNotesImagesCollection.call(this);
			}
		},
		rules: {}
	};
});

 

Нравится

Поделиться

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

Добрый день!

Подскажите, пожалуйста, как это сделать:

Зависимость от NotesUtilities для requirejs;

Полагаю, что в схеме детали в разделе надо добавить Dependencies надо добавить зависимость, но в поиске нет NotesUtilities. И что вообще такое requirejs?

Заранее спасибо!

Схема NotesUtilities в конфигурации есть:

А что такое requirejs, см. https://requirejs.org/

Зверев Александр,

Спасибо! Миксин такой, действительно есть, про requirejs, к сожалению, не поняла. Это ПО, которое отдельно надо установить? Простите за глупый, наверно, вопрос, коллеги тоже не в курсе. А сделать такую деталь мне ну очень надо))

Он встроен и уже используется в системе:

В bpm'online для работы с модулями используется загрузчик RequireJS.

Зверев Александр,

и вообще этот шаг - обязательный???

Вообще, в статье, которую мы комментируем, описано как в одну схему в определённые места добавить куски кода, создать другую схему-страницу для самой детали, схему-объект для неё же и нужная функциональность появится.

Зверев Александр,

да, просто поставил в тупик этот пункт:

Зависимость от NotesUtilities для requirejs;

Вам, возможно, всё очевидно, мне непонятно, что нужно сделать.

Посмотрел ещё раз, в прошлом комментарии изложил не совсем точно. В исходной статье в конце приводится полный текст схемы страницы новой детали, которую нужно создать, плюс ещё создать для неё объект. А фрагменты кода в начале — просто для понимания.

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

Вопрос

Периодичность автоматической синхронизации где-то настраивается?

Ответ

Мобильное приложение поддерживает три типа синхронизации:

Ofline – для выполнения синхронизации необходимо нажать кнопку синхронизации

Ofline синхронизация в фоне – запускается, в момент когда приложение bpm’online mobile сворачивается и только в случае, если настройка «Автоматическая синхронизация» соответсвует текущему статусу интернет-соединения.

Online – синхронизация происходит при каждом действии клиента с записями в приложении

 

О фильтрах, которые применяются к отображаемым активностям:

Активность не должна быть закрытой

Активность с типом не e-mail

Пользователь мобильного приложения состоит в активностях

Также применяются фильтры интерфейса мобильного приложения:

Дата активности - в зависимости от выставленного фильтра по дате

Признак "Отображать в расписании"

Нравится

Поделиться

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

Симптомы

Тип: Terrasoft.SyncException%0D%0AСообщение: В процессе синхронизации произошла ошибка%0D%0A%0D%0AТип: Terrasoft.FileException%0D%0AСообщение: В процессе открытия файла произошла ошибка%0D%0AДополнительная информация: %0D%0A%09Имя: BPMonline700/AppStructure/rev_29/src/MobileContactAnniversaryEditPage.js%0D%0A%0D%0AТип: Terrasoft.FileSystemException%0D%0AСообщение: Объект не найден%0D%0AДополнительная информация: %0D%0A%09Код: 1%0D%0A%0D%0A

Решение

В мобильном приложении выполнить действия:

  1. Очистить кэш.
  2. Повторно выполнить синхронизацию

Нравится

Поделиться

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