Стоит задача.

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

 

 

Пожалуйста не скидывайте пример: https://academy.terrasoft.ru/docs/7-16/developer/front-end_development/…

Я уже разукрасил грид при загрузке. И пробовал маркетплейс модули но там нет такого функционала.

Теперь нужно при клике, выделенную запись красить исходя из её типа.

 

Стоит полный бандл creatio.

Нравится

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

Ставим debugmode. В BaseGridDetailV2 устанавливаем дебагер на rowSelected там виден call stack отрисовки таблицы. Выводим в консоль this, видим что там есть свойства rowsStyles, cellsClasses, но они нигде не описаны в документации, если разберетесь можете попробовать использовать их.

В нашем случае нам нужны свойства collectionItemPrefix и model.$ActiveRow зная из мы можем составим полный id элемента строки, к примеру id="ContactAddressDetailV2DataGridGrid-d4dc6c60-2243-4b00-a122-7cb4987c07f6-item-82140c2c-41eb-48bb-97fb-51d0c5e92cfd".

Зная id получаем с помощью Ext.getCmp или обычного js, dom-элемент строки и можете манипулировать его свойствами как хотите.

Ставим debugmode. В BaseGridDetailV2 устанавливаем дебагер на rowSelected там виден call stack отрисовки таблицы. Выводим в консоль this, видим что там есть свойства rowsStyles, cellsClasses, но они нигде не описаны в документации, если разберетесь можете попробовать использовать их.

В нашем случае нам нужны свойства collectionItemPrefix и model.$ActiveRow зная из мы можем составим полный id элемента строки, к примеру id="ContactAddressDetailV2DataGridGrid-d4dc6c60-2243-4b00-a122-7cb4987c07f6-item-82140c2c-41eb-48bb-97fb-51d0c5e92cfd".

Зная id получаем с помощью Ext.getCmp или обычного js, dom-элемент строки и можете манипулировать его свойствами как хотите.

Взял за основу:

https://academy.terrasoft.ru/docs/7-16/developer/front-end_development/…

В  методе детали prepareResponseCollectionItem добавил цвет и маркер по условию:

item.customStyle = {
"EnteringInitialBalances":"",
"--selected-color":"red"
};

И через подключенный css добавил цвет при выделении:

.grid-row-selected[style*=Entering-initial-balances] {
    background-color: var(--selected-color) !important;
}

Результат

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

Как убрать кнопку в виде планеты "отправить сообщение на портал самооблуживания"Изображение удалено.

Нравится

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

В вашем случае надо разбирать код SectionActionsDashboard и смотреть как формируются табы, чтобы убрать один из них. Открываете схемы и смотрите все что связано со словом Tab.

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

 

Полозюков Евгений Петрович,Спасибо, примерную схему поиска я знаю, где-то есть описание как формирует id элемента для поиска в diff массиве?

Видно, что в id добавляет название схемы раздела CaseSection

Денис Суров,

Описания как формируется id нет, но можно понять что в начале идет название схемы потом имя элемента потом суффикс с типом элемента.

В вашем случае надо разбирать код SectionActionsDashboard и смотреть как формируются табы, чтобы убрать один из них. Открываете схемы и смотрите все что связано со словом Tab.

Полозюков Евгений Петрович,Спасибо, посмотрю

мне подошло скрыть контейнер Tabs

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

Добрый день. У меня в таблице Account лежат два внешних ключа на таблицу Contact. Подскажите, как явно указать столбец для джойна. Это:

esq.addColumn("=Contact.Name", "ContactName");

возвращает не верные значения. К тому же, хотелось бы использовать inner join, но запрос летит в виде:

 

LEFT OUTER JOIN [dbo].[Contact] [PrimaryContact] WITH(NOLOCK) ON ([PrimaryContact].[Id] = [UsrAccount].[PrimaryContactId])

* Из примера выше, нужно джойнить по столбцу OwnerId вместо PrimaryContact

Нравится

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

Вот статья https://academy.terrasoft.ru/docs/7-17/developer/front-end_development/…

 

Не надо писать равно.

 

Если у вас root таблица в esq это Account в нем к примеру есть поле Ответственный Owner справочник контакта. Вам надо получить какое-то из полей Owner.

 

esq.addColumn("Owner.Id", "OwnerId");

esq.addColumn("Owner.Name", "OwnerName");

 

Также если в контакте тоже есть справочное поле Lookup у справочника которого есть поле Name можно провалится и дальше 

esq.addColumn("Owner.Lookup.Name", "OwnerLookupName");

* Из примера выше, нужно джойнить по столбцу OwnerId вместо PrimaryContact

 PrimaryContactId*

Два внешних ключа это два справочных поля со справочником контакта в объекте контрагент? 

Полозюков Евгений Петрович, верно. Один указывает на Основной контакт контрагента, второй на Менеджера работающего с контрагентом.

Другими словами, запрос:

 

SELECT offer.* from UsrCommercialOffer as offer
INNER JOIN Account as acc
    ON offer.UsrAccountId = acc.Id
WHERE acc.OwnerId = @currentUserId

Его нужно написать на фронте. 

Вот статья https://academy.terrasoft.ru/docs/7-17/developer/front-end_development/…

 

Не надо писать равно.

 

Если у вас root таблица в esq это Account в нем к примеру есть поле Ответственный Owner справочник контакта. Вам надо получить какое-то из полей Owner.

 

esq.addColumn("Owner.Id", "OwnerId");

esq.addColumn("Owner.Name", "OwnerName");

 

Также если в контакте тоже есть справочное поле Lookup у справочника которого есть поле Name можно провалится и дальше 

esq.addColumn("Owner.Lookup.Name", "OwnerLookupName");

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

Каким образом убрать кнопку и тег на портале самообслуживания

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

Нравится

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

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

 

Кнопка действия добавлена в BaseDataView c name - CombinedModeActionsButton и SeparateModeActionsButton. В вашем случае надо в CaseSection в diff описать remove этих двух кнопок.

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

 

Кнопка действия добавлена в BaseDataView c name - CombinedModeActionsButton и SeparateModeActionsButton. В вашем случае надо в CaseSection в diff описать remove этих двух кнопок.

Полозюков Евгений Петрович,Спасибо, а тег?

Часть нашел,CombinedModeTagsButton

Денис, а если просто отобрать портальным пользователям права на чтение таблицы тегов обращений или исключить этот объект из справочника объектов, доступных на портале?

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

Подскажите, удалось ли найти наименование кнопки Тег для её удаления? По CombinedModeTagsButton у меня remove не отрабатывает, кнопка как была, так и есть (в DOM-модели также по классам прошлась и не нашла подходящего наименования)

Ирина Кузина,

Для решения задачи в атрибуте UseTagModule установите значение false.

Например,

 define("PortalCaseSection", [],

    function () {

        return {

            entitySchemaName: "Case",

        details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,

        attributes: {

            "UseTagModule": {

                dataValueType: Terrasoft.DataValueType.BOOLEAN,

                value: false

            }

        },

        methods: {},

        diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/

    };

});

 

Алёна Доля,

Благодарю! Вы очень помогли!

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

Добрый день!

 

Создал замещающую схему PortalPage сделал ComplainButton Visible=false , но кнопка осталась на странице

Нравится

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

Спасибо, нашел, кнопка в PortalCaseSection

"operation": "remove",

                    "name": "ComplainButton",

Денис Суров,

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



Можете ли чуть более детально рассказать как именно произвели удаление кнопки со страницы?



Правильно ли я понимаю, что достаточно в diff указать следующее:

diff: /**SCHEMA_DIFF*/[
			{
				"operation": "remove",
				"name": "НазваниеКнопки"
			}
		]/**SCHEMA_DIFF*/

Название кнопки мы берём из локализуемых строк, что определены на странице? Или откуда?

 

 

 

Ирина Кузина,

Добрый день, Ирина.

Да, код, который Вы прикрепили успешно удалит кнопку.



Название кнопки можно посмотреть разметке странице(ПКМ на кнопку -> Inspect) в id кнопки полное название, пример "ContactSectionV2CloseButtonButton". Нужно убрать сначала название схемы "ContactSectionV2" и с конца слово "Button". Остальное и есть название кнопки, то есть CloseButton.



Также название кнопки можно посмотреть в схеме, где она добавляется:

 

diff: /**SCHEMA_DIFF*/[
			{
				"operation": "insert",
				"name": "НазваниеКнопки"
               // Другие свойства
			}
		]/**SCHEMA_DIFF*/

 

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

Доброе время суток!

Подскажите пожалуйста вот при переносе из среды в среду нужно ли сохранять такие данные которые хранятся в таблицах SysEntitySchemaOperationRight, SysSSPEntitySchemaAccessList, Изображение удалено.?

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

Заранее благодарен за оказанную помощь.

Нравится

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

Андрей, в SysEntitySchemaOperationRight хранятся права на операции (чтения, добавления, изменения, удаления) по объектам системы (не путать с правами на системные операции). Если на новом месте пользователи и роли другие и их права настраиваете вручную, можно не переносить.

В SysSSPEntitySchemaAccessList хранится список объектов, доступных на портале. Если Вы добавляете новый портальный раздел, детали или справочники в нём, их схемы тоже должны там быть. Видимо, Вы создаёте новые колонки именно типа «Справочник». По одним и тем же данным без примера неясно.

А в PortalColumnAccessList, видимо, заносятся все колонки схем, видимых пользователям на портале.

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

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

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

Видимо, добавили в схему две разных колонки. Посмотрите наполнение этих добавленных данных.

Добрый день, а можно еще уточнить?

Вот какую смысловую нагрузку имеют созданные объекты в пакете Custom при создании новых разделов, а потом в дальнейшем их редактирования. Добавляю скрин экрана дев конфигурации (Пакет Custom, вкладка Схемы).

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

Андрей, а если открыть эти схемы, в дизайнере объектов и их встроенных БП ничего дополнительно не появилось?

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

Я имею в виду эту же схему не в Custom, а в том пакете, где в неё добавлены колонки.

Но пакет ELBase я не трогал

Схемы в Custom создались не потому, что Вы создали раздел, а потому, что в этом объекте включили права по операциям.

тогда еще вопрос по этой же теме, эти ж схемы объектов при переносе не нужны?

Если хотите, чтобы и там права были включены, то нужны. Или же включить вручную.

Все спасибо вам огромное

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

Вот как это выглядит сейчас:

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

Вот как надо чтобы выгляделоИзображение удалено.

Нравится

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

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

Непонятно зачем это поле выводить в реестре детали. Просто не выводите.

Если нужно чтобы пользователь видел есть ли сообщение в записи или нет, я бы добавил дополнительное булево поле "Есть сообщение" и внутреннем процессе объекта его бы заполнял при изменении значения Сообщение. И поле Есть сообщение вывел бы в реестр детали.

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

Так хочет заказчик. Так может можно все таки как то обрезать это все при отображении?

Атамогланов Гусейн,

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

А у вас точно нет Terrasoft.ContentType.LONG_TEXT? Обычно с ним так отображается.



Если поле не для редактирования, то в процессе копируйте в другое поле краткое содержание текста

Владимир Соколов,

 

Terrasoft.ContentType.LONG_TEXT я его как раз убрал.

Владимир Соколов пишет:

Если поле не для редактирования, то в процессе копируйте в другое поле краткое содержание текста

То есть? Создать еще одно поле в объект?

 

Мишустин Василий пишет:

То есть? Создать еще одно поле в объект?

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

 

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

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

Всем доброго дня. Версия 7.15.

 

Как в коде в задании-сценарии бизнес-процесса создать несколько записей одним запросом? К примеру, нужно создать несколько записей внутри цикла:

 

foreach (var groupItem in groupCollection)
	{		
		//Создадим запись
		try {
		    var entity = new Terrasoft.Configuration.WSObject(userConnection);
		    entity.SetDefColumnValues();
		    //...
		    entity.Save();
		} catch (Exception exc) {
			//return false;
		} 
}

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

 

К примеру, в JavaScript на клиенте аналогичное действие можно выполнить следующий образом:

var bq = this.Ext.create("Terrasoft.BatchQuery");
 
arr.forEach(function(item, i, arr) {
        var insert = Ext.create("Terrasoft.InsertQuery", {
        		rootSchemaName: "WSObject"
        });				                    
        insert.setParameterValue("WSComment", item.comment, Terrasoft.DataValueType.TEXT); 
        //прочие колонки
        bq.add(insert);
});
 
bq.execute(function(addresponse){});

Тогда в базу уйдёт один запрос. Как сделать аналогичное действие на c#?

Нравится

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

У вас в batchQuery несколько insert каждый из которых выполняется в отдельности, он не отличается от c# варианта который вы описали. 

В c# коде описан нормальный цикл для создания каждой записи по отдельности, так и делается нормальное создание нескольких записей.

Если вы хотите выполнить вариант sql в котором один insert с несколькими values, вам надо использовать либо CustomQuery в котором прописан sql. Либо попробовать обертку для insert в виде класса Insert.

Entity можно добавлять в EntityCollection, а потом вызывать entityCollection.Save

Николай, спасибо.

А есть пример добавления записей в такую коллекцию?

Например, в схеме MLPredictionSaver:

MLResultListSchemaConfig resultListSchemaConfig = GetResultListSchemaConfig(modelConfig);
var entityCollection = new EntityCollection(_userConnection, resultListSchemaConfig.EntitySchema);
foreach (RecommendationOutput output in predictionResult.Outputs) {
	foreach (RecommendedItem item in output.Items) {
		Entity entity = resultListSchemaConfig.EntitySchema.CreateEntity(_userConnection);
		entity.UseAdminRights = UseAdminRights;
		entity.SetColumnValue("Id", Guid.NewGuid());
		entity.SetColumnValue(resultListSchemaConfig.SubjectColumn, output.UserId);
		entity.SetColumnValue(resultListSchemaConfig.ObjectColumn, item.ItemId);
		if (resultListSchemaConfig.ValueColumn != null) {
entity.SetColumnValue(resultListSchemaConfig.ValueColumn, item.Score);
		}
		if (resultListSchemaConfig.ModelColumn != null) {
entity.SetColumnValue(resultListSchemaConfig.ModelColumn, modelConfig.Id);
		}
		if (resultListSchemaConfig.DateColumn != null) {
entity.SetColumnValue(resultListSchemaConfig.DateColumn, DateTime.UtcNow);
		}
		entityCollection.Add(entity);
	}
}
entityCollection.Save();

Уже заведена идея дать возможность сохранять несколько entity в одной транзакции.

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

Я так и не поняла из этого поста, можно ли использовать BatchQuery на стороне сервера?

Если да, то хотелось бы увидеть примеры такой реализации.

У вас в batchQuery несколько insert каждый из которых выполняется в отдельности, он не отличается от c# варианта который вы описали. 

В c# коде описан нормальный цикл для создания каждой записи по отдельности, так и делается нормальное создание нескольких записей.

Если вы хотите выполнить вариант sql в котором один insert с несколькими values, вам надо использовать либо CustomQuery в котором прописан sql. Либо попробовать обертку для insert в виде класса Insert.

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

Добрый день, не работает обычное выделение значений колонок в ProductSelectionSchema, ctrl+A так же не выделает.

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

Нравится

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

Илья, причина — в стилях стандартного контрола ContainerList, который используется в продуктовом каталоге. 

Там указан следующий стиль:

.grid {
   ...
    user-select: none;
}

Если его перекрыть на user-select: text; то всё работает.

Этот стиль задан в ядре в /0/core/hash/Terrasoft/controls/grid/grid24-1.less, его нужно просто перекрыть в кастомных стилях.

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

 Сработало. Премного благодарен!

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

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

Грубо говоря, перед исполнением основного действия (открытия лукап окошка), мне нужно добавить еще одно.

Как это можно реализовать?

Нравится

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

Антон, логика при открытии лукапа — в функции loadVocabulary схемы BaseSchemaViewModel:

		/**
		 * Open selection page from the directory or trying to add a record.
		 * @protected
		 * @param {Object} args Params.
		 * @param {Object} columnName Column name.
		 */
		loadVocabulary: function(args, columnName) {
			var multiLookupColumns = this.getMultiLookupColumns(columnName);
			var config = (Ext.isEmpty(multiLookupColumns))
				? this.getLookupPageConfig(args, columnName)
				: this.getMultiLookupPageConfig(args, columnName);
			this.openLookup(config, this.onLookupResult, this);
		},

Там проверяется наличие у колонок некоторого свойства (а именно multiLookupColumns) и если оно не пусто, запускается окно мультилукапа вместо обычного. То есть Вы можете переопределить, чтобы проверяло ещё какое-то свойства у поля на карточке и если оно есть, то произвести сохранение (например, при помощи отправки отсюда карточке команды на тихое сохранение через «песочницу»).

Антон, логика при открытии лукапа — в функции loadVocabulary схемы BaseSchemaViewModel:

		/**
		 * Open selection page from the directory or trying to add a record.
		 * @protected
		 * @param {Object} args Params.
		 * @param {Object} columnName Column name.
		 */
		loadVocabulary: function(args, columnName) {
			var multiLookupColumns = this.getMultiLookupColumns(columnName);
			var config = (Ext.isEmpty(multiLookupColumns))
				? this.getLookupPageConfig(args, columnName)
				: this.getMultiLookupPageConfig(args, columnName);
			this.openLookup(config, this.onLookupResult, this);
		},

Там проверяется наличие у колонок некоторого свойства (а именно multiLookupColumns) и если оно не пусто, запускается окно мультилукапа вместо обычного. То есть Вы можете переопределить, чтобы проверяло ещё какое-то свойства у поля на карточке и если оно есть, то произвести сохранение (например, при помощи отправки отсюда карточке команды на тихое сохранение через «песочницу»).

Благодарю, все работает)

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