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

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

Есть ли возможность в детали Активность (ActivityDetail из пакета NUI) сделать наименование задачи ссылочным как в разделах? (то бишь при щелчке в гриде на наименование задачи открывать карточку редактирования задачи)

Или хотя бы прикрутить к определенной колонке грида что-нить типа события OnDblClick по которому будет открываться на редактирование выбранная задача из детали

На данный момент просто тупо добавил кнопку Изменить по аналогии с кнопкой Добавить, но мне все же хотелось бы сделать значение именно ссылкой на объект, так как перегружать интерфейс кнопками очень не хотелось бы )

p.s. Есть ли где-нить инфа по созданию модулей (как создать грид, описание конфигов и кастом конфигов для колонок и т.д.)?
раз уж в 7ке IDE для создания карточек не используется, то хотелось бы хотя бы в виде SDK инфу получить или примеров

Использую BPMonline CRM 7

Заранее спасибо!

Нравится

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

Добрый день,

Уточните, пожалуйста, сборку, которую используете.

BPMonline CRM Версия 7.0.0.207

Добрый день,

Уточняю у департамента разработки. В ближайшее время предоставим ответ.

День добрый!
Максим, как продвигается уточнение? )

С уважением, Волков Артем

Артем, здравствуйте.

Запрос сейчас на техническом лидере департамента разработки. Рекомендации должны придти до 02.09.

Спасибо, будем ждать
p.s. в рамках обращения 0149995 нам готовят новую сборку (или пакет обновлений), так что решение необходимо будет для будущей версии (номер сборки не знаю)

Добрый день, Артем.

Специалистами департамента разработки предлагается следующий механизм для реализации перехода по ссылкам при клике на название активности в детали активности:

1) Удалить в профиле сохранённую настройку кастомизацию для детали в данной секции
Например для Раздела контакта: delete from SysProfileData where [Key]='ContactActivityDetailGridSettings';

2) Необходимо создать замещающий клиентский модуль ActivityDetail. В качестве родительского объекта необходимо указать “Схема Детали Активности” Добавить строки локализации TitleCaption, StartDateCaption, StatusCaption. Зависимость – “Активность ( Base )”

3) В код добавить следующий код:

define('ActivityDetail', ['Activity', 'sandbox', 'ActivityDetailStructure', 'ActivityDetailResources',
    'ConfigurationEnums', 'ConfigurationConstants'],
    function(Activity, sandbox, structure, resources, ConfigurationEnums, ConfigurationConstants) {
        structure.userCode = function() {
            var entitySchema = this.entitySchema = Activity;
            this.name = 'ActivityDetailViewModel';
            this.editPageName = 'ActivityPage';
            this.typeColumn = "Type";
 
            this.columnsConfig[0][0].link = {bindTo:'getLink'};
 
            this.captionsConfig = [
                {
                    cols: 12,
                    name: resources.localizableStrings.TitleCaption
                },
                {
                    cols: 6,
                    name: resources.localizableStrings.StartDateCaption
                },
                {
                    cols: 6,
                    name: resources.localizableStrings.StatusCaption
                }
            ];
 
 
            this.methods.modifyItems = function(items) {
                for (var index in items) {
                    items[index].getLink = function() {
                        var link = Terrasoft.workspaceBaseUrl;
                        var id = this.get('Id');
                        var type = this.get('Type');
                        var schemaName = 'Activity';
                        var config = Terrasoft.configuration.ModuleStructure[schemaName];
                        var URL = '';
                        var cardSchema;
                        if (type != null && type.value == ConfigurationConstants.Activity.Email){
                            cardSchema = 'EmailPage';
                        } else {
                            cardSchema = config.cardSchema;
                        }
                        var notes = "";
                        var target = '_self';
                        URL = [link, 'Nui/ViewModule.aspx#'+config.cardModule, cardSchema, ConfigurationEnums.CardState.Edit, id];
                        return {
                            url: URL.join('/'),
                            title: notes,
                            target: target
                        };
                    };
                }
            };
 
        };
        return structure;
    });

Большое спасибо!

День добрый!
Ваш способ помог, но к сожалению есть небольшая проблемка c отображением детали

Поле создания замещающего модуля для ActivityDetail с кодом:

define('ActivityDetail', ['Activity', 'sandbox', 'ActivityDetailStructure', 'ActivityDetailResources',
    'ConfigurationEnums', 'ConfigurationConstants'],
    function(Activity, sandbox, structure, resources, ConfigurationEnums, ConfigurationConstants) {
        structure.userCode = function() {
            var entitySchema = this.entitySchema = Activity;
            this.name = 'ActivityDetailViewModel';
            this.editPageName = 'ActivityPage';
            this.typeColumn = "Type";
 
 
            this.captionsConfig = [
                {
                    cols: 12,
                    name: resources.localizableStrings.TitleCaption
                },
                {
                    cols: 6,
                    name: resources.localizableStrings.StartDateCaption
                },
                {
                    cols: 6,
                    name: resources.localizableStrings.StatusCaption
                }
            ];
 
			this.columnsConfig[0][0].link = {bindTo: 'getLink'};
 
            this.methods.modifyItems = function(items) {
                for (var index in items) {
                    items[index].getLink = function() {
                        var link = Terrasoft.workspaceBaseUrl;
                        var id = this.get('Id');
                        var type = this.get('Type');
                        var schemaName = 'Activity';
                        var config = Terrasoft.configuration.ModuleStructure[schemaName];
                        var URL = '';
                        var cardSchema;
                        if (type != null && type.value == ConfigurationConstants.Activity.Email) {
                            cardSchema = 'EmailPage';
                        } else {
                            cardSchema = config.cardSchema;
                        }
                        var notes = "";
                        var target = '_self';
                        URL = [link, 'Nui/ViewModule.aspx#' + config.cardModule, cardSchema, ConfigurationEnums.CardState.Edit, id];
                        return {
                            url: URL.join('/'),
                            title: notes,
                            target: target
                        };
                    };
                }
            };
 
        };
        return structure;
    });

произошло смещение колонок + появился непонятный элемент undefined (см. activity_detail_err.png) при чем в хтмле он оформлен без тегов (см. activity_detail_html.png)
При отладке вплоть до самой загрузки данных в конфиге показывает 3 колонки, откуда появляется 4ая могу только догадываться ) видимо добавляется системой так же как и чекбокс для мультиселекта при формировании ряда
Очень надеюсь что хотя бы подскажете куда копать, потому я уже даже не знаю )

Заранее спасибо!

Добрый день,

Необходимо заменить строку в коде

                this.columnsConfig[0][0].link = {bindTo:'getLink'};

на

this.columnsConfig = this.columnsConfig[0];
               this.columnsConfig[0].link = {bindTo:'getLink'};

Спасибо, теперь все идеально )

Обнаружили такую проблему - при настройке отображаемых на детали колонок ссылки пропадают. Это можно как-нибудь обойти?

И ещё одну - если после перехода по ссылке нажать Отмену, то система выбрасывает в раздел, а не в запись раздела.

Акмаль, можно запретить менять настройки. Добавить генерацию ссылок при формировании настроек, сохраняемых в профиль не получится.
Отмена отрабатывает корректно, как "Назад". Если у Вас возвращает не в родительскую запись, нужно разбирать конкретный случай.

Добрый день!
Подскажите, пожалуйста.
Вы написали такой кусочек кода:

"var target = '_self';
...
target: target"

Это, чтобы ссылка открывалась в текущей вкладке, а как сделать так, чтобы она открывалась в новой вкладке??

Такой код не проходит, к сожалению.

"var target = '_blank';
...
target: target"

Версия системы: 7.5.0.1328

Настя, добрый день!

При использовании базового механизма перехода по ссылке из детали (в результате обычно открывается карточка редактирования объекта) используется метод openCardInChain базовой модели представления (BaseSchemaViewModel), который открывает карточку в том же окне, независимо от атрибута target.

Для того, чтобы по ссылке карточка открывалась в новом окне, необходимо использовать метод open глобального объекта window. Например:

var url = Terrasoft.workspaceBaseUrl;
window.open(url);

Примеры использования - модуль SystemDesigner пакета UIv2: действия "Мастер разделов", "Мастер деталей", "Управление конфигурацией".

Олег, здравствуйте!
Спасибо Вам большое за ответ.
Я посмотрела SystemDesigner и решила сделать наподобие.
У меня есть поле UsrFoto. Я добавила туда следующие строчки:

"click": {"bindTo": "onNavigateClick"},
"itemType": Terrasoft.ViewItemType.LINK,

{
		"operation": "insert",
		"name": "UsrFoto",
		"values": {
			"layout": {
				"column": 0,
				"row": 7,
				"colSpan": 24,
				"rowSpan": 1
			},
			"bindTo": "UsrFoto",
			"caption": {
				"bindTo": "Resources.Strings.UsrFotoCaption"
			},
			"click": {"bindTo": "onNavigateClick"},
			"itemType": Terrasoft.ViewItemType.LINK,
			"textSize": 0,
			"contentType": 1,
			//"itemType": Terrasoft.ViewItemType.HYPERLINK,
			"labelConfig": {
				"visible": true
			},
			"enabled": true/*,
			"showValueAsLink": true,
			"href": {
   			"bindTo": "getLink"
			}*/
	},
		"parentName": "Header",
		"propertyName": "items",
		"index": 15
	}

И в методы также добавила следующее:

			onNavigateClick: function() {
			var url = this.get("UsrFoto");
				if (url != null) {
					window.open(url, "_blank", "height=" + this.get("WindowHeight") + ",width=" + this.get("WindowWidth"));
			}
			}

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

Методом последовательного комментирования выяснила, что проблема в этой строчке: "click": {"bindTo": "onNavigateClick"},

Я вроде все по аналогии делала, если Вам нетрудно не подскажете в чем моя ошибка?

Вот например кусочек кода в файле SystemDesigner, пример с которого я брала.

{
				"operation": "insert",
				"propertyName": "items",
				"parentName": "UsersTile",
				"name": "ObjectRightsManagement",
				"values": {
					"itemType": Terrasoft.ViewItemType.LINK,
					"caption": {"bindTo": "Resources.Strings.ObjectRightsManagementLinkCaption"},
					"click": {"bindTo": "onNavigateToObjectRightsManagementClick"}
				}
			}
 
 
... 
 
 
navigateToObjectRightsManagement: function() {
				if (this.get("CanManageAdministration") === true) {
					var url = this.Terrasoft.workspaceBaseUrl +
						"/ViewPage.aspx?Id=5e5f9a9e-aa7d-407d-9e1e-1c24c3f9b59a&" +
						"ActiveTabId=PageContainer_34d8ed7df8e8e011837600155d04c01d_fe571096f36b14102781485b39b2edcc_" +
						"99ea5ea6447249a39dfa660296bb4674";
					window.open(url, "_blank");
				} else {

Настя, у контрола, который создаётся по полю "UsrFoto", нет свойства "click".

Вы можете добавить свой контрол, который не ссылается на колонку Entity-схемы, с типом BUTTON или LABEL, и связать его свойство "click" с обработчиком onNavigateClick.

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

Я посмотрела как это реализовано с Средствах связи контакта (там же как раз есть пол Web и по нажатию на другую вкладку как раз переходит), но не могу там разобраться..

Настя, деталь Средства связи отличается от деталей, которые созданы на основании BaseDetailV2.

Для реализации Вашей задачи необходимо в блоке diff для Вашего поля UsrFoto добавить такие свойства:

"showValueAsLink": true,
"href": {
	"bindTo": "UsrFoto",
	"bindConfig": {"converter": "getUsrFotoLink"}
},
"controlConfig": {
	"className": "Terrasoft.TextEdit",
	"linkclick": { bindTo: "onUsrFotoLinkClick"}
}

Реализация методов примерно следующая:

getUsrFotoLink: function(value) {
	return {
		"url": value,
		"caption": value
	};
},
onUsrFotoLinkClick: function(url) {
	if (url != null) {
		window.open(url, "_blank", "height=" + this.get("WindowHeight") + ",width=" + this.get("WindowWidth"));
		return false;
	}
}

Значение в поле необходимо начинать c http, иначе функционал работы с гиперссылками будет добавлять в начало путь к приложению.

Олег, спасибо Вам огрооооомное!!:smile:
Все получилось!
Я уже думала вечно буду с этими ссылками сидеть.

Олег, спасибо Вам огрооооомное!!:smile:
Все получилось!
Я уже думала вечно буду с этими ссылками сидеть.

Лабьяк Олег Игоревич пишет:

Настя, деталь Средства связи отличается от деталей, которые созданы на основании BaseDetailV2.

Для реализации Вашей задачи необходимо в блоке diff для Вашего поля UsrFoto добавить такие свойства:

"showValueAsLink": true,
"href": {
	"bindTo": "UsrFoto",
	"bindConfig": {"converter": "getUsrFotoLink"}
},
"controlConfig": {
	"className": "Terrasoft.TextEdit",
	"linkclick": { bindTo: "onUsrFotoLinkClick"}
}

Реализация методов примерно следующая:

getUsrFotoLink: function(value) {
	return {
		"url": value,
		"caption": value
	};
},
onUsrFotoLinkClick: function(url) {
	if (url != null) {
		window.open(url, "_blank", "height=" + this.get("WindowHeight") + ",width=" + this.get("WindowWidth"));
		return false;
	}
}

Значение в поле необходимо начинать c http, иначе функционал работы с гиперссылками будет добавлять в начало путь к приложению.

Спасибо, мне помогло. у меня текстовое поле стало ссылкой. все просто 

Данько Дмитрий Леонидович,

Добрый день! А подскажите где именно эти изменения вносить нужно?

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