Здравствуйте!

Помогите, пожалуйста, реализовать блокировку (сделать недоступным для редактирования, disable=false) поля мобильного приложения. Как альтернативу скрывать поле программно при загрузке.

Нравится

1 комментарий

Блокировать и разблокировать поле в мобильном приложении можно при помощи бизнес-правил. См. статью.

Там приводится следующий  пример:

Доступность поля, связанного с колонкой Stock, зависит от значения в колонке IsPresence.

Terrasoft.sdk.Model.addBusinessRule("ActivitySKU", {
    ruleType: Terrasoft.RuleTypes.Activation,
    events: [Terrasoft.BusinessRuleEvents.Load, Terrasoft.BusinessRuleEvents.ValueChanged],
    triggeredByColumns: ["IsPresence"],
    conditionalColumns: [
        {name: "IsPresence", value: true}
    ],
    dependentColumnNames: ["Stock"]
});

Для более сложных случаев есть ещё пользовательские.

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

 

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

Коллеги, день добрый!

 

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

 

По умолчанию используются следующие цвета:

- синий - для запланированных визитов;

- серый - для завершённых и отменённых;

- оранжевый - для просроченных.

 

Я же хочу эту цветовую схему изменить, сделав выполненные визиты зелёными, чтобы отличались от отменённых.

 

Нравится

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

В ядре, в scedule-item.js есть функция GetStatusCls, которая в зависимости от статуса выдаёт нужный CSS-стиль. Там для завершённого и отменённого и так разные стили: x-cancel и x-done. Цвет одинаковый, но у первого текст перечёркивается. Для изменения цветов можно на вкладке LESS переопределить нужные стили, как описывается тут или тут.

Александр, день добрый!

 

Этот файл только из файловой системы доступен? А то у нас облако, а в списке схем конфигурации не нахожу такого.

 

Это файл ядра, в конфигурации его нет.

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

Добрый день.Столкнулся с проблемой, что при попытке входа в мобильную версию системы через Google Chrome, при нажатии на кнопку  "Далее", открывается не привычное окно логина в мобильную версию приложения, а открывается новая вкладка, где предлагается залогиниться в  браузерной версии.

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

Изначально мобильная версия работала корректно. Но после перезагрузки ПК все поломалось.

Пробовал:

удаление папок с кэшем из папки мобильного приложения;

использование свежих архивов с мобильным приложением;

переустановка браузера;

удаление любых упоминаний хрома и мобильного бпм в реестре;

запуск мобильного приложения через батник на свежеустановленной винде 8 на виртуалке;

 

Проблема не зависит от адреса проекта, к которому идет подключение. Если  адрес недоступен, то пишет соответствующую ошибку, если верен, то адресует на браузерную версию соответствующего проекта. Тестил на локальном стенде и на удаленном. У коллеги с подключением к тем же проектам все в порядке. Включая подключение к моему локально развернутому проекту.

Нравится

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

Проблемы с текущей версией хрома 80+. Откатитесь до 79, и все будет работать 

Или использовать MS Edge на Chromium, запускать можно батником:

@echo off
SET PAGEPATH=appV2\MobileApp\MobileMainPage.html
start msedge --disable-features=IsolateOrigins,site-per-process --allow-file-access-from-files --disable-web-security --disable-popup-blocking --user-data-dir="%~dp0\\ChromeUserData" --enable-device-mode "file:///%~dp0%PAGEPATH%?platform=webkit&usecookie=true"

 

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

Создал модуль. Отобразил его в манифесте. Пробую отфильтровать деталь по значениям в колонке следующим образом - не помогает. Что может быть не так?

	
Terrasoft.sdk.Details.addFilter("Account", "UsrSchema4DetailStandardDetail", Ext.create("Terrasoft.Filter", {
	name: "UsrProductInAccountStatusFilter",
	type: Terrasoft.FilterTypes.Group,
	logicalOperation: Terrasoft.FilterLogicalOperations.Or,
	subfilters: [
		{
			property: "UsrProductStatus",
			value: "9b7bdb4f-4a49-49ea-a65d-65415a9f2ebc" // Значение статуса "ИНФОРМАЦИЯ"
		},
		{
			property: "UsrProductStatus",
			value: "24cee800-da09-4dfe-85e9-8dbe649b7b69" // Значение статуса "ЧУЖАЯ ПРОДАЖА"
		}]
	}));

 

Нравится

1 комментарий
Лучший ответ

Здравствуйте!

Попробуйте использовать следующее:
 

Terrasoft.sdk.Details.configure("Account", "UsrSchema4DetailStandardDetail", Ext.create("Terrasoft.Filter", {
	name: "UsrProductInAccountStatusFilter",
	type: Terrasoft.FilterTypes.Group,
	logicalOperation: Terrasoft.FilterLogicalOperations.Or,
	subfilters: [
		{
			property: "UsrProductStatus",
			value: "9b7bdb4f-4a49-49ea-a65d-65415a9f2ebc" // Значение статуса "ИНФОРМАЦИЯ"
		},
		{
			property: "UsrProductStatus",
			value: "24cee800-da09-4dfe-85e9-8dbe649b7b69" // Значение статуса "ЧУЖАЯ ПРОДАЖА"
		}]
	}));

У меня была подобная ситуация, так же использовать данную настройку следует в манифесте здесь - http://prntscr.com/ogms6l
Вот настройка моего мой фильтра:

Terrasoft.sdk.Details.configure("Event", "EventProductDetailV2StandardDetail", {
	filters: Ext.create("Terrasoft.Filter", {
		type: Terrasoft.FilterTypes.Group,
		subfilters: [
			Ext.create("Terrasoft.Filter", {
				compareType: Terrasoft.ComparisonTypes.NotEqual,
				property: "Product.IsArchive",
				value: true
			})
		]
	})
});

 

Здравствуйте!

Попробуйте использовать следующее:
 

Terrasoft.sdk.Details.configure("Account", "UsrSchema4DetailStandardDetail", Ext.create("Terrasoft.Filter", {
	name: "UsrProductInAccountStatusFilter",
	type: Terrasoft.FilterTypes.Group,
	logicalOperation: Terrasoft.FilterLogicalOperations.Or,
	subfilters: [
		{
			property: "UsrProductStatus",
			value: "9b7bdb4f-4a49-49ea-a65d-65415a9f2ebc" // Значение статуса "ИНФОРМАЦИЯ"
		},
		{
			property: "UsrProductStatus",
			value: "24cee800-da09-4dfe-85e9-8dbe649b7b69" // Значение статуса "ЧУЖАЯ ПРОДАЖА"
		}]
	}));

У меня была подобная ситуация, так же использовать данную настройку следует в манифесте здесь - http://prntscr.com/ogms6l
Вот настройка моего мой фильтра:

Terrasoft.sdk.Details.configure("Event", "EventProductDetailV2StandardDetail", {
	filters: Ext.create("Terrasoft.Filter", {
		type: Terrasoft.FilterTypes.Group,
		subfilters: [
			Ext.create("Terrasoft.Filter", {
				compareType: Terrasoft.ComparisonTypes.NotEqual,
				property: "Product.IsArchive",
				value: true
			})
		]
	})
});

 

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

Всем доброго времени суток!

Подскажите пожалуйста как так получается, что фильтры которые я применяю к реестру Контакта накладываются на поле Ответственный в Заказе - http://prntscr.com/of9vys?
А то что мне необходимо фильтровать в данном поле не отображает - http://prntscr.com/of9wvo
 

 

 

Нравится

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

И почему то вообще не срабатывает бизнес правило фильтрации:
http://prntscr.com/ofa2wb - правило добавилось
http://prntscr.com/ofa4mc - в списке пусто
http://prntscr.com/ofa5ds - контакты есть удовлетворяющие условиям фильтрации

фильтры которые я применяю к реестру Контакта накладываются на поле Ответственный в Заказе

Скорее всего, Вы их применяете к полю Owner в  Order, а Contact — название объекта справочника. Более подробно о наложении фильтров можно почитать в статье о бизнес-правилах мобильного приложения.

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

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

Добрый день! 

Есть вопрос по реализации пользовательских кнопок со своими методами, на странице
редактирования для мобильного приложения .

Можете пожалуйста описать подробную реализацию на примерах
В документации нет примеров реализации

Нашел старый топик, но по нему не получается вывести свои кнопки
 

Нравится

1 комментарий

См. примеры в статье и обсуждениях тут, тут и тут.

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

Коллеги, всем доброго времени суток!
Подскажите, есть ли возможность проставить признак обязательности заполнения(*), при этом не устанавливая параметр на уровне БД?

http://prntscr.com/ocz7r9
Есть ли какие то методы при помощи которых можно выполнить такую настройку?

Заранее благодарен.

Нравится

1 комментарий

В 7.Х вообще не стоит устанавливать обязательность поля на уровне базы, достаточно на уровне объекта.

Если же нужно кодом на мобильной странице, см. эту и эту темы.

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

Коллеги всем доброго времени суток! Подскажите как сгенерировать Terrasoft.Exception.

Необходимо преред добавлением записи проверять заполнение детали если пусто выкидывать Exception и сообщение, что заполните деталь

Terrasoft.sdk.Model.setModelEventHandler("Contact", 
	Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].insert,
	function(config, operation) {
		debugger;
		var record = config.scope.eventConfig.records[0];
		window.console.log(config);
		window.console.log(record);
		var addresses = record.ContactAddressDetailV2EmbeddedDetailStore.getData();
		if(addresses.all.length === 0) {
			var exceptionConfig = {
				message: "Сообщение",
			};		
			Ext.callback(config.failure,config.scope,Terrasoft.Exception(exceptionConfig);
		} else {
			Ext.callback(config.success, config.scope, [true]);
		}		
});

Как реализовать что бы работало, может кто то сталкивался?
Вылазит следующие ошибки  -http://prntscr.com/ocnz86
не читает - http://prntscr.com/ocnzgz
Заранее благодарен.

Нравится

1 комментарий

разобрался

Terrasoft.sdk.Model.setModelEventHandler("Contact", 
	Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.Before].insert,
	function(config, operation) {
		debugger;
		var record = config.scope.eventConfig.records[0];
		window.console.log(config);
		window.console.log(record);
		var addresses = record.ContactAddressDetailV2EmbeddedDetailStore.getData();
		if(addresses.all.length === 0) {
			var exception = new Terrasoft.Exception();
			exception.config.message = "Сообщение";
 
			Ext.callback(config.succes, config.scope, [false]);
		} else {
			Ext.callback(config.success, config.scope, [true]);
		}
		Ext.callback(config.success, config.scope, [true]);
});

 

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

Коллеги, как реализовать redirect на preview страницу после синхронизации приложения?
реализовал событие после обновления заказа

Terrasoft.sdk.Model.setModelEventHandler("Order", 
	Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.After].update,function(config){
		var model = "Order";
		var record = config.scope.eventConfig.records[0];
		var pageConfig = {			
			recordId: record.data.Id
		};
		Terrasoft.Configuration.WaSync(model, pageConfig, false);
	});

Terrasoft.Configuration.WaSync = function(model, pageConfig, toMainPage = true) {
	Terrasoft.MobileSettingsPageControllerSyncManager.synchronize({
		exportOnly: false ,
		checkForPredefinedDatabase: false,
		redirect: function() {
			debugger;
			if(toMainPage) {
				Terrasoft.core.redirectToMainPage();
			} else {
				Terrasoft.Application.close(() => {
					
				});
			}
		}
	});
};

нашел функцию Terrasoft.util.redirectToPage:
 

Terrasoft.util.redirectToPage = function(to, hash) {
	Terrasoft.Application.close(() => {
		to += location.search;
		if (hash) {
			to += "#" + hash;
		}
		location.href = to;
	});
};

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

Нравится

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

Опишите подробней свою бизнес задачу.

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

Для открытия страницы просмотра обычно используется такой метод:

Terrasoft.util.openPreviewPage("Contact", {
	recordId: contact.getId()
});

P.S. Метод Terrasoft.MobileSettingsPageControllerSyncManager.synchronize является @internal его нельзя использовать!

P.S.S. Класс Terrasoft.MobileSettingsPageControllerSyncManager является устаревшим, сейчас используют Terrasoft.SyncUtils

Наверное вам подойдет метод 

Terrasoft.SyncUtils.synchronizeData

 

Кривонос Максим,

здравствуйте, после сохранения изменения заказа, а именно изменения состояния заказа необходимо осуществлять синхронизацию приложения, что бы заказа сразу уходил в основную БД. После синхронизации нужно открыть этот же заказ на PreviewPage что бы было возможным осуществлять действия - http://prntscr.com/o9nbjt. Сразу скажу онлайн режим не подходит. Уже использую Terrasoft.SyncUtils.synchronizeData

Terrasoft.sdk.Model.setModelEventHandler("Order", 
	Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.After].update, 
	function(config) {
		var record = config.scope.eventConfig.records[0];
		if(record.modified.hasOwnProperty("Status")) {
			Terrasoft.util.Sync.synchronizeData({
				exportOnly: false ,
				isCancelable: true,
				checkIfSyncStarted: true,
				checkForPredefinedDatabase: false,
				ignoreNotifications: true,
				runType: Terrasoft.Sync.RunTypes.Background,
				redirect: true
			});
		}
	}
);

 

Возможно ли делать синхронизацию данных в фоновом режиме без перезагрузки приложения отправить измененный заказ в основную БД? Какие методы использовать?

 


 

Фоновая синхронизация доступна пока что только для Android. Чтоб она работала нужно включить системную настройку RunMobileSyncInService.

Запускать в фоне можно вот так:

Terrasoft.SyncUtils.synchronizeData({
    redirect: false,
    isCancelable: true,
    ignoreNotifications: true, 
    checkForPredefinedDatabase: false
});

Вам нужно дожидаться каких-то данных с сервера?

Кривонос Максим,

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

 

Смотрите какое поведение системы(делаю на эмуляторе):

подставил код который Вы написали выше - http://prntscr.com/o9ze1c

Синхронизация проходит без редиректа на основную страницу, но затем после сохранения записи не отрабатывают события, перехожу в другой раздел и затем обратно в раздел заказы и наблюдаю следующее - http://prntscr.com/o9zg5s

Как быть с таким поведением видимо что то где то перезатирается?

1) При подписке на события модели нужно в конце вызывать config.success

2) Если вы хотите что-то отображать пользователю то логику нужно реализовывать на карточке а не на объекте

3) у synchronizeData есть метод finish по идее он должен вызываться в конце

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

Всем доброго времени суток!

Подскажите, есть ли метод синхронизации мобильного приложения в фоновом режиме. Т.е. например после сохранения заказа вызывать данный метод, и что бы синхронизировалось с основной БД без перезагрузки приложения?

Нравится

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

Или же необходимо после синхронизации делать редирект на preview страницу сохраненного Заказа.

Terrasoft.Configuration.WaSync = function(model, pageConfig) {
	Terrasoft.MobileSettingsPageControllerSyncManager.synchronize({
		exportOnly:false ,
		checkForPredefinedDatabase: false,
		redirect: function() {
			//Terrasoft.util.openPreviewPage(model, pageConfig);
		}
	});
};
 
Terrasoft.sdk.Model.setModelEventHandler("Order", 
	Terrasoft.ModelEvents[Terrasoft.ModelEventKinds.After].update, 
	function(config){
		debugger;
		var model = "Order";
		var record = config.scope.eventConfig.records[0];
		var pageConfig = {
			recordId: record.data.Id
		};
		Terrasoft.Configuration.WaSync(model, pageConfig);
	});

Terrasoft.util.openPreviewPage - не срабатывает!

См. документацию по расширению синхронизации.

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

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

Написано:

Модули синхронизации являются внутренними (internal) классами и не подлежат расширению. Но часто возникает необходимость ограничить передаваемые во время синхронизации данные в соответствии с определенными правилами. Для этого была добавлена возможность управления этапами синхронизации с помощью класса управления.

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

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