Добрый день!

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

Подскажите как сделать.

Нравится

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

В нужном Вам Section (если для всех разделов тогда BaseSectionV2) добавьте код:

 

getSectionActions: function() {
	var actionMenuItems = this.callParent(arguments);
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator", // Добавление разделителя
		Caption: ""
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
		"Click": {"bindTo": "Функция что выполняется при нажатии на кнопку"},
		"Caption": {"bindTo": "Видимое название кнопки. Рекомендовано локализированная строка"},
		"Enabled": {"bindTo": "Активность кнопки: значение true или false"},
		"Visible": {"bindTo": "Видимость кнопки: значение true или false"},
		"ImageConfig": this.get("Иконка кнопки. Не обязательно"),
		"IsEnabledForSelectedAll": true // Видна ли кнопка при выборе нескольких записей
	}));
	actionMenuItems.addItem(this.getButtonMenuItem({
		Type: "Terrasoft.MenuSeparator", // Добавление разделителя
		Caption: ""
	}));
	return actionMenuItems;
}

 

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

Подскажите какой метод (название метода и файла) отвечает за нажатие этой кнопки? 

Нравится

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

Добрый день.

При нажатии этой кнопки срабатывает метод applySimpleFilter из файла CustomFilterViewModelV2.

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

Добрый день. Можете подсказать как добавить дополнтельную кнопку после + и троеточия? 

 

Прикрепленные файлы

Нравится

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

Например так, в схему нужно детали добавить код:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "ButtonName",
		"parentName": "Detail",
		"propertyName": "tools",
		"values": {
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"style": Terrasoft.controls.ButtonEnums.style.DEFAULT,
			"caption": resources.localizableStrings.ButtonCaption,
			"visible": { 
				"bindTo": "isButtomEnabled" 
			},
			"click": { 
				"bindTo": "buttomClick" 
			}
		}
	}
]/**SCHEMA_DIFF*/,

isButtomEnabled - метод для проверки видимости кнопки, если нужно всего отображать, то просто вернуть true

"caption": resources.localizableStrings.ButtonCaption - название кнопки (из строк локализации)

buttomClick - метод, который запускается при клике на кнопку

Например так, в схему нужно детали добавить код:

diff: /**SCHEMA_DIFF*/[
	{
		"operation": "insert",
		"name": "ButtonName",
		"parentName": "Detail",
		"propertyName": "tools",
		"values": {
			"itemType": Terrasoft.ViewItemType.BUTTON,
			"style": Terrasoft.controls.ButtonEnums.style.DEFAULT,
			"caption": resources.localizableStrings.ButtonCaption,
			"visible": { 
				"bindTo": "isButtomEnabled" 
			},
			"click": { 
				"bindTo": "buttomClick" 
			}
		}
	}
]/**SCHEMA_DIFF*/,

isButtomEnabled - метод для проверки видимости кнопки, если нужно всего отображать, то просто вернуть true

"caption": resources.localizableStrings.ButtonCaption - название кнопки (из строк локализации)

buttomClick - метод, который запускается при клике на кнопку

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

Как добавить кнопку в группе полей? 

Нравится

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

Добрый день, Артем! Без кода его никак не добавить. 

В качестве примера могу посоветовать этот ролик (парень показывает как вообще это делается) https://www.youtube.com/watch?v=ZvCQsO_MQQE и даю отсылку на академию (чисто теоретическая часть) https://academy.terrasoft.ru/docs/7-16/developer/front-end_development/…

Добрый день, Артем! Без кода его никак не добавить. 

В качестве примера могу посоветовать этот ролик (парень показывает как вообще это делается) https://www.youtube.com/watch?v=ZvCQsO_MQQE и даю отсылку на академию (чисто теоретическая часть) https://academy.terrasoft.ru/docs/7-16/developer/front-end_development/…

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

Добавление кнопки звонка к полю, как в средствах связи, что бы можно было при звонке привязать в "Связи" запись раздела из которого был произведен звонок

Нравится

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

Добрый день! что касается добавления кнопки к полю, то подобное описано в данной статье. Что касается осуществление звонка, то Вам нужно подключить миксин CommunicationOptionsMixin в своем модуле откуда будете осуществлять звонок и привязать на кнопку метод обработчик, в результате выполнения которого будет вызываться один из методов миксина: callContact(number, contactId) или же callAccount: function(number, accountId)

Нигрескул Алексей,

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

Александр, эта функция в CommunicationOptionsMixin в конечном счёте посылает сообщение через «песочницу»:

this.sandbox.publish("CallCustomer", {
	number: number,
	customerId: customerId,
	entitySchemaName: entitySchemaName,
	callRelationFields: relationFields
});

А обработчик — в CtiPanelModelUtilities:

/**
 * Handler of call to the subscriber event.
 * @param {Object} numberInfo Call parameters information.
 * @param {String} numberInfo.number Subscribers phone number.
 */
onCallCustomer: function(numberInfo) {
	if (!this.get("IsConnected")) {
		this.sandbox.publish("SelectCommunicationPanelItem", {selectedItem: "CtiPanel"});
		this.logInfo(this.getResourceString("NotConnectedMessage"));
		return;
	}
	var phoneNumber = numberInfo.number;
	if (numberInfo.customerId) {
		this.set("AdvisedIdentifiedSubscriberInfo", numberInfo);
	}
	this.callByNumber(phoneNumber);
},

То есть параметр «customerId» не является обязательным и можно попробовать вызвать с одним лишь номером. А о добавлении связей, нужно смотреть, в каком формате при нормальном звонке передаётся callRelationFields и заполнить аналогичным.

Зверев Александр,

CustomerId не обязательный, так как cti все равно определяет по номеру контакт , но если надо привязать ещё ссылку на запись раздела (в деталь связи) то обязательно как оказалось. Другими словами - что бы к звону привязать запись какого-то раздела, нужно что бы в системе обязательно существовал контакт которому звоните, так как если контакт не существует то и привязать к звонку нельзя не запись контакта не запись раздела из которого звоните. Ограничение зачем такое сделано не знаю, так как у меня рассмотрение анонимных обращений, и контакта нет, но звонки делают и привязать обращение к звонку надо, а нельзя

Если штатными API звонков не получится, можно вычислить Id нового звонка и создать записи или заполнить поля связей как обычные данные, заполнив поля по аналогии. Более подробно увидеть, что создаётся, можно, отловив уходящие к серверам HTTP или SQL-запросы.

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

На странице редактирования лида есть задача "Квалифицировать обращение", которая содержит кнопку "Завершить". Как мне изменить название этой кнопки, так, чтобы наименование поменялось лишь на странице редактирования лида?

Нравится

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

В каком смысле название кнопки задачи?

Александр Тыра, Кнопка "Завершить" на скриншоте

Эта логика реализована сразу во многих схемах, заменить надпись не так просто.

Сама кнопка и её название из расположенной там же локализируемой строки заполняется в схеме BaseDashboardItemViewModel:

/**
 * Initializes "ExecuteButtonCaption" property.
 */
initExecuteButtonCaption: function() {
    this.set("ExecuteButtonCaption", resources.localizableStrings.ExecuteButtonCaption);
},

От неё наследуется схема EntityDashboardItemViewModel, а затем ActivityDashboardItemViewModel.

Она применяется в схеме SectionActionsDashboard в функции initDashboardConfig:

const activityItemsConfig = {
    "Activity": {
        viewModelClassName: "Terrasoft.ActivityDashboardItemViewModel",
        viewConfigClassName: "Terrasoft.BaseDashboardItemViewConfig"
    }
};

А уже от неё унаследована LeadSectionActionsDashboard.
Соответственно, чтобы надпись изменилась, но только в лидах, нужно будет сделать свои аналоги этих схем и подключить вместо стандартных, чтобы в лидах отображалась плитка с модификациями.

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

В разделе есть несколько типов страницы редактирования. Как установить условия на видимость кнопки добавления для одного из типов? В каком модуле определены данные кнопки? Заранее спасибо!

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

Нравится

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

В diff схемы реестра раздела добавляем 

{
            "operation": "merge",
            "name": "SeparateModeAddRecordButton",
            "parentName": "SeparateModeActionButtonsLeftContainer",
            "propertyName": "items",
            "values": {
                "itemType": Terrasoft.ViewItemType.BUTTON,
                "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                "caption": {"bindTo": "AddRecordButtonCaption"},
                "click": false,
                "visible": {"bindTo": "IsAddRecordButtonVisible"},
                "classes": {
                    "textClass": ["actions-button-margin-right"],
                    "wrapperClass": ["actions-button-margin-right"]
                },
                "controlConfig": {
                    "menu": {
                        "items": {
                            "bindTo": "EditPages",
                            "bindConfig": {
                                "converter": function(editPages) {

                                    if (editPages.getCount() === 0) {
                                        return null;
                                    }
                                    var operationHash = {
                                        "38d26ca1-ab6a-474c-950d-f9ac9b630967": "CanAbilityToAdd1", //здесь guid это id справочника по которому определяется страница редактирования
                                        "2495b17d-2465-41cb-b625-ac36d9aef931": "CanAbilityToAdd2"
                                    };
                                    
                                    var allowedPages = [];
                                    
                                    if (this.get("CanAbilityToAdd1")) {
                                        allowedPages.push("CanAbilityToAdd1");
                                    }
                                    
                                    if (this.get("CanAbilityToAdd2")) {
                                        allowedPages.push("CanAbilityToAdd2");
                                    }

                                    for (var key in operationHash) {
                                        var hashItem = departmentToOperationHash[key];
                                        if (allowedPages.indexOf(hashItem) === -1) {
                                            editPages.collection.remove(editPages.collection.getByKey(key));
                                        }
                                    }
                                    return editPages;
                                }
                            }
                        }
                    }
                }
            }
        }
}

 

В init добавляем к примеру проверку на доступ по операции, либо другую функциональность

initCanAbilityToAdd1: function() {
                RightUtilities.checkCanExecuteOperation({
                    operation: "CanAbilityToAdd1"
                }, function(result) {
                    this.set("CanAbilityToAdd1", result);
                }, this);
            },

Добрый вечер.

Кнопки для добавления разных типов записей генерируются автоматически в зависимости от информации в таблице SysModuleEdit и поля TypeColumnValue в этой таблице.

Названия пунктов меню для разных страниц редактирования берутся из поля ActionKindCaption.

Более подробную информацию посмотрите в этом посте.

Пользовательскими настройками (без внесения дополнительных изменений в программный код) настроить видимость пункта меню в кнопке [Добавить] этого сделать не получится.

Базовая логика добавления пунктов меню для кнопки [Добавить] раздела реализована в схеме 'BaseDataView' пакета NUI.

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

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

Зверев Александр,

Не уверенна, что разграничение прав доступа, как-то повлияет на видимость пункта меню кнопки [Добавить] для этого типа.

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

В diff схемы реестра раздела добавляем 

{
            "operation": "merge",
            "name": "SeparateModeAddRecordButton",
            "parentName": "SeparateModeActionButtonsLeftContainer",
            "propertyName": "items",
            "values": {
                "itemType": Terrasoft.ViewItemType.BUTTON,
                "style": Terrasoft.controls.ButtonEnums.style.GREEN,
                "caption": {"bindTo": "AddRecordButtonCaption"},
                "click": false,
                "visible": {"bindTo": "IsAddRecordButtonVisible"},
                "classes": {
                    "textClass": ["actions-button-margin-right"],
                    "wrapperClass": ["actions-button-margin-right"]
                },
                "controlConfig": {
                    "menu": {
                        "items": {
                            "bindTo": "EditPages",
                            "bindConfig": {
                                "converter": function(editPages) {

                                    if (editPages.getCount() === 0) {
                                        return null;
                                    }
                                    var operationHash = {
                                        "38d26ca1-ab6a-474c-950d-f9ac9b630967": "CanAbilityToAdd1", //здесь guid это id справочника по которому определяется страница редактирования
                                        "2495b17d-2465-41cb-b625-ac36d9aef931": "CanAbilityToAdd2"
                                    };
                                    
                                    var allowedPages = [];
                                    
                                    if (this.get("CanAbilityToAdd1")) {
                                        allowedPages.push("CanAbilityToAdd1");
                                    }
                                    
                                    if (this.get("CanAbilityToAdd2")) {
                                        allowedPages.push("CanAbilityToAdd2");
                                    }

                                    for (var key in operationHash) {
                                        var hashItem = departmentToOperationHash[key];
                                        if (allowedPages.indexOf(hashItem) === -1) {
                                            editPages.collection.remove(editPages.collection.getByKey(key));
                                        }
                                    }
                                    return editPages;
                                }
                            }
                        }
                    }
                }
            }
        }
}

 

В init добавляем к примеру проверку на доступ по операции, либо другую функциональность

initCanAbilityToAdd1: function() {
                RightUtilities.checkCanExecuteOperation({
                    operation: "CanAbilityToAdd1"
                }, function(result) {
                    this.set("CanAbilityToAdd1", result);
                }, this);
            },

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

 

Уже зарегистрирована идея  добавить возможность контролировать какой тип страницы редактирования используется какой ролью.

Полозюков Евгений Петрович,

 пытаюсь сделать что-то подобное, все проверила 10 раз, но отладчик выдает:

Uncaught (in promise) TypeError: RightUtilities.checkCanExecuteOperation is not a function

А Вы добавили в начале в квадратных скобках и параметрах ссылку на RightUtilities? Посмотреть, как это сделано, можно в других схемах, где её используют:

define("SysOperationAuditSectionV2", ["BaseFiltersGenerateModule", "SysOperationAudit", "SysOperationAuditArch",
	"RightUtilities"],
function(BaseFiltersGenerateModule, SysOperationAudit, SysOperationAuditArch, RightUtilities) {
	return {

 

Зверев Александр, да, была проблема с последовательностью схем и параметров, передаваемых в схему)

Алла Савельева,

 

Спасибо, что подсказали на тему замещения BaseDataView. Натолкнули на верный путь!

Если кому то поможет, вот проверка на доступ к просмотру указанного типа страницы. Очень коряво, но я учусь и это работает)

define("ActivitySectionV2", ["ConfigurationConstants","RightUtilities","ProcessModuleUtilities","BaseDataView"],
function(ConfigurationConstants,RightUtilities,ProcessModuleUtilities) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: 
		{ 
			"UsrCanManageItTask": {
				dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
				type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: false
			}
		},
		diff: /**SCHEMA_DIFF*/[
 
			]/**SCHEMA_DIFF*/,
		methods: {
			init: function()
			{
					this.getUserSettingsOperationRight();
					window.console.log("Инициализация");
					this.callParent(arguments);
					window.console.log("Права");
 
			},
 
			initEditPages: function() {
				window.console.log("Определение кнопок начало");
 
				var enabledEditPages = new this.Terrasoft.Collection();
 
					this.callParent(arguments);
					var editPages = this.get("EditPages");
 
					window.console.log("Получение страниц");
					var flag = this.get("UsrCanManageItTask");
					this.Terrasoft.each(editPages.getItems(), function(item) {
						window.console.log("Проверка типа");
						window.console.log(item.get("Id"));
						//window.console.log(ConfigurationConstants.Activity.Type.Email);ConfigurationConstants.Activity.Type.Call
						if (item.get("Id") !== "e2831dec-cfc0-df11-b00f-001d60e938c6" &&
							item.get("Id") !== "e1831dec-cfc0-df11-b00f-001d60e938c6") {
 
							if (item.get("Id") !== "f5921924-3e81-4a5f-ae4c-5a6f1b6e7661")
							{
								enabledEditPages.add(item);
								//window.console.log("ок");
							}
							else { 
								if (flag)
								{
										enabledEditPages.add(item);
										//window.console.log("ок");
								}
							}
						}
					});
					window.console.log("Проверка типа конец");
					this.set("EnabledEditPages", enabledEditPages);
 
					window.console.log("Определение кнопок конец");
			},
 
			getFilters: function() {
						window.console.log("Добавление фильтра");
						var filters = this.callParent(arguments);
						if (!this.get("UsrCanManageItTask"))
						{
							filters.add("NotItTask", this.Terrasoft.createColumnFilterWithParameter(
							this.Terrasoft.ComparisonType.NOT_EQUAL, "Type", "f5921924-3e81-4a5f-ae4c-5a6f1b6e7661"
							));
							window.console.log("Добавление фильтра");
						}
						return filters;
			},
 
			getUserSettingsOperationRight: function() {
				//debugger;
				var operationsToRequest = ["UsrCanManageItTask"];
				//operationsToRequest.push("UsrCanManageItTask");
				window.console.log("Права");
 
				RightUtilities.checkCanExecuteOperations(operationsToRequest, function(result) {
					if (result) {
						this.set("UsrCanManageItTask", result.UsrCanManageItTask);
						window.console.log("Права на ит-задачи: "+result.UsrCanManageItTask);
					}
				}, this);
			}
		}
 
	};
});

 

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

Добрый день, имеется развернутый локально Creatio. Хочу добавить лэндинг(чтобы можно было к примеру перейти на localhost/landing/index.aspx) с формой, у которой есть поле phone и данные введенные в поле будут попадать в контакты -> мобильный телефон уже к имеющемуся контакту.
Что уже сделал?
Сейчас контакт выглядит следующим образом

Как описано в документации добавил лэндинг. Сжато он выглядит так:

После чего в папке ../0/Nui/ создал папку Landing с файлом index.aspx в котором лежит следующий код:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!--ШАГ 2-->
    <!--Эту часть необходимо скопировать из поля ШАГ 2 страницы редактирования лендинга-->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/track-cookies.js"></script>
    <script src="https://webtracking-v01.bpmonline.com/JS/create-object.js"></script>
    <script>
 
    var config = {
        fields: {
            "Subject": "#subject-field",
            "Email": "#email-field",
            "Name": "#name-field",
            "MobilePhone": "#phone-field",
        },
        landingId: "54a57d16-e7b6-4c7d-9c38-237cfcf6512d",
        serviceUrl: "http://localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData",
        redirectUrl: "yandex.ru"
    };
 
    function createObject() {
        landing.createObjectFromLanding(config)
    }
    </script>
    <!--ШАГ 2-->
</head>
<body>
<h1>Landing web-page</h1>
<div>
    <h2>Case form</h2>
    <form action="localhost/0/ServiceModel/GeneratedObjectWebFormService.svc/SaveWebFormObjectData" method="POST" class="mainForm" name="landingForm" onSubmit="createObject(); return false">
        Subject:<br>
        <input type="text" name="subject" id="subject-field"><br>
        Email:<br>
        <input type="text" name="Email" id="email-field"><br>
        Name:<br>
        <input type="text" name="Name" id="name-field"><br>
        Phone:<br>
        <input type="text" name="Phone" id="phone-field"><br><br>
        <input type="submit" value="Submit">
        </font>
    </form>
</div>
</body>
</html>

Если я правильно понял для того чтобы POST запрос прошел корректно должен отработать файл GeneratedObjectWebFormService.svc. Нужно ли его создавать по документации или он является дефолтным? При попытки отправки запроса возникает 403 ошибка. Как сделать это рабочим и какие ошибки я совершил?

Нравится

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

А зачем вы пытаетесь добавить лендинг внутри того же сайта, где развёрнута система? Обычно он нужен для отдельного сайта, например, страницы регистрации на сайте компании. При таком размещении, как сделали Вы, может незалогиненного пользователя при попытке открыть эту страницу перебросить на страницу логина. А для залогиненных есть более подходящие способы, вроде БП с автогенерируемыми или преднастроенными страницами.

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

А зачем вы пытаетесь добавить лендинг внутри того же сайта, где развёрнута система? Обычно он нужен для отдельного сайта, например, страницы регистрации на сайте компании. При таком размещении, как сделали Вы, может незалогиненного пользователя при попытке открыть эту страницу перебросить на страницу логина. А для залогиненных есть более подходящие способы, вроде БП с автогенерируемыми или преднастроенными страницами.

 

Как минимум, у Вас неправильный адрес стандартного веб-сервиса GeneratedWebFormService, к которому пытались обратиться со страницы. Поскольку он анонимный, там не нужен /0/. См. тут, как выглядит и где настраивается путь к нему.

 

Если нужно сделать отдельную страницу на сервере с этой формой, можно поднять в IIS ещё один сайт из одной HTML-страницы, где и настроить по инструкции связь с лендингом.

Зверев Александр,

Добрый день, подскажите как разрешить службу? Так полагаю что это что-то связанное с настройками приватности функции или что-то вроде того.

Нет, дело не в этом. Посмотрите второй абзац прошлого ответа.

Зверев Александр,
исправил без /0/ теперь следующую проблему не могу побороть 

политика CORS дефолтная и выглядит так:

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

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

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

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

Суть в том что кнопка нужна только на одной из страниц.

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

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

Как можно красиво побороть?

Спасибо.

Нравится

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

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

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

Зверев Александр,

Александр, речь о кастомной кнопке внутри записи, справа от кнопки действий. Ну или внутри действий (так же только внутри записи).

Ваши ссылки изучу. Спасибо)

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

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

Есть кнопка в группе кнопок "Действие" - "Отправить на визирование", она запускает процесс визирования. Данная кнопка должна быть активна если в таблице визирования уже есть как минимум одна положительная запись (автор согласовал). Для этого сделал запрос к базе данных и получил результат. Через свойство "Enabled" нужно реализовать доступность кнопки.

Код кнопки:

actionMenuItems.addItem(this.getButtonMenuItem({
	"Caption": VisaHelper.resources.localizableStrings.SendToVisaCaption,
	"Tag": VisaHelper.SendToVisaMenuItem.methodName,
	"Enabled": {"bindTo": "canEntityBeOperated"}
}));

"Enabled": {"bindTo": "canEntityBeOperated"} - сюда и надо отправить true и false.

Код запроса к базе данных:

var opportunityId = this.get("Id");
var ownerContact = "";
if (this.get("Owner")) {
	ownerContact = this.get("Owner").value;
}
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: "KtOpportunityVisa"
});
esq.addColumn("VisaOwner.Contact", "VisaOwnerContact");
esq.addColumn("KtOpportunity", "KtOpportunity");
esq.addColumn("Status", "Status");
var esqOwnerContactFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
	"VisaOwner.Contact", ownerContact);
var esqOpportunityFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
	"KtOpportunity", opportunityId);
var esqVisaСanceledFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
	"Status", KtConfigurationConstantsKarTel.VisaStatus.Positive);
esq.filters.add("esqOwnerContactFilter", esqOwnerContactFilter);
esq.filters.add("esqOpportunityFilter", esqOpportunityFilter);
esq.filters.add("esqVisaСanceledFilter", esqVisaСanceledFilter);
esq.getEntityCollection(function (result) {
	if (result.success && result.collection.getCount() === 0) {
		return false;
	} else {
		return true;
	}
}, this);

Так как запрос асинхронный то на сколько помню решается это через Terrasoft.chain с Callback, но как это сделать хоть убейте не помню.

Нравится

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

По поводу упомянутого механизма Вы недавно задавали вопрос в этой теме. Также см. публикацию.

По поводу упомянутого механизма Вы недавно задавали вопрос в этой теме. Также см. публикацию.

Зверев Александр,

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

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