Сделал редактируемый реест с позицией.
Добавил кнопки вверх и вниз

init: function() {
                                this.callParent(arguments);
                        },
...

onActiveRowAction: function(buttonTag) {
                                var activeRow = this.getActiveRow();
                                var position;
                                switch (buttonTag) {
                                        case "Up":
                                                position = activeRow.get("Position");
                                                if (position > 0) {
                                                        position--;
                                                        this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
                                                }
                                                break;
                                        case "Down":
                                                position = activeRow.get("Position");
                                                position++;
                                                this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
                                                break;
                                        default:
                                                break;
                                }
                        },

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

Нравится

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

в методе onActiveRowAction скорее всего забыли:

this.callParent(arguments);

т.е. Ваша логика затерла "родительскую", а подразумевалось ее дополнение.

Игорь то что у меня вначале стоит.

init: function() {
				this.callParent(arguments);
			},

не работает?

это для метода init
я же вам говорю про метод onActiveRowAction
у каждого метода своя само собой цепочка.

вставьте

this.callParent(arguments);

в начале или в конце вашего описания метода onActiveRowAction

Может я не правильно описал сами кнопки

diff: /**SCHEMA_DIFF*/[
			{
				"operation": "merge",
				"name": "DataGrid",
				"values": {
					"className": "Terrasoft.ConfigurationGrid",
					"generator": "ConfigurationGridGenerator.generatePartial",
					"generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"},
					"changeRow": {"bindTo": "changeRow"},
					"unSelectRow": {"bindTo": "unSelectRow"},
					"onGridClick": {"bindTo": "onGridClick"},
					"activeRowActions": [
						{
							"className": "Terrasoft.Button",
							"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
							"tag": "save",
							"markerValue": "save",
							"imageConfig": {"bindTo": "Resources.Images.SaveIcon"}
						},
						{
							"className": "Terrasoft.Button",
							"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
							"tag": "cancel",
							"markerValue": "cancel",
							"imageConfig": {"bindTo": "Resources.Images.CancelIcon"}
						},
						{
							"className": "Terrasoft.Button",
							"style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
							"tag": "remove",
							"markerValue": "remove",
							"imageConfig": {"bindTo": "Resources.Images.RemoveIcon"}
						}
					],
					"initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"},
					"activeRowAction": {"bindTo": "onActiveRowAction"},
					"multiSelect": false
				}
			},
			{
				"operation": "insert",
				"name": "DataGridActiveRowUpButton",
				"parentName": "DataGrid",
				"propertyName": "activeRowActions",
				"values": {
					"className": "Terrasoft.Button",
					"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
					"imageConfig": LocalizableHelper.localizableImages.Up,
					"tag": "Up"
				}
			},
			{
				"operation": "insert",
				"name": "DataGridActiveRowDownButton",
				"parentName": "DataGrid",
				"propertyName": "activeRowActions",
				"values": {
					"className": "Terrasoft.Button",
					"style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
					"imageConfig": LocalizableHelper.localizableImages.Down,
					"tag": "Down"
				}
			}
		]/**SCHEMA_DIFF*/,
	methods: {
			init: function() {
				this.callParent(arguments);
			},
onActiveRowAction: function(buttonTag) {
				var activeRow = this.getActiveRow();
				var position;
				//this.callParent(arguments);
				switch (buttonTag) {
					case "Up":
						position = activeRow.get("Position");
						if (position > 0) {
							position--;
							this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
						}
						break;
					case "Down":
						position = activeRow.get("Position");
						position++;
						this.setPosition(activeRow.get("Id"), position, this.reloadGridData, this);
						break;
					default:
						break;
				}
			},

а зачем закомментировали

//this.callParent(arguments);

не помогло ?

Не помогло.
Вообще все кнопки перестали работать.
Делаю так.
Из базового BaseSectionV2 из метода onActiveRowAction
Копирую и вставляю код

case "delete":
this.deleteRecords();
break;

Только пока не нашел где для cancel и save

в вашем switch case поместите

this.callParent(arguments)

в условие default:

Увы не помогло.

Но ведь метод onActiveRowAction в детали с ред. реестром вызывается из схемы ConfigurationGridUtyilities. Вам не нужно вызывать радителя. Достаточно скопировать весь код замещаемого метода и добавить свою логику в switch.

"Мотков Илья" написал:с ред. реестром вызывается из схемы ConfigurationGridUtyilities.

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

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

Добрый день!

Подскажите, пожалуйста, как изменить название Лида.
Стандартное : Тип потребности/ФИО Контакта, Контрагент.

У меня задача изменить последовательность, первым выводить название контрагента.

Не совсем понимаю, где необходимо внести изменения.

Нравится

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

опишите ваш кейс точнее, абсолютно не понятно что вы хотите в конечном итоге:
1) отрегулировать последовательность пунктов в выпадающем списке
2) все таки изменить название объекта "Лид"
3) внести изменения в справочник типов для Лида
.. и это только первое, что приходит в голову

Мне необходимо изменить последовательность в названии Лида в поле LeadName.
Пример на скриншоте ниже. Скрин страницы редактирования Лида.

Вам необходим метод UpdateLeadName в объекте Lead.
Переопределите его и внесите свои изменения

Спасибо,Мария, получилось !

"Мария Ватулина" написал:

Вам необходим метод UpdateLeadName в объекте Lead.

Переопределите его и внесите свои изменения

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

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

Система версии 7.10.1.1161
Есть карточка заказа и есть кастомная страница подборщика продуктов, которая открывается из карточки заказа по нажатию на специально созданную кнопку. Кастомная страница унаследована от BasePageV2 и привязана к entitySchema Order (то есть к тому же объекту, что и карточка заказа). На ней используется стандартная кнопка Закрыть. Все прекрасно работает, кроме случая когда подборщик открываем из карточки ново создаваемого заказа(add). В этом случае при нажатии Закрыть на кастомной странице выбрасывает обратно в раздел, а должно бы в карточку заказа.

Обратил внимание, что при добавлении нового заказа когда открывается карточка редактирования, то хеш все равно остается от раздела - SectionModuleV2/OrderSection (аналогично и во всех остальных разделах). Вероятно, в этом и есть причина, так как при нажатии Закрыть публикуется BackHistoryState. Ниже код, который используем для открытия карточки подборщика. Подскажите как добиться нужного эффекта, так как кейс с открытием подборщика из нового заказа и есть самый основной.

                                openProductSelector: function() {
                                        var orderId = this.get("PrimaryColumnValue") || this.get("Id");
                                       
                                        var defaultValues = [
                                                        {
                                                                name: "PrimaryColumnValue",
                                                                value: orderId
                                                        },
                                                        {
                                                                name: "UseSeparatedPageHeader",
                                                                value: true
                                                        }

                                                ];
                                       
                                        stateObj = {
                                                                        isSeparateMode: true,
                                                                        schemaName: "SelectProductInOrderPage",
                                                                        moduleId: "CardModuleV2_SelectProductInOrderPage",
                                                                        valuePairs: defaultValues,
                                                                        operation: "open",
                                                                        isInChain: false
                                                                };
                                        requestUrl = "CardModuleV2/SelectProductInOrderPage/";
                                       
                                        this.sandbox.publish("PushHistoryState", {
                                                hash: requestUrl,
                                                stateObj: stateObj
                                        });
                                },     

                                onProductSelectionButtonClick: function() {
                                        this.set("OpenselectProductPage", true);
                                        this.save({isSilent: true});
                                },

                onSaved: function (response, config) {
                    this.hideBodyMask();
                    if (!this.get("NextPrcElReady")) {
                        this.set("NextPrcElReady", response.nextPrcElReady);
                    }
                    if (config && config.isSilent) {
                        this.onSilentSaved(response, config);
                    } else {
                        var updateConfig = this.getUpdateDetailOnSavedConfig();
                        this.sandbox.publish("UpdateDetail", updateConfig, [this.sandbox.id]);
                        this.sendSaveCardModuleResponse(response.success);
                        if (this.get("IsInChain")) {
                            this.onProcessCardSaved();
                            return;
                        }
                        if (this.isNewMode()) {
                            this.onCloseCardButtonClick();
                        } else {
                            this.onProcessCardSaved(true);
                        }
                    }
                    this.set("Operation", Terrasoft.ConfigurationEnums.CardOperation.EDIT);
                    if (!this.destroyed) {
                        this.updateButtonsVisibility(false, { force: true });
                    }
                    this.set("IsChanged", this.isChanged());
                    this.subscribeOwner(config);
                    if (config && config.isSilent) {
                                                if(this.get("OpenselectProductPage")) {
                                                        this.set("OpenselectProductPage", false);
                                                        this.openProductSelector();
                                                }
                        return;
                    }
                    this.updateAmountAfterSave("ProductInProductsTab",
                        function () {
                            this.updateDetail({ detail: "ProductInResultsTab" });
                            this.updateOrderProductSummary();
                        },
                        this
                    );
                },

Нравится

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

пока заказ не сохранен - некуда возвращаться у заказа нет Id а стало быть и хеша не собрать.
В том числе и по этой причине при попытке что либо добавить в деталь на странице, ее карточка карточка предварительно принудительно сохраняется, т.к. если открыть в Chain карточку детали, то куда потом возвращаться :)

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

Илья, но я ведь и делаю save перед открытием. И делаю его silent - как раз как в случае с сохранением из детали. И this.set("Operation", Terrasoft.ConfigurationEnums.CardOperation.EDIT) тоже происходит в методе onSaved до открытия кастомной страницы (про этот "режим" вы говорите? или про silent save все же ?)

В более старых версиях помнится при добавлении новой записи был хеш вида CardModuleV2/OrderPageV2/add/recordId Почему от этого отказались - неясно.

в режиме создания silent-save все равно приводит к выходу в реестр.
надо подменять режим, за это отвечает специальный атрибут посмотрите метод

this.isAddMode() 

там аккурат считывается значение этого атрибута.

PS:
зачастую просто надо предотвратить поведение при котором новая карточка закрывается при сейве, этот кейс решается именно так.

Илья, режим хранится как раз в атрибуте Operation. То есть он сменяется на EDIT до того как я открываю кастомную страницу. Проблема состоит именно в том, что при нажатии Закрыть на кастомной странице идет запрос BackHistoryState, а там - хеш раздела. Вот и идет вылет в раздел.

В общем, пока проблему обходим следующим путем:

1) На странице заказа перенесли вызов метода, отвечающего за открытие кастомной страницы подборщика, из onSaved в onSilentSaved, так как он вызывается до смены режима в атрибуте Operation
2) сам режим передаем в массиве defaultValues на кастомную страницу. Код выглядит теперь так

openProductSelector: function() {
	var orderId = this.get("PrimaryColumnValue") || this.get("Id");
	var operation = this.get("Operation");
 
	var defaultValues = [
			{
				name: "PrimaryColumnValue",
				value: orderId
			}, 
			{
				name: "UseSeparatedPageHeader",
				value: true
			},
			{
				name: "Operation",
				value: operation
			} 							
		];
 
	stateObj = {
					isSeparateMode: true,
					schemaName: "SelectProductInOrderPage",
					moduleId: "CardModuleV2_SelectProductInOrderPage",
					valuePairs: defaultValues,
					operation: "open",
					isInChain: false
				};
	requestUrl = "CardModuleV2/SelectProductInOrderPage/";
 
	this.sandbox.publish("PushHistoryState", {
		hash: requestUrl,
		stateObj: stateObj
	});
},	
 
onProductSelectionButtonClick: function() {
	this.set("OpenselectProductPage", true);
	this.save({isSilent: true});
},
 
 
onSilentSaved: function() {
	if(this.get("OpenselectProductPage")) {
		this.openProductSelector();
	this.set("OpenselectProductPage", false);
	} else {
		this.callParent(arguments);
	}
}  

3) на кастомной странице создали кнопку по виду идентичную кнопке Закрыть. Видимость этой кастомной кнопки прибиндили к isNewMode, а кнопки Закрыть к противоположному к isNewMode значению.
4) Метод обработчик нажатия на кастомную кнопку открывает наш заказа в режиме редактирования.

onBacktToOrderButtonClick: function() {
		var orderId = this.get("PrimaryColumnValue") || this.get("Id");
		var defaultValues = [
				{
					name: "PrimaryColumnValue",
					value: orderId
				}					
		];
 
		stateObj = {
						isSeparateMode: true,
						schemaName: "OrderPageV2",
						moduleId: "CardModuleV2_" + orderId + "_OrderPageV2",
						valuePairs: defaultValues,
						operation: "edit",
						isInChain: false
					};
		requestUrl = "CardModuleV2/OrderPageV2/edit/" + orderId;
 
		this.sandbox.publish("PushHistoryState", {
			hash: requestUrl,
			stateObj: stateObj
		});				
},

Но это решение все равно несколько "корявое". Так как при создании нового заказа: карточка заказа. Открыть подборщик => Подборщик. Закрыть => Карточка Заказа. Закрыть => попдаем обратно в подборщик вместо раздела.

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

Когда пользователь кликает по гиперссылкам в окне приложения страницы по которым он перемещаются образуют очередь (стек LIFO), типовые действия "Закрыть" / "Сохранить" и т.д. приводят к тому что пользователь "возвращается на карточку", зачастую работая с другими карточками пользователь инициирует БП или иначе изменяет данные, которые ранее были загружены в модели карточек к которым предстоит "вернуться", но когда пользователь "возвращается на них" то данные там не актуализированы.
И это представляет прям насущную проблему.
Её не сложно решить самостоятельно, имея какой-то способ определения факта события "пользователь вернулся на карточку".
Стоит признаться, "ковырялся" я довольно много... но пока что "зацепиться" ни за что не удалось.
Но мне кажется что, способ всё такие есть.

Есть ли у коллективного разума какие-то идеи, знания на этот счет ?

Нравится

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

Сам спросил, сам отвечу
за это отвечает BROADCAST сообщение BackHistoryState
на него есть всего один подписчик в ConfigurationBootstrap.js
его обрабатывает метод onBackHistoryState
так что можно "расширять" его при необходимости.

PS: по факту этот метод не делает ничего кроме вызова

router.back();

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

Ладно, вы справились быстрее, поздравляю :smile:

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

Добрый день!
Возникла проблема при работе с SVN.
Не удается обновить или зафиксировать пакеты.
В конфигурации ошибка выглядит так: "The XML response contains invalid XML"

Лог ошибки:
2017-07-21 13:40:39,965 [86] ERROR NT AUTHORITY\SYSTEM Svn ThrowException - The XML response contains invalid XML
RootCause: The XML response contains invalid XML
SvnErrorCode: SVN_ERR_XML_MALFORMED
SvnErrorCategory: 26
Workspace Number: 0
Workspace Name: Default

В чем может быть проблема?

Нравится

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

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

Похоже на внутреннюю ошибку svn, начать можно с проверки url svn сервера, также можно попробовать выкачать репозиторий какой-то сторонней утилитой (например tortoise svn) и попробовать зафиксировать какие-то изменения.

Также можно открыть рабочую копию в файловой системе, если это on-site, и попробовать выполнить svn cleanup, но осторожно, там есть опция по отмене изменений, она должна быть выключена

"Мотков Илья" написал:

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

Похоже на внутреннюю ошибку svn, начать можно с проверки url svn сервера, также можно попробовать выкачать репозиторий какой-то сторонней утилитой (например tortoise svn) и попробовать зафиксировать какие-то изменения.

Также можно открыть рабочую копию в файловой системе, если это on-site, и попробовать выполнить svn cleanup, но осторожно, там есть опция по отмене изменений, она должна быть выключена


Добрый день, дело в том, что подобные on-site приложения уже ранее были развернуты и на них не возникало таких проблем, так как производилась, так сказать, установка с 0 (подключение svn, установка пакетов из svn и так далее). Проблема возникает только в тот момент, когда пытаемся развернуть новое приложение из готового бэкапа старого. Т.е. получается что конфигурации +- между собой схожи, так что кажется навряд-ли url svn сервера как то менялся.

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

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

Нравится

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

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

В построителе выборки Вы можете использовать does not exists (или не существует) фильтр, в котором перечислить все остальные состояния отличные от 'Отменен'.
Более подробно о построении таких фильтров (пункт "Установка агрегирующего фильтра" - вместо количества нужно указать опцию не существует):
https://academy.terrasoft.ru/documents/sales-team/7-10/rasshirennyy-fil…

P.S. прикрепила скриншот для наглядности

Алла, спасибо за решение)

Добавьте еще условие, что заказы существуют. И при это не существуют заказы, в которых состояние отличное от "Отменен"

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

Доброго времени суток.
Версия 7.9.

На открытой CTI панели звонков есть функция поиска по контактам (см. скриншот).
Там есть кнопочка с телефонной трубкой. Однако кликнуть по ней, чтобы позвонить, не получается.

Можно ли где-нибудь добавить обработку на этот клик, в какой схеме определён этот блок?
Или убрать кнопку, как вариант.

Нравится

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

обработчик - callPhoneNumber
находится в CtiPanelModelUtilities

добавление строки-элемента в CTIPanel

{
	"operation": "insert",
	"parentName": "ctiPanelMainContainer",
	"index": 4,
	"propertyName": "items",
	"name": "PhoneNumber",
............................................и т.д.
},

Данила, спасибо!

Но есть ещё один момент. Это звонок по кнопке 1 (на прикреплённой картинке).
Можно ли вызвать звонок по кнопке 2?

Также есть аналогичная кнопка в ленте звонков.

там обработчик onNumberClick,
из, скорее всего, CommunicationHistoryItem

Данила,

CommunicationHistoryItem - это для истории звонков. Туда добавил обработчик кликов.

Есть ещё результаты поиска, они на первом скрине были..

Пока нашёл в SubscriberSearchResultItem вот такое:

{
					"operation": "insert",
					"name": "CommunicationItemsListContainer",
					"parentName": "SubscriberSearchResultItemContainer",
					"propertyName": "items",
					"values": {
						"id": "CommunicationItemsListContainer",
						"itemType": Terrasoft.ViewItemType.GRID,
						"markerValue": "CommunicationItemsListContainer",
						"selectors": {"wrapEl": "#CommunicationItemsListContainer"},
						"idProperty": "Id",
						"collection": {"bindTo": "SubscriberCommunications"},
						"onGetItemConfig": {"bindTo": "getCommunicationPanelViewConfig"},
						"classes": {"wrapClassName": ["communications-control-group"]},
						"generator": "CtiContainerListGenerator.generatePartial"
					}
				}

Похоже, что кнопка где-то рядом.. пока не нахожу что-то.

Нашёл - схема SubscriberCommunicationItem.

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

BPM 7.10
При создании нового элемента, при выборе определенного значения категории (например - К1), изменить уровень доступа к полям этого элемента. Т.е. при открытии поле под замком, после выбора категории и установки параметра в значение "К1" - замок убрать.

Предполагаю, выполняться это должно на клиенте, т.е. использование JS.

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

Нравится

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

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

Для этого можно использовать бизнес-правила. Подробнее по ссылке:
https://academy.terrasoft.ru/documents/sales-enterprise/7-10/nastroyka-…

"Терещенко Алексей" написал:Подскажите есть ли библиотека с примерами, которые можно было бы самостоятельно проанализировать для выполнения собственного функционала?

ну кое что есть на академии в специальном разделе
а так, основной источник примеров - это исходники конфигурации, вот тут о том как их выгрузить

"Севостьянов Илья Сергеевич" написал:ну кое что есть на академии в специальном разделе

Спасибо. Реализовал с помощью бизнес-правил.

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

Доброго времени, форумчане.

Возникла следующая потребность:
Есть сайт, на котором оформляются заказы, после оформления они передаются в bpm.
На странице заказа в bpm вставил Iframe сайта на котором оформляются заказы.
Цель: при открытии заказа в bpm нужно, чтобы в Iframe передавались данные авторизации(чтобы зайти в кабинет) и открывался аналогичный заказ на сайте для возможности его редактирования.

Есть ли возможность сделать это и вообще передавать данные в Iframe средствами bpm?

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

Нравится

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

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

У нас, к сожалению нет готовых решений для реализации автоматизированной интеграции с IFrame.

Можете воспользоваться стандартными средствами экспорта из bpm и загружать данные в IFrame вручную.

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

С уважением, Анастасия.

Кирилл, всё что вам нужно есть тут:smile:

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

Хочу поделиться интересной 'фичей', обнаруженной при настройке графиков в дешбордах.

Если у Вас в графике есть несколько серий и для первой серии установить тип графика 'Bar' (скрин 1), а для другой 'Column' (скрин 2) (возможно, что в русскоязычной локализации они называются по-другому), то в итоге Вы получите эффект 'вложения' одной серии в другую (для понимания этого эффекта лучше посмотреть прикрепленный скриншот график).

P.S. Не исключаю, что такой эффект после внесения изменений и исправлений в графики после очередного обновления на новую версию может пропасть, так как отображаться в итоге должно нечто другое, соответствующее указанному типу графика, но пока такой эффект присутствует вы можете использовать его в настройке ваших дешбордов, тем более, что нашим пользователям он очень понравился :wink:

Сейчас у нас версия 7.10.2.

Нравится

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

Это именно что фича а не баг, и тянется она давно, и не планирует исчезать :smile:

Максим,

хорошо, если так.

Мы этому будем только рады!

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