Вопрос

Здравствуйте! Подскажите как можно реализовать обновление карточки мобильного приложения? Кейс следующий делаю апдейт заказа и после обновления полей в 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 я нашёл статью по добавлению кнопки на страницу редактирования существующей записи и вторую статью - по добавлению кнопки на страницу редактирования в режиме добавления новой записи. Отличаются ли описанные там шаги добавления кнопки от шагов добавления кнопки на страницу поиска ?

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

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

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

Спасибо.

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

Как создать преднастроечную страницу. Дайте, пожалуйста, ссылку на руководство по созданию преднастроечных страниц.

У меня такой же вопрос

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

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

Обучающее видео по созданию страниц доступно по ссылке

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

1. В WebApp.Loader\Web.config найти запись по ключу "useFileContent" и установить
useFileContent="true"
2. В ConnectionString.config найти запись по ключу "clientUnitContentPath" и установить путь выгрузки JScript файлов:
name="clientUnitContentPath" connectionString="C:\Projects\JS_Code"
3.Перейти в конфигурацию, выбрать из меню "Действие" пункт "Обновить клиентские модули из базы данных"
4. Внесити изменения в JScript файлы, например используя IDE для работы с такими файлами
5. Для фиксации результата выбрать из меню "Действие" пункт "Зафиксировать клиентские модули в базе данных"

У меня такой же вопрос

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Коллеги, нужен совет!

Имеем COM Visible класс на C# .Net 3.5, в котором имеется массив значений
Из-под админки Terrasoft на debbuger я могу видить структуру этого массива и значения.... а вот доступ получить не удается
Как-то так: Instant.Items(1) или так Instant.Items[1] - ошибка и все тут!

Как описать этот массив в C#, что бы достучаться до него из JScript ?

Спасибо!

У меня такой же вопрос

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

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

А так?
Что бы получить доступ, добавьте Set аксессор.

public class Test
{
    /// <summary>
    /// String array field instance.
    /// </summary>
    string[] _elements = { "one", "two", "three" };
 
    /// <summary>
    /// String array property getter.
    /// </summary>
    public string[] Elements
    {
	get { return _elements; }
    }
 
    /// <summary>
    /// String array indexer.
    /// </summary>
    public string this[int index]
    {
	get { return _elements[ index] ; }
    }
}

Дмитрий, спасибо!

Вот этого нам и не хватало:

public string this[int index]
    {
        get { return _elements[ index] ; }
    }

:smile:

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

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

function FormatFloat(Value, DecimalMark, ThousandSeparator, Prefix, Postfix, NoZero){
        DecimalMark = IsNull(DecimalMark, ',');
        ThousandSeparator = IsNull(ThousandSeparator, ' ');
        Prefix = IsNull(Prefix, '');
        Postfix = IsNull(Postfix, '');
        var Minus = (Math.abs(Value) != Value) ? ' - ' : '';
        Value = Math.abs(Value);
        var Result = '';
        var Cop = Math.round((Value - Math.floor(Value))*100);
        if (Cop.toString().length > 1 || !!NoZero) {
                Result = Result + DecimalMark + Cop.toString();
        } else {
                Result = Result + DecimalMark + '0' + Cop.toString();
        }
        var IsFirstIteration = true;
       
        while (true) {  
                var Thousand = Math.floor(Value) - Math.floor(Value / 1000) * 1000;
                if (IsFirstIteration) {
                        Result = Thousand + Result;
                        IsFirstIteration = false;
                } else {
                        Result = Thousand + ThousandSeparator + Result;        
                }
               
                Value = Math.floor(Value / 1000);
                if (Value == 0) {
                        return Prefix +Minus + Result + Postfix;
                } else {
                        if (Thousand 10) {
                                Result = '00' + Result;
                        } else
                                if (Thousand 100) {
                                        Result = '0' + Result;                         
                                }
                }
               
        }              
}

Параметры:

Value — исходное дробное число.
DecimalMark — десятичная запятая, точка или название валюты на её месте.
ThousandSeparator — пробел или запятая между единицами, тысячами, миллионами и т.д.
Prefix — название валюты перед числом.
Postfix — название валюты или разменной монеты после числа.
NoZero — если true, то 1 копейка, иначе — 01 копейка.

Примеры использования:

FormatFloat(-12345.67)//- 12 345,67
FormatFloat(1000003.62, ' руб. ', null, null, ' коп.')// 1 000 003 руб. 62 коп.

Также сходную задачу решает "коробочная" функция AmountToStr (скрипт scr_ConvertUtils), переводящая число в его написание словами. А если нужно ещё и склонять слово (1 копейка, 2 копейки,5 копеек), можно использовать соответствующий механизм.

Поделиться

0 комментариев
Войдите или зарегистрируйтесь, чтобы комментировать