Вопрос

Как поменять Caption детали для конкретной страницы редактирования?

То есть, чтобы одна и та же деталь в контактах называлась например "Деталь1", а в контрагентах "Деталь2".

Ответ

Необходимо в схеме детали в секции diff добавить следующий код:

diff: /**SCHEMA_DIFF*/[
{
   "operation": "merge",
   "name": "Detail",
   "values": {
      "caption": {"bindTo": "getDetailCaption"}
   }
}
]/**SCHEMA_DIFF*/

А в методе анализировать имя карточки, в которую загружена деталь, и менять caption на необходимый. Например так:

getDetailCaption: function() {
   var cardPageName = this.get("CardPageName");
   if (cardPageName === "ActivityPageV2") {
      return "Name 1";
   }
   return "Name 2";
}

Можно использовать локализируемые строки.

В типовых конфигурациях, аналогичный пример есть в схеме OpportunityContactDetailV2.

/**
 * Устанавливает заголовок детали в зависимости от открытой страницы.
 * @protected
 * @return {String}
 */
getDetailCaption: function() {
   var cardPageName = this.get("CardPageName");
   if (cardPageName === "OpportunityPageV2") {
      return this.get("Resources.Strings.InOpportunityCaption");
   }
   return this.get("Resources.Strings.InContactCaption");
},

Конкретный пример (реализована логика в ContactCommunicationDetail и AccountCommunicationDetail):

define("AccountCommunicationDetail", ["AccountCommunicationDetailResources", "terrasoft"],
    function(resources, Terrasoft) {
        return {
            entitySchemaName: "AccountCommunication",
            methods: {
                init: function() {
                    this.callParent(arguments);
                },
                getDetailCaption: function() {
                    var cardPageName = this.get("CardPageName");
                    if (cardPageName === "AccountPageV2") {
                        return "Средства связи";
                    }
                    return "Средства связи контрагента";
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "Detail",
                    "values": {
                        "caption": {"bindTo": "getDetailCaption"}
                    }
                }
            ]
        };
});
define("ContactCommunicationDetail", ["ContactCommunicationDetailResources", "terrasoft"],
    function(resources, Terrasoft) {
        return {
            methods: {
                init: function() {
                    this.callParent(arguments);
                },
                getDetailCaption: function() {
                    var cardPageName = this.get("CardPageName");
                    if (cardPageName === "ContactPageV2") {
                        return "Средства связи";
                    }
                    return "Средства связи контакта";
                }
            },
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "Detail",
                    "values": {
                        "caption": {"bindTo": "getDetailCaption"}
                    }
                }
            ]
        };
});

Необходимо почистить кеш браузера.

Нравится

Поделиться

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

Вопрос

Как отключить фоновую синхронизацию, которая запускается при сворачивании приложения?

Ответ

Создать схему с типом "Модуль" (например, "MobileUtilitiesCustom")

и написать в ней следующий код:

/* Отключение фоновой синхронизации при сворачивании приложения */
Terrasoft.Sync.BackgroundSyncManager.setMode(Terrasoft.BackgroundSyncModes.Never);

В манифесте мобильного приложения (например, "MobileApplicationManifestDefaultWorkplace") указать эту кастомную схему:

{
    ...
   "CustomSchemas": [
      ...
      "MobileUtilitiesCustom"
   ]
   ...
}

Смотрите также

В мобильном приложении также есть фоновая синхронизация по расписанию, она отключается с установкой системной настройки MobileDataSyncFrequency в 0

Эти два варианта запуска синхронизации работают только при включенной системной настройке RunMobileSyncInService

Нравится

Поделиться

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

Вопрос

Когда мы пытаемся синхронизировать данные, этого похоже не происходит. Мы не можем пользоваться телефонами во время синхронизации, но даже после того как мы оставляем их на 3-4 часа, ничего похоже не происходит. Нет сообщения об ошибке или чего-то такого. Возможно это связано с количеством данных, которые мы хотим передать. Есть ли способ выбрать определенные данные для каждого пользователя? Если мы сможем фильтровать данные для импорта, это ускорит синхронизацию.

Ответ

Период синхронизации зависит от объема данных в системе.

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

Для этого:

1) Откройте настройку системы «Режим работы мобильного приложения»

2) Установите значение «Online»

Этот вариант обычно рекомендуется, если у вас есть постоянный доступ к Интернету.

Нравится

Поделиться

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

Вопрос

Как установить сортировку (порядок отображения) нескольких страниц редактирования в выпадающем списке раздела

Ответ

define("AccountSectionV2", [], function() {
    return {
        entitySchemaName: "Account",
        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
        methods: {
            initEditPages: function() {
                this.callParent(arguments);
                var editPages = this.get("EditPages");
                editPages.sortByFn(this.editPagesSortFunction);
            },
            editPagesSortFunction: function(elA, elB) {
                var valueA = elA.values.SchemaName;
                var valueB = elB.values.SchemaName;
                var sortRule = function(schemaName) {
                    //the direction will be 1-2-3...
                    if (schemaName === "UsrAccount1Page") {//Partner (in my case)
                        return 3;
                    }
                    if (schemaName === "UsrAccount2Page") {//Our company
                        return 1;
                    }
                    if (schemaName === "UsrAccount3Page") {//Customer
                        return 2;
                    }
                    return 0;
                };
                return sortRule(valueA) > sortRule(valueB);
            }
        },
        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
    };
});

 

Нравится

Поделиться

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

Вопрос

Как убрать или отредактировать заставку при отображении страницы пустого реестра:

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

Ответ

Для решения задачи необходимо изменять базовую логику приложения. Данный функционал реализован в схеме «BaseSectionV2» (пакет «NUI») (рис. 1).

Вам необходимо в схеме раздела (например, «ContactSectionV2») переопределить метод «getDefaultEmptyGridMessageProperties».

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

Рис. 1

Нравится

Поделиться

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

Вопрос

Как правильно написать бизнес правило, чтобы оно корректно работало при добавлении и изменении записей в редактируемом реестре. При формировании конфигурации колонок реестра используются колонки связанных объектов.

Подробнее: http://www.community.terrasoft.ru/forum/topic/13684

Ответ

Рекомендуется в случае связанных объектов использовать свойства attribute и attributePath в бизнес-правилах:

"attribute": "Order",
"attributePath":"SxPaymentFormula.SxPaymentDelay"

В случае редактируемого реестра данный вариант не всегда помогает, так как часть логики выполняется в карточке, а часть - в реестре. В этом случае самым простым вариантом решения будет устанавливать значение атрибута в методе initEntity карточки детали. Примерно так:

initEntity: function(callback, scope) {
        this.callParent([function() {
                if (!this.get("Order.SxPaymentFormula.SxPaymentDelay")) {
                        this.set("Order.SxPaymentFormula.SxPaymentDelay",
                                this.get("Order") && this.get("Order")["SxPaymentFormula.SxPaymentDelay"]);
                }
                callback.call(scope || this);
        }this]);
}

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

"attribute": "Order.SxPaymentFormula.SxPaymentDelay"

 

Нравится

Поделиться

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

Вопрос

Как передать информацию из модального окна?

Ответ

1) Создайте страницу модального окна - «Схема модели представления карточки», без указания родительской схемы:

define("UsrMyModalPage", ["ModalBox"], function(ModalBox) {
	return {
		attributes: {
			"TestText": {
				dataValueType: Terrasoft.DataValueType.TEXT,
				type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN
			}
		},
		messages: {
			"DataFromModal": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.PUBLISH
			}
		},
		methods: {
			init: function(callback, scope) {
				this.callParent(arguments);
			},
			onRender: function() {
			},
			onCloseButtonClick: function() {
				this.sandbox.publish("DataFromModal", { test: this.get("TestText") }, [this.sandbox.id]);
				ModalBox.close();
			}
		},
		diff: [
			{
				"operation": "insert",
				"name": "MyContainer",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.CONTAINER,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyContainer",
				"propertyName": "items",
				"name": "MyGridContainer",
				"values": {
					"itemType": Terrasoft.ViewItemType.GRID_LAYOUT,
					"items": []
				}
			},
			{
				"operation": "insert",
				"parentName": "MyGridContainer",
				"propertyName": "items",
				"name": "TestText",
				"values": {
					"bindTo": "TestText",
					"caption": "Test text",
					"layout": {"column": 0, "row": 0, "colSpan": 10}
				}
			},
			{
				"operation": "insert",
				"parentName": "MyGridContainer",
				"name": "CloseButton",
				"propertyName": "items",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"style": Terrasoft.controls.ButtonEnums.style.BLUE,
					"click": {bindTo: "onCloseButtonClick"},
					"markerValue": "CloseButton",
					"caption": "OK",
					"layout": { "column": 0, "row": 1, "colSpan": 3 }
				}
			}
		]
	};
});

2) Создайте модуль модального окна - «Модуль», с одной единственной зависимостью на вышесозданную страницу.

define("UsrMyModalModule", ["ModalBox", "BaseSchemaModuleV2"],
		function(ModalBox) {
	Ext.define("Terrasoft.configuration.UsrMyModalModule", {
		extend: "Terrasoft.BaseSchemaModule",
		alternateClassName: "Terrasoft.UsrMyModalModule",
		/**
		 * @inheritDoc Terrasoft.BaseSchemaModule#generateViewContainerId
		 * @overridden
		 */
		generateViewContainerId: false,
		/**
		 * @inheritDoc Terrasoft.BaseSchemaModule#initSchemaName
		 * @overridden
		 */
		initSchemaName: function() {
			this.schemaName = "UsrMyModalPage";
		},
		/**
		 * @inheritDoc Terrasoft.BaseSchemaModule#initHistoryState
		 * @overridden
		 */
		initHistoryState: Terrasoft.emptyFn,
	});
	return Terrasoft.UsrMyModalModule;
});

3) Создайте замещающую страницу редактирования для добавления созданного модального окна:

define("ContactPageV2", ["ContactPageV2Resources", "GeneralDetails", "ModalBox"],
function(resources, GeneralDetails, ModalBox) {
	return {
		entitySchemaName: "Contact",
		messages: {
			"DataFromModal": {
				mode: Terrasoft.MessageMode.PTP,
				direction: Terrasoft.MessageDirectionType.SUBSCRIBE
			}
		},
		details: /**SCHEMA_DETAILS*/{
		}/**SCHEMA_DETAILS*/,
		methods: {
			subscribeSandboxEvents: function() {
				this.callParent(arguments);
				this.sandbox.subscribe("DataFromModal", function(arg) {
					console.log("msg from modal: " + arg.test);
				}, this, [this.sandbox.id + "_" + "UsrMyModalModule"]);
			},
			loadMyModal: function() {
				var sandbox = this.sandbox;
				var config = {
					heightPixels: 420,
					widthPixels: 750
				};
				var moduleName = "UsrMyModalModule";
				var moduleId = sandbox.id + "_" + moduleName;
				var renderTo = ModalBox.show(config, function() {
					sandbox.unloadModule(moduleId, renderTo);
				});
				sandbox.loadModule(moduleName, {
					id: moduleId,
					renderTo: renderTo
				});
			},
			onMyClick: function() {
				this.loadMyModal();
			},
			onEntityInitialized: function() {
				this.callParent(arguments);
			}
		},
		diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "CombinedModeActionButtonsCardContainer",
				"propertyName": "items",
				"name": "MainContactButton",
				"values": {
					"itemType": Terrasoft.ViewItemType.BUTTON,
					"caption": "пыщь-пыщь",
					"click": {"bindTo": "onMyClick"}
				}
			}
		]/**SCHEMA_DIFF*/
	};
});

 

Нравится

Поделиться

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

Очень полезная публикация, спасибо.

Хочу обратить внимание на строку "Создайте страницу модального окна - «Схема модели представления карточки», без указания родительской схемы:". У меня в 14-ой версии без указания родительской схемы схема от модуля не подгружалась. Указал зависимость от BaseEntityPage - всё заработало.

Спасибо за уточнение. Судя по упоминаниям BaseEntityPage в обзорах обновлений 7.8.1 и 7.8.2, это изменение могло произойти уже довольно давно.

Товарищи, это не работает :( Есть актуальный пример?

Надежда, ещё пример есть в комментариях к этой теме. А что именно у Вас не работает в этом?

Добрый день! Возможно создать кастомное модальное окно на портале?

Денис Суров,

 

Добрый день.

Для портальных страниц можно использовать эту же инструкцию - делаете замещение необходимой вам портальной страницы (например PortalCasePage) и добавляете код из п.3 данной публикации.

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

Задача

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

Решение

Для отключения фильтра необходимо создать замещающий обьект MobileApplicationManifestDefaultWorkplace (создается автоматически, если поменять колонки в мастере мобильного приложения) и заполнить следующим кодом:

{
    "SyncOptions": {
        "SysSettingsImportConfig": [],
        "ModelDataImportConfig": [
            {
                "Name": "Opportunity",
                "SyncFilter": null
            }
        ]    
    },
    "Modules": {},
    "Models": {}
}

После этого сохранить манифест, очистить кэш в мобильном приложении.

Необходимые условия

Права администратора, bpm'online 7.6+

Нравится

Поделиться

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

Вопрос

Как синхронизировать bpm'online 7.5 с версией мобильного приложения? У меня такая  ошибка :

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

Ответ

Чтобы синхронизировать продажи bpm'online с мобильной версией, вам необходимо загрузить приложение из googlePlay или AppStore. В поле адрес сервера bpm'online вам нужно ввести имя веб-сайта вашей системы bpm'online. Например. если адрес моей системы bpm'online равен sales-omni-demo.bpmonline.com, тогда мне нужно указать точно такой же адрес в этой строке, также предоставляя мой логин и пароль.

Насколько я вижу на скриншоте, вы указали неверный адрес сервера bpm'online. Он должен всегда включать bpm'online.com. Поэтому попробуйте указать правильный адрес сервера, и вы сможете получить доступ к мобильному приложению.

Кстати, вы можете настроить Mobile App в версии bpm'online 7.5, вы можете настроить списки и страницы разделов так, как вы хотите, чтобы они отображались на мобильном устройстве. Перейдите в раздел «Конструктор системы», прокрутите страницу вниз и откройте мастер мобильных приложений, чтобы выполнить необходимые настройки.

Нравится

Поделиться

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

Вопрос

Как реализовать подсказку (tips) на детали "Связи"

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

Ответ

Для детали связей подсказки формируются основе метода onGetPageTips(), который вызывается в схеме BasePageV2:

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

Для добавления пользовательских подсказок в разделе «Активности» необходимо:

  1. заместить АctivityPageV2
  2. добавить локализированную строку
  3. переопределить метод onGetPageTips()

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

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

В базовой конфигурации Вы можете посмотреть пример кода в схеме ContactPageV2 (UIv2):

{
    "operation": "insert",
    "parentName": "Header",
    "propertyName": "items",
    "name": "Owner",
    "values": {
        "layout": {"column": 11, "row": 2, "colSpan": 13},
        "tip": {
            "content": {"bindTo": "Resources.Strings.OwnerTip"}
        }
    }
},

 

Нравится

Поделиться

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