Всем доброго времени суток! Столкнулся с такой проблемой. При добавлении БП в раздел "съезжает" ранее добавленная кнопка - https://prnt.sc/tn9xut.

Как с этим бороться?

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

Нравится

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

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

Вадим Косарев,

	diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"parentName": "ActionButtonsContainer",
				"propertyName": "items",
				"name": "SimpleInfoButton",
				"values": {
					"layout": { "column": 1, "row": 6, "colSpan": 1},
					"itemType": Terrasoft.ViewItemType.INFORMATION_BUTTON,
					"content": { "bindTo": "Resources.Strings.InfoButtonCaption" }
				}
			}
		]/**SCHEMA_DIFF*/,

 

Алексей, процессы открывает кнопка ProcessRunButton. Она реализована в BaseDataView (базовой схеме раздела) кодом:

{
	"operation": "insert",
	"name": "ProcessRunButton",
	"parentName": "SeparateModeActionButtonsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.BUTTON,
		"caption": {"bindTo": "Resources.Strings.RunProsessButtonCaption"},
		"imageConfig": {"bindTo": "Resources.Images.ProcessButtonImage"},
		"iconAlign": Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		"classes": {
			"imageClass": ["t-btn-image left-12px t-btn-image-left proc-btn-img-top"],
			"textClass": ["t-btn-text t-btn-left actions-button-margin-right"]
		},
		"menu": {"items": {"bindTo": "getFilteredBySectionProcesses"}},
		"visible": {"bindTo": "getIsRunProcessButtonVisible"}
	}
},

В отличие от Вашего элемента, она входит в SeparateModeActionButtonsContainer, а уже тот —в ActionButtonsContainer:

{
	"operation": "insert",
	"name": "SeparateModeActionButtonsContainer",
	"parentName": "ActionButtonsContainer",
	"propertyName": "items",
	"values": {
		"itemType": Terrasoft.ViewItemType.CONTAINER,
		"visible": {
			"bindTo": "IsCardVisible",
			"bindConfig": {
				"converter": function(value) {
					return !value;
				}
			}
		},
		"wrapClass": ["separate-action-buttons-container-wrapClass"],
		"items": []
	}
},

Возможно, Ваша кнопка с учётом иерархии контейнеров не там, где должна была находиться? Или дело в «"layout": { "column": 1, "row": 6, "colSpan": 1}», ведь нумерация идёт с нуля и 1 — это уже второй, с учётом видимой кнопки процессов?

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

Коллеги, всем доброго времени суток!

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

http://prntscr.com/ocz7r9

Есть ли какие то методы при помощи которых можно выполнить такую настройку?

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

Нравится

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

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

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

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

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

Столкнулся с такой проблемой. Есть орг. роли в которых есть поле Область/Штат, заполнено неким значением, в эту роль входит пользователь Иванов. При работе с моб. приложения под этим пользователем необходимо отображать только те контакты у которых на детали есть адрес с полем Область/Штат соответсвующий полю Область/Штат орг. роли.

Реализовал функцию которая считывает роли данного пользователя и заносит в глобальную переменную.

Далее добавил фильтр в реестре:

Terrasoft.sdk.Module.addFilter("Contact", Ext.create("Terrasoft.Filter", {
	type: Terrasoft.FilterTypes.Group,
	logicalOperation: Terrasoft.FilterLogicalOperations.Or,
	subfilters: Terrasoft.WaContactFiltersByRegionInCurrentUserRole()
}));
 
 
Terrasoft.WaContactFiltersByRegionInCurrentUserRole = function () {
	var subfilters = [];
	for (var i = 0; i < Terrasoft.WaRoleRegions.length; i++) {
		subfilters.push({property:"[ContactAddress:Contact:Id].Region", value:Terrasoft.WaRoleRegions[i]});
	}
	return subfilters;
};



В оффлайн режиме фильтрует, в онлайн нет, иногда выдает ошибки.

Так вот собственно вопрос, с чем это может быть связанно и как с этим бороться?

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

Нравится

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

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

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

 Здравствуйте! Согласен, изначально так и было, но в стандартном реестре записи не отображаются пользователи видят следующее -

http://prntscr.com/o6ypsp. Пользователям не нравится такой вид, поэтому задавал фильтр по ответсвенному - фильтровало, но потом как оказалось не подходит по бизнес логике фильтрации, пришлось придумать такой костыль, вот и выплыло следующее в оффе фильрует в онлайн нет - http://prntscr.com/o6yr3i

Как с таким бороться?

Вообще, это стандартное поведение с 14 версии, отображает сначала пустой список, а потом — последние посещённые 10 записей:

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

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

это понятно. Однако помимо реестра нужно ещё накладывать фильтр в справочных полях Контакт что бы фильтровало какие описано выше))

Разобрался чего не фильтровало, я в фильтр передавал объект - https://prnt.sc/o7a23e

перестроил фильтрацию по Id и все заработало как в оффлайн так и в онлайн режиме

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

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

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

Создал функцию:

 

(function () {
	var SysUserInRole = "SysUserInRole";
	var columns = ["Id", "SysRole.Region"];
	var store = Ext.create("Terrasoft.store.BaseStore",{
		model: SysUserInRole
	});
	var queryConfig = Ext.create("Terrasoft.QueryConfig", {
		modelName: SysUserInRole,
		columns: columns
	});
	var filters = Ext.create("Terrasoft.Filter", {
		property: "SysUser.Id",
		value: Terrasoft.CurrentUserInfo.userId
	});
	store.load({
		queryConfig: queryConfig,
		filters: filters,
		callback: function(records, operation, success) {
			try {
				debugger;
				if(success && records) {
					Terrasoft.WaUserInRoles = records;
				} else {
					window.console.info(operation);
					window.console.info(success);
					window.console.info(records);
				}
			} catch(ex) {
				Terrasoft.Mask.hide({force: true});
				Terrasoft.Logger.error(ex, Terrasoft.LogDestination.Console);
				window.console.error(ex);
				return;
			}
		},
		scope: this
	});
}());

Добавил ее в манифест в блок:

 

{
	"ApplicationRequiredModels": [
		"SysAdminUnit",
		"SysUserInRole"
	],
	"CustomSchemas": [
		....
		"WaMobileGetCurrentUserRoles"
	],
}

При выполнении не может определить lockupModel:

 

var lookupModel = Ext.ClassManager.get(columnConfig.modelName);

http://prntscr.com/o3ctl3

 

В чем может быть проблема? Заранее благодарен.

Нравится

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

не актуально, разобрался. Нужно было добавить Region в блок манифеста ApplicationRequiredModels

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

Здравствуйте! Подскажите как можно реализовать обновление карточки мобильного приложения? Кейс следующий делаю апдейт заказа и после обновления полей в success обновлять страницу.

Код примерно следующий:

 

setDiscount: function(config){
		var orderProductRecord = Ext.clone(config.model);
		if(config.discountType==="legal"){
			var discountByContract = config.contract.data.Discount;
			var totalAmount = config.model.data.TotalAmount;
			var discountPrice = this.calculateAmountWithDiscount(totalAmount, discountByContract);
			var totalDiscount = totalAmount-discountPrice;
			orderProductRecord.set("WaDiscountAccount", discountByContract, true);
			orderProductRecord.set("WaTotalDiscount", totalDiscount, true);
			orderProductRecord.save({
				success: function(){
					window.console.log("Update was success");
					Terrasoft.Router.back();
				},
				failure: function(exception) {
					Terrasoft.MessageBox.showMessage(Ext.String.format(Terrasoft.LS.WaErrorExecutionMessage, exception));
				},
				queryConfig: Ext.create('Terrasoft.QueryConfig', {
					modelName: orderProductRecord.self.modelName,
					columns: ["WaDiscountAccount", "WaTotalDiscount"]
				})
			}, this);
		} else if (config.discountType ==="personal") {
			//orderProductRecord.set("WaDiscountContact", config.DiscountContact, true);
		}
	},

 

Нравится

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

См. тут. Возможно, подойдут функции:

markPreviousPagesAsDirty(operationConfig)

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

refreshPreviousPages(operationConfig, currentPageHistoryItem)

Метод выполняет для всех предыдущих страниц повторную загрузку данных или актуализирует данные на основании operationConfig. Если установлено значение для параметра currentPageHistoryItem, метод выполняет те же действия для предшествующих страниц.

refreshAllPages(operationConfig, excludedPageHistoryItems)

Метод выполняет для всех страниц повторную загрузку данных или актуализирует данные на основании operationConfig. Если установлен параметр excludedPageHistoryItems, метод исключает из актуализации указанные страницы.

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

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



Проблема заключается в следующем:

Расположено две одинаковые детали на одной странице редактирования на разных табах. 

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



 

attributes: {
	"isEngineeringDivision": {
		"dataValueType": Terrasoft.DataValueType.BOOLEAN,
		"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"value": true
	},
	"isNotEngineeringDivision": {
		"dataValueType": Terrasoft.DataValueType.BOOLEAN,
		"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
		"value": true
	}
}
methods: {
	init: function() {
		this.callParent(arguments);
		this.checkEnabledButton();
	},
 
	checkEnabledButton: function() {
		this.sandbox.publish("checkUserInAuPublish", null, ["checkUserInAuPublish"]);
		this.sandbox.subscribe("checkUserInAU", function(result) {
			this.set("isEngineeringDivision", result);
			this.set("isNotEngineeringDivision", result === true ? false : true);
		}, this, ["checkUserInAU"]);
	}
},

 

Нравится

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

Попробуйте по-другому объявить эти детали в блоке details.

Вот аналогичный пример:

            "SamplesDetail": {

                "schemaName": "SampleInKitDetailV2",

                "entitySchemaName": "BTSample",

                "filter": {

                    "detailColumn": "BTKitIDLookup",

                    "masterColumn": "Id"

                },

                "defaultValues": {

                    "BTKitIDLookup": {

                        "masterColumn": "Id"

                    },

                    "BTFromSupply": false

                },

                "filterMethod": "samplesFilter",

               "profileKey": "PatientParametersDetail1"

            },

 

Метод фильтрации в данном случае выглядит так:

            samplesFilterMethod: function(kitId, isSupply) {

                var filterGroup = new Terrasoft.createFilterGroup();

                filterGroup.add("KitId", Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "BTKitIDLookup", kitId));

                filterGroup.add("SamplesIsSupply", Terrasoft.createColumnFilterWithParameter(

                    Terrasoft.ComparisonType.EQUAL, "BTFromSupply", isSupply));

                return filterGroup;

            },

Обратите внимание, что в ситуации, если на разные табы добавляется одна и та же деталь, нужно добавить свойство "profileKey" и оно должно отличаться у одинаковых деталей.

Однако в такой ситуации служба поддержки рекомендует создавать разные детали.

К сожалению это не помогло

В данный момент детали зависят от разных схем, которые наследуются от одной общей ActivityDetailV2

Добавлены как две разные

Результат один и тот же

 

Попробуйте отладиться.

Уточните, возникают ли какие-то ошибки в консоли?

Также сделайте скриншот, чтобы было понятно, что отображается в первом табе и не отображается во втором.

Алла Савельева,

Нет, все проходит без ошибок, единственное, что результат выполнения не записывается в атрибут, либо же не срабатывает visible и enabled при повторной инициализации детали 

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

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

Подскажите кто нибудь сталкивался с такой реализацией, в модальном окне есть справочное поле с типом Terrasoft.ContentType.LOOKUP?

Если задаю данный тип то не работает, при нажатии на лупу открывается модуль справочника но в нем пусто: http://prntscr.com/m0klnc http://prntscr.com/m0kmde

если делать через Terrasoft.ContentType.ENUM то все работает.

 

{
					"operation": "insert",
					"name": "Contact",
					"parentName": "WaChangeResponsibleModulePageSelectionEditContainer",
					"propertyName": "items",
					"values": {
						"layout": {
							"colSpan": 23,
							"rowSpan": 1,
							"column": 0,
							"row": 0,
							"layoutName": "WaChangeResponsibleModulePageSelectionEditContainer"
						},
						"bindTo": "Contact",
						"contentType": Terrasoft.ContentType.ENUM,
						"labelConfig": {"visible": false},
						"hasClearIcon": false,
						"enableRightIcon": true,
						"controlConfig": {
							"placeholder": "$Resources.Strings.WaContactPlaceholderText",
							"classes": ["placeholderOpacity"],
						},
						"minSearchCharsCount": 1,
						"searchDelay": 50
					}
				},

 

Нравится

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

Все всплывающие окна реализованы через ModalBox и, грубо говоря, нельзя ими спамить. Активно всегда только 1 окно. Именно поэтому в миникарточках одни ENUM-ы)

Все всплывающие окна реализованы через ModalBox и, грубо говоря, нельзя ими спамить. Активно всегда только 1 окно. Именно поэтому в миникарточках одни ENUM-ы)

Варфоломеев Данила,

понял, благодарю

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

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

Нужна помощь.

Есть код обработчик:

 

diff:[
			{
				"operation": "insert",
				"name": "AltNoInformationInterestd2e10eaa-14f7-4005-96b9-78145978b4f2",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 0,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltNoInformationInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 0
			},
			{
				"operation": "insert",
				"name": "AltAbsentInterestb586a604-e240-48b6-ba46-2889721a98cf",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 1,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltAbsentInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 1
			},
			{
				"operation": "insert",
				"name": "AltHaveInterest8b3652ac-d60d-4562-a1a5-e28a28cbce58",
				"values": {
					"layout": {
						"colSpan": 24,
						"rowSpan": 1,
						"column": 0,
						"row": 2,
						"layoutName": "GeneralInfoTabGridLayout8576b06a"
					},
					"labelConfig": {},
					"enabled": true,
					"bindTo": "AltHaveInterest",
					"controlConfig": {
						"checkedchanged": {
							"bindTo": "onInterestCheked"
						}
					}
				},
				"parentName": "GeneralInfoTabGridLayout8576b06a",
				"propertyName": "items",
				"index": 2
			},
],
methods: {
onInterestCheked : function() {
				debugger;
				//var event = window.event;
				if(event) {
					if(event.currentTarget.toString() != "[object XMLHttpRequest]")
					{
						if(this.get("AltNoInformationInterest")  == false 
							&& event.currentTarget.id.indexOf("AltNoInformationInterest") >= 0)
						{
							this.set("AltNoInformationInterest", true);
							this.set("AltAbsentInterest", false);
							this.set("AltHaveInterest", false);
						}
 
						if(this.get("AltAbsentInterest") == false && event.currentTarget.id.indexOf("AltAbsentInterest") >= 0)
						{
							this.set("AltAbsentInterest", true);
							this.set("AltNoInformationInterest", false);
							this.set("AltHaveInterest", false);
						}
 
						if(this.get("AltHaveInterest") == false  && event.currentTarget.id.indexOf("AltHaveInterest") >= 0)
						{
							this.set("AltHaveInterest", true);
							this.set("AltAbsentInterest", false);
							this.set("AltNoInformationInterest", false);
						}
					}
				} 
				else {
					console.log("");
				}
			},
}

В хроме работает отлично, но в FireFox ругается на event. т.к. не определено и не отображало часть контента карточки.

определил event:

var event = window.event;

ошибку перестало бить но метод перестал корректно работать:

Chrome: http://prntscr.com/lkanf6

Firefox: http://prntscr.com/lkaoau

Кто нибудь сталкивался с подобным? И как с этим бороться?

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

Нравится

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

Можно попробовать для каждого типа браузеров определить логику, получив браузер



var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);

var isSafari = /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);

 

Проще проверять на null значение event и если да — применять то или иное обходное решение.

WebKit follows IE's old behavior of using a global symbol for "event", but Firefox doesn't. When you're using jQuery, that library normalizes the behavior and ensures that your event handlers are passed the event parameter.

Вопрос с этой особенностью Firefox рассматривается во многих местах, см. ссылки: 1, 2, 3, 4, 5.

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

Коллеги всем доброго времени суток.

Кто нибудь сталкивался с аутентификацией и отправкой внешних запросов на JS?

Как это лучше всего реализовать?

Заранее благодарю!

Нравится

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

Нигрескул Алексей,

Александр прав. Можно написать конфиги, прокинуть сервис без авторизации. И если сайт не в облаке, тогда всё просто, если в облаке - каждое обновление конфиги перетирает. 

Либо типовая авторизация (тот же XMLHttpRequest.1 запрос на получение куки+csrf-токена, последующие запросы - к сервисам, но уже с заголовками)

Не совсем понятно что должно авторизовываться и откуда. С js-кода BPM обратиться на какой-то сервер? (тогда XMLHttpRequest с кучей коллбеков, при условии, что CORS не выскочит)

Или наоборот с условного сайта авторизоваться в BPM? 

Варфоломеев Данила,

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

На почту приходит письмо в нем есть условная ссылка которая редиректит на реализованное api из которого уже идет аутентификация с bpm и в bpm кидаются нужные запросы с данными. Как то так. 

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

Нигрескул Алексей,

Александр прав. Можно написать конфиги, прокинуть сервис без авторизации. И если сайт не в облаке, тогда всё просто, если в облаке - каждое обновление конфиги перетирает. 

Либо типовая авторизация (тот же XMLHttpRequest.1 запрос на получение куки+csrf-токена, последующие запросы - к сервисам, но уже с заголовками)

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

Как в BPMonline 7.6 добавить на страницу, определённую как модуль Java Script, созданный в конфигурации как 'Добавить/Расширенные/Схема модели представления карточки' одно поле и одну кнопку ? Эта страница предназначена для последующего использования в элементе 'Преднастроенная страница' в составе бизнес-процесса. Помогите, пожалуйста.

Нравится

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

Используйте автогенерируемую страницу - так будет проще.

Нет, по заданию - мне надо сделать преднастраиваемую страницу. Мне нужно определить (в Java Script) страницу поиска клиента для консультации (поисковая страница) и добавить на неё поле и кнопку. А затем, подключить её к элементу "Преднастроенная страница", находящемуся в бизнес-процессе.
И второе - в SDK я нашёл статью по добавлению кнопки на страницу редактирования существующей записи и вторую статью - по добавлению кнопки на страницу редактирования в режиме добавления новой записи. Отличаются ли описанные там шаги добавления кнопки от шагов добавления кнопки на страницу поиска ?

Евгений, данную задачу все еще можно реализовать автогенерируемой страницей!

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

Страницу поиска Вы будете создавать с нуля. Методы добавления кнопки будут те же.

Спасибо.

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