Вопрос

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

Ответ

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 комментариев
Показать все комментарии

Вопрос

По какому принципу работают представления в мобильном приложении? При импорте данных в оффлайн-режиме представления сохраняются в базу как обычные таблицы. В рамках задачи необходимо фильтровать поле, у которого справочником является представление. В представлении используются записи из двух разделов (Контрагенты и кастомное Строительные объекты). Выходит, что при добавлении нового контрагента в десктоп-версии он появляется в представлении, и по нему можно фильтровать. При создании нового контрагента в оффлайн-режиме мобильного приложения в представлении он появляется, очевидно, только после синхронизации, что затрудняет работу пользователя. Насколько я понимаю, в SQL-Lite есть возможность работы с представлениями. Есть ли возможность реализовать функционал представлений? Код представления в файле. Версия приложения 7.9.2 2410. Версия мобильного приложения 7.11.7.

Ответ

 

В SQLite есть возможность создавать представление. Для это нужно выполнить скрипт создания представления в конфигурационном модуле.

Для этого нужно создать сам модуль и добавить его в манифест в блок CustomSchemas

 

Пример кода:

 

var sqls = [“CREATE VIEW IF NOT EXISTS AccountView (Id, Name) AS  SELECT Id, Name FROM Account”];
Terrasoft.Sql.DBExecutor.executeSql({
   isCancelable: false,
   sqls: sqls,
   success: function() {},
   failure: function() {}
});



 

Реализовать в карточке фильтрацию по вьюхе будет довольно сложно, придется все равно писать кастомное бизнес-правило, которое будет делать запрос к view.

 

По умолчанию с представлениями на уровне SQLite мы не работаем. В этом нет смысла, т.к. представление в MSSQL или Oracle может вообще не совпадать по реализации с представленим в SQLite. Представление в мобильном приложении – это обычная таблица, следовательно с ним нужно работать соответственно.

 

Это значит, что если нужно, чтобы значение там появилось, его следует туда добавить. Для этого можно реализовать бизнес-правила на объекты «Контрагент» и «Строительные объекты», в которых при добавлении записи или ее обновлении будет делаться копия этой записи в нужное представление.

Нравится

Поделиться

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

Вопрос

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

Пример:

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

Возможно ли увеличить количество отображаемых полей? Если не через мастер, то через код.

Ответ

В реестре может отображаться не только колонка для отображения, но можно выводить и значения, сформированные на основании значений нескольких колонок. Для такого сложного форматирования, или отображения разных значений в зависимости от условий, значения колонок можно задавать в виде функций (используя методы Terrasoft.sdk.GridPage.setPrimaryColumn() и Terrasoft.sdk.GridPage.setSecondaryColumn()):

Terrasoft.sdk.GridPage.setPrimaryColumn('Account', {
	columns: ['Name', 'PrimaryContact'],
	convertFunction: function(values) {
		if (!Ext.isEmpty(values.PrimaryContact)) {
			return values.Name + ' (' + values.PrimaryContact + ')';
		} else {
			return values.Name;
		}
	}
});

Кроме того, можно указывать дополнительные колонки и при выборе значения поля-справочника. Делается это по аналогии с гридом, но только используется класс Terrasoft.sdk.LookupGridPage:

Terrasoft.sdk.LookupGridPage.setSecondaryColumn("Account", "PrimaryContact");

А вот альтернативный вариант расширения возможностей грида - изменение шаблона элементов грида:

Terrasoft.util.writeStyles(
	".div-table {",
		"display:table;",
		"width:100%;",
	"}",
	".div-table-row {",
		"display:table-row;",
		"width:100%;",
		"clear:both;",
	"}",
	".div-table-col {",
		"float:left;",
		"display:table-column;",
		"min-width:50%;",
	"}",
	".div-table-col-button {",
		"float:right;",
		"display:table-column;",
	"}"
);
Ext.define("MyCustomList", {
	override: "Ext.Terrasoft.List",
 
	initializeItemTpl: function() {
		this.callParent(arguments);
		var store = this.getStore();
		var model = store.getModel();
		var modelName = model.getName();
		if (modelName === "Account") {
			var tpl = this.getItemTpl();
			tpl.html =
			"<div class=\"x-list-item-tpl div-table\">" +
				"<div class=\"div-table-row\">" +
					"<div class=\"div-table-col\">{[this.applyPrimaryColumn(values)]}</div>" +
					"<div class=\"div-table-col-button\">{Phone}</div>" +
				"</div>" +
				"<div class=\"div-table-row\">" +
					"<div class=\"div-table-col\">{[this.applySecondaryColumn(values)]}</div>" +
					"<div class=\"div-table-col-button\">{Web}</div>" +
				"</div>" +
			"</div>";
		}
	}
 
});

 

Нравится

Поделиться

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

Симптомы

Bpm'online mobile bug report

Type: Terrasoft.SourceCodeException

Message: TypeError: undefined is not an object (evaluating 'columnConfig.columnType')

Причина

Ошибка возникает из-за того, что Вы не верно настроили параметры встроенной деталей, например, в разделе «Объекты».

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

Рис. 1

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

Рис. 2

Решение

Для решения необходимо корректно настроить все детали.

Например, как настроить деталь «Файлы и примечания» в разделе «Лиды»:

- Для отображения в мобильном приложении необходимо выбрать деталь «Файлы и ссылки Лида»

- В поле «Колонка детали» указать «Лид»

- В поле «Колонка объекта Лид» указать «Id»

Также как примеры можно посмотреть как реализованы детали в других разделах.

Следует обратить внимание, что в результате данная деталь будет работать в основном для отображения названия файлов и работы с веб-ссылками.

Например, Вы может попробовать следующие настройки детали:

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

Рис. 3

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

Рис. 4

Нравится

Поделиться

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

Добрый час суток! Хочется узнать как можно добавить RadioButton в мобильное приложение на страницу ? 

Сам контрол я нашел https://academy.terrasoft.ua/jscoresdk/source/radiobutton.html вот тут. Как его использовать,чтобы оно работало с данными ( как отрендерить правильно ) ? К примеру у меня нужно чтобы можно было выбирать ответ с помощью radiobutton'ов,но сложность в том,что я пока не особо понимаю как это сделать. Спасибо заранее.

Нравится

4 комментария

Никита, здравствуйте!

Такой контрол существует (например, мы используем его на кастомной странице входа в демо-режим), но на данный момент его полноценная обработка в мобильном приложении не поддерживается.  Текущий механизм работы с карточками "не умеет" работать с таким интерфейсным элементом, также не реализована работа с данными

Также ссылка https://academy.terrasoft.ua/jscoresdk/source/radiobutton.html предназначена для доработка в веб-версии приложения.

Мы зафиксировали пожелание в департамент разработки.

Вильшанский Дмитрий, Да,насчет ссылки я уже понял,я как раз с Демо версии брал пример и добавлял на страницу,но к сожалению на этом и остановился.. Спасибо,буду знать.

 

подскажите пожалуйста,а checkBox я так понимаю тоже не поддерживается тогда?

Никита, 

Check-box в связке с источником данных в виде справочного поля как элемент страницы  - обработка не реализована. 

В приложении check-box используется в реестре для решения задачи мультивыбора. Пример реализации можно посмотреть в блоке быстрой фильтрации для типа колонки "Справочник". 

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

Вопрос

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

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

Есть возможность поместить кнопку именно где-то посреди страницы? Действие для пользователя будет довольно неудобным. Или это принципиально невозможно?

Коммьюнити - https://community.terrasoft.ru/questions/dobavit-knopku-na-stranicu-redaktirovania-v-mobilnom-prilozenii

Ответ

Можете посмотреть алгоритм реализации в похожем топике: https://community.terrasoft.ru/questions/dobavlenie-kastomnyh-elementov-v-mobilnom-prilozenii

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

Ext.define("...вью...", {
    config: {
       refreshButton: {
            id: 'usr_order_refresh_btn',
            cls: "x-button-primary-blue",
            text: 'Обновить'
        }
    },
    showRefreshButton: function (isShow) {
        var navigationPanel = this.getNavigationPanel(); /*компонент в котором нужно отобразить контрол*/
        var refreshButton = this.getRefreshButton();
        if (isShow) {
            this._refreshButton = navigationPanel.addButton(refreshButton);
        } else {
            navigationPanel.removeButton(refreshButton);
        }
        return this._refreshButton;
    }
});
Ext.define("...контроллер...", {
    initializeView: function (view) {
        this.callParent(arguments);
        var btn = view.showRefreshButton(true);
        btn.on("tap", this.onRefreshButtonTap, this);
    },
    onRefreshButtonTap: function() {
        /* сабж */
    }
});

Если нужно открыть пикер для выбора значения, то посмотрите MobileActivityGridPageControllerV2. Там много пример открытия пикеров. Например, для выбора «Ответственного» (метод getEmployeePicker()

) или выбора режима расписания (метод getGridModePicker()).

Нравится

Поделиться

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

Вопрос

Кейс:

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

Входе анализа выяснилось, что основной тип файлов это изображения, которые присутствуют в подписи писем (имеют название «image»).

Можно ли настроить так фильтрацию, чтобы мобильное приложение не затягивало лишние файлы?

Ответ

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

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

{
    "SyncOptions": {
        "SysSettingsImportConfig": [],
        "ModelDataImportConfig": [
            {
                "Name": "ActivityFile",
                "SyncFilter": {
                    "property": null,
                    "valueIsMacros": false,
                    "value": null,
                    "isNot": true,
                    "type": "Terrasoft.FilterTypes.Group",
                    "logicalOperation": "Terrasoft.FilterLogicalOperations.Or",
                    "subfilters": [
                        {
                            "property": "Name",
                            "funcType": "Terrasoft.FilterFunctions.SubStringOf",
                            "funcArgs": ["image"] //по какому слову не будут попадать значения
                        },
                        {
                            "property": "Activity.Owner",
                            "isNot": true,
                            "valueIsMacros": true,
                            "value": "Terrasoft.ValueMacros.CurrentUserContact"
                        }
                    ]
                }
            }
        ]
    },
    "Modules": {},
    "Models": {}
}

Если это продукт FieldForce, то также необходимо добавить этот же код в манифест "MobileApplicationManifestFieldForceWorkplace".

Нравится

Поделиться

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

Симптомы

Баг-репорт:

Type: Terrasoft.SourceCodeException

Message: TypeError: undefined is not an object (evaluating 'ruleConfig.rule')

Причина

BusinesRuleManager в карточке редактирования выполняет правила паралельно 

Решение

1.В конфигурации добавить кастомную схему с типом «Исходный код», например, с названием «UsrMobileUtilities»;

2.В схеме вставить код:

Ext.define("Terrasoft.BusinessRulesManager.Override", {
    override: "Terrasoft.BusinessRulesManager",
    /**
    * @private
    */
    doExecuteRules: function(config) {
        this.executionConfig = config;
        this.allRulesAreValid = true;
        this.executeRulesForNextRecord();
    },
    executeRules: function(config) {
        if (this.rulesToExecute > this.rulesExecuted) {
            this.waitRulesInProgressId = setInterval(function() {
                if (this.rulesToExecute === this.rulesExecuted) {
                    clearInterval(this.waitRulesInProgressId);
                    this.doExecuteRules(config);
                }
            }.bind(this), 500);
        } else {
            this.doExecuteRules(config);
        }
    }
});

3. Сохраняете изменения;

4. Данную схему подключить в манифесте мобильного приложения (например, «MobileApplicationManifestDefaultWorkplace») в секции «CustomSchemas»:

"CustomSchemas": [
    "UsrMobileUtilities"
]

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

5. Сохранить изменения.

 

Второй способ решения: заполнить справочники Города, Регионы и Страны (с заполнением связывающих полей).

Нравится

Поделиться

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

Вопрос

какие возможности представляет API камеры в мобильном приложении? (mobile 5.4)

Ответ

В BPMonlineMobile 5.4 используется версия PhoneGap 2.8

О ее возможностях работы с камерой можно почитать тут: http://cordova.apache.org/docs/en/2.8.0/cordova_camera_camera.md.html#Camera

Нравится

Поделиться

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

Симптомы

Баг-репорт:

Type: Terrasoft.SourceCodeException

Message: TypeError: null is not an object (evaluating 'lookupModel.PrimaryColumnName')

AdditionalInfo: Script: file:///var/containers/Bundle/Application/xxxxxx-xxxx-xxxxx-xxxxx-xxxxxxxx/BPMonlineMobile.app/www/appV2/Common/Terrasoft.Mobile.Combined.js%0D%0A%09Line: 12183 Stack trace:

Terrasoft.core#showUncaughtException@file:///var/containers/Bundle/Application/xxxxxx-xxxx-xxxxx-xxxxx-xxxxxxxx/BPMonlineMobile.app/www/appV2/Common/Terrasoft.Mobile.Combined.js:2821:38

Terrasoft.core#onWindowError@file:///var/containers/Bundle/Application/xxxxxx-xxxx-xxxxx-xxxxx-xxxxxxxx/BPMonlineMobile.app/www/appV2/Common/Terrasoft.Mobile.Combined.js:2463:39

Причина

1. В мастере мобильного приложения не отображена первичная колонка для отображения.

2. В объекте (например, "Account") нет колонки первичной для отображения. 

Решение

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

Нравится

Поделиться

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