Каким образом можно, кликнув на номер телефона в 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…, то при клике на нее можно взять файл. Если же попытаться обернуть ссылку в тэги <a href""></a> для человеческого представления, то ссылка не работает. В отладке я вижу, что тэги были убраны системой. Хочу, чтобы было так же, как при отображении столбца Заголовок. Подскажите, пожалуйста, как это реализовать?

Нравится

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 = "<a href=\"{0}\" target=\"{1}\" title=\"{2}\" data-column=\"{3}\">{4}</a>";
  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 событие). Надо тестить)

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

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

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

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

Возможно ли это сделать?

Нравится

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

Информация о том, как добавлять кнопки есть на академии:
https://academy.terrasoft.ru/documents/technic-sdk/7-8/kak-dobavit-knop…
Посмотреть как по нажатию кнопки переходить в импорт можете в схеме SystemDesigner
Там для этого есть метод:
navigateToImportFromExcel: function() {
var url = this.Terrasoft.workspaceBaseUrl + ConfigurationConstants.ApplicationPage.ExcelImport;
window.open(url, "_blank", "height=" + this.get("WindowHeight") + ",width=" + this.get("WindowWidth"));
},
Что касается предзаполения объекта, необходимо изучить как данный механизм работает в самой странице импорта: схема FileImportStartPage
В замещающей схеме FileImportStartPage реализовать метод который будет заполнять объект импорта на нужным вам. И средствами песочницы sandbox, узнавать что вы перешли в импорт из нужной вам страницы нужной вам кнопкой, выполнять его. Подробнее про песочницу: http://www.community.terrasoft.ru/forum/topic/15210

Илья, большое спасибо!

Не находил, что есть ещё такой вариант страницы импорта.

"Мотков Илья" написал:Что касается предзаполения объекта, необходимо изучить как данный механизм работает в самой странице импорта: схема FileImportStartPage

Это метод setImportObject, как я понимаю? Только запускать при открытии окна.

Разобрался с основным, кроме одного момента:

"Мотков Илья" написал:И средствами песочницы sandbox, узнавать что вы перешли в импорт из нужной вам страницы нужной вам кнопкой, выполнять его.

Сообщения использовал неоднократно, но ведь тут страница открывается на соседней вкладке (окне), будет ли там работать сандбокс?

Например, я передаю сообщение по клику на кнопку:

this.sandbox.publish("StartImportFlag", { date: "test" }, ['FileImportModule_FileImportStartPage']);

В замещающей схеме FileImportStartPage есть соответственно:

this.sandbox.subscribe("StartImportFlag", function(arg) {
	console.log(arg); //Это пока просто для примера - должно вывести test
}, this, [this.sandbox.id]); //Тут this.sandbox.id равен FileImportModule_FileImportStartPage, у этих страниц они слишком различаются между собой.

Открываю страницу импорта, сообщение по идее должно отправиться, в консоль выведется test, но... ничего не происходит.

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

Здравствуйте!
В разделе контрагента создаётся новая деталь. (новый объект, из которого формируется деталь).
В деталях, если какие-то поле справочник - щёлкнув по нему есть возможность перейти в карточку данной записи.
Мне необходимо, создать возможность перехода по гиперссылке, по полю, не являющемся справочником.
Можно ли это как-то реализовать самостоятельно, через код?

Нравится

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

Добрый день Екатерина!!!

поясните пожалуйста, если реквизит не является справочником и при этом будет являться Гиперссылкой, подскажите пожалуйста нажав на данную ссылку куда вы желаете потом перейти? немного непонял задачи. Так как если к примеру Реквизит имеет тип "Текст", и принудительно описать, что данный реквизит на детали будет Гиперссылка, то нужно будет не забывать, что еще и события по нажатию на Гиперссылку нужно будет отработать. Уточните пожалуйста задачу, я поделюсь примером из своих решений. Спасибо!!!

При нажатии в реестре детали на "изменить" - мы переходим на карточку детали. я хочу, чтобы при нажатии в реестра на "названии" - происходило то же самое.

Здравствуйте, Екатерина!

Посмотрите в пакете CTIBase деталь Активности.

Там должен быть пример обработчика клика по номеру телефона.

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

Добрый день!
У меня такая ситуация. В компании внедрён BPMOnline SD 5.4.0
Есть задача по формированию гиперссылки во всех письмах-оповещениях по обращениям.
Однако, если я не авторизован в системе, то изначальная ссылка, по которой я перехожу, теряется в процессе авторизации. Может кто-то знает почему и как исправить ?
И второй вопрос - Есть ли возможность переходить на страницу ввода логина/пароля только в случае того, если доменная авторизация НЕ сработала (чтобы не надо было вручную на страницу логина кликать на доменную авторизацию) ?

Спасибо заранее за любой ответ.

С уважением, Владимир.

Нравится

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

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

Здравствуйте, Владимир!

По вопросу №1 ("Есть задача по формированию гиперссылки во всех письмах-оповещениях по обращениям.
Однако, если я не авторизован в системе, то изначальная ссылка, по которой я перехожу, теряется в процессе авторизации. Может кто-то знает почему и как исправить ?
"):

Действительно, такая ситуация присутствовала в более ранних сборках.
Для исправления необходимо обновиться на сборку выше 5.4.0.2467 (включительно).
Для получения сборки Вы можете обратиться в техническую поддержку по адресу: support@terrasoft.ru
Перед обновлением крайне желательно сделать резервную копию предыдущей версии бинарных файлов и базы данных.

По вопросу №2 ("Есть ли возможность переходить на страницу ввода логина/пароля только в случае того, если доменная авторизация НЕ сработала (чтобы не надо было вручную на страницу логина кликать на доменную авторизацию) ?"):

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

Добрый день . У нас версия 5.4.0.2269. Могу я реализовать задачу по формированию гиперссылки во всех письмах-обращениях? Мне вышлют сборку?

Татьяна,

напишите на support@terrasoft.ru - мы вышлем Вам обновленную сборку.

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