Добрый день! В странице контакта есть определенное поле, куда передается строковое значение по типу "00000 https://someurlcrm.org/....". Как сделать данный url "https://someurlcrm.org/...." кликабельным так, чтобы при открытии странички клиента можно было нажать на данную ссылку, находящуюся в данном поле и перейти дальше по ссылке ?

Изображение удалено.

Нравится

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

Добрый день, Арнур!

 

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

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

 

В решении вашей бизнес-задачи вам поможет статья: https://community.creatio.com/articles/creating-custom-web-link-field

 

С уважением,

Анастасия

Anastasiia Stepanova,

Здравствуйте, спасибо за ответ! У меня есть еще один вопрос: пример, ссылку на который вы отправили предполагает, что в поле будет передаваться url в формате строки, а что, если значением строки будет не только url? Допустим, строка "Спасибо за удобный сервис! ссылка на объект: https://someurl.org" и здесь должен быть кликабельным только кусок с "https://someurl.org". Я видел, что в самом разделе, если настроить для вывода нужную нам колонку, то система распознает url, пускай и неполностью (т.е. ссылка выделена синим и кликабельна до того момента, когда строка заканчивается и начинается новая строка). 

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

Привет, коллеги,

 

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

https://prnt.sc/1ybk46n



Видел похожее поведение в детали SupplyPaymentDetailV2. Там есть ссылки, но они ведут на карточку системы (при клике на справочное поле).

https://prnt.sc/1ybkk9v



Также наше пост на комъюнити, где обсуждается похожий вопрос

https://community.terrasoft.ru/questions/klikabelnye-ssylki-v-detali-s-redaktiruemym-reestrom



Подскажите, пожалуйста, куда копать, чтобы добиться того, чего мы хотим? 

Нравится

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

Дмитрий добрый день!

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

Для реализации можно использовать следующею статью или напрямую изменять дом дерево страницы.

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

Подскажите пожалуйста.

Есть страница детали с разными полями.

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

Ну как пример:

"Инструкция здесь"

Инструкция - просто текст, "здесь" - это ссылка на локальный файл или ссылка на другой ресурс.

Нравится

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

В HtmlControl можно любой html класть. Cвойство htmlContent можно связать со строковым атрибутом или функцией которая возвращает строку или сразу положить строку

"htmlContent": "<p>some текст</p>".

 

Вот пример

{

                    "operation": "insert",

                    "name": "AcademyMessageElement",

                    "parentName": "AcademyMessageDescription",

                    "propertyName": "items",

                    "values": {

                        "itemType": Terrasoft.ViewItemType.COMPONENT,

                        "className": "Terrasoft.HtmlControl",

                        "htmlContent": {"bindTo": "AcademyHelpMessage"}

                    }

                }

В HtmlControl можно любой html класть. Cвойство htmlContent можно связать со строковым атрибутом или функцией которая возвращает строку или сразу положить строку

"htmlContent": "<p>some текст</p>".

 

Вот пример

{

                    "operation": "insert",

                    "name": "AcademyMessageElement",

                    "parentName": "AcademyMessageDescription",

                    "propertyName": "items",

                    "values": {

                        "itemType": Terrasoft.ViewItemType.COMPONENT,

                        "className": "Terrasoft.HtmlControl",

                        "htmlContent": {"bindTo": "AcademyHelpMessage"}

                    }

                }

Если нужна ссылка придется класть в HtmlControl, если нужен только текст есть Label.

{

                    "operation": "insert",

                    "name": "EmptySearchResultLabel",

                    "parentName": "EmptySearchResultContainer",

                    "propertyName": "items",

                    "values": {

                        "itemType": Terrasoft.ViewItemType.LABEL,

                        "classes": {

                            "labelClass": [

                                "description-label"

                            ]

                        },

                        "caption": {"bindTo": "Resources.Strings.EmptySearchResultMessage"}

                    }

                }

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

Каким образом можно, кликнув на номер телефона в Creatio, сделать звонок через tel-протокол?

То есть,  кликать по ссылке вида "tel: +35722444032"? Желательно, глобально, а не переопределяя каждое поле

 

Нравится

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

Владимир, вопрос обсуждали тут и тут.

Насколько понял, нужны доработки, но не каждого поля, а одна на страницу. Например, в карточке контакта ContactPageV2 переопределить функцию, которая стандартно такая:

/**
 * Starts call in CTI panel.
 * @param {String} number Phone number to call.
 * @return {Boolean} False, to stop click event propagation.
 */
onCallClick: function(number) {
	return this.callContact(number, this.$Id, this.$Account);
}

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

/**
 * Starts phone call in CTI panel.
 * @protected
 * @param {String} number Phone number to call.
 * @param {String} entitySchemaName Customer field entity schema name.
 * @param {String} customerId Customer record unique identifier.
 * @param {Terrasoft.Collection} relationFields Call instance crelation column values collection.
 * @return {Boolean} False to stop click event propagation.
 */
makeCall: function(number, entitySchemaName, customerId, relationFields) {
	if (this.isNotEmpty(number)) {
		this.sandbox.publish("CallCustomer", {
			number: number,
			customerId: customerId,
			entitySchemaName: entitySchemaName,
			callRelationFields: relationFields
		});
	}
	return false;
},

Также пробовал просто создавать средство связи типа «web» и там писать ссылку с tel и цифрами, но так работать не будет.

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

Собственно, сабж. Картинкой будет более понятно, с пояснениями:

 

1) Добавляем активность используя выборку объектов, предположим неких кастомных "эмейлов" (отдельный объект, не активность) 

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

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

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

Спасибо.

Изображение удалено.

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

Роман, зарегистрировали идею в элементе БП «Добавить данные» при выборе значения в поле добавляемого объекта из пункта меню 'Колонка из выборки' дать возможность выбрать колонки других объектов по связям. Спасибо за предложение.

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

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

Пытаюсь в итогах в графике (в режиме отображения данных) сделать ссылки на приложенные файлы. Если в колонку выводить непосредственную ссылку вида http://bpm/0/rest/FileService/GetFile/080c9917-7ec9-42e5-86ff-75a683d4f…, то при клике на нее можно взять файл. Если же попытаться обернуть ссылку в тэги для человеческого представления, то ссылка не работает. В отладке я вижу, что тэги были убраны системой. Хочу, чтобы было так же, как при отображении столбца Заголовок. Подскажите, пожалуйста, как это реализовать?

Нравится

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

Старожилы, помогите, пожалуйста

Сергей, насколько понимаю, это не конкретно для итогов, а базовая логика компонента Grid, реализованного в JS-ядре (см. сайт/0/core/hash/Terrasoft/controls/grid/grid.js):

 /**
  * Generates html cell.
  * @private
  * @param {String} dataType Cell type.
  * @param {String} cellData Cell text.
  * @return {String} Cell html.
  */
 formatCellSpan: function(dataType, cellData) {
  const spanCellXTemplate = this._getSpanCellXTemplate();
  const valueWithoutTags = Terrasoft.removeHtmlTags(cellData);
  const text = this.encodeHtml(valueWithoutTags);
  let direction = null;
  if (Terrasoft.getIsRtlMode()) {
   direction = Terrasoft.containsRtlChars(cellData) ? direction : "ltr";
  }
  const html = spanCellXTemplate.apply({
   type: dataType,
   text: text,
   direction: direction
  });
  return html;
 },

 А затем в соседней функции добавляет, если нужно, внутренние ссылки на карточки записей в разделах системы:

 /**
  * Generates html cell-link.
  * @private
  * @param {Object} linkData Link params.
  * @param {String} dataColumn Links data-column attribute.
  * @param {String} innerHtml Links internal content.
  * @return {String} Cell html.
  */
 formatCellLink: function(linkData, dataColumn, innerHtml) {
  const linkTpl = "&lt;a href=\"{0}\" target=\"{1}\" title=\"{2}\" data-column=\"{3}\"&gt;{4}&lt;/a&gt;";
  if (linkData.customUrlsExists) {
   const urlOccurrencePattern = "url_occurrence_{0}";
   linkData.customUrls.forEach(function(url, index) {
    innerHtml = innerHtml.replace(this.encodeHtml(url), Ext.String.format(urlOccurrencePattern, index));
   }, this);
   linkData.customUrls.forEach(function(url, index) {
    innerHtml = innerHtml.replace(Ext.String.format(urlOccurrencePattern, index),
     Ext.String.format(linkTpl, url, linkData.target, this.encodeHtml(url), "", url));
   }, this);
   return innerHtml;
  }
  return Ext.String.format(linkTpl, linkData.url, linkData.target, this.encodeHtml(linkData.title),
   dataColumn, innerHtml);
 },

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

 

Возможно, лучше будет сделать в итогах свой виджет с нужной логикой?

Спасибо, Александр! Надо подумать, поизучать матчасть.

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

Как добавить некий код ( ссылку в простейшем случае ) в заголовок раздела ( лидов ) ?

Изображение удалено.

Нравится

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

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

Вот пример добавления новой кнопки туда:

{
    "operation": "insert",
    "name": "ToggleCalendarButton",
    "parentName": "SeparateModeActionButtonsRightContainer",
    "propertyName": "items",
    "index": 0,
    "values": {
        "itemType": Terrasoft.ViewItemType.BUTTON,
        "click": {
            bindTo: "toggleCalendar"
        },
        "markerValue": {
            bindTo: "getToggleCalendarButtonMarkerValue"
        },
        "controlConfig": {
            "imageConfig": {
                "bindTo": "Resources.Images.ToggleCalendarIcon"
            }
        },
        "classes": {
            "wrapperClass": ["toggle-calendar-wrapper"],
            "imageClass": ["toggle-calendar-image"]
        },
        "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT
    }
},

А вот пример логики клика с переходом по ссылке:

/**
 * Navigates to community site.
 * @protected
 */
CommunityClick: function() {
    var communityLink = this.get("Resources.Strings.CommunityUrl");
    window.open(communityLink);
}

 

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

Добрый день.

Через бизнес-процесс настраивается Email. При вызове бизнес-процесса передаются параметры для подстановки в Email.



Подстановка текстовых значений - работает. Вопрос в том, возможно ли подставить в URL переменный параметр. К примеру, стороннюю ссылку.

Также, возможно ли подстановка картинки из передаваемого URL в шаблон письма?

К примеру, штрих-код.

Нравится

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

Это делается реализацией своего обработчика макроса на основе IMacrosInvokable. См. обсуждения тут, тут и особенно тут. Стандартно в системе этот механизм использован для оценок по обращениям.

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

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

Как это лучше сделать?

Я, например, вижу, что есть метод setActiveTab, однако, надо номер таба получить.

Нормально ли сделать ссылку вида

/0/Nui/ViewModule.aspx#CardModuleV2/UsrMyPage/edit/3f199545-fd54-46fb-b801-f711014389f2/4

Не окажется ли так, что такая приписка к урлу будет валить систему в будущих версиях?

Нравится

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

Добрый день

Вы можете оперировать не номерами Tab'а, а их именами и в урле будете передавать его имя. В будущих релизах не планируется что-то добавлять после Id записи

По ходу возник еще один вопрос - а когда можно вызывать setActiveTab при загрузке страницы? В onEntityEnitialized получается рано - таб выбирается, но контент остается от первого таба.

Алексей-Карягин пишет:

В onEntityEnitialized получается рано - таб выбирается, но контент остается от первого таба.

Это потому , что с табами всё очень плохо smiley Попробуйте вот так написать:

onEntityInitialized: function() {
	this.callParent(arguments);
	this.tabsCollectionActions();
},
tabsCollectionActions: function() {
	var tabsCollection = this.get("TabsCollection"); //получаем коллекцию
	//что-то с ней делаем (или нет)
	this.setActiveTab("ProductsInDiscountTab"); //устанавливаем активную
	this.set("ProductsInDiscountTab", true); //в этом set-е вся соль. Нафига он - непонятно. Но без него не рендерится содержимое вкладки
},

 

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

this.set("ProductsInDiscountTab", true); тоже не рендерится. Только таймаут, только хардкор!

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

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

В лиде есть деталь. Деталь стандартная, при нажатии на "+" открывается карточка создания.
задача состоит в том, чтобы из детали можно было открыть карточку редактирования по ссылке,а не через выбор пункта "изменить". например, как сделано с деталью Контакты в контрагенте. Делаю по аналогии, но у меня не работает. также в детали выведено поле UsrName и при клике на него нужно открыть объект UsrStructure.

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

пробовала и через linkClicked и через on[ColumnName]LinkClick. первый вообще не вызывается. Второй тоже, но для него я знаю почему - так как в Terrasoft.configuration.ModuleStructure нет моей сущности.
var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];

подскажите, пожалуйста, как я могу реализовать эту задачу?

Нравится

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

"Zaitova Liubov" написал:подскажите, пожалуйста, как я могу реализовать эту задачу?

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

"Варфоломеев Данила" написал:
Zaitova Liubov пишет:

подскажите, пожалуйста, как я могу реализовать эту задачу?

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


я рассматривала метод addColumnLink. в нем есть следующая строка
var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];
но моей сущности нет в этой коллекции Terrasoft.configuration.ModuleStructure, потому что я создавала ее через конфигурацию,а не через мастер.

"Zaitova Liubov" написал:var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];

Шаг 1: Нафиг выкинуть все методы террасофта
Шаг 2: Костыли. Я к примеру хочу в детали адрес контрагента лепить ссылку на поле "адрес":

addColumnLink: function(item, column) {
	var columnPath = column.columnPath;
	var onColumnLinkClickName = "on" + columnPath + "LinkClick";
	var profileColumns = this.getProfileColumns();
	var profileColumn = profileColumns[columnPath];
	var isProfiledLinkColumn =
		profileColumn && (profileColumn.type === Terrasoft.GridCellType.LINK);
	var isLinkColumn = this.getIsLinkColumn(this.getGridEntitySchema(), column);
	if ((isProfiledLinkColumn || isLinkColumn) && !this.getIsEditable()) {
		var referenceSchemaName = column.referenceSchemaName;
		var schemaConfig = Terrasoft.configuration.ModuleStructure[referenceSchemaName];
		var scope = this;
		if (column.isLookup && schemaConfig) {
			item[onColumnLinkClickName] = function() {
				var record = this.get(columnPath);
				if (!record) {
					return "";
				}
				var recordId = record.value;
				if (!recordId) {
					return "";
				}
				return scope.createLink.call(this, referenceSchemaName, columnPath,
					record.displayValue, recordId);
			};
		} else {
			var columnIdName = item.primaryColumnName;
			var entitySchemaName = this.getGridEntitySchemaName();
			var entitySchemaConfig = Terrasoft.configuration.ModuleStructure[entitySchemaName];
			if (entitySchemaConfig) {
				item[onColumnLinkClickName] = function() {
					var recordId = this.get(columnIdName);
					if (!recordId) {
						return "";
					}
					var displayValue = this.get(columnPath);
					if (scope.Ext.isEmpty(displayValue)) {
						return "";
					}
					var link =
						LinkColumnHelper.createLink(entitySchemaName, columnPath, displayValue, recordId);
					return link || scope.createLink.call(this, entitySchemaName, columnPath,
						displayValue, recordId);
				};
			}
		}
	}
	/**КОСТЫЛИ**/
	if (columnPath === "Address") {
		var scope = this;
		var columnIdName = item.primaryColumnName;
		var entitySchemaName = this.getGridEntitySchemaName();
		item[onColumnLinkClickName] = function() {
			var recordId = item.get("Id");
			if (!recordId) {
				return "";
			}
			var displayValue = item.get("Address");
			if (scope.Ext.isEmpty(displayValue)) {
				return "";
			}
 
			var editPageName ="AccountAddressPageV2";
			var link = Terrasoft.workspaceBaseUrl + "/Nui/ViewModule.aspx#CardModuleV2/"+editPageName+"/edit/"+recordId;
			return {
				caption: displayValue,
				target: "_self",
				title: displayValue,
				url: link
			};
		};
	}
	if (Ext.isEmpty(item[onColumnLinkClickName])) {
		item[onColumnLinkClickName] = function() {
			return (item.getLinkColumnConfig ? item.getLinkColumnConfig(column) : null);
		};
	}

Шаг 3: Вставить в methods детали.
Результат:
зшс

В чём проблема, то?:smile:

"Варфоломеев Данила" написал:В чём проблема, то?


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

В дополнение, у меня возникла проблема возврата в ту вкладку, из которой вызывалась страница. В addColumnLink сформировал ссылку. Переход происходит, но при нажатии на странице "Закрыть" возврат на первую вкладку, а вызов происходит из второй. Те же ссылки стандартные, например, "Контрагент" переходят и возвращаются корректно. Что упустил - понять не могу.

"Лапшин Павел Александрович" написал:Переход происходит, но при нажатии на странице "Закрыть" возврат на первую вкладку, а вызов происходит из второй.

Надо разбираться с HistoryState и браузерной строкой. Иногда при переходе по страницам bpm-ка не меняет путь и вот фиг знает, если честно, как система отреагирует на закрытие карточек(PushBackHistoryState событие). Надо тестить)

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